本教程根据以下内容创作
GZCTF官方文档: https://docs.ctf.gzti.me/zhhttps://blog.csdn.net/qq_52820087/article/details/127851116
注: 关于动态Flag题目部署我只粗略概括, 更详细内容看上文第二篇大佬的文章, 并且下文只有web题的动态Flag部署,
没有pwn题的(问就是不会)
一. Web动态Flag题目部署
1. 创建如下结构目录(这里只做一个演示)
.+-- src| +-- index.php| +-- flag.sh+-- Dockerfile
接下来分别讲解每个文件的用处
a. index.php
这里简单的直接把Flag输出于页面上
<!DOCTYPE html><html><head> <title>签到</title></head><body><?phpecho "flag{testflag}";?></body></html>
b. DockerFile
FROM ctftraining/base_image_nginx_mysql_php_56 COPY src /var/www/htmlRUN mv /var/www/html/flag.sh && chmod +x /flag.sh
上文选用了 ctftraining/base_image_nginx_mysql_php_56 来作为基础镜像, 该镜像可以自动运行flag.sh帮助实现动态Flag, 关于该镜像的更多信息可以通过如下仓库
https://github.com/CTFTraining/base_image_nginx_mysql_php_73
然后把 src 目录复制到了基础镜像环境中的***/var/www/html下, 接着把/var/www/html/flag.sh***移动到根目录下, 以便自动运行
这里再提一句, GZCTF中, Dockerfile不需要写 EXPOSE 来暴露端口, 直接在Web页面创建题目时填写即可, 如果写了反而会导致占用端口资源等问题
c. flag.sh
#!/bin/shsed -i "s/flag{testflag}/$GZCTF_FLAG/" /var/www/html/index.phpexport GZCTF_FLAG=""
官方文档中提到, 容器采用 $GZCTF_FLAG 环境变量进行注入(通俗易懂的讲, 就是GZCTF会生成一个Flag放在 $GZCTF_FLAG 环境变量中), 所以我们只要把 $GZCTF_FLAG 放到我们想放的位置就可以了
所以就采用如上命令, 把预先留的flag{testflag}替换为 $GZCTF_FLA 的值
关于最后一句的用处, 我觉得应该是, 为了防止从环境变量中得到Flag, 从而绕过了原本题目
2. bulid镜像并push到DockerHub仓库上
a. bulid镜像
在Dockerfile所在目录下, 运行
docker build -t name/testweb .
name为dockerhub名(当然如果你不push到DockerHub上这里乱写也行)
testweb为镜像名(自定义)
"."为版本号,代表latest
> 这里建议先学一下Docker的命令
b. 查看镜像
docker images
c. push镜像
docker logindocker push name/webtest
这里name/webtest记得替换, 下图框出的地址下文会用到
3. 进入GZCTF平台, 部署题目
a. 创建题目时, 选择动态容器
b. 设置容器镜像
容器镜像填入刚刚我们push上去的地址(即上文框出的地址, 比如docker.io/name/testweb),
服务端口根据传入的容器需求填写(即容器对外开放的端口)
剩下的参数自行决定
c. 设置Flag生成规则
点击上文界面的编辑附件及flag
如果没有需求, 直接这样也可以, 有更多需求可以查看官方文档
二. 本地上传镜像部署
1. build镜像
跟上文一样, build镜像, 看看有没有存在创建好的镜像
docker images
2. 打包镜像
docker save -o D:\image.tar name/testweb
-o后面跟着是保存路径, 其他参数执行替换
3. 打包的文件上传到服务器上
通过Xftp将tar文件上传到服务器上
4. 加载镜像
docker load -i image.tar
-i 后面跟着是.tar文件的路径
5. 进入GZCTF平台, 部署题目
跟上文配置几乎一样, 就在填写容器镜像时, 直接填
docker ps
列出来的镜像名即可(比如name/testweb)
三. 其他类型题目的部署
其他的根据GZCTF平台的提示上传附件等就可以了~~(有手就行)~~
欢迎关注订阅号催更, 接下来研究一下k8s部署GZCTF