2.7 Misc隐写术深入分析 – lmn-【密码学】小世界-安全文库-NGC660 安全实验室

2.7 Misc隐写术深入分析 – lmn

2.7 Misc隐写术深入分析 – lmn

1652023688967-a84c35d1-693f-4859-8a58-b633e39ac5d2

CTF中Misc的隐写是最常见的出题方向之一,早在几年前CTF的隐写技术就已是重点之一,非常值得大家深究。

隐写技术不仅在CTF中常见,在其他方向也常见。随着互联网发展越来越迅速,各个方向的技术不仅快速发展,相关技术的融合迭代也成了热门趋势,与此同时,信息的安全和隐藏开始被大家重视。

0x01 隐写技术概要

“隐写”,我们可以分成两部分理解,“隐”将目标真实信息隐藏在选定的伪装载体后面“写”则是真实信息隐藏在伪装载体后面的技术。

1652057827986-63a5df7b-7c31-4ac4-a7b3-1c350eb0416c

Address:https://2.bp.blogspot.com/-TTsv3fj66GY/WgGu5N5CoxI/AAAAAAAAKHk/9Oup8dSsFzonXVWoCCQjwpqAVKZKlf_GACLcBGAs/s1600/2.%2BWhat%2Bis%2BSTEGANOGRAPHY%2Bprohathacker.jpg

国内外研究共识

隐写技术的英文在很多技术期刊上用的是“Technical Steganography”,这也是为什么很多隐写工具的名称都以Steg开头的原因

Gary C. Kessler《Advances in Computers》中给出了这么一段公式:
stego_medium = hidden_message + carrier + stego_key

  • stego_medium:隐写的最终媒介
  • hidden_message:需要隐藏的信息
  • carrier:载体
  • stego_key:密钥

1652058474877-2cbbb6b0-01c9-4b56-b0d1-a9354f23fd86

Address:https://tse1-mm.cn.bing.net/th/id/OIP-C.3-VS2Ba2s5DgW7CPjoudDAHaFj?pid=ImgDet&rs=1

在《The Official CHFI》这本书中,有非常系统的讲解了在Forensics中Steganography(隐写)

Steganography与Cryptography(密码学)的区别:

  1. Steganography不改变文本的原本形态
  2. Steganography并不是先输入plain text 然后转换成“cipher”

0x02 隐写技术的历史

在刚才的隐写技术概要中,笔者已经从自己的理解拆分了我们所谓的“隐写”。

CHFI也对隐写(Steganography)进行了拆分,用于结束隐写技术的历史
Steganography = Greek origin(steganos) + graphie(writing)

希腊🇬🇷

Greek(希腊人)
在历史上,Herodotus记载了很多Steganography的使用,其中一个讲的是:有一个希腊人叫Histaiaeus,他想鼓励Miletus的Aristagoras反抗Persian国王,并以一种相当有创意的方式做到了这一点。为了安全地传达这些指示,Histaiaeus剃了他的信使的头,把信息写在他光秃秃的头皮上,然后等待头发长回来。当信使到达目的地时——Aristagoras剃了光头,上面写着消息,虽然这肯定不是最快的沟通方式,但它非常有效,因为送信人没有携带任何可疑的东西,能够不受骚扰地通过警卫的检查。

中国🇨🇳

中国人在元朝时使用隐写术来反抗蒙古人统治的中国,当时的领导人对不得不屈从于外国统治感到不满,于是发明了一种创造性的方法,在不被发现的情况下协调叛乱。起义军首领知道中秋节快到了,就下令制作一种特殊的月饼,每个月饼里都有一条关于袭击的信息。在中秋节的晚上,月饼被分发,信息被阅读,起义军成功地攻击并推翻了政府,接下来就是明朝的建立。

第一次世界大战

在第一次世界大战期间,隐写术在几个时期和实例中都获得了成功。一种方法被称为Turning Grille,这采取了Cardano’s Grille方法,并加强了它。Turning Grille看起来就像一个普通的格栅(一块方形的硬纸板),分成小格子,其中一些格子被打孔。要使用转盘格栅,编码器先写第一组字母,然后把格栅旋转90度,再写第二组字母,依此类推,每个序列后都要旋转格栅。

