记一次CTF校赛GZ::CTF的搭建,web动态容器,以及包含遇到的问题等等

参考文章:GZCTF在ubuntu系统中的安装之单docker-CSDN博客

一.安装docker和docker-compose

apt-get update
apt install docker.io docker-compose

我看到其他文章中有安装其他组件的,比如说docker.ic等等,但我的Ubuntu似乎安不起,但也不影响,docker.io和docker-compose这两个已经满足基本需要了。

查看docker是否安装成功

docker-compose --version 

若有以上信息显示说明已经安装成功。

二、GZ::CTF竞赛平台的安装

安装完docker以及docker-compose之后我们就可以开始安装GZ了。

这里GZ提供两个配置文件,配置完成后直接拉取(还挺方便的…………

1、首先创一个目录

mkdir GZCTF  #路径及目录名自己选择,自己熟悉就好

2、创建appsettings.json文件

{
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "Database": "Host=db:5432;Database=gzctf;Username=postgres;Password=<Your POSTGRES_PASSWORD>"       //必须项
  },
  "EmailConfig": {
    "SendMailAddress": "a@a.com",
    "UserName": "",
    "Password": "",
    "Smtp": {
      "Host": "localhost",
      "Port": 587
    }
  },
  "XorKey": "<Your XOR_KEY>",    //必须项
  "ContainerProvider": {
    "Type": "Docker", // or "Kubernetes"
    "PortMappingType": "Default", // or "PlatformProxy"
    "EnableTrafficCapture": false,
    "PublicEntry": "<Your PUBLIC_ENTRY>", // or "xxx.xxx.xxx.xxx" !必须项
    // optional
    "DockerConfig": {
      "SwarmMode": false,
      "Uri": "unix:///var/run/docker.sock"
    }
  },
  "RequestLogging": false,
  "DisableRateLimit": true,
  "RegistryConfig": {
    "UserName": "",
    "Password": "",
    "ServerAddress": ""
  },
  "CaptchaConfig": {
    "Provider": "None", // or "CloudflareTurnstile" or "GoogleRecaptcha"
    "SiteKey": "<Your SITE_KEY>",
    "SecretKey": "<Your SECRET_KEY>",
    // optional
    "GoogleRecaptcha": {
      "VerifyAPIAddress": "https://www.recaptcha.net/recaptcha/api/siteverify",
      "RecaptchaThreshold": "0.5"
    }
  },
  "ForwardedOptions": {
    "ForwardedHeaders": 5,
    "ForwardLimit": 1,
    "TrustedNetworks": ["192.168.12.0/8"]        //必须项
  }
}

这里有几个必须要设置的参数值:

<Your POSTGRES_PASSWORD>:你设置的密码,后面要跟数据库密码一致

<Your XOR_KEY>:你比赛的私钥。参数值为任意字符串。

<Your PUBLIC_ENTRY>:用于创建容器,外部访问地址,可以是 IP 或域名,也就是自己的域名或者ip

TrustedNetworks:可以默认0.0.0.0/0

3、创建docker-compose.yml文件

version: "3.0"
services:
  gzctf:
    image: gztime/gzctf:latest
    restart: always
    environment:
      - "LANG=zh_CN.UTF-8" # choose your backend language `en_US` / `zh_CN` / `ja_JP`
      - "GZCTF_ADMIN_PASSWORD=<Your GZCTF_ADMIN_PASSWORD>"
    ports:
      - "80:8080"
    volumes:
      - "./data/files:/app/files"
      - "./appsettings.json:/app/appsettings.json:ro"
      # - "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
      - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
    depends_on:
      - db

  cache:
    image: redis:alpine
    restart: always

 
  db:
    image: postgres:alpine
    restart: always
    environment:
      - "POSTGRES_PASSWORD=<Your POSTGRES_PASSWORD>"
    volumes:
      - "./data/db:/var/lib/postgresql/data"

主要设置两个参数值

GZCTF_ADMIN_PASSWORD:初始管理员密码。

