搭建CTF動態靶場

来源:https://www.cnblogs.com/ssh1y/archive/2022/12/05/helloworld.html
-Advertisement-
Play Games

前言 本文藉鑒文章:https://www.yuque.com/dengfenglai-esbap/kb/mc4k41?#xOxNG 在此基礎上修改了一點(照著原來的做沒成功),感謝這位師傅給的資源。 1、環境準備 1、主機:伺服器CentOs7 2、Docker版本:20.10.2 3、Docke ...


前言

本文藉鑒文章:https://www.yuque.com/dengfenglai-esbap/kb/mc4k41?#xOxNG
在此基礎上修改了一點(照著原來的做沒成功),感謝這位師傅給的資源。

1、環境準備

1、主機:伺服器CentOs7
2、Docker版本:20.10.2
3、Docker-compose版本:1.25.0
4、IP地址:公網地址或虛擬機地址

2、系統環境搭建

1、更新yum源

yum update

2、安裝系統所需服務

yum install -y git nginx mariadb mariadb-server Mysql-python python-pip gcc  python-devel yum-utils device-mapper-persistent-data lvm2 epel-release

3、安裝docker

# 換源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安裝docker
yum -y install docker-ce-17.12.1.ce

4、DaoClould配置鏡像源加速

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

5、檢查是否安裝成功

docker --version

6、安裝docker-compose

# 下載docker compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 添加可執行許可權
chmod +x /usr/local/bin/docker-compose
# 將文件copy到 /usr/bin/目錄下
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 查看版本
docker-compose --version

3、靶場環境搭建

1、下載CTFd

git clone https://github.com/glzjin/CTFd.git

2、下載frp

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

3、下載ctfd-whale插件

git clone https://github.com/glzjin/CTFd-Whale.git

# 重命名為小寫
mv CTFd-Whale/ ctfd-whale

4、下載docker版本的frps

git clone https://github.com/glzjin/Frp-Docker-For-CTFd-Whale

# 重命名為小寫
mv Frp-Docker-For-CTFd-Whale/ frp-docker-for-ctfd-whale

4、CTFd環境配置

1、初始化docker集群

docker swarm init

2、加入節點

docker node update --label-add='name=linux-1' $(docker node ls -q)

3、將ctfd-whale放入CTFd的插件目錄

mv ctfd-whale/ CTFd/CTFd/plugins/

4、啟動docker版本的frps及frps配置

cd frp-docker-for-whale/frp
vim frps.ini

進入之後,看到

[common]
bind_port = 6490
token = randomme

可將token進行修改,埠一般採用預設埠。
5、修改完成後返回目錄啟動

cd ..
docker-compose up -d

等待構建完成,用docker ps -a查看是否正在運行

6、將frpc文件移動到CTFd中

cd CTFd/
mkdir frpc

進入frpc的目錄(frp_0.29.0_linux_amd64)將裡面的frpc,frpc.ini,frpc_full.ini,LICENSE這四個文件放在CTFd/frpc文件夾中

cd ../frp_0.29.0_linux_amd64
mv frpc.ini ../CTFd/frpc/
mv frpc_full.ini ../CTFd/frpc/
mv frpc ../CTFd/frpc/
mv LICENSE ../CTFd/frpc/

7、進入剛剛新建的CTFd/fprc目錄,配置frpc.ini文件

[common]
token = randomme
server_addr = 172.1.0.4
server_port = 6490
pool_count = 200
tls_enable = true

admin_addr = 172.1.0.3
admin_port = 7400

!除了token其他的務必和上面一摸一樣
8、配置Dockerfile(這邊做了一點修改)

FROM python:3.6-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories &&\
    apk update && \
    apk add python3 python3-dev linux-headers libffi-dev gcc make musl-dev py-pip mysql-client git openssl-dev g++
