CTF靶场搭建及Web赛题制作与终端docker环境部署

♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ 

 写在前面

╔══════════════════════════════════════════════════════════════════════════╗

哈喽大家好!我是Myon,趁着我的云服务器还没过期,这次给大家出一期很详细的CTF比赛的靶场搭建以及关于Web赛题的制作与docker环境的部署教程,由于本人能力有限,也只能给大家讲一些基础简单的东西,欢迎大家在评论区互相交流学习,希望通过这篇博客大家能学到一些新东西,也期待大家的关注和支持!

╚══════════════════════════════════════════════════════════════════════════╝

♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ 

因为这种CTF的靶场我之前搭过,如果你们看过我之前写的博客就知道,之前介绍的是单纯基于CTFd搭建,而这次是基于H1ve(这个外观看着更好)。我们学校上次的CTF比赛就是我负责搭建和运维的,以及Pwn和Web赛题的环境部署,后面我会一并介绍。

先给大家看一下成品效果图

首页:

排行:

challenges:

公告:

写这篇博客主要是对之前一些内容的补充和总结吧,如果在阅读过程中有不懂的也欢迎大家参考我前面的文章,在《网站搭建》专栏里,再次感谢大家的支持和关注!

 文章开始前给大家分享一个学习人工智能的网站,通俗易懂,风趣幽默

人工智能icon-default.png?t=N7T8https://www.captainbed.cn/myon/

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

使用服务器:centos8               OK正文开始   ◉ ‿ ◉

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

目录

Part1、CTF靶场搭建

1、从github上克隆H1ve

2、安装 docker

3、安装 python-pip 

4、安装 docker-compose 

5、拉取镜像并启动 Single Mode

6、将H1ve整个目录下的所有容器设置为自启动

Part2、Web赛题制作与终端docker环境部署

1、题目文件的制作

(1)files文件夹

(2)Dockerfile

​(3)docker-compose.yml

2、docker环境部署

3、赛题前端部署

4、终端赛题运维


Part1、CTF靶场搭建

如果是新的服务器是没有git命令的,我们先安装

yum install git

1、从github上克隆H1ve

位置大家随便放就行了,我这里是在root目录下创了一个Myon的文件夹然后克隆到里面

git clone https://github.com/D0g3-Lab/H1ve.git

克隆好之后,我们还需要先安装一些东西

设置yum源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

2、安装 docker

yum install -y docker-ce

 看到complete代表安装完成

我们查看一下docker的版本并设置开机自启动

docker versionsystemctl start dockersystemctl enable docker

接着我们安装 docker-compose

(这个docker-compose命令在后面拉取镜像以及赛题的环境时会经常用到)

3、安装 python-pip 

✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧

注意这里默认安装的pip会导致一个错误,先不要执行下面命令,先看后面的报错解释

默认安装的是Python2.7的版本,而这里我们需要Python3版本的pip

✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧

yum -y install epel-releaseyum -y install python-pip

看到complete则代表安装成功,我们也可以使用命令检查一下

pip -V

但是当我们尝试安装 docker-compose 时就会遇到报错

pip install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple 

大概意思就是我们的pip版本太老了,找不到合适的 docker-compose 版本满足

 尝试升级pip版本 

pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install --upgrade pip

但是大概率你们会遇到以下的报错:

Could not find a version that satisfies the requirement docker-compose (from versions: )
No matching distribution found for docker-compose

You are using pip version 8.1.2, however version 23.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

解决方法:安装python3的pip

由上面pip -v我们知道默认安装的是Python2.7的版本

因此这里我们安装Python3的pip并且进行升级

yum install python3-pippip3 install --upgrade pip

可以看到 pip 成功升级到21.3.1 

 之后的pip操作都用pip3代替

4、安装 docker-compose 

pip3 install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple 

可以看到安装成功,至于那个warning不用管它

接下来我们进入到之前克隆好的H1ve目录下

修改配置文件

(这一步最好先不要操作,因为我不确定后面的报错是否与这步有关,建议先尝试直接进行后面的镜像拉取操作,如果有问题可以尝试删掉H1ve再次克隆)

sed -i 's/mariadb:10.4/mariadb:10.4.12/g' single.ymlsed -i 's/mariadb:10.4/mariadb:10.4.12/g' single-nginx.yml

5、拉取镜像并启动 Single Mode

docker-compose -f single.yml up

遇到如下的报错:

ERROR: manifest for mariadb:10.4.12.12.12.12 not found: manifest unknown: manifest unknown 

这种情况意思是docker需要我们指定下载镜像的版本号

但是我并没有找到解决办法,因此我替换了它的single.yml文件

然后就可以拉取了(我怀疑是前面修改配置文件导致的)

