基于ctfd的小型虚拟化网络靶场搭建与设计
介绍
文中插件支持动态flag,低部署难度
快速部署,高兼容性,以队内赛,小型训练赛等需要快速搭建平台,快速展示的场景
CTFd(Capture The Flag Dashboard)是一个开源的CTF(Capture The Flag,夺旗赛)平台,旨在帮助安全研究人员和团队组织和管理CTF比赛。它提供了一个用户友好的界面,允许创建和管理竞赛、题目和参与者。CTFd支持各种类型的题目,包括密码学、逆向工程、Web安全等,可以根据需求进行定制和扩展。
环境
ubuntu20,多次搭建后发现这个版本搭建成功次数最多
搭建
基础工具安装
apt update
apt install docker-compose -y
下载CTFd
如果未安装git请先apt安装
git下载CTFd
git clone https://github.com/CTFd/CTFd.git
git clone https://github.com/zeze-zi/ctfd_zezezi.git CTFd/CTFd\plugins\
修改Dockerfile文件
FROM python:3.9-slim-bookworm as build
WORKDIR /opt/CTFd
RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list.d/debian.sources
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
libffi-dev \
libssl-dev \
git \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
COPY . /opt/CTFd
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.ustc.edu.cn/pypi/web/simple \
&& for d in CTFd/plugins/*; do \
if [ -f "$d/requirements.txt" ]; then \
pip install --no-cache-dir -r "$d/requirements.txt" -i https://mirrors.ustc.edu.cn/pypi/web/simple ;\
fi; \
done
FROM python:3.9-slim-bookworm as release
WORKDIR /opt/CTFd
RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list.d/debian.sources
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
libffi8 \
libssl3 \
docker.io \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
COPY --chown=1001:1001 . /opt/CTFd
RUN useradd \
--no-log-init \
--shell /bin/bash \
-u 1001 \
ctfd \
&& mkdir -p /var/log/CTFd /var/uploads \
&& chown -R 1001:1001 /var/log/CTFd /var/uploads /opt/CTFd \
&& chmod +x /opt/CTFd/docker-entrypoint.sh \
&& chmod 777 /opt/CTFd
COPY --chown=1001:1001 --from=build /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
USER 1001
EXPOSE 8000
VOLUME /var/run/docker.sock:/var/run/docker.sock
ENV DOCKER_HOST unix:///var/run/docker.sock
ENTRYPOINT ["/opt/CTFd/docker-entrypoint.sh"]
修改CTFd/plugins/zezezi/init.py中set_config(暴露的公网ip)
后期会改进
set_config('zezezi:host', "192.168.40.133")
CTFd/api/v1/challenges.py 随便找个地方写入
为了获取宿主机的镜像列表CTFd/api/v1/challenges.py 随便找个地方写就行
import docker
@challenges_namespace.route("/docker_images")
class GetDockerImages(Resource):
@challenges_namespace.doc(description="No Docker Images")
def get(self):
if is_admin():
client = docker.from_env()
images = client.images.list()
return {"success": True, "data": [image.tags[0] for image in images if image.tags] }
return {"success": False}
部署启动
在ctfd目录中部署镜像,然后启动
docker build -t ctfd .
#等待部署完成
docker run -d --name ctfd-container -p 8000:8000 -v /var/run/docker.sock:/var/run/docker.sock --group-add $(getent group docker | cut -d: -f3) ctfd
#############
--group-add $(getent group docker | cut -d: -f3): 给权限,使web程序可以在容器中调用宿主机的docker权限,有更好的解决方案,后期换
上题
简单的完成ctfd自带的初始化后,部署动态靶机
部署前需要先将题目的docker镜像部署好
这是一个示例题目
docker build -t 名字 .
-t 后面接你镜像的名字
. 表示最新,即为版本号
在管理界面中挑战中部署,选择zezezi…的挑战类型
填写相关信息,选择题目镜像和题目对应对外的端口(默认80)这两个比较重要选错无法启动题目
编辑是否可见,flag为空会默认注入动态随机生成的flag
创建完题目后查看题目
点击启动题目容器
访问题目给的链接
可以开始做题做题