0x03 取证中的六类隐写术

在所有的隐写术中,都是为了隐藏信息。这些技术可以被分离和分析以了解在整个过程中发生了什么。

隐写术的六大类是替代系统技术、变换域技术、扩频技术、统计方法技术、失真技术和覆盖生成技术。

替代系统技术

替换系统隐写术用秘密信息中的比特代替掩蔽物中多余或不需要的比特,一些可用的隐写工具使用最小有效位(LSB)方法对秘密消息进行编码
LSB在数字封面文件中,有大量的浪费或冗余空间,隐写术程序利用这个空间,并使用它在数字覆盖中隐藏另一条消息(在位级别上)

变换域技术

变换域技术也非常有效,变换域技术将消息数据隐藏在信号的变换空间中。每天人们在互联网上来回发送图片通常他们使用的是JPEG格式。JPEG的有趣之处在于它们在关闭时会自动压缩。为了实现这一点,他们必须清除多余的数据(多余的比特),否则会阻止他们进行压缩。在压缩过程中,JPEG会使其近似值变小,这种变化改变了空间,因此,它可以用来隐藏信息。

扩频技术

  • 直接序列
    在直接序列扩频频谱中,要传输的信息流被分成小块,每个小块分配到跨频谱的一个频率信道中,在传输点的数据信号与一个更高的数据速率位序列(也称为芯片代码)相结合,该序列根据扩展比划分数据。
  • 跳频
    跳频是指带宽频谱的一个宽幅被划分为许多可能的广播频率。跳频设备耗电少、价格便宜,但直接序列扩频系统的性能通常更好、更可靠。

统计方法

统计方法使用所谓的“1 bit 隐写方案”。这种方案只在数字载体中嵌入了一个比特的信息,从而产生了一个统计变化,即使它只是一个微小的变化。封面中的统计变化表示1,而未改变的封面表示0。这个系统的工作基于接收方区分修改和未修改封面的能力。

变形技术

隐写术的失真方法会改变掩蔽对象来隐藏信息。“当算法将更改或扭曲的封面与原始封面进行比较时,就可以恢复秘密消息。

覆盖生成方法

封面生成方法可能是六种类型中最独特的一种。cover生成方法实际上创建了一个cover,其唯一目的是隐藏信息。垃圾邮件模仿者是掩护生成方法的一个很好的例子。

0x04 隐写术的类型

语言隐写术

语言隐写术可以简单地描述为使用语言的任何形式的隐写术,但最基本的两个类别是开放码和文本符号。NICETEXT是一个利用语言隐写术的程序,目标是提供一个程序可以将密文(加密文本)转换成看起来像自然语言的文本,同时仍然提供原始密文的掩护,这类程序的另一个好处是它可以应用于许多不同的语言。

文本隐写术

文本符号用于对文本进行图形化修改,如字体间距和偏移。它们关注的是微小但却可见的细节。某些方法也可以在没有文本的情况下工作。这些被称为实数符号。

技术隐写术

技术隐写术的范围更广,因为它不一定要处理书面文字,即使它传递信息。技术隐写术是一种隐写方法,其中使用工具、设备或方法来隐藏信息。

嵌入式方法

数据隐藏的技术挑战是巨大的,主机文件中需要填充数据的漏洞,无论是统计上的还是感知上的,都有可能通过有损压缩来消除。成功隐藏数据的关键是找到不适合压缩算法利用的漏洞。

最低有效位

最低有效位(LSB)是隐写术的替代方法,其中二进制表示法中最右边的位(对二进制数据影响最小的位)被替换为嵌入消息中的一位。这种方法通过隐藏来提供安全性。

变换技术

在隐写术中嵌入消息时,可以使用三种主要类型的转换技术。它们是离散余弦变换(DCT)、离散傅里叶变换和小波变换,在变换过程中以各种方式将秘密数据嵌入到掩蔽物中。

0x05 隐写术在Misc中的常见类别

图片附加字符串隐写

常见的图片隐写例如在图片中附加字符串,或者在图片中嵌入其他图片、压缩包等文件的方式

首先我们看一下直接在图片中附加字符串,典型的题目例如BUGKU中的“这是一张单纯的图片”

