0x00
记录一下自己用docker出题的经过
因为太懒(菜)了不想写dockerfile,就决定套用模板来出题。
0x01 没有数据库交互
我们需要一个文件夹,文件夹目录如下:
-docker
--dockerfile
--www(题目主要源代码)
---index.html
---index.php
这里我用的是sql-injection-lab的一个基础镜像acgpiano/sqli-labs,这样的好处就是可以模板化,只需要改一点点的东西就行了,操作会更加的简单。
dockerfile内容如下:
FROM acgpiano/sqli-labs
RUN rm -rf /var/www/html/*
ADD ./www /var/www/html
我们吧题目放到www这个文件夹里面,然后执行命令docker build -t test .
这样我们就得到了一个test的题目镜像,然后直接把test这个镜像跑起来就行了。
等待运行结束后docker images即可查看到新生成的镜像
运行test镜像
然后访问公网ip和我们映射的端口就行了,记得提前开放端口
xxx.xxx.xxx.xxx:1008
0x02 dockerfile示例
dockerfile:
#第一行写跟第1点中一样的基本镜像
FROM ubuntu:14.04
#这里可以写上你的姓名/昵称
MAINTAINER yourname
#这里可以写上你的制作时间
ENV REFRESHED_AT 2018-01-01
#使用utf-8编码
ENV LANG C.UTF-8
#先写 修改源/更新 【如果必须的话】
#替换源(这里可用sed或者直接COPY一个完整的sources.list来替换)
RUN sed -i 's/http://archive.ubuntu.com/ubuntu//http://mirrors.163.com/ubuntu//g' /etc/apt/sources.list
#进行更新
RUN apt-get update -y
#将环境变量设置为非交互的 【这个看个人】
ENV DEBIAN_FRONTEND noninteractive
#再写 各种安装
#如 安装mysql
RUN apt-get -y install mysql-server
#安装apache2
RUN apt-get -yqq install apache2
#安装php5
RUN apt-get -yqq install php5 libapache2-mod-php5
#安装php扩展
RUN apt-get install -yqq php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl
#再修改一些配置
#对于文件中的替换字符串,多使用sed命令
#例如去掉apache2的列目录漏洞
RUN sed -i 's/Options Indexes FollowSymLinks/Options None/' /etc/apache2/apache2.conf
#然后才是复制文件,不推荐挂载卷
#ADD会自动解压压缩包,而COPY不会
ADD html.tgz /var/www
#剩下一些操作(权限要控制好)
#例如修改某个文件的所有者
RUN chown root:root /var/www/html/x.php
#start.sh为开机启动脚本,里面包含容器开启后要启动的命令
COPY start.sh /root/start.sh
#加上执行权限
RUN chmod +x /root/start.sh
#使用ENTRYPOINT而不使用CMD(CMD容易受run命令最后的命令给影响)
ENTRYPOINT cd /root; ./start.sh
#WEB开放端口默认为80,一般为一个,若有特殊情况,请写明
EXPOSE 80
0x03 一个web题完整的例子:
首先需要一个文件夹,文件目录如下:
-模板
--dockerfile
--docker-compose.yml
--start.sh
--www(这里面放题目的源代码)
---...
---...
dockerfile:
FROM ubuntu:14.04
MAINTAINER Mrkaixin
ENV REFRESHED_AT 2019-8-14
ENV LANG C.UTF-8
#更换源
RUN sed -i 's/http://archive.ubuntu.com/ubuntu//http://mirrors.163.com/ubuntu//g' /etc/apt/sources.list
#更新
RUN apt-get update -y
#防止Apache安装过程中地区的设置出错
ENV DEBIAN_FRONTEND noninteractive
#如 安装mysql
RUN apt-get -y install mysql-server
#安装apache2
RUN apt-get -yqq install apache2
#安装php5
RUN apt-get -yqq install php5 libapache2-mod-php5
#安装php扩展
RUN apt-get install -yqq php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl
#配置Apache信息
RUN echo "ServerName localhost:80" >> /etc/apache2/apache2.conf
#移除Apache初始界面
RUN rm -rf /var/www/html/index.html
RUN sed -i 's/Options Indexes FollowSymLinks/Options None/' /etc/apache2/apache2.conf
#复制本地www文件夹下的文件到apache的网站目录
ADD ./www /var/www/html
COPY start.sh /root/start.sh
RUN chmod +x /root/start.sh
ENTRYPOINT cd /root; ./start.sh
EXPOSE 80
这个dockerfile主要的作用就是,配置lamp环境。
start.sh
sleep 1
#启动mysql
find /var/lib/mysql -type f -exec touch {} ; && service mysql start
#设置mysql的root用户密码
mysqladmin -u root password "root"
mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS Mrkaixin"
#启动apache
/usr/sbin/apache2ctl -D FOREGROUND
#service apache2 start
#/bin/bash
docker-compose.yml
version: '2'
services:
web:
build: .
ports:
- "8000:80"
用docker-compse.yml的想法是,我只需要使用docker-compose -up -d这条命令他就可以自动帮我build镜像,并且可以自动帮我把docker跑到我想要的端口上,是一个非常方便的东西
在www目录下放入index.php
一切都准备好了之后把整个文件夹放入服务器本地 ,回到dockerfile所在目录执行docker-compose up -d
执行后访问公网ip:映射端口
搭建成功
0x04 涉及到数据库操作的题目
目录文件夹如下:
-docker
--dockerfile
--www(题目主要源代码)
---index.html
---index.php
---ctf.sql(mysql文件)
上面的dockerfile基本上没变,可以直接照搬
只需要改一下start.sh就行
修改后的start.sh
sleep 1
#启动服务,例如apache2
#具体的启动命令,视系统环境而定
#/etc/init.d/apache2 start
#为了适应各种docker版本,mysql的启动命令建议如下(mysqld除外)
find /var/lib/mysql -type f -exec touch {} ; && service mysql start
flagfile=/var/www/html/ctf.sql
#if [ -f $flagfile ]; then
#这里就是替换flag值为/root/flag.txt里的值(这是为动态flag做准备)
sed -i "s/flag{x*}/$(cat /root/flag.txt)/" $flagfile
#mysql导入sql文件(newwpasswd只是示例密码)
mysqladmin -u root password "529529"
mysql -uroot -p529529 -e "CREATE DATABASE IF NOT EXISTS ctf"
mysql -uroot -p529529 ctf < $flagfile
#删除sql文件(一般是要删除的) / 如果不是sql文件这里不需要删除
rm -f $flagfile
#fi
/usr/sbin/apache2ctl -D FOREGROUND
#service apache2 start
#/bin/bash
参考链接