手把手教你如何創建一個支持ctf動態獨立靶機的靶場

手把手教你如何創建一個支持ctf動態獨立靶機的靶場

前言

要說開源的ctf訓練平臺,ctfd是不錯的選擇,支持各類插件,今天我就來介紹一下如何部署趙今師傅爲ctfd平臺寫的一款支持獨立動態靶機的插件。前提是你的ctfd也是docker部署的。html

動態獨立靶機

說到獨立動態靶機,各位ctfer可能會聯想到i春秋舉辦的各種比賽,其中比賽環境大都用到了動態獨立靶機(dynamic standalone instance)技術,也就是每作一道題,就會自動生成一個虛擬題目環境,每個環境剛剛生成的時候都是嶄新的,且能爲每一個隊伍生成一個獨一無二的flag,防止flag分享做弊的行爲。python

技術原理

先來看張圖 = =
在這裏插入圖片描述
別被這張圖嚇到了, 這個圖只是在本地部署動態靶機,而趙師傅的buuctf平臺因爲使用學校的服務器生成獨立靶機還增長了內網穿透功能,網絡結構要更復雜,因此這個插件有些功能是針對趙師傅下需求設計的,而咱們僅僅只須要本地生成獨立靶機便可,所以只需使用該插件如圖所示的部分功能便可。mysql

官方教程

建議先去看看官方教程:)本教程對應官方教程第一種模式。
https://www.zhaoj.in/read-633...linux

安裝步驟

1.安裝啓動frps

下載frp並安裝git