1652023781752-9f7d1233-dc72-43f9-ae02-4a3651fe7f28

使用Winhex可以看到图片后加了一串字符串

1652023786682-c80f6eaa-2018-4aa3-a25c-db5dc576479e

之后通过Unicode—ascii解码即可

1652023790761-1945fdfc-5185-48a4-bba6-ebb347f9de5b

除了可以使用Winhex以外,使用strings也非常好用
打印文件中的可打印字符串,常用来在二进制文件中查找字符串,经常与grep配合使用

参数:

strings [ -a ] [ - ] [ -o ] [ -t Format ] [ -n Number ] [ -Number ] [ file  ]

-a --all:扫描整个文件而不是只扫描目标文件初始化和装载段
-f –print-file-name:在显示字符串前先显示文件名
-n –bytes=[number]:找到并且输出所有NUL终止符序列
- :设置显示的最少的字符数,默认是4个字符
-t --radix={o,d,x} :输出字符的位置,基于八进制,十进制或者十六进制
-o :类似--radix=o

图片文件结构隐写

文件都有不同的存储格式,例如PNG的文件头为:
0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A

正常的图片,头部的格式是固定的
一个有效的 PNG 图像必须包含一个 IHDR块、一个或多个IDAT块和一个 IEND块

IHDR包括:
Width: 4 bytes
Height: 4 bytes
Bit depth: 1 byte
Color type: 1 byte
Compression method: 1 byte
Filter method: 1 byte
Interlace method: 1 byte

IDAT图像数据:

  • 从图像布局中描述的图像扫描线开始;此原始数据的布局和总大小由IHDR的字段决定
  • 根据IHDR块指定的过滤方法过滤图像数据
  • 使用IHDR块 指定的压缩方法压缩过滤后的数据

BUGKU中的“隐写”题目是通过更改图片的高显示真是信息
在查看PNG文件格式时,IHDR后面的八个字节就是宽高的值

1652023804615-e34651d5-9213-4d9f-8013-e40e34cf312e

IHDR指图像头部块,包含图片的宽度、高度、位的深度和颜色类型

1652023809887-8571f59c-ebc9-40dc-afd2-0d77fac19d82

1652023815935-22b87bf3-5f98-40ec-8383-e48ced2ed053

修改后即可

1652023820037-0a36e4c5-48bd-414c-b366-a12a0e6cfc4b

图片中嵌入文件

图片式隐写是在图片中隐藏了zip、其他图片或文件,一般肉眼看图片的大小可以发现,检测的方法是用binwalk

1652058724492-01274dca-152d-48fb-aad5-b1c8bb3030a1

Address:https://cn.bing.com/images/search?view=detailV2&ccid=ztuLbJxQ&id=3B1F65A967A19CCD0293BA23892B6A6F664D41D9

binwalk中的参数
-e, --extract                自动提取已知的文件类型
-D, --dd=<type[:ext[:cmd]]>  提取<type>签名(正则表达式),给文件一个扩展名<ext>,然后执行<cmd>
-M, --matryoshka             递归扫描提取的文件
-d, --depth=<int>            限制matyoshka递归深度(默认值:8级深度)
-C, --directory=<str>        解压文件/文件夹到自定义目录(默认:当前工作目录)
-j, --size=<int>             限制每个提取文件的大小
-n, --count=<int>            限制提取文件的数量
-r, --rm                     解压后删除刻录的文件
-z, --carve                  从文件中提取数据,但不要执行提取实用程序
-V, --subdirs                提取到由偏移量命名的子目录中

图片类隐型经常会将一部分数据隐藏在一张图片中,判断思路可以,Jpg格式的文件在16进制中的表示是以 ff d9 两个字节结尾,可以通过判断末尾来判断是否为真正的图片文件,有时也可以通过文件的大小稍加判断

典型的MISC例如BUGKU的“隐写2”

1652023834043-f8f1beee-e9f1-4375-8e16-9e9c3f3d59b3

可以直接看到图片中隐藏着其他文件

图片中隐藏另一张图片可以使用经典的隐写工具Stegsolve

1652023839109-7750e282-fe5c-493b-b1f3-c77c3ead5827

1652023844037-2d687036-8722-47d0-9354-464924c3d78a

