前言
一开始接触pwn的时候,我们要么本地调试,要么自己用socat将程序启动起来远程调试
最近去搞pwn培训,发现将pwn题一个一个部署起来还是比较繁琐,除了权限还要考虑其他东西
后来一顿搜索,看看有无别人的解决方案,发现一个xinted + docker的方案:
https://github.com/Eadom/ctf_xinetd
但是对于这个我发现了一些缺点:
- 需要自己配置flag
- 需要自己修改ctf.xinetd文件
- 没有docker-compose.yml方便我们去启动
- 一次只能部署一个题目(我想一键将5道题甚至是10道题同时部署在一个docker容器中)
- 安全性基于chroot,而且只给了ls,cat和sh三个程序,已经很安全了,但是sh还是存在fork炸弹的可能
于是我根据自己需要,写了一个项目:https://github.com/giantbranch/pwn_deploy_chroot
pwn_deploy_chroot介绍
特点
- 一次可以部署多个题目到一个docker容器中
- 自动生成flag,并备份到当前目录
- 也是基于xinted + docker + chroot
- 利用python脚本根据pwn的文件名自动化地生成3个文件:pwn.xinetd,Dockerfile和docker-compose.yml
- 在/bin目录,利用自己编写的静态编译的catflag程序作为/bin/sh,这样的话,system(“/bin/sh”)实际执行的只是读取flag文件的内容,完全不给搅屎棍任何操作的余地
- 默认从10000端口监听,多一个程序就+1,起始的监听端口可以在config.py配置,或者生成pwn.xinetd和docker-compose.yml后自己修改这两个文件
环境配置
1 | # 安装docker |
使用
只需要3步:
- 将所有pwn题目放入bin目录(注意名字不带特殊字符,因为会将文件名作为linux用户名)
- python initialize.py
- docker-compose up –build -d
下面给下详细操作:
1、将你要部署的pwn题目放到bin目录
我的项目已经将一个程序copy了3分作为示例,注意文件名不要含有特殊字符,文件名建议使用字母,下划线,横杆和数字,当然全字母的当然最好了
1 | root@instance-1:~/pwn_deploy_chroot# ls bin/ |
2、运行initialize.py
运行脚本后会输出每个pwn的监听端口,
1 | root@instance-1:~/pwn_deploy_chroot# python initialize.py |
文件与端口信息,还有随机生成的flag默认备份到flags.txt
1 | root@instance-1:~/pwn_deploy_chroot# cat flags.txt |
3、启动环境
请使用root用户执行命令
1 | docker-compose up --build -d |
不出意外,题目就启动起来了
1 | root@instance-1:~/pwn_deploy_chroot# netstat -antp | grep docker |
我们测试一下pwn1,看看效果
可以看到,虽然执行的是system(“/bin/sh”),但是实际功能只是输出flag,这样就非常安全了