POSTGRES_PASSWORD: 数据库密码。与上一个文件一致。

4、构建GZ::CTF

docker-compose up -d

这里问题就来了,这个问题当时困扰我很久,以及后面web动态容器的搭建也是卡在这步,拉不了镜像,这个问题其实就是镜像网址默认为国外,下载容易超时,而且国内的某些镜像网址也非常容易超时,我找了很多也是超时,甚至一度怀疑是我电脑的问题,这里向各位师傅推荐一个镜像网址就是华为云的镜像地址,每个用户都是唯一的,特别好用,登录华为云,容器镜像服务 SWR->镜像中心->镜像加速器

更改镜像地址

vi /etc/docker/daemon.json

添加你在华为云获取的镜像地址,这里不推荐其他地址,我都试过了,都是超时!!

接着重启一下docker服务

systemctl daemon-reload 
systemctl restart docker.service

拉取成功

打开浏览器访问80端口。到这已经完成GZ::CTF的搭建了,尽情游玩吧(bushi

三、web容器、动态flag的实现

安装docker desktop

对于非 Gnome 桌面环境,必须安装:gnome-terminal

apt install gnome-terminal

下载desktop.docker.deb,这里使用dpkg命令安装deb压缩包,apt用不了!!

dpkg -i ./docker-desktop-4.24.0-amd64.deb 

启动服务

systemctl --user start docker-desktop
systemctl --user enable docker-desktop

构建容器镜像

创建如下结构

flag.sh

#!/bin/sh
sed -i "s/flag{testflag}/$GZCTF_FLAG/" /var/www/html/index.php

export GZCTF_FLAG=""

该文件主要实现动态flag,这里主要需要更改的是你flag文件的路径 

Dockerfile

FROM ctftraining/base_image_nginx_mysql_php_56 

COPY src /var/www/html

RUN mv /var/www/html/flag.sh / \ 
        && chmod +x /flag.sh

该文件主要实现基本镜像拉取,把你整个镜像跑起来,若要加命令请在下行加run <bash命令> 

index.php

<!DOCTYPE html>
<html lang="en">
<head>
    <title>F12 no! no! no!</title>
</head>
<p style="font-family:arial;color:black;font-size:20px;text-align:center;">Flag不在这里哦</p>
<!-- flag{testflag} -->
<body>
    <script>
    document.oncontextmenu=function() {
    alert("右键被禁用");
    return false;
    };
    document.onkeydown = function(e) {
        e = window.event || e;
        var k = e.keyCode;
        //屏蔽ctrl+u,F12键
        if ((e.ctrlKey == true && k == 85) || k == 123) {
        if (k == 85)
            alert("Ctrl+U被禁用!");
        else 
            alert("F12被禁用!");
        e.keyCode = 0;
        e.returnValue = false;
        e.cancelBubble = true;
        return false;
        }
    }
    </script>
</body>
</html>

你自己的web题目。注意!flag应替换成flag.sh里的flag{testflag},不然无法实现动态flag 

<name>为你镜像的名称,并且在Web-F12目录中执行

docker build <name> .

在这遇到了某些问题

 这是因为系统环境变量的问题,输入以下命令:

echo 'export PATH="/usr/bin:/usr/local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

镜像搭建成功

查看容器是否存在

docker images

 

在GZ中测试,这里是你自己构造的镜像名

成功运行

四、总结

       这是我在校赛里办的一场新生赛,也算是一种经验吧,过程中遇到很多困难,比如镜像地址,以及docker pull不上等诸多问题。网上也搜了很多资料,也问了许多师傅,没有一个能做到底的。所以我把各位大佬的文章总集一下合成一篇新的文章,希望各位师傅能一把搭建。若文章中有问题,也希望各位师傅能拨乱反正(bushi

 

var code = "ddff9622-2f47-46f4-af43-1d74509dc18e"
posted @ 2024-11-29 09:32  F1yler  阅读(720)  评论(0)    收藏  举报  来源
F1ylerSec