CTF-nc-docker 配置指南
CTF-nc-docker
Github 仓库:CTF-nc-docker
使用 xinted
提供服务,构建便捷易用的 netcat
环境,一行命令启动,简单易用。
支持多个题目/服务同时共存于同一容器环境、对访问进行日志记录、可选的题目附件下载服务、可自定义的容器资源限制、针对于每个题目的自定义设置。
主要支持 python 脚本、node.js 脚本及二进制可执行程序,将其标准输入输出暴露于网络连接。对于每个访问的连接,均会产生一个新的程序实例进行处理。
本项目仅供测试及学习使用,应用于生产/外网访问存在一定安全风险!!
尽管进行了较为严格的权限限制,但是对于能够暴露 shell 的题目,本项目容器存在一定逃逸风险!!
构建与运行
在安装好 docker 后,克隆本仓库到本地并在根目录执行 python generate.py
或 python3 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
作为基础进行构建。
在构建过程中:- 首先进行换源、建立文件夹并拷贝运行时库至下载目录。
- 升级并安装
xinted
,更新pip
并安装题目所需依赖库。 - 复制所需文件至相应目录。包括运行时脚本及服务配置文件等。
- 进行权限更改,将题目文件复制进入容器内的随机文件夹中,并阻止用户的遍历,防止越过题目获取
flag
。 - 给予相关文件及目录的可执行权限。
xinted
服务相关配置。
对于每道题目进行服务配置,对每道题目的执行用户、端口、启动脚本、日志位置等进行配置。
默认进行一定的资源限制和连接数限制。docker-compose.yml
控制容器的执行。
配置所需暴露端口、进行资源限制和网络配置。
TODO
- [ ] 使用
chroot
提供更好的安全性 - [x] 使用
xterm
提供网络终端的访问,类似可见Hackergame nc 类题目的网页终端