GZCTF搭建

https://docs.ctf.gzti.me/

官方文档

一个比较详细的安装教程

https://wdh.hk/tech/ctf/%E6%96%B0%E7%9F%A5/GZCTF%E9%83%A8%E7%BD%B2%E7%AC%94%E8%AE%B0.html#%E5%B0%86%E5%BD%93%E5%89%8D%E7%94%A8%E6%88%B7%E5%8A%A0%E5%85%A5docker%E7%BB%84

默认先安装docker、docker-compose

建议以下内容用root账户完成

本文没放图片,只要文字,可以先自己尝试一下

下载

先下载GZCTF

https://github.com/GZTimeWalker/GZCTF

添加配置文件

添加两个配置文件放在GZCTF文件夹里

修改里面内容,密码、邮箱等等

其中密码要增加复杂度,简单的密码会导致配置失败

例如登录默认管理员账号的时候登录不上

配置内容如下

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
 {
"AllowedHosts": "*",
"ConnectionStrings": {
"Database": "Host=db:5432;Database=gzctf;Username=postgres;Password=<String1>"
//<String1>换成数据库密码,随机密码且长度足够
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
//邮箱配置
"EmailConfig": {
"SendMailAddress": "Admin@xxx.com", // 填入邮箱
"UserName": "ctf_noreply", // 发件人名称
"Password": "UWPTINWMFPQVMPAH", // 邮箱密码,部分服务商需要填入授权码
"Smtp": {
"Host": "smtp.163.com", // 此处为163邮箱服务器,具体自定
"Port": 465
}
},
"XorKey": "<String2>", // 自定XorKey
"ContainerProvider": {
"Type": "Docker",
"PublicEntry": "xx.xx.xx.xx", // 域名或IP配置,用于容器生成,域名不带http/https
"DockerConfig": {
"SwarmMode": false,
"Uri": "" // 本地配置Docker因此此处置空
}
},
"RequestLogging": false,
"DisableRateLimit": false,
"RegistryConfig": {
"UserName": "",
"Password": "",
"ServerAddress": ""
},

//谷歌验证码配置
"GoogleRecaptcha": {
"VerifyAPIAddress": "https://www.recaptcha.net/recaptcha/api/siteverify",
"Sitekey": "",
"Secretkey": "",
"RecaptchaThreshold": "0.5"
}
}

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
33
34
35
36
37
38
version: '3.0'
services:
gzctf:
image: gztime/gzctf:latest
restart: always
environment:
- "GZCTF_ADMIN_PASSWORD=<String3>" # <String3>换成管理员账户密码,账号为Admin
ports:
- "80:80" # 对外端口号,前为外部端口。
networks:
default:
volumes:
- "./data/files:/app/uploads"
- "./appsettings.json:/app/appsettings.json:ro"
- "./logs:/app/log"
- "./data/keys:/root/.aspnet/DataProtection-Keys"
# - "./k8sconfig.yaml:/app/k8sconfig.yaml:ro"
- "/var/run/docker.sock:/var/run/docker.sock"
depends_on:
- db

db:
image: postgres:alpine
restart: always
environment:
- "POSTGRES_PASSWORD=<String1>" # 数据库密码,务必要和appsettings.json中的配置一致
networks:
default:
volumes:
- "./data/db:/var/lib/postgresql/data"

networks:
default:
driver: bridge
ipam:
config:
- subnet: 192.168.12.0/24

运行

在GZCTF目录下

需要在有docker-compose.yml文件的目录下才可以运行这个命令

运行前需要确保docker已经启动了

这里赠送两条命令(wsl不能使用systemctl命令,具体怎么替换就不知道了,因为直接放弃了用wsl使用这玩意)

启动docker

1
sudo systemctl start docker

设置开机启动docker

1
sudo systemctl enable docker

**启动

(聪明的人会自己补齐那两个字)

1
docker-compose up -d //加-d会后台运行,不加-d前台运行,谁试谁知道
1
docker ps  //查看一下运行的docker容器

这里遇到了连接超时问题,有需要的可以看下面的解决办法

docker拉取GZCTF时连接超时

第一种解决办法

可以尝试换docker镜像

1
docker info //查看镜像信息

可以在

在/etc/docker/daemon.json里修改配置

1
2
3
4
5
6
7
{
"registry-mirrors": [
"https://o3edq20e.mirror.aliyuncs.com",
"https://cr.console.aliyun.com",
"https://yxzrazem.mirror.aliyuncs.com"
]
}

修改完后

重新加载docker的配置文件

1
sudo systemctl daemon-reload

重启docker

1
sudo systemctl restart docker

docker info 查看一下配置有没有修改好

有时候改完镜像也不会出现拉去失败的情况

可以拼运气,多试几次,我反正试了半天没成功

所有来了个下面的远水解近火

第二种解决方式

服务器拉不下来镜像

找可以拉下来镜像的

可以是在虚拟机里,或者其他可以的各种

问题主要出在dockerhub访问不到

自己想办法喽

打包已经下载完的镜像

1
docker save 你要打包的镜像名字或者id > 自己起个名字.tar

放到你需要的地方,例如我需要放在我的服务器上,找一个位置就可,运行完可以删掉tar文件

1
docker load < 自己起个名字.tar

这个时候去查看自己的docker镜像,就会发现有这个东西

再删去压缩包没法新对下载的镜像有影响

省空间了

但是麻烦了点

解完完问题后

不出意外会有这俩容器运行

1
2
c69c23555ad0   gztime/gzctf:latest   "dotnet CTFServer.dll"   2 days ago   Up 2 days   0.0.0.0:80->80/tcp, :::80->80/tcp   gzctf-develop_gzctf_1
ab81bff5922e postgres:alpine "docker-entrypoint.s…" 2 days ago Up 2 days 5432/tcp gzctf-develop_db_1

可以通过gzctf的id来查看它的运行日志,确定有没有连接到数据库

1
docker logs c69c23555ad0

访问

访问一下确保自己能访问

访问不了可以看看端口开没开,或者有没有被占用

1
netstat -tanlp

可以kill掉占用端口的进程

或者给占用端口的进程换个端口

看个人情况

这个时候就要百度了

到这基本就结束了,可以让它一直挂载在后台运行

接下里来是测试平台和出题

测试平台

根据自己填写的ip和端口打开平台

登录管理员账号

测试一下常用的项目等

重点是web出题和pwn出题

re、misc和密码只需要flag和附件即可,比较简单

动态附件

动态附件没什么坑

只要注意flag会把文件名的后缀也加上去

在上传文件的时候把后缀名删掉

在下发的同意文件名里再加上就可

例如一个

flag{Th1s_t3st_fl@g}.txt文件

上传的时候上传flag{Th1s_t3st_fl@g}文件

删掉后缀

下发的统一文件名改为

题目.txt

即可

动态容器

注意俩问题

一个服务端口

端口

平台设置的和dockerfile文件写的暴露端口要一致

服务器也要开放这个端口

不然访问不了

可恨的是腾讯云的端口不仅要在管理面板开,在腾讯云的服务器控制面板也要开

动态flag

注意GZCTF平台的动态flag的环境变量是

1
$GZCTF_FLAG

dockerfile

另外要会dockerfile的写法

还不会目前正在偷学长写好的现成的

写完所有的题目和配置文件

(如果写了docker-compose配置文件的话可以docker-compose启动,关闭命令是吧up 换成down)

没有的话手动一步步来,其实也就一步

在dockerfile在的目录里

1
docker build -t 名字 .

eg:

1
docker build -t qlnuctf/web

.是在当前目录

它会在本目录寻找dockerfile文件,按里面的配置来打包这个镜像

打包完了可以查看自己已有的镜像

1
docker images

如果有qlnuctf/web这个镜像就说明打包成功了、

配置到平台上

在给出的容器镜像里填上你自己打包的镜像的名字,服务端口是dockerfile配置的端口

qlnuctf/web