基于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
在这里插入图片描述
创建完题目后查看题目
在这里插入图片描述
点击启动题目容器
在这里插入图片描述
在这里插入图片描述
访问题目给的链接
在这里插入图片描述
可以开始做题做题
在这里插入图片描述

后台管理中可查看启动的题目情况

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值