1.GZCTF平台搭建
(1)新建GZCTF文件夹,并且在该文件夹下创建两个文件
(2)appsettings.json文件,建议直接复制粘贴,红框框起来部分是需要修改部分
{
"AllowedHosts": "*",
"ConnectionStrings": {
"Database": "Host=db:5432;Database=gzctf;Username=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": "192.168.186.135", // 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"]
}
}
(3)docker-compose.yml文件,建议直接复制粘贴,红框框起来部分是需要修改部分
version: "3.0"
services:
gzctf:
image: gztime/gzctf:latest
restart: always
environment:
- "GZCTF_ADMIN_PASSWORD=***********"
# choose your backend language `en_US` / `zh_CN` / `ja_JP`
- "LC_ALL=zh_CN.UTF-8"
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
db:
image: postgres:alpine
restart: always
environment:
- "POSTGRES_PASSWORD=********"
volumes:
- "./data/db:/var/lib/postgresql/data"
(4)平台搭建
#搭建平台
docker-compose up
#关闭平台
docker-compose down
(5)浏览器访问,至此,平台搭建完成
2.GCC编译生成题目
(1)题目源码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void init(){
setvbuf(stdout, 0LL, 2, 0LL);
setvbuf(stdin, 0LL, 2, 0LL);
setvbuf(stderr, 0LL, 2, 0LL);
}
void vul(){
char buf[128];
read(0, buf, 512);
}
int main(int argc, char** argv){
init();
write(1, "Hello, World\n", 13);
vul();
}
(2)创建.c文件,放入源码
(3)GCC编译
#gcc 未编译文件名 -o 编译完成后文件名
#默认保护全开
gcc csu.c -o csu
#部分开启got表,关闭stack保护,关闭pie,-o 编译完成文件名,未编译文件名
gcc -z lazy -fno-stack-protector -no-pie -o csu csu.c
#gcc编译中的集中保护打开和关闭
# 关闭NX / 开启NX
-z execstack / -z noexecstack
# 关闭canary / 开启canary
-fno-stack-protector / -fstack-protector-all
# 关闭pie / 开启pie
-no-pie / -pie
# 关闭relro / 部分开启relro / 完全开启relro
-z norelro / -z lazy / -z now
3.CTF-Xined项目获取
(1)更新镜像源
sudo apt-get update
(2)获取CTF-Xined项目
#下载地址,下载完成后拷贝到服务器中
https://github.com/CTF-Archives/ctf-docker-template
#或者直接git获取
git clone https://github.com/CTF-Archives/ctf-docker-template
4.题目准备
(1)进入项目文件夹,根据题目选择Ubuntu版本
(2)将题目源程序放在src目录下
(3)修改./config/ctf.xinetd文件,红框部分修改成题目名字
(4)修改./dockerfile文件,红框部分修改成题目名字
(5)修改./service/docker-entrypoint.sh文件,同样红框部分修改为题目名字
5.题目镜像制作
(1)在ubuntu版本目录下,制作题目镜像
#docker build -t 创建容器名字(题目名字)
docker build -t test_your_nc . #注意后面有个点.
(2)查看制作的题目镜像
docker images #查看制作的镜像
6.题目部署到平台
(1)登录后台admin账户,新建比赛
(2)部署题目,两个重要的地方,填写容器镜像以及容器服务端口(其他功能据个人需求调整)
(3)刚刚创建的题目镜像填写至容器处
(4)修改容器服务端口号为9999,因为Xined部署默认服务端口为9999
(可以修改,具体修改不做介绍)详细情况参考阅读pwn部分
https://hello-ctf.com/docker-template/#pyjail-python_310-socat-xinetd
(5)编写flag模板并且保存
(6)题目附件上传,可以本地也可远程
(7)返回上级并且开放题目
(8)进入比赛对题目进行测试,至此,出题完成
7.题目部署到远程服务器
(1)正常情况下,GZ平台是搭建在远程服务器上的,所以部署题目需要进行ssh连接远程服务器
(2)在远程服务器完成上面的2-3步后,利用scp命令将文件拷贝至各ubuntu版本对应的src目录下
#scp 文件在本地路径 用户名@服务器IP:文件存放在服务器的绝对路径
scp /home/yeah/Desktop/SAS/magic ubuntu@111.230.195.230:/home/ubuntu/sasctf_pwn/ctf-docker-template/pwn-ubuntu_16.04/src
(3)随后进行上面的4-6步即可完成远程服务器的题目部署
8.用到的docker命令以及遇到的问题
(1)docker命令
docker-compose up #docker搭建GZ平台
docker-compose down #docker平台关闭
docker ps #查看当前运行的容器
docker images #查看制作的容器镜像
docker rmi 镜像ID/镜像名称 #删除容器镜像
docker stop #停止容器
docker rm 容器ID/容器名字 #删除容器命令
(2)创建容器的时候报错,可能是网络原因,重启虚拟机后便解决了