# 前言:

还在持续完善中
使用最多的开源 ctf 靶场就是 GZCTF ctfd,对比来说 GZCTF 靶场的功能更加全面,所以我们今天搭建 GZCTF 靶场
本次搭建非本地源码搭建,而是用 docker 拉取搭建
开源地址:https://github.com/GZTimeWalker/GZCTF

为什么选择 docker?
为什么只需要这两个配置文件就能运行?
1.Docker 镜像已包含所有运行时依赖:
gzctf/web:latest 镜像已经内置了 .NET Core 运行时、Nginx 等,无需手动安装。
2.docker-compose.yml 自动管理服务:
一键启动所有容器(Web + DB + Redis)。
自动处理网络通信(容器间通过服务名访问,如 db:3306)。
3.appsettings.json 提供灵活配置:
修改配置后只需重启容器,无需重新构建镜像

# 准备:

ubuntu 系统(我这里用的是他的 kali 系统)
华为云账号(用于加速器配置)

# 开始:

# 换源

1.png
注释掉原来的源,替换为下面的
deb https: //mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src https: //mirrors.aliyun.com/kali kali-rolling main non-free contrib
2.png
更新软件库
3.png
然后可以正式开始了

# 开始搭建

# 安装 docker.io,docker-compose

4.png
安装完成查看当前 docker 版本,显示版本则安装成功
5.png

# 进入你要创建 GZCTF 项目的路径,mkdir GZCTF 创建 GZCTF 文件夹,ls 列出看看是否创建成功

7.png

# 进入创建的 GZCTF 文件夹分别在里面创建 appsettings.json 文件和 docker-compose.yml 文件,并 ls 列出查看是否创建成功

8.png

# 分别编译这两个文件

vi appsettings.json/docker-compose.yml

appsettings.json 代码块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{
"AllowedHosts": "*",
"ConnectionStrings": {
"Database": "Host=db:5432;Database=gzctf;Username=postgres;Password=123456" //必须项,你设置的密码,后面要跟数据库密码一致
},
"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": "192.168.25.137", // or "xxx.xxx.xxx.xxx" !必须项,用于创建容器,外部访问地址,可以是ip或域名
// 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.25.137/8"] //必须项,可以是0.0.0.0/0,也修改成自己的对应ip,防止网段冲突问题
}
}

docker-compose.yml 代码块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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=admin" # 初始管理员密码
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=123456" # 数据库密码
volumes:
- "./data/db:/var/lib/postgresql/data"


# 配置华为云镜像加速器

如果不配置镜像加速器会导致 docker 无法打开
步骤:登录已经实名了的华为云账号,swr-> 镜像资源 -> 镜像中心 -> 镜像加速器
9.png
输入命令 sudo nano /etc/docker/daemon.json 替换红框里的加速器链接
依次输入命令重启程序
systemctl daemon-reload
systemctl restart docker.service
10.png

# 启动靶场

docker-compose up -d
启动成功如下图
11.png

# 访问 ip 即可进入靶场

11.png

# 管理员配置(如果初始后没有管理员账号的话)

正常注册一个账号
1.png
输入 docker compose exec db psql -U postgres
2.png
继续输入 UPDATE “AspNetUsers” SET “Role”=3 WHERE “UserName”=‘admin’;
这里的 admin 是自己注册的用户名
3.png
然后登录进去就可以看到我们是管理员权限了,左边多了一个小扳手
然后就可以自由操作了
4.png
5.png
6.png

# 简单的上传题目(web)

首先创建一个目录 web-test
再创建一系列文件和字目录,结构如下:
tree.png
然后三个文件的代码如下

flag.sh 代码块
1
2
3
4
#!/bin/sh
sed -i "s/flag{this_is_flag}/$GZCTF_FLAG/" /var/www/html/index.php

export GZCTF_FLAG=""
index.php 代码块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!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>
Dockerfile 代码块
1
2
3
4
5
6
FROM ctftraining/base_image_nginx_mysql_php_56 

COPY src /var/www/html

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

进入当前题目的目录,然后输入 docker build -t test . 将当前容器命名 test,这个。不能掉了
1.png
最后根据流程依次完成
2.png
3.png
开启容器,成功访问
4.png
最最最后就可以愉快的玩耍了

更新于

请我喝[茶]~( ̄▽ ̄)~*

麻糖 微信支付

微信支付

麻糖 支付宝

支付宝

麻糖 贝贝

贝贝