前言
要说开源的ctf训练平台,ctfd是不错的选择,支持各种插件,今天我就来介绍一下如何部署为ctfd平台写的一款支持独立动态靶机的插件。前提是你的ctfd也是docker部署的。
动态独立靶机
说到独立动态靶机,各位ctfer可能会联想到i春秋举办的各类比赛,其中比赛环境大都用到了动态独立靶机(dynamic standalone instance)技术,也就是每做一道题,就会自动生成一个虚拟题目环境,每一个环境刚刚生成的时候都是崭新的,且能为每个队伍生成一个独一无二的flag,防止flag分享作弊的行为。
①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析
技术原理
先来看张图 = = 别被这张图吓到了, 这个图只是在本地部署动态靶机,而赵师傅的buuctf平台由于使用学校的服务器生成独立靶机还增加了内网穿透功能,网络结构要更复杂,所以这个插件有些功能是针对赵师傅下需求设计的,而我们仅仅只需要本地生成独立靶机即可,因此只需使用该插件如图所示的部分功能即可。
官方教程
建议先去看看官方教程:)本教程对应官方教程第一种模式。 [www.zhaoj.in/read-6333.h…]
安装步骤
1.安装启动frps
下载frp并安装
sh复制代码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.ini frps.ini /etc/frp/
sudo cp frpc frps /usr/bin/
sudo chmod a+x /usr/bin/frpc /usr/bin/frps
sudo systemctl enable frps
编辑frps.ini
bash
复制代码sudo vim /etc/frp/frps.ini
frps.ini
ini复制代码[common]
bind_port = 7897
bind_addr = 0.0.0.0
token =thisistoken
至于frpc.ini,先不急着配置,后面会配置
启动frps系统服务
bash
复制代码sudo systemctl start frps
2.创建网络并启动frpc容器并配置frpc.ini
启动frpc容器
bash复制代码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容器通信
bash复制代码sudo docker network create frpcadmin
sudo docker network connect frpcadmin <frpc容器名或者ID>
#将frpc和ctfd容器单独连接到网络frpcadmin,注意要等容器创建好之后再连接,因此ctfd将在稍后连接
查看frpcadmin网络的连接情况并记录frpc容器的网络IP
bash
复制代码docker network inspect frpcadmin
编辑frpc.ini
bash
复制代码vim ~/frp_0.29.0_linux_amd64/frpc.ini
frpc.ini
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
编辑完之后记得重启frpc容器
bash
复制代码docker restsrt <frpc容器的ID>
3.安装靶场与插件
下载靶场与插件
bash复制代码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
yml复制代码version: '2.2'
services:
ctfd:
build: .
user: root
restart: always
ports:
- "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:
- db
networks:
default:
internal:
db:
image: mariadb:10.4.12 #这里改成10.4.12,10.4.13会出错
restart: always
environment:
- MYSQL_ROOT_PASSWORD=ctfd
- MYSQL_USER=ctfd
- MYSQL_PASSWORD=ctfd
- MYSQL_DATABASE=ctfd
volumes:
- .data/mysql:/var/lib/mysql
networks:
internal:
# This command is required to set important mariadb defaults
command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --wait_timeout=28800, --log-warnings=0]
cache:
image: redis:4
restart: always
volumes:
- .data/redis:/data
networks:
internal:
networks:
default:
internal:
internal: true
重新build后启动ctfd 如果是在国内网络环境下构建镜像的同学,建议修改Dockerfile为以下来使用豆瓣源or阿里源:
bash复制代码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 -i https://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 -i https://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添加:
ini复制代码
banal==0.4.2
之后构建启动镜像。
sh复制代码docker-compose build
docker-compose up -d
将ctfd连接frpcadmin网络
sh
复制代码docker network connect frpcadmin <ctfd容器名或者ID>
启动ctfd后进入管理页面选择插件
填写相关参数,注意要在template里面写上frpc.ini的内容。里面domain填写自己的
由于我这篇文章写的比较早,ctfd-whale已经有了很多次更新,根据gtfly师傅的提醒,这里需要填写创建的网络。
启动题目选择dynamic_docker
这里选择一个支持动态FLAG的docker镜像,并选择设置该docker镜像的内部端口
内部端口可以用docker ps查看
3b.使用docker-compose一站式部署靶场、容器与网络
以下docker-compose.yml的功能与上述操作步骤一样的,作为可选项,有能力的同学可以试试看
yml复制代码version: '2'
services:
ctfd:
build: .
user: root
restart: always
ports:
- "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:
- db
networks:
default:
internal:
frpcadmin:
ipv4_address: 172.22.0.3
db:
image: mariadb:10.4.12
restart: always
environment:
- MYSQL_ROOT_PASSWORD=ctfd
- MYSQL_USER=ctfd
- MYSQL_PASSWORD=ctfd
- MYSQL_DATABASE=ctfd
volumes:
- .data/mysql:/var/lib/mysql
networks:
internal:
# This command is required to set important mariadb defaults
command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --wait_timeout=28800, --log-warnings=0]
cache:
image: redis:4
restart: always
volumes:
- .data/redis:/data
networks:
internal:
frpc:
image: glzjin/frp:latest
restart: always
volumes:
- ~/frp_0.29.0_linux_amd64/frpc.ini:/etc/frp/frpc.ini
networks:
frpcadmin:
ipv4_address: 172.22.0.2
frp-containers:
networks:
default:
internal:
internal: true
frpcadmin:
driver: bridge
internal: true
ipam:
config:
- subnet: 172.22.0.0/16
frp-containers:
driver: bridge
ipam:
config:
- subnet: 172.21.0.0/16
4.测试
不出意外的话,现在在challenge界面可以使用动态靶机 管理员也可以在后台管理靶机
5.制作支持动态flag的镜像
请看gtfly写的
[www.gtfly.top/2019/09/27/…]
或者可以看看赵师傅的贡献指南。 [www.zhaoj.in/read-6259.h…]
推荐一个github靶机仓库
[github.com/CTFTraining]
pwn题
1、创建一个新目录。
sh复制代码mkdir pwntest
cd pwntest
2、进入该目录,将可执行文件拷贝到该目录下,命名为 pwn。创建一个 Dockerfile 文件,内容如下:
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、构建。
sh
复制代码docker build -t <你在 dockerhub的用户名/你的镜像名> ./
常见错误分析与检查
一般错误:
可以使用命令docker logs <ctfd容器的ID>
查看报错情况
docker容器无法启动:
确保docker api填写正确,如示例中为unix:///var/run/docker.sock 你也可以使用端口形式的api如官方示例:可以用IP:端口指定API 然后使用如下命令进入ctfd容器,手动调用端口测试
sh复制代码docker exec -it <ctfd容器的ID> /bin/sh
/opt/CTFd# python
python复制代码>>>import docker
>>>client=docker.DockerClient(base_url="unix:///var/run/docker.sock")
>>>client.images.list()
如果api正确会列出所有镜像
frp端口无法映射:
可以使用如下命令进入ctfd容器,手动调用端口测试
sh复制代码docker exec -it <ctfd容器的ID> /bin/sh
/opt/CTFd# python
python复制代码>>>import requests
>>>requests.get("http://172.22.0.2:7400/api/reload")
<Response [200]> #这个表示成功
如果还是不行,也可以尝试查看ctfd和frpc容器的日志来分析解决。
xml复制代码docker logs <ctfd容器的ID>
docker logs <frpc容器的ID>
题外话
在搭建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的标签如下:
是不是很帅呢?
黑客&网络安全如何学习
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
1.学习路线图
攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。
3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。
4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。
还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。
这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。
参考解析:深信服官网、奇安信官网、Freebuf、csdn等
内容特点:条理清晰,含图像化表示更加易懂。
内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…
因篇幅有限,仅展示部分资料,如果你对网络安全入门感兴趣,需要的话可以在下方
出处。