iami233
iami233
文章156
标签37
分类4

文章分类

文章归档

记一次 CTF 环境和动态独立靶机部署

记一次 CTF 环境和动态独立靶机部署

写在前面

寒假期间打算通过协会搞场比赛,最近得以如愿。正好年初学了点 Docker,顺便研究了一下动态独立靶机如何编写。CTF平台的话是通过 ip + windows + vmware 桥接出去做靶场。

靶场使用了 D0g3 基于 CTFD 二次开发的 H1ve

平台安装基本没有坑,但动态启动 Docker 坑很多… 且 H1ve 内置的 test/file_upload 题目有问题根本无法启动,导致被卡死在 Docker 这很久。

阅读下面的内容需要有一点点的 Linux 知识,并且会编写 Shell 脚本、Dockerfiledocker-compose.yml 文件。

开始安装

系统是在清华大学开源软件镜像站下载的 CentOS-7-x86_64-DVD-2009.iso,所以无需修改系统内置镜像源。

1
2
3
# 需要安装git和wget
yum -y install git
yum -y install wget

安装Docker

详情请移步我一月份的文章:Docker学习记录 这里不再赘述

安装H1ve

由于某些不可描述因素,国内访问 Github 时不时抽风。原本是打算搭建代理进行访问,最后想起可以通过修改 hosts 文件来进行访问。(其实还有一种方法 通过码云进行中转,但是对码云没有好感,果断放弃。

1
2
3
4
5
6
7
8
9
10
11
# 修改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:最大容器延长时间(超过将无法延长,达到时间后会自动摧毁)

1

FRP Settings

  • FRP Http Domain Suffix:FRP域名前缀(如开启动态域名转发必填)
  • FRP Direct Ip Address FRP:frp服务器IP
  • FRP Direct Minimum Port:最小端口
  • FRP Direct Maximum Port:最大端口
  • FRP Config Template Frpc:热重载配置头模版(如不会自定义,尽量按照默认配置)
1
2
3
4
5
6
[common]
token = random_this
server_addr = frps
server_port = 80
admin_addr = 0.0.0.0
admin_port = 7400

2

题目编写

目录结构
1
2
3
4
5
6
7
test # 题目存放文件夹必须小写英文
├─ Dockerfile
├─ docker-compose.yml
├─ files
│ ├─ index.php
│ └─ start.sh
└─ flag
Dockerfile
1
2
3
4
5
6
7
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
1
2
3
4
5
6
#!/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
1
2
3
4
5
6
7
8
9
10
11
<!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
1
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

theme
plugins

参考文章

本文作者:iami233
本文链接:https://5ime.cn/h1ve.html
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可