# 前言:
还在持续完善中
使用最多的开源 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", "PortMappingType": "Default", "EnableTrafficCapture": false, "PublicEntry": "192.168.25.137", "DockerConfig": { "SwarmMode": false, "Uri": "unix:///var/run/docker.sock" } }, "RequestLogging": false, "DisableRateLimit": true, "RegistryConfig": { "UserName": "", "Password": "", "ServerAddress": "" }, "CaptchaConfig": { "Provider": "None", "SiteKey": "<Your SITE_KEY>", "SecretKey": "<Your SECRET_KEY>", "GoogleRecaptcha": { "VerifyAPIAddress": "https://www.recaptcha.net/recaptcha/api/siteverify", "RecaptchaThreshold": "0.5" } }, "ForwardedOptions": { "ForwardedHeaders": 5, "ForwardLimit": 1, "TrustedNetworks": ["192.168.25.137/8"] } }
|
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" - "GZCTF_ADMIN_PASSWORD=admin" ports: - "80:8080" volumes: - "./data/files:/app/files" - "./appsettings.json:/app/appsettings.json:ro" - "/var/run/docker.sock:/var/run/docker.sock" 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; 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]()
最最最后就可以愉快的玩耍了