一、misc中隐写概述和工具介绍

1. 隐写术

       隐写术是一本关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。隐写术的英文名叫做Steganography,来源于特里特米乌斯的一本讲述密码学与隐写术的著作steganographia,该书书名源于希腊语,意为”隐秘书写”。

2. 题目类型

隐写术题目在CTF中大致分为以下几种类型:
图片隐写—-jpg、png、bmp等图片的信息隐藏
音频隐写—-MP3隐写、波形隐写、频谱隐写
文档隐写—-常见文档格式,如doc、word、pdf等文件的信息隐藏
视频隐写—-在嵌入视频中嵌入隐藏信息
其他隐写—-如NTFS流、HTML的snow隐写等

3. 文件头

       在隐写题目中,首先要介绍的知识点是文件头,文件头是位于文件开头的一段承担一定任务的数据。一般都在文件开头的部分,文件头一般是系统文件类似的重要标准,尤其是当我们遇到需要修复文件的题目时,更加需要掌握常见文件的头部和尾部标识。

4. 十六进制编辑器

       十六进制编辑器,用来以16进制视图进行文本编辑的编辑工具软件。十六进制编辑器可以用来检查和修复各种文件、恢复删除文件、硬盘损坏造成的数据丢失等,如010 Editor、Winhex等都是功能比较强大的十六进制编译器,推荐使用010 Editor,内置很多模板,分析比较方便。

5. file命令

Linux系统自带工具,用来快速查看文件类型,通过file指令,我们得以辨识该文件的类型。
file识别文件类型命令:file 文件名

6. binwalk工具

       binwalk是一个自动提取文件系统,该工具最大的优点就是自动完成指定文件的扫描,只能发掘潜藏在文件中所有可疑的文件类型及文件系统。相比file命令行工具来说,file只能从文件的第一个字节来开始识别,且只能把一个文件识别成一个类型的文件,很难看出来是否隐藏着其他文件,binwalk就能很好的完成这项任务。
binwalk识别隐藏文件命令:binwalk 文件名
binwalk提取隐藏文件命令:binwalk -e 文件名

7. foremost工具

       foremost是基于文件开始格式,文件结束标志和内部数据结构进行恢复文件的程序。该工具通过分析不同类型文件的头、尾、内部数据结构,同镜像文件的数据进行对比,以还原文件。他默认支持19种类型的文件恢复。用户还可以通过修改配置文件扩展支持其他文件类型,有时候binwalk无法正确分离出文件时,可以尝试使用foremost工具分离。
foremost分离常用命令:foremost 文件名 -o 文件夹名

8. dd手动分离工具

       前面两种都是自动化分离工具,dd这个工具是一种半自动化工具,有时候自动化工具不能实现文件分离,所以需要用这个工具来进行分离。
分离常用命令:dd if=源文件 bs=1 skip=开始分离的字节数 of=目标文件名

9. stegsolve工具

       这是一款使用java开发的工具,在CTF中最常用来检测LSB隐写痕迹的工具是stegsolve,这是一款可以对图片进行多种操作的工具,包括对图片进行xor,sub等操作,对图片不同通道进行查看等功能。
File Format:文件格式,这个主要是查看图片的具体信息
Fata Extract:数据抽取,图片中隐藏数据的抽取
Frame Browser:帧浏览器,主要是对GIF之类的动图进行分解
Image Combiner:拼图,图片拼接

10. stegdetect工具

       stegdetect程序主要用于分析jpeg文件,可以检测到通过JSteg、JPHide、OutGuess、invisible secrets、F5、appendX和Camouflage等这些隐写工具隐藏的信息,stegdetect通过统计检测来分析图像文件中是否包括隐藏内容。他运行静态测试以判断隐藏的内容是否存在。此外,它还会尝试识别隐藏内容是通过哪个工具嵌入的。
GitHub地址:https://github.com/abeluck/stegdetect
常用命令:stegdetect -s 10 文件名

二、JPG图片隐写

1. 工具下载

Windows平台:
jphs:http://io.acad.athabascau.ca/~grizzlie/Comp607/jphs05.zip
Steghide:http://steghide.sourceforge.net/download.php
silenteye:https://sourceforge.net/projects/silenteye/
JPEGsnoop:https://www.impulseadventure.com/photo/jpeg-snoop.html

