iami233
iami233
文章113
标签102
分类4
记一次CTF环境和动态独立靶机部署

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

写在前面

寒假期间打算通过协会搞场比赛,最近得以如愿。正好年初学了点Docker,顺便研究了一下动态独立靶机如何编写。CTF平台的话是通过ip+windows+vmware桥接出去做靶场。
靶场使用了D0g3基于CTFD二次开发的H1ve 开源地址:https://github.com/D0g3-Lab/H1ve

平台安装基本没有坑,动态启动Docker坑很多… 且H1ve内置的test/file_upload根本无法启动。导致被卡死在docker这很久。
阅读下面的内容需要有一点点的Linux知识和会编写Shell脚本以及Dockerfiledocker-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:最大容器延长时间(超过将无法延长,达到时间后会自动摧毁)

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:热重载配置头模版(如不会自定义,尽量按照默认配置)
[common]
token = random_this
server_addr = frps
server_port = 80
admin_addr = 0.0.0.0
admin_port = 7400

2

题目编写

目录结构
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

theme
plugins

参考文章

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