要说开源的ctf训练平台,ctfd是不错的选择,支持各种插件,今天我就来介绍一下如何部署赵今师傅为ctfd平台写的一款支持独立动态靶机的插件。前提是你的ctfd也是docker部署的。
说到独立动态靶机,各位ctfer可能会联想到i春秋举办的各类比赛,其中比赛环境大都用到了动态独立靶机(dynamic standalone instance)技术,也就是每做一道题,就会自动生成一个虚拟题目环境,每一个环境刚刚生成的时候都是崭新的,且能为每个队伍生成一个独一无二的flag,防止flag分享作弊的行为。
先来看张图 = =
建议先去看看官方教程:)本教程对应官方教程第一种模式。 www.zhaoj.in/read-6333.h…
下载frp并安装
cd
wget https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_linux_amd64.tar.gz
tar -zxvf frp_0.29.0_linux_amd64.tar.gz
cd frp_0.29.0_linux_amd64
sudo cp systemd/* /etc/systemd/system/
sudo mkdir /etc/frp
sudo cp frpc.inifrps.ini /etc/frp/
sudo cp frpcfrps /usr/bin/
sudo chmod a+x /usr/bin/frpc /usr/bin/frps
sudo systemctl enable frps
编辑frps.ini
sudo vim /etc/frp/frps.ini
[common]
bind_port = 7897
bind_addr = 0.0.0.0
token =thisistoken
至于frpc.ini,先不急着配置,后面会配置
启动frps系统服务
sudo systemctl start frps
启动frpc容器
sudo docker network create ctfd_frp-containers
sudo docker run-d -v ~/frp_0.29.0_linux_amd64/frpc.ini:/etc/frp/frpc.ini --network="ctfd_frp-containers" --restart=always "glzjin/frp"
创建网络frpcadmin用于ctfd容器和frpc容器通信
sudo docker network create frpcadmin
sudo docker network connect frpcadmin
#将frpc和ctfd容器单独连接到网络frpcadmin,注意要等容器创建好之后再连接,因此ctfd将在稍后连接
查看frpcadmin网络的连接情况并记录frpc容器的网络IP
docker network inspect frpcadmin
vim ~/frp_0.29.0_linux_amd64/frpc.ini
[common]
server_addr = 172.17.0.1 # 这里填写宿主机ifconfig之后docker0的ip,因人而异,不要一摸一样填
server_port = 7897
token=thisistoken
admin_addr = 172.22.0.2 #这里填写frpc容器在frpcadmin网络里的ip,因人而异,不要一摸一样填,而且要和后续下图插件配置界面中️的一样。
admin_port = 7400
log_file = ./frps.log
docker restsrt
下载靶场与插件
git clone https://github.com/CTFd/CTFd.git
cd CTFd/
git reset 6c5c63d667a17aec159c8e26ea53dccfbc4d0fa3 --hard
#回滚到当前教程适合的版本
cd CTFd/plugins #打开ctfd插件目录
git clone https://github.com/glzjin/CTFd-Whale.git ctfd-whale #确保插件文件夹小写
cd ctfd-whale
git reset 5b32f457e9f56ee9b2b29495f4b3b118be3c57bd --hard #回滚到当前教程适合的版本
cd ../.. #返回ctfd主目录
vim docker-compose.yml
配置docker-compose.yml
version: '2.2'
services:ctfd:build: .user: rootrestart: alwaysports:- "8000:8000" #你自己的environment:- UPLOAD_FOLDER=/var/uploads- DATABASE_URL=mysql+pymysql://root:ctfd@db/ctfd- REDIS_URL=redis://cache:6379- WORKERS=1- LOG_FOLDER=/var/log/CTFd- ACCESS_LOG=-- ERROR_LOG=-volumes:- .data/CTFd/logs:/var/log/CTFd- .data/CTFd/uploads:/var/uploads- .:/opt/CTFd:ro- /var/run/docker.sock:/var/run/docker.sock #添加这句即可,别的基本按照官方的不用动depends_on:- dbnetworks:default:internal:db:image: mariadb:10.4.12 #这里改成10.4.12,10.4.13会出错restart: alwaysenvironment:- MYSQL_ROOT_PASSWORD=ctfd- MYSQL_USER=ctfd- MYSQL_PASSWORD=ctfd- MYSQL_DATABASE=ctfdvolumes:- .data/mysql:/var/lib/mysqlnetworks:internal:# This command is required to set important mariadb defaultscommand: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --wait_timeout=28800, --log-warnings=0]cache:image: redis:4restart: alwaysvolumes:- .data/redis:/datanetworks:internal:
networks:default:internal:internal: true
重新build后启动ctfd 如果是在国内网络环境下构建镜像的同学,建议修改Dockerfile为以下来使用豆瓣源or阿里源:
FROM python:2.7-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories &&\apk update && \apk add python python-dev linux-headers libffi-dev gcc make musl-dev py-pip mysql-client git openssl-dev
RUN adduser -D -u 1001 -s /bin/bash ctfd
WORKDIR /opt/CTFd
RUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploads
RUN pip config set global.index-url https://pypi.doubanio.com/simple
RUN pip config set install.trusted-host pypi.doubanio.com
COPY requirements.txt .
RUN pip install -r requirements.txt -ihttps://pypi.doubanio.com/simple
COPY . /opt/CTFd
RUN for d in CTFd/plugins/*; do \if [ -f "$d/requirements.txt" ]; then \pip install -r $d/requirements.txt -ihttps://pypi.doubanio.com/simple; \fi; \done;
RUN chmod +x /opt/CTFd/docker-entrypoint.sh
RUN chown -R 1001:1001 /opt/CTFd
RUN chown -R 1001:1001 /var/log/CTFd /var/uploads
USER 1001
EXPOSE 8000
ENTRYPOINT ["/opt/CTFd/docker-entrypoint.sh"]
然后部署下阿里云的docker加速器: help.aliyun.com/document_de…cr.console.aliyun.com/cn-qingdao/… 选择左下角镜像加速器注意由于这篇文章年代久远banal的版本已经不支持python2。如果遇到以下问题:
def is_sequence(obj: Any) -> bool syntax error:
请在reqiurements.txt添加:
banal==0.4.2
之后构建启动镜像。
docker-compose build
docker-compose up -d
将ctfd连接frpcadmin网络
docker network connect frpcadmin
启动ctfd后进入管理页面选择插件
由于我这篇文章写的比较早,ctfd-whale已经有了很多次更新,根据gtfly师傅的提醒,这里需要填写创建的网络” style=“margin: auto” />
以下docker-compose.yml的功能与上述操作步骤一样的,作为可选项,有能力的同学可以试试看
version: '2'
services:ctfd:build: .user: rootrestart: alwaysports:- "8000:8000" #你自己的environment:- UPLOAD_FOLDER=/var/uploads- DATABASE_URL=mysql+pymysql://root:ctfd@db/ctfd- REDIS_URL=redis://cache:6379- WORKERS=1- LOG_FOLDER=/var/log/CTFd- ACCESS_LOG=-- ERROR_LOG=-volumes:- .data/CTFd/logs:/var/log/CTFd- .data/CTFd/uploads:/var/uploads- .:/opt/CTFd:ro- /var/run/docker.sock:/var/run/docker.sock #添加这句即可,别的基本按照官方的不用动depends_on:- dbnetworks:default:internal:frpcadmin:ipv4_address: 172.22.0.3db:image: mariadb:10.4.12restart: alwaysenvironment:- MYSQL_ROOT_PASSWORD=ctfd- MYSQL_USER=ctfd- MYSQL_PASSWORD=ctfd- MYSQL_DATABASE=ctfdvolumes:- .data/mysql:/var/lib/mysqlnetworks:internal: # This command is required to set important mariadb defaultscommand: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --wait_timeout=28800, --log-warnings=0]cache:image: redis:4restart: alwaysvolumes:- .data/redis:/datanetworks:internal:frpc:image: glzjin/frp:latestrestart: alwaysvolumes:- ~/frp_0.29.0_linux_amd64/frpc.ini:/etc/frp/frpc.ininetworks:frpcadmin:ipv4_address: 172.22.0.2frp-containers:
networks:default:internal:internal: truefrpcadmin:driver: bridgeinternal: trueipam:config:- subnet: 172.22.0.0/16frp-containers:driver: bridgeipam:config:- subnet: 172.21.0.0/16
不出意外的话,现在在challenge界面可以使用动态靶机 管理员也可以在后台管理靶机
1、创建一个新目录。
mkdir pwntest
cd pwntest
2、进入该目录,将可执行文件拷贝到该目录下,命名为 pwn。创建一个 Dockerfile 文件,内容如下:
FROM glzjin/pwn_base_18
COPY pwn /pwn/pwn
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 build -t <你在 dockerhub的用户名/你的镜像名> ./
可以使用命令docker logs
查看报错情况
确保docker api填写正确,如示例中为unix:///var/run/docker.sock 你也可以使用端口形式的api如官方示例:可以用IP:端口指定API 然后使用如下命令进入ctfd容器,手动调用端口测试
docker exec -it /bin/sh
/opt/CTFd# python
>>>import docker
>>>client=docker.DockerClient(base_url="unix:///var/run/docker.sock")
>>>client.images.list()
如果api正确会列出所有镜像
可以使用如下命令进入ctfd容器,手动调用端口测试
docker exec -it /bin/sh
/opt/CTFd# python
>>>import requests
>>>requests.get("http://172.22.0.2:7400/api/reload")
#这个表示成功
如果还是不行,也可以尝试查看ctfd和frpc容器的日志来分析解决。
docker logs
docker logs
在搭建ctfd的时候,默认会有一个类似微信登录的方式登录的选项,就是使用MLC来登录。
OAuth Settings not configured. Ask your CTF administrator to configure MajorLeagueCyber integration.
是不是很帅呢?
BUUCTFCthulhu OJ
09ac16608228296~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image" style=“margin: auto” />
是不是很帅呢?
BUUCTFCthulhu OJ
如果配置有遇到困难可以加入交流群:729021148 或者本人淘宝店:item.taobao.com/item.htm?id…
这是一份网络安全从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1EI1Ks6P-1676911614735)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bdTYR1wD-1676911614735)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
网络安全导论
渗透测试基础
网络基础
操作系统基础
Web安全基础
数据库基础
编程基础
CTF基础
该阶段学完即可年薪15w+
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mMV9Vil0-1676911614736)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
弱口令与口令爆破
XSS漏洞
CSRF漏洞
SSRF漏洞
XXE漏洞
SQL注入
任意文件操作漏洞
业务逻辑漏洞
该阶段学完年薪25w+
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r6FWVwoi-1676911614737)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
反序列化漏洞
RCE
综合靶场实操项目
内网渗透
流量分析
日志分析
恶意代码分析
应急响应
实战训练
该阶段学完即可年薪30w+
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SD57UHgb-1676911614739)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
蓝队基础
蓝队进阶
该部分主攻蓝队的防御,即更容易被大家理解的网络安全工程师。
攻防兼备,年薪收入可以达到40w+
需要上述路线图对应的网络安全配套视频、源码以及更多网络安全相关书籍&面试题等内容
网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!