Linux平台:
outguess:https://github.com/crorvick/outguess
F5:https://github.com/matthewgao/F5-steganography
steghide:https://github.com/StefanoDeVuono/steghide

2. JPG文件结构

JPG以一副24位彩色图像为例,JPEG的压缩分为四个步骤:
       颜色转换:在将彩色图像进行压缩之前,必须先对颜色模式进行数据转换,转换完成之后还需要进行数据采样。
       DCT变换:是将图像信号在频率域上进行变换,分离出高频和低频信息的处理过程,然后再对图像的高频部分(即图像细节)进行压缩。
       量化:由于下面的第四步编码过程中使用的码本都是整数,对此要对频率系数进行量化,将之转换为整数。数据量化后,矩阵中的数据都是近似值,和原始图像数据之间有了差异,这一差异是造成图像压缩后失真的主要原因。
       编码:编码是基于统计特性的方式。

3. JPG常见隐写方式

  • Exif信息隐藏
           Exif是可交换图像文件格式,是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。hpg图片拥有exif信息,可以用来通过填充exif信息来隐藏信息。
           解决方法:
                  在Windows平台右键图片点击属性,可以查看部分exif信息。
                  在Linux平台可使用exiftool工具查看所有的exif信息。
  • 字符附加
           在附加式的图片隐写术中,我们通常是用某种程序或者某种方法在载体文件中直接附加上需要被隐写的字符串或者其他信息,由于写入的位置对图片来说无关紧要,所以不会影响图片的正常打开识别。
           解决方式:
                  用16进制编辑器打开图片,查找与flag有关的字符,出现在文件末尾的可能性最大
                  在linux下,使用strings命令,可以将文件中的所有字符串打印出来,steings命令在对对象文件或者二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意系列,以换行符或空字符结束。strings命令对识别随机对象很有用。
  • 文件结合
           采用一种特殊方式将图片文件与其他文件结合起来。该文件一般保存为jpg格式,可以正常显示图片,当有人获取该图片后,可以修改文件的后缀名,比如结合的是zip文件,将图片改为zip压缩文件,在文件无损坏的情况下就可以以zip文件直接打开。
           图种是一种以图片文件为载体,然后将zip等压缩文附加在图片文件后面。因为操作系统识别的过程是从文件头标志,到文件的结束标志位,当系统识别到图片的结束标志位后,默认是不再继续识别的,所以我们在通常情况下只能看到它是一张图片。
           解决方式:
                  在Windows平台下修改后缀名或者16进制编辑器手动分离
                  在Linux平台下使用binwalk,dd,foremost等工具分离
  • 基于DCT域的JPG图像隐写
           因为DCT是一种有损压缩技术,但一般不会影响图像的视觉效果,可以通过这个特性来隐藏信息。在这个隐写类型中,常见的隐写方法有JSteg、JPHide、Outguess、F5等。
           解决方法:
                  使用Stegdetect工具检测隐写方式,并且还可以基于字典暴力破解密码方式提取通过JPHide、outguess等方式嵌入的隐藏信息。
                  根据Stegdetect的判断结果,使用对应工具玩完成解密。
  • SilentEye工具隐写
           使用SilentEye进行信息隐藏,SlientEye是一款免费的图片信息隐藏工具,可以对图片和音频进行信息隐藏。

4. JPG隐写实战

4.1 Exif隐写

Windows下右键属性选择详细信息选项卡即可查看

linux下使用exiftool工具查询,命令:exiftool 文件名

4.2 字符拼接

Windows下使用16进制编辑器搜索关键字,一般出现在文件尾

Linux下使用strings工具配合grep过滤关键字

4.3 文件结合

Windows下可以使用16进制编辑器搜索该文件文件尾

Linux下使用binwalk -e来分离文件

在Linux下还可以使用foremost来分离

4.4 JPHide

使用stegdetect工具检测隐写方式,命令: ./stegdetect -s 10.0 文件名

使用JPHide工具进行解密,open jpeg=>Seek=>输入密码=>保存解密文本

