記錄個人第一次搭建CTF平臺(H1ve)

m1xian發表於2024-06-30

準備工作

安裝docker
sudo apt-get update
sudo apt-get install -y docker.io
這裡要耐心等待

systemctl start docker
systemctl enable docker
設定開機就啟動docker

systemctl enable docker
檢視docker是否安裝成功

docker -v
驗證一下是否裝好

pip3 install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple
安裝docker-compose

然後是安裝H1ve
git clone https://github.com/D0g3-Lab/H1ve.git
先進入到H1ve目錄
然後docker-compose -f single.yml up
拉取映象
docker update --restart=always $(docker ps -aq)
此命令將各個容器都設定成自啟動

CTFd-Owl

參考:https://5ime.cn/h1ve.html

後臺導航欄-->Plugins-->CTFd-Owl 或者 靶場地址/plugins/ctfd-owl/admin/settings

Docker Settings

  • Docker Flag Prefix:動態生成的flag字首
  • Docker APIs URL:API名字(預設為unix://var/run/docker.sock)
  • Max Container Count:最大啟動容器數量(預設無限制)
  • Max Renewal Time:最大容器延長時間(超過將無法延長,達到時間後會自動摧毀)

FRP Settings

  • FRP Http Domain Suffix:FRP域名字首(如開啟動態域名轉發必填)
  • FRP Direct Ip Address FRP:frp伺服器IP
  • FRP Direct Minimum Port:最小埠
  • FRP Direct Maximum Port:最大埠
  • FRP Config Template Frpc:熱過載配置頭模版(如不會自定義,儘量按照預設配置)
[common]
token = random_this
server_addr = frps
server_port = 80
admin_addr = 0.0.0.0
admin_port = 7400

題目編寫

目錄結構
test # 題目存放資料夾必須小寫英文
├─ Dockerfile
├─ docker-compose.yml
├─ files
│    ├─ index.php 
│    └─ start.sh
└─ flag
Dockerfile
FROM php:7.3-apache
COPY files /var/www/html
RUN chmod 755 /var/www/html && \
    chown root:root /var/www/html && \
    chmod +x /var/www/html/start.sh
CMD /var/www/html/start.sh
EXPOSE 80
docker-compose.yml
version: '2'
services:
  service: 
    # build 該置頂目錄下的dockerfile
    build: .
    # image 指定build Dockerfile生成映象的名稱
    image: test
    ports:
      - 9999:80
    volumes:
        # 掛載的 Flag
        - "$PWD/flag:/flag"
    tty: true
    networks:
      - net

networks:
    # 配置docker network
    net: 
      external: 
         name: h1ve_frp_containers
files/start.sh
#!/bin/bash

v=`cat /flag`
cat /var/www/html/index.php | sed -i "s/flag{test_flag}/$v/" /var/www/html/index.php # 用於正則匹配flag並替換

apache2-foreground
files/index.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>測試題目</title>
</head>
<body>
flag{test_flag}<!--這裡會被start.sh替換成動態flag-->
</body>
</html>
flag
flag{this_test_flag}

docker搭建環境部署ctf題目

參考:https://blog.csdn.net/q20010619/article/details/108587879

拉取映象

docker search lamp
docker pull tutum/lamp #隨便pull了一個lamp
docker images 檢視映象

啟動容器

docker run -it -d --name=myweb  -p [host port]:[docker port] [image]
#對映埠前首先確定埠沒有被佔用lsof -i :8080
#-d //容器後臺執行。
#-p //指定對映埠。
#--name=myweb  //容器命名
#-it //是以互動模式執行容器
eg:
docker run -it -d --name=myweb -p 78:80 -p 3306:3306 docker.io/linode/lamp
將伺服器apach2的78埠對映到docker的80埠,將3306mysql對映到docker上3306埠

重啟

systemctl restart docker

環境已經搭建完畢,可以將ctf題目原始碼複製到container的主目錄中

docker cp ez_php a9277ea0259a:var/www/html
#docker cp [本地路徑] [container id]:[container 路徑]

進入docker container

docker exec -it 763c32535da7 /bin/bash
#如果從這個容器退出,不會導致容器的停止,推薦使用 docker exec
#-i //讓容器的標準輸入保持開啟。
#-t //讓docker分配一個偽終端並繫結到容器的標準輸出上。

進入容器中的資料庫,建立好ctf題目需要的資料庫、資料表等等(資料庫密碼為空)

cd var/www/html
mysql -uroot -p

之後訪問網站就行

匯出容器

docker export 1e560fca3906 > example.tar

相關文章