部署如DVWA或upload-labs這類綜合性靶場的時候,雖然是使用Docker環境,設置好權限后容器被擊穿的問題不需要考慮,但擔心部分選手修改了題目環境,比如一直XSS彈窗,所以想要編寫腳本每天定時刷新靶場,讓靶場的可維護性更高。
容器是鏡像的實例,關閉了容器不意味着刪除這個實例,當刪除這個容器后,重新從鏡像啟動一個新的實例時才會丟失之前的數據。
所以這里刷新環境需要將之前的舊容器刪除,時間暫定為一天刷新一次。
先啟動一個
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平台,歡迎各位師傅來玩哇,雖然題目很少(已經在盡力出了嗚嗚嗚,有什么問題可以私聊我