4.5 outguess

同样的使用stegdetect工具进行检测,也可以直接全部工具试一遍

使用stegdetect工具检测出是jphide隐写,但使用jphide工具无法解密,此时考虑更换工具

命令: ./outguess -k 密码 -r 隐写文件名 解密文件名

4.6 F5

F5也是属于DCT域的隐写,掌握F5加密和解密方式即可
加密:java Embed 隐写前图片 隐写后图片 -e 隐写文件 -p 密码
解密:java Extract 被隐写图片 -p 密码 //解密后文件:output.txt

4.7 steghide

steghide隐写不止可以隐写jpg,还可以隐写png等格式,掌握使用方法
加密:steghide embed -cf 隐写图片-ef 隐写文件 -p 密码
解密:steghide.exe extract -sf 被隐写图片 -p 密码

4.8 slienteye

拖入图片打开后点击decode即可解密,加密使用encode

三、PNG图片隐写

1. 工具下载

PCRT:https://github.com/sherlly/PCRT
BlindWaterMark:https://github.com/chishaxie/BlindWaterMark
macromedia fireworks 8
BCompare

2. PNG文件格式

       PNG是一种采用无损压缩算法的位图格式,其设计目的是试图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNG file signature)域和按照特定结构组织的3个以上的数据块(chunk)组成。
       PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是必需的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。

数据块名称 允许多个数据块 位置 作用
IHDR 不允许 第一个数据块 文件头数据块
PLTE 不允许 第二个数据块,可选 调色板数据块
IDAT 允许 如果有调色板数据块,则是第三个数据块 图像数据块
IEND 不允许 最后一个数据块 图像结束数据

PNG图像文件中每一个数据块的格式都是相同的,分别由4个部分组成。

字段名 大小(字节) 描述
Length(长度) 4 指定数据块中的数据长度
Chunk Type Code(数据块类型码) 4 数据块类型,比如IHDR、PLTE、IDAT等
Chunk Data(数据块数据) Length(由图像决定) 存储数据
CRC(循环冗余检测) 4 循环冗余码

CRC循环冗余码生成是计算方式是通过Chunk Type Code和Chunk Data中的数据进行计算得到的,在CTF中有时可能需要修复CRC值,计算方式如下:

IHDR
文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。文件头数据块由13字节组成,它的格式如下表所示。
其中我们需要了解的是前8个字节的内容,也就是Width和Height,出题人经常会去修改一张图片的高度或宽度使得一张图片显示不完整从而达到隐藏信息的目的。

IDAT
图像数据块IDAT:它存储着实际的图像数据,在数据流中可包含多个连续顺序的图像数据块,一个png图像包含多个IDAT数据块,但只有一个IDAT块被充满时,才会继续新的块。在题目中如果遇到长度和其他块不同时应该引起注意。

IEND
PNG的图像结束数据是用来标记PNG文件结束,并且必须放在文件尾部,由12个字节组成。一般情况下,所有的PNG图像结束数据块的十六进制数值都是一样的,IEND数据块的长度总是00 00 00 00,数据标识总是49 45 4E 44,因此,CRC码也总是AE 42 60 82。出题人可能修改该结构,导致文件无法打开。

3. png常见隐写方式

  • 字符附加和文件结合
  • 基于PNG文件格式的隐写
  • 基于LSB的图片隐写
  • 图片容差隐写
  • 图层叠加
  • 数字水印隐写

4. png隐写实战

4.1 IHDR修复

通过PCRT检测图片的IHDR是否正确,不正确可能是修改了高宽和crc校验值。如果是修改了高宽,修改后即可显示隐藏内容,使用脚本爆破正确的高宽。在Windows下修改了crc是可以正常打开的,但是在linux下无法打开。
PCRT命令:py -2 PCRT.py -v -i IHDR.png

1
2
3
4
5
6
7
8
9
10
11
import os
import binascii
import struct
misc = open("fff.png","rb").read()
for i in range(1024):
for j in range(1024):
data = misc[12:16] + struct.pack('>i',i) + struct.pack('>i',j) + misc[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == 0xfe1a5ab6:
print i,j
print "hex",hex(i),hex(j)