之前是为了学习搭pwn题的环境稍微碰了下docker,但是因为kali上的gdb被我搞得问题很大,再加上不能完全卸载重装,索性想着搞一个pwn工具的集成环境,一劳永逸,docker无疑是个好东西,顺便也记录下搭建pwn题的过程吧
pwn环境部署
最基础的方法是socat, socat tcp-l:9999,fork exec:./pwn1
没有timeout,连得人多多半就爆炸了
所以选择:xinted + docker
xinted
xinted从权限到服务配置都做好了一个dockerfile,build即可
1 | git clone https://github.com/Eadom/ctf_xinetd.git |
docker 安装
因为没有用ubuntu,kali等其他的debian系等等没法直接 sudo apt-get install docker-ce
kali最后成功安装docker的方法:
在/etc/apt/sources.list 中添加
1 | deb http://http.debian.net/debian jessie-backports main |
更新源并安装即可
1 | apt-get update |
ubuntu:1
2
3
4
5
6curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
sudo echo -e "{\n
\"registry-mirrors\": [\"https://docker.mirrors.ustc.edu.cn/\"]
}" >/etc/docker/daemon.json
sudo systemctl restart docker
配置docker环境
- 将bin文件放置到bin目录下
- 修改flag内容
- 修改ctf.xinted的服务:
port = 指定端口
server_args = –userspec=1000:1000 /home/ctf ./binname
build dockerfile
1 | docker build -t "binname" . |
将镜像跑起来就ok了
pwn docker
一个集成pwn常用工具的docker,暂时用的是pwndocker,不过比较臃肿,之后再自己搭建一个
使用
一般刚开机docker未打开,使用service docker start
打开服务
pull
1 | docker pull skysider/pwndocker |
docker images
可以看到已经在仓库里了
1 | /pwn/docker# docker images |
各项含义:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
docker run -t -i skysider/pwndocker
直接进入bash
1 | ~/pwn/docker# docker run -t -i skysider/pwndocker |
*b11ff1440061 是container的id*
- 外部文件要往container里复制,使用
1 | docker cp /path/file b11ff1440061: /path |
当然b11ff1440061 换成container的id
- 因为别人的docker工具不一定适合自己,需要自己再安装什么的,但是一般安装完退出后就又没有了,当然不能每次都重装
有两种办法:
- 在container中安装完以后,exit
1 | docker commit b11ff1440061 pwndocker |
同时可以使用
-m 来指定提交的说明信息,跟我们使用的版本控制一样
-a 可以指定更新的用户信息
之后是用来创建镜像容器的id 最后指定目标镜像仓库名和tag信息
这样可以将修改完的另存为新的image
1 | ~# docker images |
- 使用dockerfile重新build
像这里可以举例,编辑dockerfile:
1 | FROM skysider/pwndocker |
From 指定镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。
EXPOSE 可以指定开放端口
编辑完后1
docker build -t pwndocker .
按理说这样子就可以了。。但是我这里会有个报错The command '/bin/sh -c apt-get install vim' returned a non-zero code: 1
仍未解决
小事
为了新生赛出了道简单的python 沙箱逃逸,但是为了把部署进docker就遇到了各种问题,貌似是对python文件的支持不太好,都是在bash里面可以运行,但是在外部nc就有各种各样的问题,编译为pyc也有问题,尝试pyinstaller编译为elf,又说是不允许创建临时文件…尝试使用nuitka编译为elf,同时得到了一堆so文件,前面是即使把so放进去并设置好索引,在docker外都会提示找不到库,后面发现整个得到的elf文件就有问题。
回头尝试查找问题,发现直接使用socat都无法运行起来,但是尝试简单的python文件运行就没有问题,排除后发现代码中调用exec后台执行的时候就会有问题。