战队招新赛即将来临,题目自然是要原创的(大嘘)至少要自己打包部署,虽然自己水平不咋地但是也只能硬着头皮上了
但是在出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容器打包、备份镜像和文件传输
- 菜鸟教程是一个绝佳的中文入门使用教程
- 也可以参阅LUG(中国科学院大学Linux用户协会)编写的入门教程
- 如果需要学习进阶知识,可以查阅docker官方文档
- 如果你是个造轮子爱好者,不妨试试亲手实现一个迷你docker:Fewbytes/rubber-docker、《自己动手写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
- 如果想批量部署可以使用giantbranch大佬的项目giantbranch/pwn_deploy_chroot
我们只需将程序和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,限于能力我并未尝试
手动部署
(坑)
Comments NOTHING