RUN adduser -D -u 1001 -s /bin/bash ctfd
WORKDIR /opt/CTFd
RUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploads
RUN python -m pip install --upgrade pip setuptools wheel -i https://pypi.doubanio.com/simple
RUN pip3 config set global.index-url https://pypi.doubanio.com/simple
RUN pip3 config set install.trusted-host pypi.doubanio.com
COPY requirements.txt .
RUN pip install -r requirements.txt -i  https://pypi.doubanio.com/simple
COPY . /opt/CTFd
RUN for d in CTFd/plugins/*; do \
      if [ -f "$d/requirements.txt" ]; then \
        pip install -r $d/requirements.txt -i  https://pypi.doubanio.com/simple; \
      fi; \
    done;
RUN chmod +x /opt/CTFd/docker-entrypoint.sh
RUN chown -R 1001:1001 /opt/CTFd
RUN chown -R 1001:1001 /var/log/CTFd /var/uploads
USER 1001
EXPOSE 8000
ENTRYPOINT ["/opt/CTFd/docker-entrypoint.sh"]

在原有的基礎上加上了一行:

RUN python -m pip install --upgrade pip setuptools wheel -i https://pypi.doubanio.com/simple

9、配置docker-compose.yml

version: '2.2'

services:
  ctfd-nginx:
    image: nginx:1.17
    volumes:
      - ./nginx/http.conf:/etc/nginx/nginx.conf   
    user: root
    restart: always
    ports:    
      - "443:443"
    networks:
        default:
        internal:
    depends_on:
      - ctfd
    cpus: '1.00'  
    mem_limit: 150M     
  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=-
      - REVERSE_PROXY=true
    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:
        frp:
            ipv4_address: 172.1.0.2
    cpus: '1.00'     
    mem_limit: 450M     

  db:
    image: mariadb:10.4
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=ctfd
      - MYSQL_USER=ctfd
      - MYSQL_PASSWORD=ctfd
    volumes:
      - .data/mysql:/var/lib/mysql
    networks:
        internal:
    command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --wait_timeout=28800, --log-warnings=0]
    cpus: '1.00'     
    mem_limit: 750M     

  cache:
    image: redis:4
    restart: always
    volumes:
      - .data/redis:/data
    networks:
        internal:
    cpus: '1.00'     
    mem_limit: 450M     

  frpc:    
    image: glzjin/frp:latest     
    restart: always
    volumes:
      - ./frpc:/conf/     
    entrypoint:
        - /usr/local/bin/frpc
        - -c
        - /conf/frpc.ini
    networks:
        frp:
            ipv4_address: 172.1.0.3  
        frp-containers:
    cpus: '1.00'     
    mem_limit: 250M     

networks:
    default:
    internal:
        internal: true
    frp:
        driver: bridge
        ipam:
            config:
                - subnet: 172.1.0.0/16
    frp-containers:
        driver: overlay
        internal: true
        ipam:
            config:
                - subnet: 172.2.0.0/16



10、配置requirements.txt(這邊我也做了點修改)

Flask==1.1.1
Werkzeug==0.16.0
Flask-SQLAlchemy==2.4.1
Flask-Caching==1.4.0
Flask-Migrate==2.5.2
Flask-Script==2.0.6
SQLAlchemy==1.3.11
SQLAlchemy-Utils==0.36.0
passlib==1.7.2
bcrypt==3.1.7
six==1.13.0
itsdangerous==1.1.0
requests>=2.20.0
PyMySQL==0.9.3
gunicorn==19.9.0
normality==2.0.0
dataset==1.1.2
mistune==0.8.4
netaddr==0.7.19
redis==3.3.11
datafreeze
python-dotenv==0.10.3
flask-restplus==0.13.0
pathlib2==2.3.5
flask-marshmallow==0.10.1
marshmallow-sqlalchemy==0.17.0
boto3==1.10.39
marshmallow==2.20.2
gevent==1.4.0
tzlocal==2.1

去掉了datafreeze的版本限制。
11、配置nginx
在CTFd的目錄下,新建一個文件夾併進入

mkdir nginx
cd nginx

創建http.conf

worker_processes 4;
events {
  worker_connections 1024;
}
http {
  # Configuration containing list of application servers
  upstream app_servers {
    server ctfd:8000;
  }
  server {
    listen 80;
    client_max_body_size 4G;
    # Handle Server Sent Events for Notifications
    location /events {
      proxy_pass http://app_servers;
      proxy_set_header Connection '';
      proxy_http_version 1.1;
      chunked_transfer_encoding off;
      proxy_buffering off;
      proxy_cache off;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Host $server_name;
    }
    # Proxy connections to the application servers
    location / {
      proxy_pass http://app_servers;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Host $server_name;
    }
  }
}

12、開始構建
在CTFd文件夾下開始構建鏡像和容器

cd CTFd/
docker-compose up -d

不出意外的話,可以看到

13、查看容器的運行狀態

docker ps -a

可以看到

所有容器均啟動成功
14、訪問
瀏覽器中訪問ip:8000即可打開


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ​ 這裡有個坑 1:轉賬低於5毛會失敗 2:轉賬金額需要自己取整一下,微信官方金額是 分 為單位,換算成 元 時可能會除不盡 { "code":"PARAM_ERROR", "detail":{ "location":"body", "value":7.000000000000001 // 微信金額 ...
  • 普通的切片對迭代器無法實行切片操作 1 from itertools import islice 2 3 4 def func(): 5 for i in [4, 9, 6, 2]: 6 if i % 2 == 0: 7 yield i 8 9 10 f = func() 11 res = isli ...
  • noi 1.5 39 與 7 無 關 的 數 。 1.描述 一個正整數,如果它能被7整除,或者它的十進位表示法中某一位上的數字為7,則稱其為與7相關的數.現求所有小於等於n(n < 100)的與7無關的正整數的平方和. 2.輸入 輸入為一行,正整數n(n < 100) 3.輸出 輸出一行,包含一個整 ...
  • 說明: 1. 本文基於Spring-Framework 5.1.x版本講解 2. 建議讀者對創建對象部分源碼有一定瞭解 概述 這篇講講Spring迴圈依賴的問題,網上講迴圈依賴的帖子太多太多了,相信很多人也多多少少瞭解一點,那我還是把這個問題自己梳理一遍,主要是基於以下出發點: 1. Spring到 ...
  • JZ31 棧的壓入、彈出序列 描述 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序 ...
  • Hello,大家好,又是好久不見,最近太忙了(藉口)。看了下日誌,有 2 個月沒寫文章了。為了證明公眾號還活著,今天必須更新一下了。 在我們的開發過程中,總有那麼些需求是那麼的變態。常規的方案已經無法滿足。比如某些規則非常複雜,而客戶又經常要修改它。那麼我們可能需要把這部分代碼直接做為配置文件提取出 ...
  • 從技術生態發展過程及理念、產品級解決方案理念、產品系統框架及主要功能介紹、產品系統二次開發和應用案例等5個方面進行了主題發言。 ...
  • 一:背景 1.講故事 這周有個朋友找到我,說他的程式出現了記憶體緩慢增長,沒有回頭的趨勢,讓我幫忙看下到底怎麼回事,據朋友說這個問題已經困擾他快一周了,還是沒能找到最終的問題,看樣子這個問題比較刁鑽,不管怎麼說,先祭出 WinDbg。 二:WinDbg 分析 1. 托管還是非托管泄露 一直關註這個系列 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...