前段时间经历了自己人生中的第一出题,在出题过程中遇到了很多问题,而网上相关的教程很少,于是打算记录一下自己出题的过程以及踩过的坑。
- 首先是安装docker
用官方的脚本直接就可以安装:
代码语言:javascript复制curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
这个命令可以安装好一切,至于网上说用apt-get install docker docker-compose
来安装docker-compose,千万别这样,这样会破坏依赖关系(我的ubuntu就这样被干烂了哈哈哈),安装好了以后运行命令sudo docker ps -a
没报错就是成功了。
这里要注意,所有docker相关的命令前面一定要加sudo才能运行成功(我一开始不知道,咋运行都是报错,还以为安装的时候啥东西出错了)
不加sudo会报如下的错误:
- ctf_xinetd的下载与使用
这是Github上的一个开源项目:ctf_xinetd
直接将这个项目clone下来:
代码语言:javascript复制git clone https://github.com/Eadom/ctf_xinetd.git
会发现在当前目录下生成了一个文件夹:
将编译好的ELF文件(如果有libc也一起放进去),放入此文件夹的bin目录中,并且把flag改成想要的内容,然后在ctf_xinetd的同级目录下创建docker-compose.yml文件:
其中的内容为:
代码语言:javascript复制version: '3'
services:
pwn:
build: ./
image: pwn
ports:
- "60001:9999"
pids_limit: 1024
# cpus: 0.5
restart: unless-stopped
# privileged: true
这里面的image名字要与后面创建的docker image的名字对应。
然后打开ctf.xinetd文件,将图中框起来的部分的名字改为前一步中在bin目录中放入的ELF的名字:
在ctf_xinetd的目录下运行命令:
代码语言:javascript复制docker build -t "pwn" .
来创建一个镜像,也就是image,这里的名字要和docker-compose中写的名字一样,也就是说你docker-compose文件里的image名字写的是什么,这里build的image名就要叫啥。
这里的build命令可能会报出如下的错误:
这是由于使用的ubuntu版本高于了18.04导致的,解决方法就是打开ctf_xinetd文件夹下的dockerfile文件,并将图纸框起来的部分删除即可:
这里值得一提的是,如果需要更改docker所使用的ubuntu版本,也是在dockerfile的最上面更改即可:
然后仍然在此目录下运行命令:
代码语言:javascript复制docker run -d -p "127.0.0.1:8888:9999" -h "pwn" --name="pwn" pwn
这里的-p后面的内容就是把9999端口映射到8888端口,这里的端口号可以改。
–name后面的内容是指定容器的名称,而-h是指定容器的hostname,而最后的那个pwn,则是image的名字,所以这里要根据你前面创建的镜像名进行更改。
注意,这里其实是手动映射了端口,其实直接使用docker-compose文件来映射端口也是可以的。
运行之后就会发现docker已经成功运行了,到这里题目部署就完成了,在题目的exp中写上:
代码语言:javascript复制io=remote("ip",port) #port为映射后的端口,在这里是8888
即可发现能够成功打通并拿到测试用的flag。