之后访问 8000 端口

但是这个主题不一样,就是纯CTFd的版本

接着我又尝试拉取了一下我之前搭建的版本镜像

然后我又对比了一下两者的文件信息,发现文件名并没有什么差别,但是内容应该是有差别的

于是我删掉了H1ve重新克隆进行测试

确定是否因为修改配置文件导致single.yml出了问题

克隆好之后什么都不要做,进入目录直接拉取,居然成了

接着尝试拉取Single-Nginx Mode 

docker-compose -f single-nginx.yml up

 这里可以拉取成功但是无法访问

修改配置文件进行验证,发现也可以拉取成功

就很奇怪了,当然不排除是我拉取之前的版本时对我刚从github上克隆下来的版本环境这些有影响

总的来说给大家的建议就是克隆好之后先直接尝试拉取镜像,如果不行再设置配置文件,操作错误也可以尝试删除H1ve之后重新克隆。

顺便说一下,你们还需要确保用到的端口那些是允许的,在服务器的安全组规则里面设置。

当然如果你希望直接访问ip就到靶场,那么这里可能需要设置代理转发,将80端口转发到8000。

(在我之前讲的完全基于CTFd搭建的那个里是不需要的,直接访问ip即是靶场首页)

具体内容可以参考我之前的博客:《基于云服务器的博客和靶场搭建-经验教训》

怎么说呢,这个github克隆的H1ve项目感觉有点问题,因此下面我用自己之前的版本继续后面操作

关于我之前搭建那个版本的H1ve,如果可以我会放到资源里面,比github上的好多了)

我们需要将与H1ve有关的容器都开启并设置为自启动

查看容器

docker ps -a

启动容器 

docker start 容器名

6、将H1ve整个目录下的所有容器设置为自启动

docker update --restart=always $(docker ps -aq)

 查看开启的容器

docker ps

现在我们不用再拉取镜像,直接访问靶场地址+端口号即可,靶场将一直处于开启状态

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

接下来进入第二部分 ◉ ‿ ◉

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

Part2、Web赛题制作与终端docker环境部署

为了方便测试,我这里将服务器的所有端口都开放了,你们可以根据题目所在的端口自行添加

1、题目文件的制作

每个网页它至少应该包含一个index.php或者index.html(首页文件)

我们先做一个最简单的web题,比如将flag藏在一个网页的源码里

该文件命名为index.php,内容如下图

内容可能看着复杂,其实它就是一个页面而已。 

(1)files文件夹

这样我们的题目文件就有了,新建一个文件夹files,将这个文件index.php放到files目录下

(为什么文件夹叫files,因为后面我会给你们两个模版文件,按照我说的来就行)

当然如果你会自己写Dockerfile和docker-compose.yml,那么你可以自己想怎么来就怎么来。

我让ChatGPT写过,是可行的,但是这里我主要是讲基础的套路方法,所以给你们模版,按照我说的来,你就可以部署简单的web赛题。

除了files,我们还需要另外两个文件:

(2)Dockerfile

(这个文件你可以直接用,不用修改)

内容如下:

FROM php:5.6-fpm-alpineRUN rm -rf ar/wwwml/*COPY ./files ar/wwwmlEXPOSE 80WORKDIR ar/wwwml
CMD ["php", "-S", "0.0.0.0:80"]



(3)docker-compose.yml

(这个文件需要将端口修改为你自己题目部署在的端口)

内容如下:

version: "2"services:web:build: .restart: alwaysports:- "0.0.0.0:8001:80"environment:- FLAG=Myon{s0_eaSyest_wEb_fl2}

关于第二个文件内容解释:

0.0.0.0:8001:80  # 题目部署在8001端口,选手访问8001端口即可访问到题目环境

80是ngnix所在端口,具体取决于自己环境,一般都是在80,当然我之前部署Pwn赛题时遇到过其他问题,需要修改配置文件的,具体你们可以参考我之前的博客:

《基于CTFTraining在CTFd部署Web题目》 和

《基于xinetd部署pwn题(百分百搭成并且可以nc靶场地址)》

FLAG=Myon{s0_eaSyest_wEb_fl2}  # 这个其实后面我发现它似乎没什么影响,因为正确的flag是你自己放在文件里的,除非题目是那种与环境变量有关系的可能会影响,因此保险起见,你可以把这里的FLAG值改为自己题目的flag值,只是为了进一步确保一致。

其他内容保持不变。

将上述文件:files、Dockerfile、docker-compose.yml 统一放进一个新的文件夹

为了方便记忆和运维,我喜欢以题目名字来命名,比如就叫 f12 (查看源码的题)

这样我们web赛题的文件就都准备好了,将f12这个文件夹放入终端

我这里先建了一个testctf的文件夹,里面用来存放CTF赛题

新建文件夹的命令

mkdir 文件夹名

传文件的话我比较喜欢用xftp,直接拉动或者粘贴复制

2、docker环境部署

进入f12这个目录,使用命令拉取镜像

docker-compose up -d

拉取成功后,使用命令查看该容器

docker ps

访问该题目所在端口,这里是8001

使用F12,在网页源码里找到flag

3、赛题前端部署

那么关于赛题如何放上去,添加到我们靶场的前端,设置flag,分数这些,在我博客《基于CTFTraining在CTFd部署Web题目》里面已经详细讲过,这里就不再赘述。

http://t.csdnimg.cn/TRiOo

链接应该会过期,你们直接搜索我博客的名字即可找到,或者在《网站搭建》的专栏里面

此外,我这里还有一些其他类型的Web题的源码,小游戏、基本传参、php反序列化、命令执行、文件上传、php绕过、信息泄露这些题搭建起来还是很容易的,欢迎大家找我交流讨论。

sql注入的话就需要结合数据库了,有些题的源码也可以让ChatGPT帮写。

4、终端赛题运维

如果我们部署docker环境时遇到问题,比如无法访问,或者有些文件信息没有修改,但是又已经拉取了题目的镜像环境,那么我们就需要先删除这个容器,然后重新拉取:

查看题目容器名字

docker ps

使用命令删除有问题的容器

docker rm -f 容器名

此时题目页面已经无法访问

但是,重点来了,我们还能直接使用docker-compose up -d去拉取吗

这样操作是不行的,拉取之后你会得到一个与你删除前一样的容器,尽管你已经修改了文件内容

这个问题还是可以看我之前的博客《基于xinetd部署pwn题(百分百搭成并且可以nc靶场地址)》

http://t.csdnimg.cn/3QPno

因为docker搭建的是一个容器,你可以理解为一个独立的环境,里面的文件所在路径这些是不一样的。为什么我们敢把漏洞直接部署在自己的服务器上,正因为docker的安全性还是很强的,当然也可能存在docker容器逃逸到本地,但是一般用docker搭建的东西还是很安全的,就算容器里的东西被打烂了,也不会影响到你服务器本地的东西,它是一个单独的环境。

要想真正替换掉题目环境,正确的操作有两种:

方法一:重命名题目文件夹(比如f12改为F12)使用mv命令

当然你需要确保你重命名的名字是未被拉取过镜像的名字,即一个全新的名字

mv f12 F12

这个时候,我们进入到F12进行镜像拉取,也是使用

docker-compose up -d

方法二:删除所有未使用的网络,未使用的网络是不被任何容器引用的网络。

docker network prune

因为这个网络原本的容器已经被我们删除了,但是它的网络还存咋,但是未被容器引用,所以需要先清除掉,之后再进行镜像拉取才会拉取到你修改后的文件内容。

建议使用方法二,不过也可以用重命名的方法,等未使用的网络堆积一段时间后再统一进行清除。

♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

文章至此结束 希望你们看完有所收获 期待大家的关注与支持 ◉ ‿ ◉

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/160203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用ChatGPT创建Makefile构建系统:使用Make运行Docker

使用ChatGPT创建Makefile构建系统:使用Make运行Docker 芯语芯愿(知乎/纷传/CSDN/);小石头的芯语芯愿(微信公众号) 开发高效现代的构建系统对于满足开发周期需求至关重要。原先,嵌入式开发者一…

Unity 场景烘培 ——LensFlare镜头光晕(三)

提示:文章有错误的地方,还望诸位大神指出! 文章目录 前言一、镜头光晕 (Lens Flares)是什么?二、使用Lens Flares组件总结 前言 一般情况下都会忽略的东西,镜头光晕。理论上不加镜头光晕,也不会有什么影响…

vue3的两个提示[Vue warn]: 关于组件渲染和函数外部使用

1. [Vue warn]: inject() can only be used inside setup() or functional components. 这个消息是提示我们,需要将引入的方法作为一个变量使用。以vue-store为例,如果我们按照如下的方式使用: import UseUserStore from ../../store/module…

RabbitMQ快速入门(简单收发消息)

文章目录 前言一、数据隔离1.用户管理2.virtual host 二、控制台收发1.交换机2.队列3.绑定 三、编程式收发1.依赖和配置2.收发信息 总结 前言 1.了解数据隔离 2.RabbitMQ控制台收发信息 3.SpringBoot整合RabbitMQ收发信息 一、数据隔离 1.用户管理 点击Admin选项卡&#xff0…

依赖库:Ceres-solver-2.0.0安装

依赖库:Ceres-solver-2.0.0安装 前言安装ceres-solver-2.0.0验证 前言 Ceres Solver是谷歌开源的C非线性优化库,能够解决有约束或无约束条件下的非线性最小二乘问题。2010年之后大量的运用在谷歌的产品开发中,尤其在谷歌开源的cartographer中…

sonar对webgoat进行静态扫描

安装sonar并配置 docker安装sonarqube,sonarQube静态代码扫描 - Joson6350 - 博客园 (cnblogs.com) 对webgoat进行sonar扫描 扫描结果 bugs Change this condition so that it does not always evaluate to "false" 意思是这里的else if语句不会执行…

“我,24岁,年薪20万”:选对了行业究竟多重要?

那些在职场上顺风顺水,按部就班拿到高薪的人都有什么特点? 今天的主人公Flee告诉我,是稳。 在她的故事里,我看到一个“别人家的姑娘”,是怎样在职场上稳步晋升,大学毕业仅2年,就拿到18.6K月薪&a…

2022年12月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 一个骰子,从3个不同角度看过去的点数如图所示,请问5的对面是什么点数?( ) A:1 B:3 C:4 D:6 答案:A 根据图三,用右手定则,大拇指朝上指向6所对的方向,其余四指握起来…

目标检测框存在内嵌情况分析与解决

这里写目录标题 问题描述原因分析与解决方法:后续及思考参考文档 问题描述 目标检测模型输出的检测框存在内嵌情况。 原因分析与解决方法: 根据经验,第一感觉是后处理nms部分出了问题。来看下对应的代码: static float CalcIou…

通过对比 入库申请->入库审核流程 与 直接入库 代码实现,解决前者误修改stock_info表is_in=1或2数据的bug

入库申请->入库审核流程&#xff1a; 提交按键定义位置&#xff1a;src\views\purchase\rurchase\RurchaseAdd.vue <a-button click"handleSubmit" type"primary" :loading"loading">确认物品已入库</a-button> <template&…

二、类与对象(二)

8 this指针 8.1 this指针的引入 我们先来定义一个日期的类Date&#xff1a; #include <iostream> using namespace std; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year <&l…

Python BDD之Behave测试报告

behave 本身的测试报告 behave 本身提供了四种报告格式&#xff1a; pretty&#xff1a;这是默认的报告格式&#xff0c;提供颜色化的文本输出&#xff0c;每个测试步骤的结果都会详细列出。plain&#xff1a;这也是一种文本格式的报告&#xff0c;但没有颜色&#xff0c;并且…

电动汽车充放电V2G模型MATLAB代码

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 主要内容&#xff1a; 本程序主要建立电动汽车充放电V2G模型&#xff0c;采用粒子群算法&#xff0c;在保证电动汽车用户出行需求的前提下&#xff0c;为了使工作区域电动汽车尽可能多的消纳供给商场基础负荷…

【办公常识】写好的代码如何上传?使用svn commit

首先找到对应的目录 找到文件之后点击SVN Commit

五大资源之Service(可以固定IP)

Service可以看作是一组同类Pod对外访问接口,借助Service应用可以方便的实现服务发现与负载均衡 创建集群内部可以访问Service #暴露Service(也创建在了namespace dev下) [root@master ~]# kubectl expose deployment(pod控制器) nginx --name=svc-nginx1 --type=Cluste…

基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码

基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于原子轨道搜索优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xf…

Python入门教学——输入任意长度的int整型一维数组

使用python输入一个任意长度的整型一维数组&#xff1a; nums input("请输入整数数组&#xff0c;用空格分隔&#xff1a; ") nums [int(i) for i in nums.split( )] # 将每个数转换为整型后输出 运行结果&#xff1a; 【注】如果不强制转换类型&#xff0c;数字…

如何使用YOLOv8代码框架中的RT-DETR

1. RT-DETR RT-DETR是由由此&#xff0c;百度推出了——RT-DETR (Real-Time DEtection TRansformer) &#xff0c;一种基于 DETR 架构的实时端到端检测器&#xff0c;其在速度和精度上取得了 SOTA 性能。 RT-DETR开源的代码在百度自己的飞桨paddlepaddle上&#xff0c;因此非…

基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码

基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于天鹰优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

新手必看!!附源码!!STM32通用定时器输出PWM

一、什么是PWM? PWM&#xff08;脉冲宽度调制&#xff09;是一种用于控制电子设备的技术。它通过调整信号的脉冲宽度来控制电压的平均值。PWM常用于调节电机速度、控制LED亮度、产生模拟信号等应用。 二、PWM的原理 PWM的基本原理是通过以一定频率产生的脉冲信号&#xff0…