cd
wget https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_linux_amd64.tar.gz
tar -zxvf frp_0.29.0_linux_amd64.tar.gz
cd frp_0.29.0_linux_amd64
cp systemd/* /etc/systemd/system/
mkdir /etc/frp
cp frpc.ini  frps.ini /etc/frp/
cp frpc  frps /usr/bin/
chmod a+x /usr/bin/frpc /usr/bin/frps
systemctl enable frps

編輯frps.inigithub

vim /etc/frp/frps.ini
frps.ini
[common]
bind_port = 7897
bind_addr = 0.0.0.0
token =thisistoken

至於frpc.ini,先不急着配置,後面會配置redis

啓動frps系統服務sql

systemctl start frps

2.建立網絡並啓動frpc容器並配置frpc.ini

docker network create ctfd_frp-containers
docker run  -d -v ~/frp_0.29.0_linux_amd64/frpc.ini:/etc/frp/frpc.ini --network="ctfd_frp-containers" --restart=always "glzjin/frp"

建立網絡frpcadmin用於ctfd容器和frpc容器通訊docker

docker network create frpcadmin 
docker network connect frpcadmin <frpc容器名或者ID> 
#將frpc和ctfd容器單獨鏈接到網絡frpcadmin,注意要等容器建立好以後再鏈接,所以ctfd將在稍後鏈接

查看frpcadmin網絡的鏈接狀況並記錄frpc容器的網絡IPvim

docker network inspect frpcadmin

在這裏插入圖片描述
編輯frpc.ini

vim ~/frp_0.29.0_linux_amd64/frpc.ini

frpc.ini

[common]
server_addr = 172.17.0.1
server_port = 7897
token=thisistoken
admin_addr = 172.22.0.2 #這裏填寫frpc容器在frpcadmin網絡裏的ip
admin_port = 7400
log_file = ./frps.log

3.安裝靶場與插件

下載靶場與插件

git clone https://github.com/CTFd/CTFd.git
cd CTFd/CTFd/plugins #打開ctfd插件目錄
git clone https://github.com/glzjin/CTFd-Whale.git ctfd-whale #確保插件文件夾小寫
git reset 5b32f457e9f56ee9b2b29495f4b3b118be3c57bd #回滾到當前教程適合的版本
cd ../.. #返回ctfd主目錄
vim docker-compose.yml

配置docker-compose.yml

version: '2'

services:
  ctfd:
    build: .
    user: root
    restart: always
    ports:
      - "8000:8000" #你本身的
    environment:
      - UPLOAD_FOLDER=/var/uploads
      - DATABASE_URL=mysql+pymysql://root:ctfd@db/ctfd
      - REDIS_URL=redis://cache:6379
      - WORKERS=1
      - LOG_FOLDER=/var/log/CTFd
      - ACCESS_LOG=-
      - ERROR_LOG=-
    volumes:
      - .data/CTFd/logs:/var/log/CTFd
      - .data/CTFd/uploads:/var/uploads
      - .:/opt/CTFd:ro
      - /var/run/docker.sock:/var/run/docker.sock #添加這句便可,別的基本按照官方的不用動
    depends_on:
      - db
    networks:
        default:
        internal:

  db:
    image: mariadb:10.4
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=ctfd
      - MYSQL_USER=ctfd
      - MYSQL_PASSWORD=ctfd
      - MYSQL_DATABASE=ctfd
    volumes:
      - .data/mysql:/var/lib/mysql
    networks:
        internal:
    # This command is required to set important mariadb defaults
    command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --wait_timeout=28800, --log-warnings=0]

  cache:
    image: redis:4
    restart: always
    volumes:
    - .data/redis:/data
    networks:
        internal:

networks:
    default:
    internal:
        internal: true

從新build後啓動ctfd

docker-compose build
docker-compose up -d

將ctfd鏈接frpcadmin網絡

docker network connect frpcadmin <ctfd容器名或者ID>

啓動ctfd後進入管理頁面選擇插件
在這裏插入圖片描述
填寫相關參數,注意要在template裏面寫上frpc.ini的內容。裏面domain填寫本身的
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
因爲我這篇文章寫的比較早,ctfd-whale已經有了不少次更新,根據gtfly師傅的提醒,這裏須要填寫建立的網絡。
在這裏插入圖片描述

啓動題目選擇dynamic_docker
在這裏插入圖片描述
這裏選擇一個支持動態FLAG的docker鏡像,並選擇設置該docker鏡像的內部端口
在這裏插入圖片描述
內部端口能夠用docker ps查看
在這裏插入圖片描述

3b.使用docker-compose一站式部署靶場、容器與網絡

如下docker-compose.yml的功能與上述操做步驟同樣的,做爲可選項,有能力的同窗能夠試試看

version: '2'

services:
  ctfd:
    build: .
    user: root
    restart: always
    ports:
      - "8000:8000" #你本身的
    environment:
      - UPLOAD_FOLDER=/var/uploads
      - DATABASE_URL=mysql+pymysql://root:ctfd@db/ctfd
      - REDIS_URL=redis://cache:6379
      - WORKERS=1
      - LOG_FOLDER=/var/log/CTFd
      - ACCESS_LOG=-
      - ERROR_LOG=-
    volumes:
      - .data/CTFd/logs:/var/log/CTFd
      - .data/CTFd/uploads:/var/uploads
      - .:/opt/CTFd:ro
      - /var/run/docker.sock:/var/run/docker.sock #添加這句便可,別的基本按照官方的不用動
    depends_on:
      - db
    networks:
        default:
        internal:
        frpcadmin:
            ipv4_address: 172.22.0.3        

  db:
    image: mariadb:10.4
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=ctfd
      - MYSQL_USER=ctfd
      - MYSQL_PASSWORD=ctfd
      - MYSQL_DATABASE=ctfd
    volumes:
      - .data/mysql:/var/lib/mysql
    networks:
        internal:
       
    # This command is required to set important mariadb defaults
    command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --wait_timeout=28800, --log-warnings=0]

  cache:
    image: redis:4
    restart: always
    volumes:
    - .data/redis:/data
    networks:
        internal:
  frpc:
    image: glzjin/frp:latest
    restart: always
    volumes:
      - ~/frp_0.29.0_linux_amd64/frpc.ini:/etc/frp/frpc.ini
    networks:
        frpcadmin:
            ipv4_address: 172.22.0.2
        frp-containers:
networks:
    default:
    internal:
        internal: true
    frpcadmin:
        driver: bridge
        internal: true
        ipam:
            config:
                - subnet: 172.22.0.0/16
    frp-containers:
        driver: bridge
        ipam:
            config:
                - subnet: 172.21.0.0/16

4.測試

不出意外的話,如今在challenge界面可使用動態靶機
在這裏插入圖片描述
管理員也能夠在後臺管理靶機
在這裏插入圖片描述

5.製做支持動態flag的鏡像

請看gtfly寫的
http://www.gtfly.top/2019/09/...
或者能夠看看趙師傅的貢獻指南。
https://www.zhaoj.in/read-625...
推薦一個github靶機倉庫
https://github.com/CTFTraining

常見錯誤分析與檢查

通常錯誤:

可使用命令docker logs <ctfd容器的ID>查看報錯狀況

docker容器沒法啓動:

確保docker api填寫正確,如示例中爲unix:///var/run/docker.sock
你也可使用端口形式的api如官方示例:能夠用IP:端口指定API
而後使用以下命令進入ctfd容器,手動調用端口測試

docker exec -it <ctfd容器的ID> /bin/sh
/opt/CTFd# python
>>>import docker
>>>client=docker.DockerClient(base_url="unix:///var/run/docker.sock")
>>>client.images.list()

若是api正確會列出全部鏡像

frp端口沒法映射:

可使用以下命令進入ctfd容器,手動調用端口測試

docker exec -it <ctfd容器的ID> /bin/sh
/opt/CTFd# python
>>>import requests
>>>requests.get("http://172.22.0.2:7400/api/reload")
<Response [200]> #這個表示成功

友情鏈接

BUUCTF
Cthulhu OJ

相關文章
相關標籤/搜索