zoukankan      html  css  js  c++  java
  • docker出题和编写dockerfile

    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
    
    

    参考链接

    http://github.mrkaixin.computer/2019/08/11/如何用dockerfile灌题/

    https://www.kingkk.com/2018/08/docker-笔记/

  • 相关阅读:
    namespaces in C++
    cout如何刷新缓冲区
    Journey CodeForces 1336F[data structures divide and conquer graphs trees]
    using ll=long long;
    Kaavi and Magic Spell CodeForces 1337E【dp strings】
    摸个🐟
    gcc的几个有用的处理二进制位的内置函数
    Yui and Mahjong Set CodeForces 1337F 【interactive】交互式题
    C++ auto 的使用
    2005年微软十大安全漏洞 java程序员
  • 原文地址:https://www.cnblogs.com/wangtanzhi/p/12510509.html
Copyright © 2011-2022 走看看