Docker部署CTF綜合性靶場,定時刷新環境


部署如DVWA或upload-labs這類綜合性靶場的時候,雖然是使用Docker環境,設置好權限后容器被擊穿的問題不需要考慮,但擔心部分選手修改了題目環境,比如一直XSS彈窗,所以想要編寫腳本每天定時刷新靶場,讓靶場的可維護性更高。

第一時間想到的是使用Linux下的crontab定時任務加shell腳本實現,刷新環境的命令使用docker的restart命令,本以為restart就能夠重置題目的環境,因為之前記得docker里面的數據沒有持久化到硬盤上,重啟后就相當於重置題目環境了,查了資料后才發現restart是不行的:

容器如果重啟后數據是可以保留的話為什么還需要容器的持久化?

容器是鏡像的實例,關閉了容器不意味着刪除這個實例,當刪除這個容器后,重新從鏡像啟動一個新的實例時才會丟失之前的數據。

所以這里刷新環境需要將之前的舊容器刪除,時間暫定為一天刷新一次。

先啟動一個upload-labs靶場,並且將其映射到13000端口上

docker pull c0ny1/upload-labs
docker run -d -p 13000:80 c0ny1/upload-labs:latest

訪問之:

關於Linux下的定時任務

我們經常使用的是crontab命令是cron table的簡寫,它是cron的配置文件,也可以叫它作業列表,我們可以在以下文件夾內找到相關配置文件。

Linux 系統里的 cron 守護進程,可以跟隨系統啟動,是一個用來創建定時任務的基本工具。

  • /var/spool/cron/ 目錄下存放的是每個用戶包括root的crontab任務,每個任務以創建者的名字命名

  • /etc/crontab 這個文件負責調度各種管理和維護任務。

  • /etc/cron.d/ 這個目錄用來存放任何要執行的crontab文件或腳本。

  • 我們還可以把腳本放在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目錄中,讓它每小時/天/星期、月執行一次。

查看cron狀態:

/etc/init.d/cron status

可以看到定時任務是在running中的,即在運行

添加定時任務:

crontab -e

因為我們刪除的容器還在運行當中,所以我們需要先將其停止再刪除,命令格式大概如下:

每晚的23:30停止docker

30 23 * * * /usr/bin/docker stop xxxxx(容器ID)

但是我們不知道容器ID,使用docker ps命令查找,並使用grep和awk組合查找:

先時候docker ps -a查看所有容器

查找存在upload-labs字符串的行

docker ps -a | grep "upload-labs"

按照空格分隔,並獲取其第一列,這里的第一列即我們想要獲取的容器ID

docker ps -a | grep "upload-labs"| awk '{print $1}'

獲取成功,接着合並暫停和刪除的操作

docker stop `docker ps -a | grep "upload-labs"| awk '{print $1}'` && docker rm `docker ps -a | grep "upload-labs"| awk '{print $1}'` 

暫停刪除成功,可以再使用

docker ps -a

查看運行或暫停的容器,可以看到已經沒有upload-labs這個容器了

合並啟動操作:

docker stop `docker ps -a | grep "upload-labs"| awk '{print $1}'` && docker rm `docker ps -a | grep "upload-labs"| awk '{print $1}'` && docker run -d -p 13000:80 c0ny1/upload-labs:latest

並將其添加到定時任務中,定時任務中使用docker的絕對路徑

添加定時任務:

30 23 * * * /usr/bin/docker stop `docker ps -a | grep "upload-labs"| awk '{print $1}'` && /usr/bin/docker rm `docker ps -a | grep "upload-labs"| awk '{print $1}'` && /usr/bin/docker run -d -p 13000:80 c0ny1/upload-labs:latest

為了方便測試是否成功,我這里將時間格式改為了

* * * * *

即每一分鍾執行一次命令,這樣我們只需要檢查容器ID是否改變即可判斷容器是否刷新成功

並且重定向刪除了運行信息

crontab -e

寫入任務

* * * * * /usr/bin/docker stop `docker ps -a | grep "upload-labs"| awk '{print $1}'` && /usr/bin/docker rm `docker ps -a | grep "upload-labs"| awk '{print $1}'` && /usr/bin/docker run -d -p 13000:80 c0ny1/upload-labs:latest >/dev/null 2>&1

保存后退出,查看當前的upload-labs的容器ID:

為:

6f53446a7ffe 

等待一會

可以看到這個時候的容器ID由6f53446a7ffe 變為了

2837f421951c 

說明docker定時刷新腳本沒有出現問題,將其修改為每天23:30刷新一次,最終版本為:

30 23 * * * /usr/bin/docker stop `docker ps -a | grep "upload-labs"| awk '{print $1}'` && /usr/bin/docker rm `docker ps -a | grep "upload-labs"| awk '{print $1}'` && /usr/bin/docker run -d -p 13000:80 c0ny1/upload-labs:latest >/dev/null 2>&1

這樣就可以安心部署題目的時候就不需要環境長期人為檢查維護了,但是引發的另外一個問題是可能docker的冗余文件會比較多,時間長了之后占用服務器的存儲空間,這個問題下次寫篇文章來解決,以上

 

日常夾帶私貨:http://biuctf.cc/

校內CTF平台,歡迎各位師傅來玩哇,雖然題目很少(已經在盡力出了嗚嗚嗚,有什么問題可以私聊我

 

參考文章:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM