threst's Blog

ctf之隱寫術

2018/08/28 Share

写在前面的话

做了这么多的ctf比赛,告诉我个道理——再少不会少隐写!!!隐写题可是每次比赛都有的,But回顾过去,摸着自己的良心说那次解题不是用工具去套,套中了就解开了,没套中就凉了,于是在这种大背景下,我打算写一篇关于隐写的系(xia)统(che)的文章。各位师傅看就看,别骂人。

what is 隐写?

参考百度上面说就是:隐写术(Steganography)是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。这里提到了信息隐藏技术,粗略的说下,信息隐藏技术不仅仅只包括隐写术,还有数字水印,隐蔽信道,阀下信道,匿名通信这几种,但是我们都不需要了解,其中数字水印主要应用于产权保护,而隐写术主要应用于通信。

隐写术应用场景

要说隐写术的应用不得不提下伟大的Simmons模型,由于最近在看<你好,旧时光>(真心好看),就拿林杨和余周周来打比方。
1.林杨和余周周分属两个教室,一个文科,一个理科。
2.为了将同学情谊升华需要进行通信,而通信的短信必须经过中间的潘主任的审阅。
3.潘主任可以阅读短信的内容,而且阅读后可以判断他们是否早恋。

分析:

加密短信方法不可取,因为潘主任会阅读传送的信息的内容,加密后的信息大概率会引起潘主任的怀疑,潘主任可以以此为依据对他们进行调查。因此林杨和余周周需要一种对通信过程隐藏的手段。
这么分析一下,可能很多同学对密码学和隐写术产生了困惑,什么时候用隐写,什么时候用密码?
密码学与隐写术要根据请情况的不同来选择。
密码学:试图通过对信息加密的方式,使信息变得无意义,继而使他人无法获得真正的信息。
隐写术:试图隐藏通信事件本身。
但他们都有相同目的都是为了针对第三方,在隐蔽性方面(总体上)隐写>加密。因为加密后的文本通常为无意义文本,较易察觉(当然也存在诸如培根密码等密文为有意义文本的加密方
式),但在安全性上面(总体上)加密>隐写,隐写方式或算法一但被识别,通常也就取得信息了,但是加密通常即使知道加密算法也无法解出明文(不考虑碰撞)。

现代数字隐写四大载体

  • 1.文本:字体、空格、标点、行间距等
    2.图像:各类图片格式特征(png、jpg、bmp)
    3.音频:mp3 stego、波形图、频谱图
    4.视频:压缩视频、未压缩视频

关于CTF比赛

在ctf比赛中隐写套路较为固定比赛工具较为成熟。
好处:通常题目难度较低,即使没有解题思路,依次尝试各个解法往往也能在没发现提示
的情况下找出问题所在。
坏处:容易形成思维定势,一旦题目考察方式不常规,往往容易无从下手,不知道从哪开
始去分析,失去独立发现问题和思考的能力。
通常作为MISC类题目的一个考察方向,(这里MISC泛指Misc & Steganography & forensic & Crypto),因为不作为单独分类,因此隐写术通常只是一道Misc题中的一部分,与其他考察方向
共同构成一道完整的Misc题。在国外CTF比赛中以计算机取证(Forensics)类的题目出现。

CTF比赛中的典型隐写分析工具

Binwalk

固件分析工具,常用作路由器逆向、后门分析,或识别二进制图像中的嵌入式文件和可
执行代码
常用参数:

1
2
3
命令:binwalk -e firmware.bin——选项“-e"和“--extract"用于按照定义的配置文件中的提取方法从固件中提取探测到的文件系统。
命令:binwalk -Me firmware.bin——选项“-M"和“--matryoshka"用于根据magic签名扫描结果进行递归提取,仅对"-e"和“--dd"选项有效。
命令:binwalk -Me -d 5 firmware.bin——选项“-d"和“--depth=<int>"用于限制递归提取深度,默认深度为8,仅当“-M"选项存在时有效。

Stegsolve

图片通道查看器,常用参数:

1
2
3
4
5
6
Analyse下拉菜单:
File Format:查看文件格式和参数信息,有时候flag会写在图片信息里
Data Extract:数据提取,如LSB隐写等在这个选项中提取信息
Stereogram solver:立体视图,可以左右移动控制偏移量
Frame Broswer:逐帧浏览,如查看快速闪过的GIF图中的flag
Image Combiner:图片结合,可以对两张图片做xor、add、sub等运算

StegDetect

数字图像隐写分析工具,主要针对JPEG,常用参数:

1
2
3
4
5
6
7
8
9
-q 仅显示可能包含隐藏内容的图像。
-n 启用检查JPEG文件头功能,以降低误报率。如果启用,所有带有批注区域的文件将被视为没有被嵌入信息。如果JPEG文件的JFIF标识符中的版本号不是1.1,则禁用OutGuess检测。
-s 修改检测算法的敏感度,该值的默认值为1。检测结果的匹配度与检测算法的敏感度成正比,算法敏感度的值越大,检测出的可疑文件包含敏感信息的可能性越大。
-d 打印带行号的调试信息。
-t 设置要检测哪些隐写工具(默认检测jopi),可设置的选项如下:
j 检测图像中的信息是否是用jsteg嵌入的。
o 检测图像中的信息是否是用outguess嵌入的。
p 检测图像中的信息是否是用jphide嵌入的。
i 检测图像中的信息是否是用invisible secrets嵌入的。

Foremost

基于文件开始格式,文件结束标志和内部数据结构进行恢复文件的程序。

1
2
3
4
5
6
7
8
9
10
11
-V  - 显示版权信息并退出
-t - 指定文件类型. (-t jpeg,pdf ...)
-d -打开间接块检测 (针对UNIX文件系统)
-i - 指定输入文件 (默认为标准输入)
-a - 写入所有的文件头部, 不执行错误检测(损坏文件)
-w - 向磁盘写入审计文件,不写入任何检测到的文件
-o - 设置输出目录 (默认为为输出)
-c - 设置配置文件 (默认为 foremost.conf)
-q - 启用快速模式. 在512字节边界执行搜索.
-Q - 启用安静模式. 禁用输出消息.
-v - 详细模式. 向屏幕上记录所有消息。

strings

strings命令在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。 strings命令对识别随机对象文件很有用。

1
2
3
4
-a --all:扫描整个文件而不是只扫描目标文件初始化和装载段
-f –print-file-name:在显示字符串前先显示文件名
-t --radix={o,d,x} :输出字符的位置,基于八进制,十进制或者十六进制
-e --encoding={s,S,b,l,B,L} :选择字符大小和排列顺序:s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit

常见文件格式

what is 文件格式?

文件格式(或文件类型)是指电脑为了存储信息而使用的对信息的特殊编码方式,是用于识别内部储存的资料。比如有的储存图片,有的储存程序,有的储存文字信息。每一类信息,都可以一种或多种文件格式保存在电脑存储中。每一种文件格式通常会有一种或多种扩展名可以用来识别,但也可能没有扩展名。扩展名可以帮助应用程序识别的文件格式。

文件头

文件头就是是位于文件开头的一段承担一定任务的数据。一般都在开头的部分。以jpg图片和zip压缩包文件为例。图6和图7分别是jpg图片的文件头以及jpg图片的结尾。

txt格式

txt是微软在操作系统上附带的一种文本格式,是最常见的一种文件格式 ,早在DOS时代应用就很多,主要存文本信息,即为文字信息,现在的操作系统大多使用记事本等程序保存,大多数软件可以查看,如记事本,浏览器等等。
txt.jpg

doc/docx格式

doc即document的缩写,docx在doc的基础上加入了xml,通常是指Microsoft Office Word软件创建的文件格式,docx实际上是作为一个zip压缩方式的压缩文件,docx相对doc体积更小,支持的对象更多,同常采用AOPR的工具爆破docx的难度更大。
doc和docx大小.jpg
doc和docx中内容一样,docx比doc相比,体积更小。
docx.jpg
注意这里标记的pk,其实docx可以讲是一种zip文件。我们把后缀名改成zip试试。
docxzip.jpg
可以看到,可以用解压软件打开。
doc.jpg

png格式

属于无损压缩的位图格式,他采用LZ77的派生算法进行压缩,压缩比高,文件体积小,同时不损失颜色和数据,一个png文件可以由一个文件头标志和若干个数据块构成,而数据块有可以分为关键数据块和辅助数据块,每一类数据块又包含若干具体的数据块部分。

拿张png的图片来举个例子.
png
丢到winhex中分析,对于一个PNG文件来说,其文件头总是由位固定的字节来描述的,剩余的部分由 3 个以上的 PNG 的数据块(Chunk)按照特定的顺序组成。PNG图片是有两种数据块的,一个是叫关键数据块,另一种是辅助数据块。正常的关键数据块,定义了4种标准数据块,每个PNG文件都必须包含它们。
一般格式:

1
文件头 89 50 4E 47 0D 0A 1A 0A+数据块+数据块+数据块……

jpeg格式

JPEG 是有损压缩格式,将像素信息用JPEG保存成文件再读取出来,其中某些像素值会有少许变化。在保存时有个质量参数可在0至100之间选择,参数越大图片就越保真,但图片的体积也就越大。一般情况下选择 70 或 80 就足够了,png主要是块,而jpeg主要是以段的形式
jpg
一样拿张图片做栗子,注意jpg文件有些段是没有长度描述也没有内容,只有段标识和段类型。比如文件头和文件尾均属于这种段,段与段之间无论有多少 FF都是合法的,这些FF称为「填充字节」,必须被忽略掉。
文件头.jpg
0xffd80xffd9为 JPG 文件的开始结束的标志
文件尾.jpg

bmp格式

是windows的标准图像文件格式,通常情况下采用位映射存储格式,除了图像的深度(可以理解为控制色彩的能力)可选外,不采用任何其他的压缩方式,因此bmp的图像质量非常高,体积也非常大,bmp图像通常可以分为设备相关位图和设备无关位图两大类,一个bmp的文件格式通常由文件头,信息头,颜色信息和位图数据四部分组成
文件头:前面两个字节一般42 4D,随后4个字节表示位图大小,再后面4个字节为保留位设置为0,再后面的4个字节非常关键,表示文件头到位图数据的偏移量
1.bmp

bmp.jpg
其中图像文件头。0x4d42=’BM’,表示是Windows支持的BMP格式。(注意:查ascii表B 0x42,M0x4d,bfType为两个字节,B为low字节,M为high字节所以bfType=0x4D42,而不是0x424D,请注意)
https://baike.baidu.com/item/BMP/35116

gif

gif就是我们经常看见的动图,比如各种表情包,从文件格式来讲它也是一种无损压缩,它存储的不是颜色的本身,而是该点的颜色列表的索引值,其内部分成许多存储快,可以用来存储多副图像或者是决定图像表现行为的控制块,继而实现动图和交互式应用,一个gif图像通常由文件头,gif数据流和文件终结器三个部分组成,目前常见的有87(不支持动图)和89两个版本.

gif

我们还是用一张git图来举栗子

<GIF数据流> ::= 头部 <;逻辑视屏> <;数据>* 尾记录,这个规则将;实体定义如下。它必须以头部开始,头部后面接一个逻辑视屏实体,该实体要用其他规则来定义。最后,数据实体接结束符。数据实体后面的*表示数据实体可以在此位置出现0或多次。

1
2
3
4
5
6
7
<Gif 数据流> ::= 头部 <;逻辑视屏> <;数据>* 尾记录
<;逻辑视屏> ::= 逻辑视屏描述块 [全局色表]
<;数据> ::= <;成象块> |<;特殊用途块>
<;成象块> ::= [图象控制扩充] <;成象块>
<;成象块> ::= <;基于表的图象> |纯文本扩充
<;基于表的图象> ::= 图象描述符 [局部色表] 图象数据
<;特殊用途块> ::= 应用扩充 |注释扩充

gif.jpg

mp3

mp3格式是在音频隐写中常见的一种格式,mp3即MPEG-a Audio Layer-3的简称,根据压缩质量和编码的复杂程度可以大致分为3层,分别对应与mp1,mp2,mp3,这三种有损压缩的声音文件,根据用途的不同,每层采用的编码方式也不同,其编码层次越高,编码器就越复杂,压缩率也高,一个mp3文件大致可以分成TAG_V2,Frame,TAG_V1三部分,其中frame是构成mp3的最小组成单位。
拿十三哥的音频来举个例子,使用audacity工具可以查看mp3的波形图,频谱图.
mp32.jpg

mp3.jpg

CATALOG
  1. 1. 写在前面的话
  2. 2. what is 隐写?
  3. 3. 隐写术应用场景
    1. 3.0.1. 分析:
  4. 3.1. 关于CTF比赛
  • 4. CTF比赛中的典型隐写分析工具
    1. 4.0.1. Binwalk
    2. 4.0.2. Stegsolve
    3. 4.0.3. StegDetect
    4. 4.0.4. Foremost
    5. 4.0.5. strings
  • 5. 常见文件格式
    1. 5.1. what is 文件格式?
    2. 5.2. 文件头
    3. 5.3. txt格式
      1. 5.3.1. doc/docx格式
      2. 5.3.2. png格式
      3. 5.3.3. jpeg格式
      4. 5.3.4. bmp格式
      5. 5.3.5. gif
      6. 5.3.6. mp3