CTF教程,CTF靶场搭建

文章 , 技术分享
410 0

第一讲 信息隐写

一、stegsolve使用方法

Stegsolve使用方法(是因为ctf题总是遇到并且目前百度没有十分详细的探究说明)

img

这个没什么好说的,打开文件 ,保存,退出

img

在分析里面从上到下的依次意思是

File Format:文件格式

Data Extract:数据提取

Steregram Solve:立体试图 可以左右控制偏移

Frame Browser:帧浏览器

Image Combiner:拼图,图片拼接

用法(使用场景)

1.File Format:这里你会看见图片的具体信息有时候有些图片隐写的flag会藏在这里

2.Data Extract:(好多涉及到数据提取的时候,很多博主在wp中都是一带而过,小白们还以为要一个个试。。)

img

左边一大部分主要是讲了RGBA(Alpha是透明度)的颜色通道

为了方便理解我们分开说

RGB是红绿蓝 但他们的值代表的实际上是亮度

R的数字越大,则代表红色亮度越高;R的数字越小,则代表红色亮度越低。G,B同理

R的亮度各有256个级别,GB同理。即从0到255,合计为256个。从数字0到255的逐渐增高,我们人眼观察到的就是亮度越来越大,红色、绿色或蓝色越来越亮。然而256是2的8次方 所以你会看见上图的7~0 一共8个通道

而Alpha就是透明度 该通道用256级灰度来记录图像中的透明度信息,定义透明、不透明和半透明区域

alpha的值为0就是全透明,alpha 的值为 255 则表示不透明

因此左半部分就理解了

右半部分就是Extra By(额外的)和Bit Order(位顺序)和Bit Plane Order(位平面的顺序)

1).Extra By(额外的):分为row(行)和column(纵)

每个像素用R,G,B三个分量表示,那么一张图片就像一个矩阵,矩阵的每个单位就是(0~255,0~255,0~255)

也就会有是纵排列和行排列了,一般事先访问行再访问列(如果相反会引起ve使用方法)

2).Bit Order(位顺序):MSB是一串数据的最高位,LSB是一串数据的最低位。

3).Bit Plane Order(位平面的顺序)

整个图像分解为8个位平面,从LSB(最低有效位0)到MSB(最高有效位7)随着从位平面0 到位平面7,位平面图像的特征逐渐变得复杂,细节不断增加。(一般我们的图片如果是RGB那么就是24位 3乘8嘛)

4)Bit Plane Order(位平面的顺序):一般图片是24位 也就是3个8 大家可以想像成三明治 比如BGR就是B为三明治第一层 G为第二层 R为第三层。

3.Steregram Solve:立体试图 可以左右控制偏移 可以放张图片试一下就知道这个是什么意思了

4.Frame Browser:帧浏览器 主要是对GIF之类的动图进行分解,把动图一帧帧的放,有时候会是二维码

5.Image Combiner:拼图,图片拼接(意思显而易见)

接下来会带大家实战去深入理解一下Data Extract里面ctf经常用到的LSB隐写

img

这个我们之前介绍的很详细

而LSB隐写就是修改RGB颜色分量的最低二进制位也就是最低有效位(LSB),而人类的眼睛不会注意到这前后的变化,(人类的眼睛只能识别一部分颜色的变化)

img

如果我们修改lsb那么颜色依然和没修改的一样,并且修改的话每个像数可以携带3比特的信息。

img

这个作用是在于把最低位的二进制全部提取出来

img

这个作用在于对提取出来的最低位使用lsb解码算法

img

二、PNG文件结构


1、PNG文件简介

中文名便携式网络图形类型无损压缩的位图片形格式
英文名Portable Network Graphics(PNG)设计目的试图替代GIFTIFF文件格式

2、PNG文件结构

PNG图像格式文件由一个8字节的PNG文件署名域和按照特定结构组织的3个以上的*数据块(chunk)*组成。

PNG文件署名域PNG数据块PNG数据块...PNG数据块

1)、PNG文件署名域

PNG文件署名域是用来标识一个文件是否是PNG格式的,共有8个固定字节:

十进制数137 80 78 71 13 10 26 10
十六进制数89 50 4E 47 0D 0A 1A 0A

2)、PNG数据块(Chunk)

PNG定义了两种类型的数据块:

  • 关键数据块(critical chunk)——这是必需的数据块
  • 辅助数据块(ancillary chunks)——这是可选的数据块

每个数据块由4个部分组成:

名称字节数说明
Length (长度)4指定数据块中数据域的长度,其长度不超过(2^31-1)字节
Chunk Type Code (数据块类型码)4数据块类型码,由ASC\\字母(A~Z)(a~z)组成
Chunk Data (数据块数据)可变存储按照Chunk Type Code指定的数据
CRC (循环冗余检测)4存储用来检测是否有错误的循环冗余码

(1)关键数据块

关键数据块可分为四种类型:

*①文件头数据块IHDR**(header chunk)*

它包含PNG文件存储的图像数据的基本信息,是PNG数据流中的第一个数据块中,一个PNG数据流有且仅有一个IHDR。IHDR数据块的数据块类型码(Chunk type code)为: 0x49 48 44 52(ASCII码“IHDR”),标识该块类型。

