如何安全快速地部署多道ctf pwn比賽題目
阿新 • • 發佈:2018-12-14
前言
一開始接觸pwn的時候,我們要麼本地除錯,要麼自己用socat將程式啟動起來遠端除錯
最近去搞pwn培訓,發現將pwn題一個一個部署起來還是比較繁瑣,除了許可權還要考慮其他東西
後來一頓搜尋,看看有無別人的解決方案,發現一個xinted + docker的方案:
但是對於這個我發現了一些缺點:
- 需要自己配置flag
- 需要自己修改ctf.xinetd檔案
- 沒有docker-compose.yml方便我們去啟動
- 一次只能部署一個題目(我想一鍵將5道題甚至是10道題同時部署在一個docker容器中)
- 安全性基於chroot,而且只給了ls,cat和sh三個程式,已經很安全了,但是sh還是存在fork炸彈的可能
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後自己修改這兩個檔案
環境配置
# 安裝docker
curl -s https://get.docker.com/ | sh
# 安裝 docker compose 和git
apt install docker-compose git
# 下載
git clone https://github.com/giantbranch/pwn_deploy_chroot.git
使用
只需要3步:
- 將所有pwn題目放入bin目錄(注意名字不帶特殊字元,因為會將檔名作為linux使用者名稱)
- docker-compose up --build -d
下面給下詳細操作:
1、將你要部署的pwn題目放到bin目錄
我的專案已經將一個程式copy了3分作為示例,注意檔名不要含有特殊字元,檔名建議使用字母,下劃線,橫杆和數字,當然全字母的當然最好了
[email protected]:~/pwn_deploy_chroot# ls bin/
pwn1 pwn1_copy1 pwn1_copy2
執行指令碼後會輸出每個pwn的監聽埠,
[email protected]:~/pwn_deploy_chroot# python initialize.py
pwn1's port: 10000
pwn1_copy1's port: 10001
pwn1_copy2's port: 10002
檔案與埠資訊,還有隨機生成的flag預設備份到flags.txt
[email protected]:~/pwn_deploy_chroot# cat flags.txt
pwn1: flag{93aa6da5-db45-46fa-a2e1-af2be6698692}
pwn1_copy1: flag{f9966c51-52e4-4212-ac44-97bf16620b41}
pwn1_copy2: flag{b17949ce-e3fa-4ca7-9fcc-44b8dc997cb3}
pwn1's port: 10000
pwn1_copy1's port: 10001
pwn1_copy2's port: 10002
3、啟動環境
請使用root使用者執行命令
docker-compose up --build -d
不出意外,題目就啟動起來了
[email protected]:~/pwn_deploy_chroot# netstat -antp | grep docker
tcp6 0 0 :::10002 :::* LISTEN 19828/docker-proxy
tcp6 0 0 :::10000 :::* LISTEN 19887/docker-proxy
tcp6 0 0 :::10001 :::* LISTEN 19873/docker-proxy
我們測試一下pwn1,看看效果
可以看到,雖然執行的是system("/bin/sh"),但是實際功能只是輸出flag,這樣就非常安全了