战队招新赛即将来临,题目自然是要原创的(大嘘)至少要自己打包部署,虽然自己水平不咋地但是也只能硬着头皮上了
但是在出Web题和PWN题时发现平台必须上传docker镜像归档,所以临时学了点docker,期间踩了不少坑,这里记录一下

docker的简单使用

docker for Windows

现今提起虚拟化技术就不得不提docker

使用docker可以为我们省去很多配置环境的烦恼,本站的靶场、书库以及内网穿透服务就是使用docker部署的

在Linux使用docker相当方便,而如果想要在Windows使用docker则需要小小折腾一下

首先,在Windows平台使用docker需要开启Hyper-V或使用WSL2,网上资料很多这里就不细说了,这里极力推荐使用WSL2,毕竟docker本来就是基于Linux内核的,使用Linux shell操作更有连贯性

  • 注意:WSL2相当于一个拥有完整内核的Linux虚拟机,使用时务必注意内存占用

然后需要我们下载安装docker的桌面端Docker Desktop,在注重GUI的Windows里一个可视化的面板能为我们助力不少

然后在Settings->Resources->WSL Intergration里勾选选项并选择你希望使用的WSL Linux发行版

现在,打开Docker Desktop后在cmd、powershell或WSL里输入docker就可以使用docker了

Docker和WSL一样默认安装在C盘,如果你希望将其迁移到其他分区,可以参考这篇博客

如果你想搜寻适合自己使用的镜像,你可以登录DockerHub或者使用命令查询

docker search [NAME]

至于换源之类的就烦请自行查询资料了我选择科学上网完全没有这方面的烦恼(逃)

docker容器打包、备份镜像和文件传输

容器打包成镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS:

  • -a:提交的镜像作者
  • -c:使用Dockerfile指令来创建镜像
  • -m:提交时的说明文字
  • -p:在commit时,将容器暂停

举例:

$ docker commit -m "test_shell" a80a8f312440 testshell:v0
sha256:c10326e00f22732d73eb602a22fd7ec73cf69852bf1549c7b2631167068df0a4

执行后镜像列表中就会生成一个我们打包的镜像如下

$ docker images
REPOSITORY     TAG       IMAGE ID       CREATED         SIZE
testshell      v0        c10326e00f22   2 hours ago     368MB

备份镜像

想要对打包出来的镜像进行转移、异地部署则需要我们将镜像文件备份成归档文件

docker save -o [PATH/FILENAME] name:tag

举例:

$ docker save -o ../testnc.tar testnc:v0

此时我们的上级目录就会生成一个归档文件(.tar)

文件传输

如何实现本地文件与容器中的文件互传呢

docker cp [FILEPATH] CONTAINER:[PATH]         //本地->容器
docker cp CONTAINER:[FILEPATH] [FILEPATH]     //容器->本地

CTF题目部署

Web

自动部署

对于Web题环境我目前选择的镜像是lamp镜像(Linux、Apache、MySQL、PHP)

$ docker search lamp
NAME                                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mattrayner/lamp                           A simple LAMP docker image running the prere…   317                  [OK]
linode/lamp                               LAMP on Ubuntu 14.04.1 LTS Container            182              
tutum/lamp                                Out-of-the-box LAMP image (PHP+MySQL)           150              
fauria/lamp                               Modern, developer friendly LAMP stack. Inclu…   119                  [OK]
greyltc/lamp                              a super secure, up-to-date and lightweight L…   103
    [OK]

比如这次我选择的是tutum/lamp,大约有四百多MB

页面的内容扔进var/www/html/即可,与服务器基本一致

手动部署

当然,使用现成的镜像有时无法满足Web题对轻量和个性化的需求,我们也可以选择使用原生系统镜像手动搭建

(坑)

权限设置

Apache
Nginx

(坑)

PWN

自动部署

对于pwn题的环境限于能力我并不能自主搭建,这里使用了大佬的项目Eadom/ctf_xinetd

我们只需将程序和flag放入bin并修改ctf.xinetd文件的内容即可

ctf.xinetd:

service ctf
{
    disable = no
    socket_type = stream
    protocol    = tcp
    wait        = no
    user        = root
    type        = UNLISTED
    port        = 9999(端口)
    bind        = 0.0.0.0(回环地址)
    server      = /usr/sbin/chroot
    # replace helloworld to your program
    server_args = --userspec=1000:1000 /home/ctf ./你的程序
    banner_fail = /etc/banner_fail
    # safety options
    per_source	= 10 # the maximum instances of this service per source IP address
    rlimit_cpu	= 20 # the maximum number of CPU seconds that the service may use
    #rlimit_as  = 1024M # the Address Space resource limit for the service
    #access_times = 2:00-9:00 12:00-24:00
}

然后在此目录内执行命令

docker build -t "IMAGE_NAME" .             //别忘了最后那一个点

然后就会自动帮我们生成一个基于Ubuntu16.04的PWN题镜像

当然,光是如此往往无法满足PWN题的需求

比如:docker原生的Ubuntu16.04的libc版本很低,我们在较新发行版内编译的程序往往无法运行(glibc只能向下兼容)

$ ldd --version
ldd (Ubuntu GLIBC 2.27-3ubuntu1.6) 2.27

对此我大概有两种方案

  • 在docker原生的Ubuntu16.04内编译程序
  • gcc指定libc文件编译

第一种方案需要在容器内自行安装gcc,而且需要互传文件,较为繁琐且限制多多

apt-get update
apt-get install gcc

原生的Ubuntu16.04的libc版本低于自动部署的容器的版本,亲测程序可以运行

$ ldd --version
ldd (Ubuntu GLIBC 2.23-0ubuntu11.3) 2.23

第二种方案需要我们自行下载并编译glibc源码,我暂且尚未尝试

当然,我们也可以修改dockerfile,限于能力我并未尝试

手动部署

(坑)