这种搭建方法需要你先装好docker,关于docker命令的安装这里就不过多介绍了,下面讲的是基于你已经安装好了docker,我们再使用xinetd在CTFd上部署pwn题目。
首先讲一下我自己搭建pwn题的一些经历,我最开始参考的是用socat命令来搭,但是我没有成功,依旧是端口的问题或者是命令执行不成功,停在了那里无法执行,我也试过pwn_deploy_chroot以及相关的,但是也是命令执行卡住了,以及由于我没有注册GitHub账号,导致无法克隆那个工具,于是我最终还是选择用的xinetd来搭建。
第一步,我们先克隆xinetd
git clone https://github.com/Eadom/ctf_xinetd
克隆好之后我们进入该目录,如下图所示
下面讲的东西请大家务必耐心看完,先不要着急去搭建, 如果只是为了搭建我直接就给你们放几个命令就行了,还是真心希望各位能顺利部署pwn题目。
这里要先给大家说清楚一个东西,我们搭建的这种CTF靶场一般是在80端口
而实际上我们的题目部署所在的端口是被映射到了一个80端口(网页服务)
使用 docker ps 命令可以查看开启的容器
如下图,蓝色标注为容器名,红色标注为端口间的映射关系
关于ctf_xinetd下的目录介绍:
bin目录下面放的是flag和pwn题目程序文件;
默认是helloworld和flag,我们可以将它们替换成我们自己想要的flag和题目程序
(注意在做这些替换之前不要去创容器、拉取镜像这些,什么意思呢,如果你已经创好了这道题的容器,那么它里面放的就是helloworld和默认flag的内容,这时你再去bin目录里作更改是无效的,bin目录里内容虽然改了,但是容器里的东西是没改的,并且,对于容器中来说,helloworld和flag并不在bin目录,而是在 /home/ctf 目录下)
关于更换flag和pwn程序我们有两种方法:
(1)在创建容器之前,替换bin目录下的内容;
直接改flag的内容或者自己拉一个进去,再拉一个题目程序(我这里叫stack)进去,并删掉原来的程序(helloworld),注意,stack需要有可执行权限,我们使用chmod命令加权,一般加到750就够了,加777权限更高但是风险也上去了,这里建议加750就行。
chmod 750 stack
加权之后我们发现程序名变成了绿色,说明该程序已经具有可执行权限
(2)哪怕我们创建好了题目容器,后面又需要更换flag或者题目程序,我们可以使用docker cp 命令来替换:
docker cp 程序所在位置(如果你是在文件当前路径那就直接用文件名) 容器名:要添加到的位置
比如我们更换flag:
docker cp flag eb5d199dfc0f:/home/ctf #eb5d199dfc0f是你自己这道题的容器名
但是更建议各位创建容器之前就对bin目录里内容进行替换
接下来我们还需要改另外两个文件,如果不改,你只能连接本地,即nc 0.0.0.0 才能访问,而将0.0.0.0替换成你靶场地址时就无法访问。
因为我们下载的这个 ctf_xinetd 它里面默认端口是被映射到了9999,而我们前面说了,我们需要的是80,因此我们要将所有的9999替换成80。
vim ctf.xinetd
将port改为80
(这里顺便把./后面的hellworld改成你放到bin目录下的程序名)
修改后wq保存退出
vim Dockerfile
将expose改为80并保存退出
现在我们才开始创建容器:
docker build -t "stack" .
这个stack是你创建的镜像的名称,应该是可以随便取的,但是我用的是pwn程序名,方便之后的管理和识别。
创建好后,我们启用它:
docker run -d -p "0.0.0.0:8090:80" -h "stack" --name="stack" stack
这里的stack换成你自己的bin目录下的pwn程序名,8090换成你自己希望放的一个未使用的端口。
启用成功后我们便可看到这个容器
我们直接nc 靶场地址 端口
使用exp脚本测试一遍,没有任何问题,可以成功建立连接并获取flag
至此,我们在终端的部署完成
接下来只需将题目添加到CTFd前端即可
填写好相关的信息,上传题目程序,给出nc的地址和端口
最终效果
至此我们基于xinetd完成了对pwn题目的所有部署
关于web题目的部署,可以参考我的另一篇博客 http://t.csdn.cn/cywRR
此外,也欢迎各位来我自己搭的靶场玩 ,杂项和密码学那些都比较简单,很容易AK,主要是针对想入门CTF的朋友,特别是杂项的题目,很具有总结性,也都是原创题,算是我自己以前对杂项知识的一个简单总结,Welcome! 靶场地址 MyonCTF