CTFD动态靶场搭建 为了迎接未来的新生赛和未来接活做准备,学习一下如何搭建CTFD靶场顺便练练手。不过这中间踩的坑也是巨多,前前后后搭了好几天才搭好。
前置 CTFD使用的是的docker搭建,所以在服务器上需要先装好docker和docker-compose。其中ctfd有多种搭建方式,我采用的是服务器本地起frp服务将题目容器转发到服务器的端口上。
安装FRP 下载并安装rp
1 2 3 4 5 6 7 8 9 10 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 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/ #将客户端和服务端的二进制文件移动至bin文件夹 sudo chmod a+x /usr/bin/frpc /usr/bin/frps #给所有用户赋予frpc和frps的可执行权限 sudo systemctl enable frps #将frps服务设置为每次开机启动
编辑frps配置文件
1 2 3 4 5 vim /etc/frp/frps.ini [common] bind_port = 7897 bind_addr = 0.0 .0.0 token = thisistoken
启动frps服务
修改/etc/frp/frpc.ini的配置文件
此处的frpc与上面的frps相对应,连接的是上面启动的frps
1 2 3 4 5 vim /etc/frp/frpc.ini [common ]server_addr = 172 .17 .0 .1 #此处的IP 为docker0的ip ,docker0的ip 通过ifconfig查看server_port = 7897 token =thisistoken
再修改frp_0.29.0_linux_amd64/frpc.ini (这个文件会用来配置frpc容器的)
1 2 3 4 5 6 7 [common] server_addr = 172.17 .0.1 server_port = 7897 token =thisistokenadmin_addr = 172.20 .0.3 admin_port = 7400 log_file = ./frps.log
创建网络并运行frpc容器
1 2 3 docker network create ctfd_frp-containers 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容器通信
1 2 docker network creat frcadmin docker network connect frpcamdin id<刚才启动的frpc容器ID>
查看frpcadmin网络的连接情况并记录frpc容器的网络IP
1 docker network inspect frpcadmin
图中的IP就是frpc容器在frpcadmin网络中的IP地址,就是我们在/frp/frpc.ini中指定的(admin_addr)
可以提前把这个地址记录下来,后面配置ctfd-whale的时候会用到。
安装CTFd和CTFd-whale 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 git clone https://gi thub.com/CTFd/ CTFd.git cd CTFd git reset 6 c5c63d667a17aec159c8e26ea53dccfbc4d0fa3 --hard cd CTFd/CTFd/ plugins/ git clone https://gi thub.com/glzjin/ CTFd-Whale.git ctfd-whale cd ctfd-whale git reset 5 b32f457e9f56ee9b2b29495f4b3b118be3c57bd --hard cd ../../ ../ vim docker-compose.yml
docker-compose.yml,直接复制粘贴就行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 version : '2.2' services : ctfd : build : . user : root restart : always ports : - "8000:8000" #第一个是访问ctfd的端口,第二个是docker端口映射出去的端口 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 : 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
进入CTFd目录,修改Dockerfile的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 FROM python:3.6 -alpineRUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories &&\ apk update && \ apk add python3 python3-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" ]
requirements.txt内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Flask ==1 .1 .2 Werkzeug ==0 .16 .0 Flask -SQLAlchemy==2 .4 .1 Flask -Caching==1 .4 .0 Flask -Migrate==2 .5 .2 Flask -Script==2 .0 .6 SQLAlchemy ==1 .3 .11 SQLAlchemy -Utils==0 .36 .0 passlib ==1 .7 .2 bcrypt ==3 .1 .7 six ==1 .13 .0 itsdangerous ==1 .1 .0 jinja2 ==2 .11 .3 requests >=2 .20 .0 PyMySQL ==0 .9 .3 gunicorn ==19 .9 .0 normality ==2 .0 .0 dataset ==1 .1 .2 mistune ==0 .8 .4 netaddr ==0 .7 .19 redis ==3 .3 .11 datafreeze ==0 .1 .0 gevent ==21 .12 .0 python -dotenv==0 .10 .3 flask -restplus==0 .13 .0 pathlib2 ==2 .3 .5 flask -marshmallow==0 .10 .1 marshmallow -sqlalchemy==0 .17 .0 boto3 ==1 .10 .39 markupsafe ==1 .1 .1 marshmallow ==2 .20 .2
准备好后开始构建容器,进入CTFd目录
启动镜像
启动完之后将ctfd容器加入到frpcadmin的网络之中
1 2 docker ps docker network connect frpcadmin
可以看到ctfd容器已经加入到了frpcadmin容器之中了
查看容器运行状态
访问 ip:8000进入平台,按需填写内容
上方导航栏Admin->Plugins 配置CTFd Whale相关内容
添加题目 上方challenges处添加题目,选择dynamic_docker创建动态题目
最后不要忘记选择动态分数
成功部署题目
flag也是动态flag