它的格式如下:

域的名称字节数说明
width4图像宽度,以像素为单位
height4图像高度,以像素为单位
bit depth1图像深度:索引彩色图像:1,2,4或8灰度图像:1,2,4,8或16真彩色图像:8或16
color type1颜色类型:0:灰度图像,1,2,4,8或162:真彩色图像,8或163:索引彩色图像,1,2,4或84:带α通道数据的灰度图像,8或166:带α通道数据的真彩色图像,8或16
compression method1压缩方法(LZ77派生算法)
filter method1滤波器方法
interlace method1隔行扫描方法:0:非隔行扫描1:Adam7

*②调色板数据块PLTE**(paltte chunk)*

它含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,使得图像深度较小的图像,可以使用索引号来正确表示颜色,并且它要放在图像数据块IDAT之前。PLTE数据块是定义图像的调色板信息,它可以包含1~256个调色板信息。每一个调色板信息由3个字节组成:

颜色字节意义
Red10:黑 255:红
Green10:黑 255:绿
Blue10:黑 255:蓝

此外,PLTE块还必需满足以下限制条件:

  • 调色板的长度应为3的倍数,即PLTE块最大字节数为256 × 3 = 768 B;
  • 调色板信息的数量不能超过图像深度可以表示的范围;
  • 对于Colour type 3的PNG图像(索引图像),PLTE块是必需的,此时调色板的颜色索引从0开始编号,然后是1,2……;对于Colour type为2和6的图像,PLTE块是可选的,此时调色板将提供一个1—256的建议颜色集,以便软件或屏幕不支持显示真彩色时量化真彩色图像;Colour type为0和4的图像中不能出现PLTE块。

*③图像数据块IDAT**(image data chunk)*

它存储实际的数据,在数据流中可包含多个连续顺序的图像数据快IDAT。IDAT存放图像真正的数据信息。

*④图像结束数据IEND**(image trailer chunk)*

它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。

用固定的12个字节表示: 00 00 00 00 49 45 4E 44 AE 42 60 82


(2)辅助数据块

**①透明信息数据块:tRNS**(Transparency chunk)**
*②图像γ数据块:gAMA**(Image gamma chunk)*
*③基色和白色度数据块:cHRM**(Primary chromaticities chunk)*
*④标准RGB色彩空间数据块:sRGB**(Standard RGB colour space chunk)***
**⑤文本信息数据块:tEXt**(Textual data chunk)**
*⑥压缩文本数据块:zTXt* *(Compressed textual data chunk)*
*⑦背景颜色数据块:bKGD**(Background colour chunk)*
*⑧物理像素尺寸数据块:pHYs**(Physical pixel dimensions chunk)*
*⑨样本有效位数据块:sBIT**(Significant bits chunk)*
*⑩图像直方图数据块:hIST**(Palette histogram chunk)*
*⑩①图像最后修改时间数据块:tIME**(Image last-modification time chunk)***


3、PNG文件实例分析

用FlexHEX打开下图png:

img


①PNG文件标识

img


②文件头数据块IHDR

img

名称数据说明
Length00 00 00 0D数据域长度为13
Chunk Type Code49 48 44 52标识IHDR
width00 00 03 93图像宽度为915
height00 00 02 20图像高度为544
bit depth08图像深度为8位
color type06颜色类型为6,属于带α通道数据的真彩色图像
compression method00无压缩
filter method00滤波器方法为0
interlace method00非隔行扫描
CRC18 C6 3D E6CRC检错

③图像结束数据IEND

img

第二讲 如何搭建CTF比赛平台(CTFd)

下载CTFd代码
CTFd的仓库代码下载地址:https://github.com/CTFd/CTFd/releases
写这篇文章的时候最新版本是CTFd-3.4.0版本,因此以该版本为例。

此处我下载的是第一个.zip文件

上传代码至Centos7服务器并解压
如果你下载的是.zip文件请使用命令unzip CTFd-3.4.0.zip进行解压缩
如果提示如下内容,说明没有安装unzip工具,请先执行命令yum install -y unzip安装unzip工具,再进行解压缩

-bash: unzip: 未找到命令

如果你下载的是.tar.gz文件,请使用命令tar -zxvf CTFd-3.4.0.tar.gz进行解压缩

安装运行环境
首先需要检查的是你的python环境,CTFd采用python3编写。
请先尝试执行命令python,如果出现的是Python 2.x.x说明python是python2的环境,执行输入exit()后回车退出。
再尝试执行python3,如果能够出现Python 3.x.x则说明存在python3的环境。后续我们将使用python3进行相关操作。
如果输入python3出现如下信息,则说明没有python3的环境,我们需要先进行python3环境的安装。

-bash: python3: 未找到命令

