1. 程式人生 > >如何安全快速地部署多道ctf pwn比賽題目

如何安全快速地部署多道ctf pwn比賽題目

前言

一開始接觸pwn的時候,我們要麼本地除錯,要麼自己用socat將程式啟動起來遠端除錯

最近去搞pwn培訓,發現將pwn題一個一個部署起來還是比較繁瑣,除了許可權還要考慮其他東西

後來一頓搜尋,看看有無別人的解決方案,發現一個xinted + docker的方案:

但是對於這個我發現了一些缺點:

  1. 需要自己配置flag
  2. 需要自己修改ctf.xinetd檔案
  3. 沒有docker-compose.yml方便我們去啟動
  4. 一次只能部署一個題目(我想一鍵將5道題甚至是10道題同時部署在一個docker容器中)
  5. 安全性基於chroot,而且只給了ls,cat和sh三個程式,已經很安全了,但是sh還是存在fork炸彈的可能

pwn_deploy_chroot介紹

特點

  1. 一次可以部署多個題目到一個docker容器中
  2. 自動生成flag,並備份到當前目錄
  3. 也是基於xinted + docker + chroot
  4. 利用python指令碼根據pwn的檔名自動化地生成3個檔案:pwn.xinetd,Dockerfile和docker-compose.yml
  5. 在/bin目錄,利用自己編寫的靜態編譯的catflag程式作為/bin/sh,這樣的話,system("/bin/sh")實際執行的只是讀取flag檔案的內容,完全不給攪屎棍任何操作的餘地
  6. 預設從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步:

  1. 將所有pwn題目放入bin目錄(注意名字不帶特殊字元,因為會將檔名作為linux使用者名稱)
  2. 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,這樣就非常安全了

感謝