记一次 CTF 环境和动态独立靶机部署
写在前面
寒假期间打算通过协会搞场比赛,最近得以如愿。正好年初学了点 Docker,顺便研究了一下动态独立靶机如何编写。CTF平台的话是通过 ip
+ windows
+ vmware
桥接出去做靶场。
靶场使用了 D0g3
基于 CTFD
二次开发的 H1ve
平台安装基本没有坑,但动态启动 Docker 坑很多… 且 H1ve
内置的 test/file_upload
题目有问题根本无法启动,导致被卡死在 Docker 这很久。
阅读下面的内容需要有一点点的 Linux
知识,并且会编写 Shell
脚本、Dockerfile
和 docker-compose.yml
文件。
开始安装
系统是在清华大学开源软件镜像站下载的 CentOS-7-x86_64-DVD-2009.iso,所以无需修改系统内置镜像源。
# 需要安装git和wget
yum -y install git
yum -y install wget
安装Docker
详情请移步我一月份的文章:Docker学习记录 这里不再赘述
安装H1ve
由于某些不可描述因素,国内访问 Github
时不时抽风。原本是打算搭建代理进行访问,最后想起可以通过修改 hosts
文件来进行访问。(其实还有一种方法 通过码云进行中转,但是对码云没有好感,果断放弃。
# 修改hosts
cd /etc
sudo rm -rf hosts
sudo wget https://cdn.jsdelivr.net/gh/521xueweihan/GitHub520@main/hosts
# 下载H1ve
git clone https://github.com/D0g3-Lab/H1ve.git H1ve-1.1.3
# 启动服务
cd H1ve-1.1.3
docker-compose -f single.yml up -d
# 停止服务
docker-compose -f single.yml stop
启动之后,我们可以通过 靶场ip:8000
,来访问靶场了,端口可以在 single.yml
中修改
动态独立靶机
- 每个人的环境都是独立的,题目遭到破坏不会影响到其他人。
- flag 为动态生成,每个人均不同,有效防止串 flag 行为。
遇到的最大的坑就是这里。貌似 H1Ve
内置的 test/file-upl0ad
存在问题。自己手动写了个题目才启动成功。
CTFd-Owl
后台导航栏-->Plugins-->CTFd-Owl
或者 靶场地址/plugins/ctfd-owl/admin/settings
Docker Settings
Docker Flag Prefix
:动态生成的flag前缀Docker APIs URL
:API名字(默认为unix://var/run/docker.sock)Max Container Count
:最大启动容器数量(默认无限制)Max Renewal Time
:最大容器延长时间(超过将无法延长,达到时间后会自动摧毁)
FRP Settings
FRP Http Domain Suffix
:FRP域名前缀(如开启动态域名转发必填)FRP Direct Ip Address FRP
:frp服务器IPFRP Direct Minimum Port
:最小端口FRP Direct Maximum Port
:最大端口FRP Config Template Frpc
:热重载配置头模版(如不会自定义,尽量按照默认配置)
[common]
token = random_this
server_addr = frps
server_port = 80
admin_addr = 0.0.0.0
admin_port = 7400
题目编写
目录结构
test # 题目存放文件夹必须小写英文
├─ Dockerfile
├─ docker-compose.yml
├─ files
│ ├─ index.php
│ └─ start.sh
└─ flag
Dockerfile
FROM php:7.3-apache
COPY files /var/www/html
RUN chmod 755 /var/www/html && \
chown root:root /var/www/html && \
chmod +x /var/www/html/start.sh
CMD /var/www/html/start.sh
EXPOSE 80
docker-compose.yml
version: '2'
services:
service:
# build 该置顶目录下的dockerfile
build: .
# image 指定build Dockerfile生成镜像的名称
image: test
ports:
- 9999:80
volumes:
# 挂载的 Flag
- "$PWD/flag:/flag"
tty: true
networks:
- net
networks:
# 配置docker network
net:
external:
name: h1ve_frp_containers
files/start.sh
#!/bin/bash
v=`cat /flag`
cat /var/www/html/index.php | sed -i "s/flag{test_flag}/$v/" /var/www/html/index.php # 用于正则匹配flag并替换
apache2-foreground
files/index.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>测试题目</title>
</head>
<body>
flag{test_flag}<!--这里会被start.sh替换成动态flag-->
</body>
</html>
flag
D0g3{f4af4a4fg485a6w4f89a489zv}
部署题目
后台导航栏-->Challenges-->加号
或者 靶场地址/admin/challenges/new
Challenge Type
:题目类型(选dynamic_check_docker)Deployment Type
:部署方式(选SINGLE-DOCKER-COMPOSE)Dirname
:题目所在文件夹(相对于ctfd-owl/source的相对路径)FRP Type
:frp类型(DIRECT为ip直接访问,HTTP为域名访问)FRP Port
:题目内网端口(例子中为80)Name
:题目名称Category
:题目类别(WEB/MISC..)Write&Preview
:题目介绍Initial Value
:题目初始分Decay Limit
:题目分数达到最小值之前的解决数量Minimum Value
:题目最低分
汉化界面
手动汉化了一下H1ve-theme和CTFd-Owl的用户界面,基本能汉化的全汉化了。 Github地址:https://github.com/5ime/H1ve-Chinese