Docker Pwn机配置
前言
由于自己的荣耀轻薄本装了双系统(ubuntu20.04和win10),每次在打ctf比赛的时候基本上都是使用ubuntu系统来做pwn和misc,每次做学校的作业基本都要用office之类的工具(ubuntu虽然也有wps支持但是还是挺不习惯的)。加上近期学了docker的部分知识,于是先要用docker+ubuntu+vnc+pwntools的方式配置一台属于自己的docker pwn机。
虽然github上已经有很多版本的pwn机,但是还是想自己动手做一台。
docker中ubuntu容器用的xubuntu-desktop最小安装,加上vnc服务其实看起来还行,本来是打算安装gnome-desktop或者kde的,但是太大并且下载太慢,就没有选择了
docker容器的vnc配置可以参考视频,还有配套的博文
至于配置好了vnc服务之后,还需要配置一系列的pwntools,我们就从这一部分开始了! g'g
我这里直接启动了我之前做好的镜像(/home/woodwhale/.dockerinit是我自己写的一个sh脚本,目的是启动直接开启vnc服务)
docker run --name pwn --hostname pwn -p 15901:5901 --shm-size=1g --user=woodwhale -itd bi0xpwn:v2 /home/woodwhale/.dockerinit
启动后连接vnc的效果:
比虚拟机快了n倍,很爽!
1、docker解封
这一部分我姑且叫他解封,因为docker的容器是精简版本的,所以阉割了很多库和功能,我们首先需要进入容器使用
unminimize
我这里之前已经执行过了,所以没有反映,建议在配置vnc服务之前就输入这个指令,之后输入需要比较久的时间!
2、切换apt源
机房10m的网,如果用ubuntu中国的官方源我只有28kb左右的速度,用了清华的瞬间2mb的速度,虽然在安装32位库的方面非官方源可能出点问题,但是先用网速快的再说!
sudo vim /etc/apt/source.list
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
sudo apt update
3、安装需要的pwntools!
1.git
必须经常在github上下载工具,所以git必装
sudo apt install git
安装完后,初始化一下
git init
git submodule update
2.gcc
编程语言译器,做写c必须的,不解释了
sudo apt install gcc
安装成功后验证:
3.python3-pip
虽然docker在unminimize之后安装了python3,但是没有pip3
sudo apt install python3-pip
4.python2
有些库还是只有python2支持的,所以还是得下一个python2
(懂不懂py2的含金量啊~)
sudo apt install python2
5.curl和wget
我一般用来下载东西的,其实也可以做做web题,post、get请求都是可以的
sudo apt install curl
sudo apt install wget
6.pip2
pip2已经从apt中删除了,通过curl的方式下载一个py文件进行安装
需要用root权限安装pip2,不然有些东西安装不了会失败
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
sudo python2 get-pip.py
验证pip2
7.pwntools
pwntools是一个CTF框架和开发库。它是用Python编写的,设计用于快速原型和开发,旨在使开发编写尽可能简单
直接使用pip3和pip2安装python3和python2的版本~
pip3 install pwntools
pip2 install pwntools
8.pwndbg
我个人做题都是用pwndbg的,所以这里配置pwndbg的环境
首先去git上克隆一下
git clone https://github.com/pwndbg/pwndbg.git
我这里机房的网给墙了,所以直接用win主机在官网下载zip包了
然后使用docker的cp指令直接存到容器中
docker cp .\pwndbg-dev.zip pwn:/home/woodwhale/workspace/ctftools/pwntools
到容器中使用unzip指令解压
woodwhale@pwn:~/workspace/ctftools/pwntools$ unzip pwndbg-dev.zip
然后到文件夹中,输入如下开始安装必要环境
chmod +x ./setup.sh
./setup.sh
等待一会就安装好啦!
验证安装成功
9.pwngdb
pwngdb可以配合pwndbg使用,增加了很多方法来查看,可以参考这篇博文进行配置
首先克隆下来,由于网络问题我还是在win宿主机上下载了zip包,通过docker cp指令移动到容器中
git clone https://github.com/scwuaptx/Pwngdb.git
docker cp .\pwngdb.zip pwn:/home/woodwhale/workspace/ctftools/pwntools
仍然是unzip
然后就是配置主目录下的.gdbinit文件
我的配置如下:
source /home/woodwhale/workspace/ctftools/pwntools/pwndbg/gdbinit.py
source /home/woodwhale/workspace/ctftools/pwntools/Pwngdb/pwngdb.py
source /home/woodwhale/workspace/ctftools/pwntools/Pwngdb/angelheap/gdbinit.py
define hook-run
python
import angelheap
angelheap.init_angelheap()
end
end
三个source需要正确的位置
10.one_gadget
一键获取shell的one_gadget工具!
首先需要安装ruby这门语言,在其包管理工具gem中下载安装one_gadget
sudo apt install ruby ruby-dev
sudo gem install one_gadget
验证安装
11.seccomp-tools
seccomp-tools用来看沙箱题,也是通过gem来安装!
sudo gem install seccomp-tools
验证安装成功
12.LibcSearcher
老版本的 libcsearcher就不说了,这里用的是新版本通过libcdatabase在线查询的libcsearcher
github项目地址
安装也很简单,使用pip3就可以简单一键安装!
pip3 install LibcSearcher
13.patchelf
更改libc的神器!
安装也很简单!
sudo apt install patchelf
验证安装:
14.glibc-all-in-one
配合patchelf使用,基本都能用!
github项目地址
由于网路问题,我是用win宿主机下载zip文件docker cp进入容器
进入容器unzip一下
将其中的updata_list文件的首行改为python3,因为我这里无法识别python这个指令(只有python3和python2)
然后在当前文件夹下打开终端,给所有可执行文件赋予权限后下载libc全家桶
chmod +x *
./update_list
然后就是一顿download
配合我自己写的一个libcpatcher.py脚本,可以进行libc选择!
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
import sys, os, subprocess
LIBS_PATH = "/home/bi0x/ctftools/pwntools/glibc-all-in-one/libs/" # 使用自己glibc/libs的目录
BINARY = ""
LIBC = ""
BIT = ""
def check_args():
if not (3 >= len(sys.argv) >= 2) :
print("\033[31mParameter error!Try again!\033[0m")
print("\033[35mUsage : libcpatcher elfname (libc_addr)\033[0m")
print("\033[35mExample : libcpatcher hacknote 2.23-0ubuntu3_amd64\033[0m")
exit(0)
def choose_libc():
print("\033[32mYou can choose: \033[0m")
libs_list = os.listdir(LIBS_PATH)
libs_list.sort()
for i in range(0,len(libs_list)):
print(f"\033[31m{i+1}\033[0m \033[33m:\033[0m \033[36m{libs_list[i]}\033[0m")
i = int(input("\033[32mChoose: \033[0m"),10) - 1
if i >= len(libs_list) :
print("\033[31mChoose error!Try again!\033[0m")
exit(0)
return libs_list[i]
def init():
global BINARY, LIBC, BIT
BINARY = sys.argv[1]
LIBC = sys.argv[2] if len(sys.argv) == 3 else choose_libc()
BIT = subprocess.check_output([f"file {BINARY}"],shell=True).decode().split(" ")[2]
def libcpatcher():
global BINARY, LIBC, BIT
error = "\033[31mText file busy!\033[0m"
try:
print("\n\033[31mBefor patch \033[0m")
print(subprocess.check_output([f"ldd {BINARY}"],shell=True).decode())
if "64" in BIT and "amd64" in LIBC:
subprocess.check_output([f"patchelf --set-rpath {LIBS_PATH}{LIBC}/:/libc.so.6 {BINARY}"],shell=True)
subprocess.check_output([f"patchelf --set-interpreter {LIBS_PATH}{LIBC}/ld-linux-x86-64.so.2 {BINARY}"],shell=True)
elif "32" in BIT and "i386" in LIBC :
subprocess.check_output([f"patchelf --set-rpath {LIBS_PATH}{LIBC}/:/libc.so.6 {BINARY}"],shell=True)
subprocess.check_output([f"patchelf --set-interpreter {LIBS_PATH}{LIBC}/ld-linux.so.2 {BINARY}"],shell=True)
else:
error = "\033[31mlibc Bit error!Try again!\033[0m"
exit(0)
print("\033[32m======================================================================\033[0m \n")
print("\033[31mAfter patch \033[0m")
print(subprocess.check_output([f"ldd {BINARY}"],shell=True).decode())
except:
print(error)
exit(0)
def main():
check_args()
init()
libcpatcher()
if __name__ == '__main__':
main()
15.补充
python3和python2的pwntools库需要pathlib2的支持,所以我们还得安装一下
pip3 install pathlib2
pip2 install pathlib2
另外,单纯的安装pwntools之后可能出现工具无法使用的情况,例如无法使用checksec和ROPgadget,我们可以在.bashrc文件中导入~/.local/bin
的path,因为这个文件夹中都是我们的pwntools的小工具,导入到环境变量中就可以使用啦
在~/.bashrc
最后加入这句话
export PATH=$PATH:/home/woodwhale/.local/bin
4、docker commit
最后当然是将我们的配置好的docker pwn打包成新的镜像啦
docker commit <id/name> 仓库:名字
5、vnc的补充
如果觉得每次都需要开启vncviewer来连接麻烦,可以使用novnc来进行web端的远程连接
首先
sudo apt install novnc
然后
websockify -D --web=/usr/share/novnc/ 6901 localhost:5901
我把这两句运行指令直接放在了.dockerinit中,容器运行就启动
后话
配置了这么久的docker pwn终于是结束了,之后试试用其他的设备运行这个镜像生成的容器
tar包拉成镜像命令:
docker load -i bi0xpwn.tar
运行指令:
docker run --name bi0xpwn --hostname pwn -p 15901:5901 -p 16901:6901 --shm-size=1g --user=woodwhale -it bi0xpwn:finally /home/woodwhale/.dockerinit