(2024.3.6再度更新最新)一篇文章教你ctfd平台搭建&ctfd动态靶机创建&docker的使用&ctf动态flag的实现 来我这就够了!

雷神的小锤子 2024-10-26 12:07:01 阅读 62

目录

一、ctfd的搭建

先换个源

开始安装docker

启动Docker服务并设置为开机启动

下载CTFd修改版

构建镜像

部署容器

二、开始部署一个ctfd赛题

现成的题库演示:

一个docker镜像:

选择dynamic_docker:

部署完很多很多的题目

点击开启,点击网址

三、怎么自己写一个ctf题目

👌好!首先给大家一个网址:Docker Hub

下载一个xftp

创建个文件夹

输入docker login

这就是我们刚刚部署完的题目:


一、ctfd的搭建

1.首先我们大家随着对网络安全的越来越强的认识,喜欢做点题目练练手,那么搭个靶场就很不错,ctfd作为开源的老牌平台(虽然这个平台也有安全性的问题),不过么还是很不错哒!

2.那么我们废话不多说,开始搞起来吧!

3.首先我们得买个云服务器(好处就是网络快,搞错了可以直接重置,自己也会带有加速源),不过搭建本地服务器也是可以的,可惜我们实验室也就那么几台。。

4.接下来,进入服务器,可能你会遇到什么密码错误等等,自己在控制台重置一下服务器就行了:

5.接下来我们先换个源:

我们先用下面的命令:

<code> vim /etc/apt/sources.list

deb http://mirrors.aliyun.com/debian/ buster main contrib non-free

deb http://mirrors.aliyun.com/debian/ buster-updates main contrib non-free

deb http://mirrors.aliyun.com/debian/ buster-proposed-updates main non-free contrib

deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib

# deb-src http://mirrors.aliyun.com/debian/ buster-updates main contrib non-free

# deb-src http://mirrors.aliyun.com/debian/ buster main contrib non-free

# deb-src http://mirrors.aliyun.com/debian/ buster-proposed-updates main contrib non-free

# deb-src http://mirrors.aliyun.com/debian/ buster-backports main contrib non-free

deb http://mirrors.aliyun.com/debian-security/ buster/updates main non-free contrib

# deb-src http://mirrors.aliyun.com/debian-security/ buster/updates main non-free contrib

最后使用:wq 这个命令保存

像我一样:

回车保存就可以了

6.接下来我们开始安装docker(为什么呢?因为我们需要创建动态靶机,这个是我们非常有用的一个好东西,具体可以查一下他的好处,我这里不多赘述):

安装命令如下:

<code>curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

测试docker是否安装成功:

sudo docker help

若安装成功,终端会显示Usage: docker [OPTIONS] COMMAND,提示你输入更详细的docker命令。

然后再安装 Docker Compose:

apt-get install docker-compose

启动Docker服务并设置为开机启动

sudo systemctl start docker

sudo systemctl enable docker

 之后我们验证一下是否安装成功:

特别说明:可能会有报错问题,docker-compose无法下载等:

在linux中通过curl拉取高速安装版本,可能导致下载的不全。结果就是version命令报错。

解决方法:

直接在release中下载对应的linux发行版【docker-compose-linux-x86_64】https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64

下载完后将软件上传至 Linux的【/usr/local/bin】目录下

然后重命名:

<code>sudo mv docker-compose-linux-x86_64 docker-compose

将可执行权限应用于二进制文件:

sudo chmod +x /usr/local/bin/docker-compose

创建软链:

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

2024.3.6号个人测试时再度更新说明:阿里云,腾讯云各个云服务器我也不知道为啥,可能有的服务器docker和docker-compose版本都可以允许,别的云服务器上就又不能运行了,但凡出现以下报错:

1.ERROR: for frpc  Cannot start service frpc: b'Could not attach to network ctfd_frp_containers: rpc e rpc error: code = 7 desc = network not manually attachable
2.ERROR: for ctfd_frpc_1  a bytes-like object is required, not 'str'
3.ERROR: Network "ctfd_frp_containers" needs to be recreated - internal has changed
4.rpc error: code = PermissionDenied desc = network ctfd_frp_containers not manually attachable
5.ERROR: Encountered errors while bringing up the project.
6.ERROR: no VNI provided
7.ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

以上这几个报错全是因为docker版本和docker-compose版本问题,建议安装以下版本:

安装特定版本的话docker的方法网上有很多我就不说了,指定安装24.0.7版本

docker-compose特定版本在我上面部分解决方案里已经写了,直接去github下载特定版本后上传服务器上,创建软连接。

我也是测试了20多个小时总结出来的。。。(docker的版本真的很重要)

7.接下来我们要开始最重要的一步了 ,安装ctfd:

许多文章都是需要再配置ctf,并且不是汉化版的,我们直接使用大神全部配置好的!

Docker集群设置

启用Docker Swarm,并为生成的Manager节点取一个别名

<code>docker swarm init# 初始化

docker node ls# 查看节点ID

docker node update --label-add name=linux-1 <节点 ID> # 添加别名

下载CTFd修改版

博主 Vicosna 已经对CTFd v3.3.1官方源码进行了更换国内镜像源、添加CTFd-Whale子模块、配置frp网络、设置静态文件CDN加速等工作,可前往使用作者修改的版本进行安装部署。

git clone -b frp https://github.com/vicosna/CTFd.git# 修改版(根目录不建议修改名字)

cd CTFd# 进入CTFd目录

git submodule update --init # 更新CTFd-Whale子模块

# ——————————————————————————————————————————————————————

# 如果你访问Github的速度不佳,也可以使用博主提供的CSDN和Gitee版(可选)

git clone -b https://codechina.csdn.net/vicosna/CTFd.git# CSDN

cd CTFd# 进入CTFd目录

sed -i 's/github.com/codechina.csdn.net/g' .gitmodules# 修改子模块Url

git submodule update --init # 更新CTFd-Whale子模块

# ——————————————————————————————————————————————————————

git clone -b frp https://gitee.com/vicosna/CTFd.git# Gitee

cd CTFd# 进入CTFd目录

sed -i 's/github.com/gitee.com/g' .gitmodules# 修改子模块Url

git submodule update --init # 更新CTFd-Whale子模块

之后构建镜像

运行

docker-compose build

命令,等待·················

如果修改的各配置文件没有错误的话,那么应该就会返回 Successfully tagged ctfd_ctfd:latest~

然后部署容器

运行

docker-compose up -d

部署容器,耐心等待~

2024.2.5更新:

如果构建过程中遇到这样的报错

说是没有节点:

ERROR: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.

我们只要执行:

<code>docker swarm init

docker node update --label-add='name=ctfd_frp_containers' $(docker node ls -q)code>

docker node update --label-add='name=linux-1' $(docker node ls -q)code>

依次执行这三句话然后就可以让他构建一个管理节点,这样的话你的动态靶机才可以运行起来,不然的话会没有反应······

我们再来使用docker ps -a查看一下当前正在运行的容器是否都正常。

可以看到我们已经存在ctfd的docker镜像了(这边由于我已经做了比较多的ctf题目镜像,所以还有别的镜像···)

8.访问你的服务器的公网IP就能打开平台界面啦,由于CTFd最新版启用了nginx端口转发,我们直接访问<code>80端口即可,当然CTFd的默认端口8000也可以访问。

恭喜大家完成ctfd的部署,为啥我有这样漂亮的界面?我之后再讲哈哈哈

我非常欢迎大家来放我们的平台。

二、开始部署一个ctfd赛题

我们这里先用现成的题库,这里用CTFTraining题库进行演示:

<code>sudo mkdir -p /opt/CTF #创建CTF目录

sudo cd /opt/CTF

sudo git clone htt/opt/CTFps://github.com/CTFTraining/CTFTraining.git #安装CTFTraining,注意这里只能git下来目录,目录中是空的,需要一个一个CTF题目去git

cd CTFTraining

ls

然后比如说我们随便选一个ctf题,2016的反序列化这个:

sudo git clone htt/opt/CTFps://github.com/CTFTraining/0ctf_2016_unserialize.git #下载CTF题目,只要替换0ctf_2016_unserialize为其他目录名称即可下载所有题目

cd 0ctf_2016_unserialize/ #进入题目目录中

ls

然后我们直接在这个目录下:

sudo docker-compose up -d #使用docker-compose下载镜像生成容器并启动容器

构建后你可以看一下是否构建完成:

docker ps -a #查看容器状态

应该是存在一个docker镜像了,就像我的这个:

然后进入网站:

管理员点击进入Admin Panel 管理界面:

点击whale:

把自己服务器的ip填入direct ip address 地址中:

如果你是本地搭建的就写127.0.0.1,保存一下。

进入challenge界面:

点击上面的加号:

进入后我们选择dynamic_docker(如果你要是只要静态的flag,那你就用standard标准就行了):

然后填写内容:这里名称啊,分数啊,提示啊啥的都自己想填啥就填啥了

注意了:这边docker image 就是你本地构建镜像的名字,如果不存在本地镜像会自动调用dockerhub上面的在线镜像内容,这个是后话我们后面再说

我这边是

这个名字,所以填这样的:

ctftraining/0ctf_2016_unserialize

别的你就填别的

然后FRP port 的内容你就填80 这个是配置的默认转发接口

就像我这样填肯定没问题!!

然后在下面的什么初始分数,衰减分数,最低分数,你就看你心情填了:

接下来点击create 你就得到了一个题目

然后可能刚部署完的题目是隐藏的,你需要进入题目详情然后点击:

把hidden变成visible就行

然后你就按照方法部署完很多很多的题目了。。。

点击刚刚部署的反序列化:

点击开启,点击网址:刚点完会有点慢的,初始化啥的,老ctfer懂的都懂啦~

我们就搞好啦~

三、怎么自己写一个ctf题目

刚才有个朋友问我,马老师怎么自己写一个ctf题目呢?我不要现成的。我一看,哦源赖氏昨天

言归正传,我们这里就要用到docker啦,这里稍微说一下,docker其实在我看来就是一个一个的小服务器一样,它可以部署很多服务,部署好东西,他是轻量化的,就这么多···其实我具体也不太懂

👌好!首先给大家一个网址:Docker Hub

大家进去后注册一下,可能需要科学上网。。

这个是docker的镜像管理网址,就像github一样···

这样我们就可以通过在本地构建好ctf题目镜像后利用他上传到网站上,这样的话,以后调用这个镜像,或者部署ctf题目将会非常方便。

这是我的几个镜像,大家直接像上文所说的方法里面,docker image 里面直接填入我的这个名称,比如:

这就是一个题目,你就可以直接使用我的题目了,很方便,你的服务器会自动调用它,不需要手动本地构建了,大家可以试试。

那么,如果怎么本地上传到docker hub上呢?

这里再额外说一下,如果你要是云服务器,下载一个xftp这样可以很方便的管理你的服务器上的内容。

这里我连上服务器可以很清楚的看到你的服务器的文件:

然后额我们开始正式写一题flag吧:

创建个文件夹:

第一个文件夹里面是:

files里面是:

html是:

我是这样的结构,因为给大家演示的是最简单的,那么我就用这样的结构,当然你也可以用你自己的想法。

然后我给大家看一下最简单的flag动态例子:

index.php:

<code><?php

echo $flag = "flag_here";

?>

<!DOCTYPE html>

<html lang="en">code>

<head>

<meta charset="UTF-8">code>

<meta name="viewport" content="width=device-width, initial-scale=1.0">code>

<meta http-equiv="X-UA-Compatible" content="ie=edge">code>

<title>Boring Code</title>

</head>

<body>

<img src="https://www.zhaoj.in/wp-content/uploads/2019/09/1568193169f6d798aa4fd6c6c07b525caceb42cf88.png"/>code>

</html>

大家可以想一下这个flag界面是啥样子的。。

那么有的同志就说了,马老师你这个没用啊,不是动态flag,flag不就是flag_here吗?我说小同志,我这个有用,当年二百多斤的英国大力士都掰不动我一个···

那么这个就需要dockerfile文件里面来写了:

 

FROM php:5.6-apache #导入基础web环境镜像

COPY ./files /tmp/ #先复制到临时文件夹,这样避免对源文件造成误删等其他影响。

RUN cp -rf /tmp/html/ /var/www/ && \

chown -R root:root /var/www/html && \

chmod -R 755 /var/www/html #这些就是基本php的一些关键提升权限等,避免无法使用文件

CMD sh -c "sed -i "s/flag_here/$FLAG/" /var/www/html/index.php && export FLAG=not_flag && FLAG=not_flag && apache2-foreground" #最重要的东西,把flag_here作为全局变量,后面是判断语句,作为变量以后,在ctfd源码中就有可以直接将他赋值为动态flag的函数操作了,这样部署完就是动态的。

我这个大家看懂没有:

docker因为像是一个个的小服务器,那么就需要先搞一个环境,这边第一行就是人家也是在dockerhub上已经创建好的一个环境,我们直接调用他就行了,像python引入库一样,如果你要是像自己配置环境,是比较麻烦,你可以参考别人的文章,我这边不说了,因为不会(bushi),当然还有别的别人已经配置好的,大家可以去dockerhub找一找,直接用就行了。

写完之后呢,就可以上传到服务器上了。

就像这样上传到我自己的目录:

ok 然后我们进入服务器命令框:

输入docker login

我这里之前登陆过,反正应该还是需要输入账号密码的,咱输入就行了。

然后我们要进入这个刚刚写好的题目的目录下:

我的这边就是

我想这个大家应该都是会的吧····

然后使用这个命令:

<code>docker build -t name/image .

name为dockerhub名,image为镜像名(自定义)  .为版本号代表latest

名称要为 dockerhub用户名/镜像名 的格式

想我这边之前搞得就是

这样一个用户名/名称

然后应该会提示一个successfully,成功了

我们去docker ps -a 下面应该也能看到

这时我们的镜像已经构造完成,然后我们将镜像上传到dockerhub的仓库,运行以下命令

<code>docker push name/image

上传之后你的dockerhub刷新一下就应该也能看到了:

之后么就容易多啦,参考第二节填入你的镜像名称,比如

然后就是我说的,你要是上传了dockerhub,你在别的服务区,只要搭一个ctfd平台就行,镜像直接调用dockerhub上的就行了,填一个名称,简单多了。

部署完,显示题目,出来就行啦!爽!!!

(md你们可能不知道我自己中间搞了多久nnd,玩鹰的是把)

这就是我们刚刚部署完的题目:

flag是动态的吧···  好看吧····简单吧·····  我们这做校赛的时候我被喷了出这个题目。。。

四、ctfd平台的美化

你这边怎么说呢,其实github上有很多好看的主题,人家自己做的,你搜一下就有

GitHub - CTFd/themes: Official and Community CTFd themes

这里,很多的,当然你自己写一个也是可以的,大佬会美化的搞完给我来一份嗷

里面也有使用说明,下载了替换就行,然后就是记得看一下版本号兼容不兼容,我又一次搞了个主题tnnd整个平台报错打不开了,重新搞了一个。。。

或者你可以在主题文件夹下房好几个主题,这样直接切换就行,你要啥主题就切换啥:

这是我的安装目录:

你把github下载的解压完了放ctfd的这个路径下就行

切换效果:

还可以嗷,加油同志们,做好了给我分享一个。

除此之外:大家看我主页面怎么还挺好看的是吧,

大家可以在pages里面修改它的index:

<code><div class="row">code>

<div class="col-md-6 offset-md-3">code>

<img class="w-100 mx-auto d-block" style="max-width: 350px;padding: 30px;padding-top: 3vh;" src="/files/f5d4925b003100bcd2b5409c940954af/huctf.jpeg" />code>

<img class="w-100 mx-auto d-block" style="max-width: 250px;padding: 20px;padding-top: 5vh;" src="/files/1651de1baa1d2b7075ce9f55194b7da5/1.png" />code>

<img class="w-100 mx-auto d-block" style="max-width: 350px;padding: 30px;padding-top: 5vh;" src="/files/1b37387428a3720f77daf1a19a3c3d01/butian.png" />code>

<h3 class="text-center">code>

<a href="admin"><p style="font-size: 40px;margin:60px;">点击注册登录</p></a>code>

</h3>

<br>

</div>

</div>

把图片上传了引用就行。。

写到这,累了,有没有大佬给我支持一下,zfb转账500块

好了,今天就到这,有问题评论区见~



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。