安装python3
如果python3已经安装,请跳过此步。
python3截至到本文章的编写日期来看,推荐安装CTFd开发所用的python版本,这里我曾用过的版本是python3.7.x,没有出现问题,不推荐使用太高的版本,太高的版本在一些语法上可能会略有不同。
你可以选择从Python的官网中下载python进行安装,也可以直接使用Centos7的yum进行安装。
为了方便,我这里直接使用yum进行安装,其他安装方式请看其他文章。
执行命令yum install -y python3进行python3的安装。(此处yum默认给我安装的是python3.6.8版本)
安装完成后执行python3命令,验证是否能正常使用。yum安装会自动将pip工具进行安装。
执行pip3 -V验证pip3工具的安装情况。

安装CTFd依赖库(模块)
首先进入之前解压的CTFd-3.4.0文件夹(即CTFd项目根目录)
在进行后续步骤之前,建议先使用yum安装以下几个依赖,避免pip3安装过程中出现一些问题。
执行如下个命令:
yum install -y libevent-devel
yum install -y python3-devel
yum install -y gcc

然后执行命令pip3 install -r requirements.txt
等待安装完成。

该命令安装期间通常会出现一些安装失败的情况,一般是有两种类型:
1、网络不通畅导致的安装失败——有一些依赖库,如果你默认使用pip3去安装的话,可能会请求一些国外的源,此时可以尝试先将pip源更换为国内的镜像源,然后再执行命令安装。(如何过呢更换源,自行查阅相关资料,不在本篇文章范围)
2、缺少相关的依赖文件和程序,如常见的gcc编译失败,缺少.c或.h文件等

运行CTFd
进入到之前解压的CTFd-3.4.0文件夹(即CTFd项目根目录)
然后执行python3 serve.py即可默认在本地进行启动了。
默认地址127.0.0.1
默认端口4000

如果你想让别人能访问,通常我们需要将127.0.0.1换成0.0.0.0
我们使用vim打开serve.py文件,找到最下面一行
app.run(debug=True, threaded=True, host="127.0.0.1", port=args.port)
将其改成你需要的即可,对应的参数解释如下。
debug:是否开启debug模式
threaded:是否开启线程模式
host:主机地址(允许其他机器访问改成0.0.0.0)
port:主机端口
将其改成如下:
app.run(debug=False, threaded=True, host="0.0.0.0", port=8080)
然后执行python3 serve.py即可运行CTFd。
浏览器访问地址 http://你服务器地址:8080/ 即可
我的样例:http://192.168.234.136:8080/
至此,成功访问CTFd,并进入到了CTFd的安装界面

CTFd汉化
Github搜索CTFd汉化,找到CTFd_chinese_CN项目(该汉化项目汉化覆盖率高,并且更换优化了官方CDN地址,解决了访问静态资源无法加载或加载过慢问题)
https://github.com/Gu-f/CTFd_chinese_CN
下载对应版本的CTFd汉化,此处我的CTFd是3.4.0版本,因此我下载的是Release中的CTFd-CN_V1.1.1-V3.4.0.zip

下载后将其上传到服务器,然后执行命令unzip CTFd-CN_V1.1.1-V3.4.0.zip进行解压缩
此时我服务器中的文件和文件夹如下:

CTFd-3.4.0: 是我们CTFd原始的代码文件
CTFd-V3.4.0:是我们下载的汉化的代码文件
然后执行命令/bin/cp -rf CTFd-V3.4.0/* CTFd-3.4.0/将汉化的代码文件覆盖到CTFd中。

此时再执行命令python3 serve.py运行CTFd,刷新浏览器,即可看到汉化后的CTFd界面

后续
如果仅仅是少数人,或自己的小团队,去使用CTFd,以上的安装步骤,和python3 serve.py的运行方式已经足够用了。
如果是面向的人数比较众多的。建议使用gunicorn(Python-WSGI)来进行高并发、高性能的优化处理。

gunicorn高并发优化
gunicorn常用参数如下:

-c CONFIG, --config=CONFIG 设定配置文件。
-b BIND, --bind=BIND 绑定的端口,建议使用 HOST:PORT。
-w WORKERS, --workers=WORKERS 设置工作进程数。
-k MODULE 选定异步工作方式使用的模块。

比较关键的是 -w 参数,表示工作进程数,建议的设置是cpu核心数*2+1,可根据实际情况进行调整。

然后,项目根目录下执行以下命令进行启动:
gunicorn -w 3 -b 0.0.0.0:8080 "CTFd:create_app()"
接下来就可以愉快玩耍了。
(ps:个人感觉使用gunicorn后,如果gunicorn不太稳定或服务器性能不太好,并没有明显的质的提升,相反,给人的使用体验并没有直接使用python3 serve.py丝滑流畅)


ctf小技巧
exif图片就是直接查看图片的属性,在kali里面exiftool 1.jpg 这样查看更全面 或者用010工具找到bese64编码
refresh 是F5刷新文件的意思,用win里面的cdm命令 java Extract refresh.jpg -p 123456
123456是密码
binwalk 1.png 查看这个文件 里有多少文件
binwalk -e 1.png 分离这些文件
foremost 1.png 分离这些文件【更好用】
默认放在output文件夹
分离图片

2022-11-14T14:22:01.png

最后更新 2023-07-15
评论 ( 0 )
OωO
隐私评论