? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ??
?寫在前面
╔══════════════════════════════════════════════════════════════════════════╗
哈嘍大家好!我是Myon,趁著我的云服務器還沒過期,這次給大家出一期很詳細的CTF比賽的靶場搭建以及關于Web賽題的制作與docker環境的部署教程,由于本人能力有限,也只能給大家講一些基礎簡單的東西,歡迎大家在評論區互相交流學習,希望通過這篇博客大家能學到一些新東西,也期待大家的關注和支持!
╚══════════════════════════════════════════════════════════════════════════╝
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ??
因為這種CTF的靶場我之前搭過,如果你們看過我之前寫的博客就知道,之前介紹的是單純基于CTFd搭建,而這次是基于H1ve(這個外觀看著更好)。我們學校上次的CTF比賽就是我負責搭建和運維的,以及Pwn和Web賽題的環境部署,后面我會一并介紹。
先給大家看一下成品效果圖
首頁:
排行:
challenges:
公告:
寫這篇博客主要是對之前一些內容的補充和總結吧,如果在閱讀過程中有不懂的也歡迎大家參考我前面的文章,在《網站搭建》專欄里,再次感謝大家的支持和關注!
?文章開始前給大家分享一個學習人工智能的網站,通俗易懂,風趣幽默
人工智能https://www.captainbed.cn/myon/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
使用服務器:centos8? ? ? ? ? ? ? ?OK正文開始? ??????
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
目錄
Part1、CTF靶場搭建
1、從github上克隆H1ve
2、安裝 docker
3、安裝 python-pip?
4、安裝 docker-compose?
5、拉取鏡像并啟動 Single Mode
6、將H1ve整個目錄下的所有容器設置為自啟動
Part2、Web賽題制作與終端docker環境部署
1、題目文件的制作
(1)files文件夾
(2)Dockerfile
?(3)docker-compose.yml
2、docker環境部署
3、賽題前端部署
4、終端賽題運維
Part1、CTF靶場搭建
如果是新的服務器是沒有git命令的,我們先安裝
yum install git
1、從github上克隆H1ve
位置大家隨便放就行了,我這里是在root目錄下創了一個Myon的文件夾然后克隆到里面
git clone https://github.com/D0g3-Lab/H1ve.git
克隆好之后,我們還需要先安裝一些東西
設置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2、安裝 docker
yum install -y docker-ce
?看到complete代表安裝完成
我們查看一下docker的版本并設置開機自啟動
docker versionsystemctl start dockersystemctl enable docker
接著我們安裝 docker-compose
(這個docker-compose命令在后面拉取鏡像以及賽題的環境時會經常用到)
3、安裝 python-pip?
??????????????????????????????????? ??????????????????????????????????? ???
注意這里默認安裝的pip會導致一個錯誤,先不要執行下面命令,先看后面的報錯解釋
默認安裝的是Python2.7的版本,而這里我們需要Python3版本的pip
??????????????????????????????????? ???????????????????????????????????????
yum -y install epel-releaseyum -y install python-pip
看到complete則代表安裝成功,我們也可以使用命令檢查一下
pip -V
但是當我們嘗試安裝?docker-compose 時就會遇到報錯
pip install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple
大概意思就是我們的pip版本太老了,找不到合適的?docker-compose 版本滿足
?嘗試升級pip版本?
pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install --upgrade pip
但是大概率你們會遇到以下的報錯:
Could not find a version that satisfies the requirement docker-compose (from versions: )
No matching distribution found for docker-compose
You are using pip version 8.1.2, however version 23.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
解決方法:安裝python3的pip
由上面pip -v我們知道默認安裝的是Python2.7的版本
因此這里我們安裝Python3的pip并且進行升級
yum install python3-pippip3 install --upgrade pip
可以看到 pip 成功升級到21.3.1?
?之后的pip操作都用pip3代替
4、安裝 docker-compose?
pip3 install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple
可以看到安裝成功,至于那個warning不用管它
接下來我們進入到之前克隆好的H1ve目錄下
修改配置文件
(這一步最好先不要操作,因為我不確定后面的報錯是否與這步有關,建議先嘗試直接進行后面的鏡像拉取操作,如果有問題可以嘗試刪掉H1ve再次克隆)
sed -i 's/mariadb:10.4/mariadb:10.4.12/g' single.ymlsed -i 's/mariadb:10.4/mariadb:10.4.12/g' single-nginx.yml
5、拉取鏡像并啟動 Single Mode
docker-compose -f single.yml up
遇到如下的報錯:
ERROR: manifest for mariadb:10.4.12.12.12.12 not found: manifest unknown: manifest unknown?
這種情況意思是docker需要我們指定下載鏡像的版本號
但是我并沒有找到解決辦法,因此我替換了它的single.yml文件
然后就可以拉取了(我懷疑是前面修改配置文件導致的)
之后訪問 8000 端口
但是這個主題不一樣,就是純CTFd的版本
接著我又嘗試拉取了一下我之前搭建的版本鏡像
然后我又對比了一下兩者的文件信息,發現文件名并沒有什么差別,但是內容應該是有差別的
于是我刪掉了H1ve重新克隆進行測試
確定是否因為修改配置文件導致single.yml出了問題
克隆好之后什么都不要做,進入目錄直接拉取,居然成了
接著嘗試拉取Single-Nginx Mode?
docker-compose -f single-nginx.yml up
?這里可以拉取成功但是無法訪問
修改配置文件進行驗證,發現也可以拉取成功
就很奇怪了,當然不排除是我拉取之前的版本時對我剛從github上克隆下來的版本環境這些有影響
總的來說給大家的建議就是克隆好之后先直接嘗試拉取鏡像,如果不行再設置配置文件,操作錯誤也可以嘗試刪除H1ve之后重新克隆。
順便說一下,你們還需要確保用到的端口那些是允許的,在服務器的安全組規則里面設置。
當然如果你希望直接訪問ip就到靶場,那么這里可能需要設置代理轉發,將80端口轉發到8000。
(在我之前講的完全基于CTFd搭建的那個里是不需要的,直接訪問ip即是靶場首頁)
具體內容可以參考我之前的博客:《基于云服務器的博客和靶場搭建-經驗教訓》
怎么說呢,這個github克隆的H1ve項目感覺有點問題,因此下面我用自己之前的版本繼續后面操作
(關于我之前搭建那個版本的H1ve,如果可以我會放到資源里面,比github上的好多了)
我們需要將與H1ve有關的容器都開啟并設置為自啟動
查看容器
docker ps -a
啟動容器?
docker start 容器名
6、將H1ve整個目錄下的所有容器設置為自啟動
docker update --restart=always $(docker ps -aq)
?查看開啟的容器
docker ps
現在我們不用再拉取鏡像,直接訪問靶場地址+端口號即可,靶場將一直處于開啟狀態
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
接下來進入第二部分??????
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
?
Part2、Web賽題制作與終端docker環境部署
為了方便測試,我這里將服務器的所有端口都開放了,你們可以根據題目所在的端口自行添加
1、題目文件的制作
每個網頁它至少應該包含一個index.php或者index.html(首頁文件)
我們先做一個最簡單的web題,比如將flag藏在一個網頁的源碼里
該文件命名為index.php,內容如下圖
內容可能看著復雜,其實它就是一個頁面而已。?
(1)files文件夾
這樣我們的題目文件就有了,新建一個文件夾files,將這個文件index.php放到files目錄下
(為什么文件夾叫files,因為后面我會給你們兩個模版文件,按照我說的來就行)
當然如果你會自己寫Dockerfile和docker-compose.yml,那么你可以自己想怎么來就怎么來。
我讓ChatGPT寫過,是可行的,但是這里我主要是講基礎的套路方法,所以給你們模版,按照我說的來,你就可以部署簡單的web賽題。
除了files,我們還需要另外兩個文件:
(2)Dockerfile
(這個文件你可以直接用,不用修改)
內容如下:
FROM php:5.6-fpm-alpineRUN rm -rf ar/wwwml/*COPY ./files ar/wwwmlEXPOSE 80WORKDIR ar/wwwml
CMD ["php", "-S", "0.0.0.0:80"]

(3)docker-compose.yml
(這個文件需要將端口修改為你自己題目部署在的端口)
內容如下:
version: "2"services:web:build: .restart: alwaysports:- "0.0.0.0:8001:80"environment:- FLAG=Myon{s0_eaSyest_wEb_fl2}
關于第二個文件內容解釋:
0.0.0.0:8001:80? # 題目部署在8001端口,選手訪問8001端口即可訪問到題目環境
80是ngnix所在端口,具體取決于自己環境,一般都是在80,當然我之前部署Pwn賽題時遇到過其他問題,需要修改配置文件的,具體你們可以參考我之前的博客:
《基于CTFTraining在CTFd部署Web題目》?和
《基于xinetd部署pwn題(百分百搭成并且可以nc靶場地址)》
FLAG=Myon{s0_eaSyest_wEb_fl2}? # 這個其實后面我發現它似乎沒什么影響,因為正確的flag是你自己放在文件里的,除非題目是那種與環境變量有關系的可能會影響,因此保險起見,你可以把這里的FLAG值改為自己題目的flag值,只是為了進一步確保一致。
其他內容保持不變。
將上述文件:files、Dockerfile、docker-compose.yml 統一放進一個新的文件夾
為了方便記憶和運維,我喜歡以題目名字來命名,比如就叫 f12 (查看源碼的題)
這樣我們web賽題的文件就都準備好了,將f12這個文件夾放入終端
我這里先建了一個testctf的文件夾,里面用來存放CTF賽題
新建文件夾的命令
mkdir 文件夾名
傳文件的話我比較喜歡用xftp,直接拉動或者粘貼復制
2、docker環境部署
進入f12這個目錄,使用命令拉取鏡像
docker-compose up -d
拉取成功后,使用命令查看該容器
docker ps
訪問該題目所在端口,這里是8001
使用F12,在網頁源碼里找到flag
3、賽題前端部署
那么關于賽題如何放上去,添加到我們靶場的前端,設置flag,分數這些,在我博客《基于CTFTraining在CTFd部署Web題目》里面已經詳細講過,這里就不再贅述。
http://t.csdnimg.cn/TRiOo
鏈接應該會過期,你們直接搜索我博客的名字即可找到,或者在《網站搭建》的專欄里面
此外,我這里還有一些其他類型的Web題的源碼,小游戲、基本傳參、php反序列化、命令執行、文件上傳、php繞過、信息泄露這些題搭建起來還是很容易的,歡迎大家找我交流討論。
sql注入的話就需要結合數據庫了,有些題的源碼也可以讓ChatGPT幫寫。
4、終端賽題運維
如果我們部署docker環境時遇到問題,比如無法訪問,或者有些文件信息沒有修改,但是又已經拉取了題目的鏡像環境,那么我們就需要先刪除這個容器,然后重新拉取:
查看題目容器名字
docker ps
使用命令刪除有問題的容器
docker rm -f 容器名
此時題目頁面已經無法訪問
但是,重點來了,我們還能直接使用docker-compose up -d去拉取嗎
這樣操作是不行的,拉取之后你會得到一個與你刪除前一樣的容器,盡管你已經修改了文件內容
這個問題還是可以看我之前的博客《基于xinetd部署pwn題(百分百搭成并且可以nc靶場地址)》
http://t.csdnimg.cn/3QPno
因為docker搭建的是一個容器,你可以理解為一個獨立的環境,里面的文件所在路徑這些是不一樣的。為什么我們敢把漏洞直接部署在自己的服務器上,正因為docker的安全性還是很強的,當然也可能存在docker容器逃逸到本地,但是一般用docker搭建的東西還是很安全的,就算容器里的東西被打爛了,也不會影響到你服務器本地的東西,它是一個單獨的環境。
要想真正替換掉題目環境,正確的操作有兩種:
方法一:重命名題目文件夾(比如f12改為F12)使用mv命令
當然你需要確保你重命名的名字是未被拉取過鏡像的名字,即一個全新的名字
mv f12 F12
這個時候,我們進入到F12進行鏡像拉取,也是使用
docker-compose up -d
方法二:刪除所有未使用的網絡,未使用的網絡是不被任何容器引用的網絡。
docker network prune
因為這個網絡原本的容器已經被我們刪除了,但是它的網絡還存咋,但是未被容器引用,所以需要先清除掉,之后再進行鏡像拉取才會拉取到你修改后的文件內容。
建議使用方法二,不過也可以用重命名的方法,等未使用的網絡堆積一段時間后再統一進行清除。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ??
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
文章至此結束 希望你們看完有所收獲 期待大家的關注與支持 ?????
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ??