天天看點

CTF丨從零開始搭建WEB Docker靶場

要想一舉奪魁,需做好賽前準備

i春秋在這裡手把手教你實操演練

第十二屆全國大學生資訊安全競賽即将開始,小夥伴們有報名參加的嗎?大家在比賽前是否開始進行模拟演練了?今天,i春秋将與大家分享靶場搭建的相關内容,幫助大家更好的進行實操演練。

學習搭建Docker靶場之前,我們先了解一下為什麼要用Docker?

  • 相對于虛拟機,Docker啟動更快。
  • 成本考慮
  • 更安全

環境部署

搭建環境>>

  • OS: Ubuntu 16.04
  • 裝置類型: VM
  • 主控端:ESXI 6.5

解除安裝原有Docker>>

安裝>>

Ubuntu 16.04 + 上的Docker CE預設使用overlay2存儲層驅動,無需手動配置。

使用APT安裝:由于APT源使用HTTPS以確定軟體下載下傳過程中不被篡改。是以,我們需要添加使用HTTPS傳輸的軟體包以及CA憑證。

 鑒于國内網絡問題,建議使用國内源。

為了确認所下載下傳軟體包的合法性,需要添加軟體源的GPG密鑰。

 然後,我們需要向source.list中添加Docker軟體源。

 以上指令會添加穩定版本的Docker CE APT鏡像源,如果需要測試或每日建構版本的Docker CE請将stable改為test或者nightly。

安裝 Docker CE>>

更新APT軟體包緩存,并安裝 docker-ce:

Tips:

  • 使用腳本自動安裝
  • 在測試或開發環境中Docker官方為了簡化安裝流程,提供了一套便捷的安裝腳本,Ubuntu系統上可以使用這套腳本安裝。

 執行這個指令後,腳本就會自動的将一切準備工作做好,并且把Docker CE的Edge版本安裝在系統中。

啟動Docker CE>>

 建立Docker使用者組>>

預設情況下,Docker指令會使用Unix socket與Docker引擎通訊。而隻有Root使用者和Docker組的使用者才可以通路Docker引擎的Unix socket。出于安全考慮,一般Linux系統上不會直接使用Root使用者。是以,更好地做法是将需要使用Docker的使用者加入Docker使用者組。

建立Docker組:

$ sudo groupadd docker

$ sudo usermod -aG docker $USER

退出目前終端并重新登入,進行如下測試。

測試Docker是否安裝正确>>

 若能正常輸出以上資訊,則說明安裝成功。

環境測試

搭建>>

首先制作一個WEB容器,了解端口映射原理和資料卷挂載原理。

操作過程

第一步:準備工作

  • 根目錄: /opt/docker
  • 網站根目錄:/opt/docker/www
  • nginx相關目錄:/opt/docker/nginx/conf.d

第二步:安裝php7,nginx,mysql

 注意!MySQL務必加上版本号,否則會拉取MySQL8.0的鏡像下來導緻後面各種奇奇怪怪的錯。

第三步:啟動基礎環境

指令詳解

-v /opt/docker/www/:/var/www/html/:把主控端(Ubuntu)的/opt/docker/www/挂載到了docker的/var/www/html/

--name php 命名為php

-p 80:80 把主控端的80映射到docker的80端

-e MYSQL_ROOT_PASSWORD=123456

設定MySQL密碼為123456

測試環境是否正确>>

編輯檔案/opt/docker/www/index.php

 然後在主控端目錄/opt/docker/nginx/conf.d/建立index.conf

内容如下:

 然後重新開機nginx docker

 通路10.16.11.231【你部署Docker的機器的位址】檢視是否輸出PHPINFO

如圖即為成功。

定制Docker

MySQL配置>>

由于Docker的MySQL預設是開放了Root的外連權限,是以在比賽中為了安全,Root使用者務必設定強密碼,比賽前資料庫務必先備份原始庫,友善資料庫被清了恢複,權限務必配置為一個庫一個使用者,禁止該庫所有權使用者通路其他庫和禁掉相關高危權限。

部署靶場Docker>>

以dedecms為例子

首先從pull下來一個內建環境然後啟動并挂載到主控端的一個資料卷上:

docker pull chengxulvtu/dedecms:utf8_full_5.7

docker run -d --name dede-lantinghe -p 8081:80 -v /opt/docker/

www/dedecms:/var/www/html chengxulvtu/dedecms:utf8_full_5.7

然後正常安裝,配置資料庫。

然後kill掉該docker并rm掉,FTP連接配接到主控端找到安裝好dedecms的目錄/opt/docker/www/dedecms

在目錄下建立一個新的檔案夾(這裡我用的src)并把dedecms的所有檔案src檔案夾内,再/opt/docker/www/dedecms建立一Dockerfile檔案,操作後的/opt/docker/www/dedecms目錄應該類似這樣。

編輯Dockerfile檔案内容如下:

 解釋下每行指令

 在Dockerfile中第一條非注釋INSTRUCTION一定是FROM,它決定了以哪一個鏡像作為基準,<image>首選本地是否存在,如果不存在則會從公共倉庫下載下傳(當然也可以使用私有倉庫的格式)。這裡引用了eboraas最新的apache-php內建環境。

将檔案<src>拷貝到container的檔案系統對應的路徑<dest>下。

其中<src>可以是檔案、檔案夾,對于檔案和檔案夾<src>必須是在Dockerfile的相對路徑下,即隻能是相對路徑且不能包含../path/。

<dest>隻能是容器中的絕對路徑。如果路徑不存在則會自動級聯建立,根據你的需要是<dest>裡是否需要反斜杠/,習慣使用/結尾進而避免被當成檔案。

與ADD指令相比,ADD支援遠端URL擷取檔案,但官方認為是strongly discouraged,建議使用wget或curl代替。

COPY的文法和功能與ADD相同,隻是不支援上面講到的<src>是遠端URL、自動解壓這兩個特性,但是Best Practices for Writing Dockerfiles建議盡量使用COPY,并使用RUN與COPY的組合來代替ADD,這是因為雖然COPY隻支援本地檔案拷貝到container,但它的處理比ADD更加透明,建議隻在複制tar檔案時使用ADD,如ADD trusty-core-amd64.tar.gz /,會先自動解壓内容再COPY到在容器的/目錄下。

在本例中

 複制相對于Dockerfile檔案位置的src/下的所有内容到/var/www/html/下:

 RUN指令會在目前鏡像的頂層執行任何指令,并commit成新的(中間)鏡像,送出的鏡像會在後面繼續用到。

另外RUN指令的格式有兩種寫法。

shell格式,相當于執行/bin/sh -c "<command>":

RUN apt-get install vim -y

exec格式,不會觸發shell,是以$HOME這樣的環境變量無法使用,但它可以在沒有bash的鏡像中執行,而且可以避免錯誤的解析指令字元串:

 功能與shell風格相同

配置Flag項>>

進入src目錄,配置你需要的Flag項目,然後就可以打包了。

打包成鏡像>>

建立完上面的Dockerfile後在目前目錄執行。

指令原型

稍等片刻就可以運作docker images指令并能看到名為ctf,TAG為list1的鏡像了。

以上就是搭建WEB Docker靶場的全部内容,你學會了嗎?

繼續閱讀