之前是为了学习搭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
2
apt-get update   
apt-get install docker.io

ubuntu:

1
2
3
4
5
6
curl -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
2
docker build -t "binname" . 
docker run -d -p "0.0.0.0:9999:9999" -h "biname" --name="binname" binname

将镜像跑起来就ok了

pwn docker

一个集成pwn常用工具的docker,暂时用的是pwndocker,不过比较臃肿,之后再自己搭建一个

使用

一般刚开机docker未打开,使用service docker start打开服务

  1. pull
1
docker pull skysider/pwndocker
  1. docker images 可以看到已经在仓库里了
1
2
3
/pwn/docker# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
skysider/pwndocker latest a24dde07a423 6 days ago 2.02GB

各项含义:

REPOSITORY:表示镜像的仓库源

TAG:镜像的标签

IMAGE ID:镜像ID

CREATED:镜像创建时间

SIZE:镜像大小
  1. docker run -t -i skysider/pwndocker直接进入bash
1
2
~/pwn/docker# docker run -t -i skysider/pwndocker
root@b11ff1440061:/ctf/work#
*b11ff1440061 是container的id*
  1. 外部文件要往container里复制,使用
1
docker cp /path/file b11ff1440061: /path

当然b11ff1440061 换成container的id

  1. 因为别人的docker工具不一定适合自己,需要自己再安装什么的,但是一般安装完退出后就又没有了,当然不能每次都重装

有两种办法:

  • 在container中安装完以后,exit
1
docker commit  b11ff1440061 pwndocker

同时可以使用

-m 来指定提交的说明信息,跟我们使用的版本控制一样
-a 可以指定更新的用户信息
之后是用来创建镜像容器的id 最后指定目标镜像仓库名和tag信息

这样可以将修改完的另存为新的image

1
2
3
4
~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
pwndocker latest 7c0fa09ee004 12 seconds ago 2.05GB
skysider/pwndocker latest a24dde07a423 6 days ago 2.02GB
  • 使用dockerfile重新build

像这里可以举例,编辑dockerfile:

1
2
3
FROM skysider/pwndocker

RUN apt-get install vim

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后台执行的时候就会有问题。