IDAT块

-因为IDAT块可能有多个,此处也可能通过IDAT块处出现隐写

有个可以使用的工具——pngcheck
http://www.libpng.org/pub/png/apps/pngcheck.html

1652023853459-cbe963c6-0475-46e7-b039-d5885cd515b3

pngcheck验证 PNG、JNG 和 MNG 文件的完整性(通过检查内部 32 位 CRC,也就是校验和,并解压缩图像数据);它可以选择以人类可读的形式转储图像中几乎所有的块级信息。例如,它可用于打印有关图像的基本统计信息(尺寸、位深度等);在其调色板中列出颜色和透明度信息(假设它有一个);或提取嵌入的文本注释。这是一个具有批处理功能的命令行程序。

给出的几个例子:

1652023859593-d53d8752-a339-4ebc-ba9a-0213efec3252

LSB隐写就是修改了像数中的最低的1bit,png图片是一种无损压缩的位图片形格式,png图片中的图像像数一般是由RGB三原色(红绿蓝)组成,每一种颜色占用8位,取值范围为0x00~0xFF,即有256种颜色,一共包含了256的3次方的颜色,即16777216种颜色

1652057933285-3bd7b42c-b6cc-4df1-9ecc-4ae108cf9831

Address:https://forensicsdigest.com/wp-content/uploads/2020/11/steg.png

而人类的眼睛可以区分约1000万种不同的颜色,这就意味着人类的眼睛无法区分余下的颜色大约有6777216种

1652023864528-31ac99c6-89bd-4327-84d5-5f8ddbdc7005

十进制的235表示的是绿色,我们修改了在二进制中的最低位,但是颜色看起来依旧没有变化,我们就可以修改最低位中的信息,实现信息的隐写

1652023869045-ce032c09-92aa-431f-af0d-67e52b4a1ef3

题目意思:
找出隐藏在我身上的那句话,否则我将不得不摧毁你。
“在为自由服务的过程中,任何牺牲都不算大。”

既然从根本开始做,那就假设我不知道这是谁,既然是引用那就是他说出的话,搜索一下

1652023874508-4ebe4753-f47a-4c5b-8be3-3de502626877

我们知道原来它叫 Optimus Prime
第一眼竟然认成了 Option Prime

分析一定与素数有关,并且是红色为底色,之前有一道题是提图片的HSB,既然是红色,那就分析像素的R为素数尝试一下

在搜索代码的时候发现已经有大佬写出了这个代码
地址:https://www.tuziang.com/index.php/combat/1985.html

from PIL import Image
from math import sqrt

def is_prime(n):
    if n==1:
        return False
    for i in range(2, int(sqrt(n) + 1)):
        if n % i == 0:
            return False
    return True
img = Image.open("op.png")
width = img.size[0]
height = img.size[1]

for x in range(width):
    for y in range(height):
        r,g,b = img.getpixel((x,y))
        if is_prime(r):
            continue
        else:
            img.putpixel((x,y),(255,255,255))

img.show()

1652023882030-a5af13db-bd04-4259-94a8-db08901f7971

1652023886818-4ce24517-bdaa-4b81-bf56-c6fda5ebcdb0

当然,经常参加CTF比赛的小伙伴也会发现,现在的隐写已不在像之前那么简单,甚至隐写只是题目的第一层最简单的关卡。这说明更多更有用的技术我们不仅要了解,还要更加深入的探究本质和灵活变通使用。

References:
https://books.google.com.hk/books?id=8hujhG574csC&pg=PA358&lpg=PA358&dq=Technical+Steganography&source=bl&ots=m6D1OaM1Mi&sig=ACfU3U1TKnrboxH6P2kazd7VE8MOmgGV7g&hl=zh-CN&sa=X&ved=2ahUKEwjcorXkj8_3AhUGAqYKHcTzDREQ6AF6BAggEAM#v=onepage&q=Technical%20Steganography&f=false
https://baijiahao.baidu.com/s?id=1717228438836637926&wfr=spider&for=pc
https://blog.csdn.net/weixin_39672443/article/details/110806799
https://blog.csdn.net/weixin_34075268/article/details/88744599
请登录后发表评论

    请登录后查看回复内容