要说开源的ctf训练平台,ctfd是不错的选择,支持各种插件,今天我就来介绍一下如何部署 赵今师傅为ctfd平台写的一款支持独立动态靶机的插件。前提是你的ctfd也是docker部署的。
说到独立动态靶机,各位ctfer可能会联想到i春秋举办的各类比赛,其中比赛环境大都用到了动态独立靶机(dynamic standalone instance)技术,也就是每做一道题,就会自动生成一个虚拟题目环境,每一个环境刚刚生成的时候都是崭新的,且能为每个队伍生成一个独一无二的flag,防止flag分享作弊的行为。
先来看张图 = =
别被这张图吓到了, 这个图只是在本地部署动态靶机,而赵师傅的buuctf平台由于使用学校的服务器生成独立靶机还增加了内网穿透功能,网络结构要更复杂,所以这个插件有些功能是针对赵师傅下需求设计的,而我们仅仅只需要本地生成独立靶机即可,因此只需使用该插件如图所示的部分功能即可。
建议先去看看官方教程:)本教程对应官方教程第一种模式。
https://www.zhaoj.in/read-6333.html
下载frp并安装
编辑frps.ini
至于frpc.ini,先不急着配置,后面会配置
启动frps系统服务
启动frpc容器
创建网络frpcadmin用于ctfd容器和frpc容器通信
查看frpcadmin网络的连接情况并记录frpc容器的网络IP
编辑frpc.ini
编辑完之后记得重启frpc容器
下载靶场与插件
配置docker-compose.yml
重新build后启动ctfd
如果是在国内网络环境下构建镜像的同学,建议修改Dockerfile为以下来使用豆瓣源or阿里源:
然后部署下阿里云的docker加速器:
https://help.aliyun.com/document_detail/60750.html
https://cr.console.aliyun.com/cn-qingdao/instances/mirrors 选择左下角镜像加速器
注意由于这篇文章年代久远banal的版本已经不支持python2。如果遇到以下问题:
def is_sequence(obj: Any) -> bool syntax error:
请在reqiurements.txt添加:
如果遇到以下问题:
ERROR: Package ‘pyrsistent’ requires a different Python: 2.7.18 not in ‘>=3.5’
请在reqiurements.txt添加:
如果遇到问题:
ERROR: botocore 1.12.253 has requirement urllib3<1.26,>=1.20; python_version == “2.7”, but you’ll have urllib3 1.26.4 which is incompatible.
请在reqiurements.txt添加:
之后构建启动镜像。
将ctfd连接frpcadmin网络(如果使用前面的docker-compose.xml,这步可以忽略)
启动ctfd后进入管理页面选择插件
填写相关参数,注意要在template里面写上frpc.ini的内容。里面domain填写自己的
由于我这篇文章写的比较早,ctfd-whale已经有了很多次更新,根据 gtfly师傅的提醒,这里需要填写创建的网络。
启动题目选择dynamic_docker
这里选择一个支持动态FLAG的docker镜像,并选择设置该docker镜像的内部端口
内部端口可以用docker ps查看
以下docker-compose.yml的功能与上述操作步骤一样的,作为可选项,有能力的同学可以试试看
不出意外的话,现在在challenge界面可以使用动态靶机
管理员也可以在后台管理靶机
请看gtfly写的
http://www.gtfly.top/2019/09/27/CTFd%E5%8A%A8%E6%80%81docker%E9%95%9C%E5%83%8F%E7%BC%96%E5%86%99.html
或者可以看看赵师傅的贡献指南。
https://www.zhaoj.in/read-6259.html
推荐一个github靶机仓库
https://github.com/CTFTraining
1、创建一个新目录。
2、进入该目录,将可执行文件拷贝到该目录下,命名为 pwn。创建一个 Dockerfile 文件,内容如下:
glzjin/pwn_base_18 代表 Ubuntu 18.04, glzjin/pwn_base_16 代表 Ubuntu 16.04, glzjin/pwn_base_19 代表 Ubuntu 19.04, glzjin/pwn_base_20 代表 Ubuntu 20.04。注意,pwn的端口默认是10000
3、构建。
可以使用命令docker logs <ctfd容器的ID>
查看报错情况
确保docker api填写正确,如示例中为unix:///var/run/docker.sock
你也可以使用端口形式的api如 官方示例:可以用IP:端口指定API
然后使用如下命令进入ctfd容器,手动调用端口测试
如果api正确会列出所有镜像
可以使用如下命令进入ctfd容器,手动调用端口测试
如果还是不行,也可以尝试查看ctfd和frpc容器的日志来分析解决。
或者在ctfd源码里面使用print打印日志,再重启容器即可。
在搭建ctfd的时候,默认会有一个类似微信登录的方式登录的选项,就是使用MLC来登录。
但是当你试图用mlc登录的时候,你就会收到这样的错误
OAuth Settings not configured. Ask your CTF administrator to configure MajorLeagueCyber integration.
下面教你怎么开启使用mlc登录的功能
首先注册并登录mlc
选择create event
创建好了以后按照下面的方式填写相关信息
并把上面的Client ID和secret填写到ctfd的设置页面
之后就可以用mlc来登录了,当然登录的前提是用户已经注册mlc的账号,使用mlc账号登录的话会有一个official的标签如下: