(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:
<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块
好了,今天就到这,有问题评论区见~
上一篇: Kylin |银河麒麟高级服务器操作系统V10 安装 |图解版 | 带下载链接
下一篇: Ubuntu磁盘扩容
本文标签
(2024.3.6再度更新最新)一篇文章教你ctfd平台搭建&ctfd动态靶机创建&docker的使用&ctf动态flag的实现 来我这就够了!
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。