0x01 前言
之所以整理一篇Docker搭建CTF中的靶機文章,主要是因為最近斷斷續續遇到需要自己搭建一個服務器端鏡像的事,出題或者是部署一些服務,出于安全或者是可移植性的一些考慮,都是需要用到Docker的,然后每次使用Docker總要查閱一些資料,在這里整理并把經歷分享一下。
0x02 Docker介紹
整理了一下Docker|菜鳥教程上的介紹
Docker 是一個開源的應用容器引擎。 Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。 容器是完全使用沙箱機制,相互之間不會有任何接口,更重要的是容器性能開銷極低。
Docker 的架構主要分為
Docker 鏡像(Images):Docker 鏡像是用于創建 Docker 容器的模板。 Docker 容器(Container):容器是獨立運行的一個或一組應用。 Docker 客戶端(Client):Docker 客戶端通過命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 與 Docker 的守護進程通信。 Docker 主機(Host):一個物理或者虛擬的機器用于執行 Docker 守護進程和容器。 Docker 倉庫(Registry):Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用。 Docker Machine:Docker Machine是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。
0x02 Docker安裝
首先我找了一個沒有安裝Docker的服務器
以CentOS Docker 安裝為例,其他系統服務器請參考菜鳥教程https://www.runoob.com/docker/centos-docker-install.html
安裝所需的軟件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存儲驅動程序需要 device-mapper-persistent-data 和 lvm2。
sudo?yum install?-y?yum-utils \
device-mapper-persistent-data \
lvm2
sudo?yum-config-manager \--add-repo?\https://download.docker.com/linux/centos/docker-ce.repo
安裝最新版本的 Docker Engine-Community 和 containerd
sudo yum install docker-ce docker-ce-cli containerd.io
0x03 Docker使用
常用docker命令
service docker start
docker images
選項說明:
REPOSITORY:表示鏡像的倉庫源
TAG:鏡像的標簽
IMAGE ID:鏡像ID
CREATED:鏡像創建時間
SIZE:鏡像大小
import導入鏡像
docker import [options] file|URL|- [REPOSITORY[:TAG]]
實例如下:
docker import music.tar music:centos
導入之前導出的用Dockerfile生成的鏡像,然后修改它的REPOSITORY為music,TAG為centos
docker export [OPTIONS] CONTAINER
實例如下
docker export?-o test-mysql.tar <容器?ID>
docker run -t -i music:centos /bin/bash
因為鏡像本身就是要用到操作系統的,當我們在用dockerfile生成鏡像后,想要繼續去修改鏡像的內容,本質就和我們連服務器是一樣的。要退出終端,直接輸入exit退出即可。 參數說明:
-i: 交互式操作。 -t: 終端。 music:centos 這是指的我之前導入的鏡像。 /bin/bash:放在鏡像名后的是命令,這里我們希望有個交互式 Shell,因此用的是 /bin/bash。 docker網絡端口映射
docker run? -d -p 1001:80 music:centos /run.sh
這邊80是我music這個鏡像在創建的時候設置開放的端口,1001是我當前服務器的端口 -d:?后臺運行容器,并返回容器ID;
-p:?指定端口映射,格式為:主機(宿主)端口:容器端口
docker rm -f 70119596feee
后面的70119596feee是容器id,可以不打全
docker ps -a
docker stop <容器 ID>
docker start 7a432b5f80a9
docker rmi <鏡像?ID>
docker build . -t test-mysql
docker build為創建鏡像命令,名稱為test-mysql ’.'表示當前目錄,即Dockerfile文件所在的目錄
docker exec -it containerID /bin/bash
docker cp 文件名 容器ID:路徑
0x04 Apache+PHP+Mysql服務
Mysql數據庫容器
以下構建mysql鏡像參考博客
https://blog.csdn.net/qq_42891915/article/details/90116190
注:這篇博客有一個坑。在他的Dockerfile中沒有給setup.sh執行權限。
FROM mysql:5.7.20#設置免密登錄
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes#將所需文件放到容器中
COPY setup.sh /mysql/setup.sh
COPY test.sql /mysql/test.sql
COPY privileges.sql /mysql/privileges.sql
#為/mysql/setup.sh添加執行權限
RUN chmod u+x /mysql/setup.sh
#設置容器啟動時執行的命令
CMD ["sh", "/mysql/setup.sh"]
create database `test` default character set utf8 collate utf8_general_ci;
use test;SET FOREIGN_KEY_CHECKS=0;SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`uname` varchar(128) COLLATE utf8_bin NOT NULL,`passwd` varchar(128) COLLATE utf8_bin DEFAULT NULL,PRIMARY KEY (`uname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('user1', 'pass1');
INSERT INTO `user` VALUES ('user2', 'pass2');
use mysql;
select host, user from user;
-- 因為mysql版本是5.7,因此新建用戶為如下命令:
create user test identified by '123456';
-- 將test數據庫的權限授權給創建的test用戶,密碼為123456:
grant all on test.* to test@'%' identified by '123456' with grant option;
-- 這一條命令一定要有:
flush privileges;
#!/bin/bash
set -e#查看mysql服務的狀態,方便調試,這條語句可以刪除
echo `service mysql status`echo '1.啟動mysql....'
#啟動mysql
service mysql start
sleep 3
echo `service mysql status`echo '2.開始導入數據....'
#導入數據
mysql < /mysql/test.sql
echo '3.導入數據完畢....'sleep 3
echo `service mysql status`#重新設置mysql密碼
echo '4.開始修改密碼....'
mysql < /mysql/privileges.sql
echo '5.修改密碼完畢....'#sleep 3
echo `service mysql status`
echo `mysql容器啟動完畢,且數據導入成功`tail -f /dev/null
docker build . -t test-mysql
docker build 為創建鏡像命令,名稱為test-mysql ’.'表示當前目錄,即Dockerfile文件所在的目錄
將鏡像啟動,從鏡像mysql的默認3306端口映射到本地的端口上
docker run -d -p 1235:3306 test-mysql
通過PORTS可以看到成功映射到了本地的1235端口,這是我的kali虛擬機,我用真機上的Mysql管理工具Navicat嘗試連接
docker export -o test-mysql.tar 7e7
在使用鏡像包的時候,導入后啟動鏡像映射端口的時候,是需要命令的
docker run -d -p 20001:3306 test-mysql /mysql/setup.sh
啟動的時候讓他執行setup.sh
Web容器
#基于ubuntu鏡像
FROM ubuntu:16.04
#維護人的信息
MAINTAINER <785691921@qq.com>
#============
# 安裝apache2 php軟件等
#============
RUN apt-get update && \apt-get install -y apache2 software-properties-common && \LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php && \apt-get update && \apt-get install -y \libapache2-mod-php5.6 \php5.6 \php5.6-cli \php5.6-curl \php5.6-dev \php5.6-gd \php5.6-imap \php5.6-mbstring \php5.6-mcrypt \php5.6-mysql \php5.6-pgsql \php5.6-pspell \php5.6-xml \php5.6-xmlrpc \php-apcu \php-memcached \php-pear \php-redis \&& apt-get clean \&& rm -fr /var/lib/apt/lists/*
#===========================
# 拷貝同目錄下的WEB進入容器
#===========================
COPY test.php /var/www/html/
#===========================
# 拷貝啟動服務腳本
#===========================
COPY run.sh /run.shRUN chmod 775 /run.shCMD ["/run.sh"]
#!/bin/bash#清空httpd緩存文件
rm -rf /run/httpd/*#啟動httpd服務
exec /usr/sbin/apachectl -D FOREGROUND
<?php$con = mysql_connect(getenv("MYSQL_ADDR"),getenv("MYSQL_USER"),getenv("MYSQL_PASS"));if (!$con){die('Fail:' . mysql_error());}else{mysql_query("SET NAMES utf8");mysql_select_db("test", $con);$result = mysql_query("SELECT * FROM user");while($row = mysql_fetch_array($result)){echo $row['uname'] . " " . $row['passwd'];echo "";}}mysql_close($con);
?>
docker build . -t test-php
docker run -d -p 1236:80? -e MYSQL_ADDR=ip:端口 -e MYSQL_USER=test -e MYSQL_PASS='123456' test-php
0x05 常見交互式服務器靶機搭建(python環境為例)
BUFSIZE = ''
if __name__ == "__main__":print("Please input something:")buf = raw_input(BUFSIZE).replace('\n', '')print("What you entered is:"+buf)
FROM python:2-slimRUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list && \sed -i s@/security.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list && \apt-get update -y && \apt-get install socat -yCOPY test.py /test.pyEXPOSE 10000ENTRYPOINT socat TCP4-LISTEN:10000,tcpwrap=script,reuseaddr,fork EXEC:"/usr/bin/env python2 -u /test.py"
docker run -d -p 1234:10000 test_python
成功將容器的10000端口映射到本地的1234端口
導入鏡像開啟容器時的命令 ‘’’ docker run -d -p 10000:10000 test_python /bin/sh -c “socat TCP4-LISTEN:10000,tcpwrap=script,reuseaddr,fork EXEC:”/usr/bin/env python2 -u /test.py"" ‘’’
0x06 使用Dockerfile配置環境更換基礎鏡像的源
首先更換源的原因主要是隨著Debian 9?Stretch國內常用鏡像源的普及,但由于偉大的墻的存在,所以需要更換為國內的鏡像站點。 使用sed命令實現替換
sed命令介紹?https://www.runoob.com/linux/linux-comm-sed.html
FROM python:2-slim
RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list && \sed -i s@/security.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list && \apt-get update -y
不同的基礎鏡像被替換的有可能不同,一般都是Debian的默認源地址http://deb.debian.org
需要根據具體鏡像源地址進行替換
主要是執行
RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list
將Debian的默認源地址改成阿里云的地址即可,比如將http://deb.debian.org改成https://mirrors.xxx.com
總結
以上是生活随笔 為你收集整理的Docker配置CTF中的靶机环境 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。