CTF-nc-docker

Github 仓库:CTF-nc-docker

使用 xinted 提供服务,构建便捷易用的 netcat 环境,一行命令启动,简单易用。

支持多个题目/服务同时共存于同一容器环境、对访问进行日志记录、可选的题目附件下载服务、可自定义的容器资源限制、针对于每个题目的自定义设置。

主要支持 python 脚本、node.js 脚本及二进制可执行程序,将其标准输入输出暴露于网络连接。对于每个访问的连接,均会产生一个新的程序实例进行处理。

本项目仅供测试及学习使用,应用于生产/外网访问存在一定安全风险!!
尽管进行了较为严格的权限限制,但是对于能够暴露 shell 的题目,本项目容器存在一定逃逸风险!!

构建与运行

在安装好 docker 后,克隆本仓库到本地并在根目录执行 python generate.pypython3 generate.py

运行过程中产生的访问日志可以由容器内目录的 /var/log/ctf/*.log 获取。

若开启文件附件下载服务,则可以通过 http://{hostname}:{download_port} 查看到全部题目及其对应端口。

初次运行脚本会在根目录生成 global.json,请根据脚本提示进行操作。

配置说明

全局设置见 global.json,题目特意化设置见各题目文件夹中的 config.json

global.json

{
    "mirrors_base_url": "mirrors.tuna.tsinghua.edu.cn",
    "pypi_index_url": "https://pypi.tuna.tsinghua.edu.cn/simple",
    "npm_mirror_url": "http://registry.npmmirror.com/",
    "hostname": "localhost",
    "port_range_start": 65100,
    "download_server": true,
    "web_netcat_server": true,
    "server_port": 65199,
    "show_echo_msg": true,
    "show_warn_msg": true,
    "resource_limit": {
        "enable": true,
        "max_memory": "512M",
        "max_cpu": "0.5"
    }
}
  • mirrors_base_url: Debian 软件源(域名)
  • pypi_index_url: PyPI 软件源
  • npm_mirror_url: NPM 软件源
  • hostname: 访问该容器的主机名
  • port_range_start: 起始端口号
  • download_port: 文件下载服务所开放的端口
  • download_server: 是否开启文件下载服务
  • web_netcat_server: 是否开启网络 netcat 终端服务
  • server_port: 服务器端口
  • show_echo_msg: 显示题目信息
  • show_warn_msg: 显示警告信息
  • resource_limit: 运行时容器资源限制
    • enable: 是否启用限制
    • max_memory: 最大占用内存
    • max_cpu: 最大占用CPU

config.json

{
    "enable": true,
    "pip_requirements": [],
    "all_copy": true,
    "launch": "python3",
    "args": ["-u", "./src.py"],
    "extra_cmd": [],
    "copy_files": [],
    "echo_msg": ["Write some descr here."],
    "download_file_name": ""
}
  • enable: 是否启用该题目
  • pip_requirements: 需要使用 pip 安装的包
  • all_copy: 是否拷贝题目目录全部文件 (不拷贝config.json)
  • launch: 启动程序
  • args: 启动参数
  • extra_cmd: 其余需要执行的指令 (如 pip)
  • copy_files: 当不全部拷贝题目文件时,需要拷贝的文件 (相对于题目目录的路径)
  • echo_msg: 执行程序前输出的说明
  • download_file_name: 提供需要下载的题目文件

示例题目展示效果

calculator never overflow

配置文件

{
  "enable": true,
  "pip_requirements": ["sympy"],
  "all_copy": true,
  "launch": "python3",
  "args": ["-u", "./src.py"],
  "extra_cmd": [],
  "copy_files": [],
  "echo_msg": [
    "某同学写了一个简单的计算器程序,支持加、减、乘、除、乘方、开方运算。",
    "但是,计算器计算大数的时候会溢出,这位同学不想看到计算器溢出,于是他想了一个绝妙的方法。而更绝妙的是,这里的空间足够写下这个方法:",
    "让计算器的所有计算都是在 mod n 意义下进行",
    "出于某种众所周知的原因,他还用这个计算器算了一下 flag 字符串对应的整数的 65537 次方。"
  ],
  "download_file_name": ""
}

题目效果

$ nc localhost 65101
================ calculator_never_overflow =================
!!!      此环境为测试训练环境,安全性较弱,请勿执行恶意代码      !!!
!!!   DO NOT EXECUTE HARMFUL CODE IN THIS TRAINING ENV   !!!
============================================================
某同学写了一个简单的计算器程序,支持加、减、乘、除、乘方、开方运算。
但是,计算器计算大数的时候会溢出,这位同学不想看到计算器溢出,于是他想了一个绝妙的方法。而更绝妙的是,这里的空间足够写下这个方法:
让计算器的所有计算都是在 mod n 意义下进行
出于某种众所周知的原因,他还用这个计算器算了一下 flag 字符串对应的整数的 65537 次方。
============================================================

This is a calculator mod n
You can try: a + b, a - b, a * b, a / b, a ^ b, sqrt(a)
Be aware of the spaces around operators
flag ^ 65537 = ...
<more>

配置解释

这是一道密码学题目,需要通过交互计算得到 flag,不需要获取远程服务器 shell,但是需要安装依赖库。

启用该题目;此题目的 python 依赖库有 sympy;拷贝目录下全部文件;启动命令行为 python3;参数为 ["-u", "./src.py"]; 部署期不需要执行额外命令;输出四行内容;不提供文件下载。

tictactoe

配置文件

{
  "enable": true,
  "pip_requirements": [],
  "all_copy": true,
  "launch": "./tictactoe",
  "args": [],
  "extra_cmd": [],
  "copy_files": [],
  "echo_msg": ["一道很好的PWN入门题。"],
  "download_file_name": "examples/tictactoe.zip"
}

题目效果

$ nc localhost 65109
======================== tictactoe =========================
!!!      此环境为测试训练环境,安全性较弱,请勿执行恶意代码      !!!
!!!   DO NOT EXECUTE HARMFUL CODE IN THIS TRAINING ENV   !!!
============================================================
一道很好的PWN入门题。
题目附件:http://localhost:65199/examples/tictactoe.zip
============================================================

Welcome to Tic Tac Toe! Computer first!
You're 'X' and I'm 'O'!
Now computer goes!
O__
___
___
Now human goes!
Your turn. Input like (x,y), such as (0,1):

配置解释

这是一道二进制题目,题目目标为获取远程服务器 shell 并读取同目录下的 flag 文件。

启用该题目;此题目无 python 依赖库;拷贝目录下全部文件;启动命令行为 ./tictactoe;无额外参数; 部署期不需要执行额外命令;输出一行内容;提供文件下载,位于attachments中相对路径:examples/tictactoe.zip

生成文件解释

  • tmp/run/*
    每道题目的启动脚本,由每道题目的 config.json 生成。
    负责改变执行目录、输出相关信息和题目描述、题目附件等,并最终执行题目启动命令。

  • tmp/start.sh
    服务启动脚本,在 Dockerfile 最后被执行。如果启用文件服务则在此文件中会执行 python3 -m http.server

  • tmp/index.html
    默认主页,在直接请求文件服务时,会显示此主页,并列出全部题目及相关访问命令

  • Dockerfile
    控制容器的构建过程。
    经过几次选择,在保证容器大小更小的情况下,使用 python:slim 作为基础进行构建。
    在构建过程中:

    1. 首先进行换源、建立文件夹并拷贝运行时库至下载目录。
    2. 升级并安装 xinted,更新 pip 并安装题目所需依赖库。
    3. 复制所需文件至相应目录。包括运行时脚本及服务配置文件等。
    4. 进行权限更改,将题目文件复制进入容器内的随机文件夹中,并阻止用户的遍历,防止越过题目获取 flag
    5. 给予相关文件及目录的可执行权限。
  • xinted
    服务相关配置。
    对于每道题目进行服务配置,对每道题目的执行用户、端口、启动脚本、日志位置等进行配置。
    默认进行一定的资源限制和连接数限制。

  • docker-compose.yml
    控制容器的执行。
    配置所需暴露端口、进行资源限制和网络配置。

TODO

Contributors