freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CTF案例 | MISC隐写解题思路大杂烩讲解
2024-08-18 13:40:58

思路讲解

文章由Code4th安全团队内部的师傅[灰灰离开了]提供并授权发布

前言

在CTF的misc方向隐写是非常常见的题型,各种文件都可以隐写flag,不乏png,jpg,bmp,gif,word,ppt...等等

现将各类文件的隐写方式,解密方式原理以及工具进行阐述

注:以文件为分类进行阐述,相关工具在使用时讲解不集中演示

一、PNG

图片类题目通常会遇到修改文件后缀,使用010可以查看文件属性,这就需要我们了解各个文件的16进制数据(下文提到的博客有收录)

补文件头:

CTF的附件经常会遇到打开错误或者无法显示的情况,这时我们使用010 16进制编辑器打开,通常会发现文件头丢失,补全文件头即可正常打开。

常见文件头:

PNG
文件头 89 50 4E 47 0D 0A 1A 0A

文件尾 AE 42 60 82

JPEG
文件头 FF D8 FF

文件尾 FF D9

GIF
文件头 47 49 46 38 39(37) 61

文件尾 00 3B

BMP
文件头 42 4D

ZIP
文件头 50 4B 03 04

文件尾 50 4B 01 02 / 50 4B 05 06

RAR Archive (rar)

文件头:52 61 72 21

Wave (wav)

文件头:57 41 56 45

各类文件头收录见博客:CTF总结 - 灰灰离开了 - 博客园

010即010Editor,是一款16进制编辑器,可以查看和编辑文件的二进制数据,支持多种文件类型,各类文件格式支持高亮显示,010吾爱破解下载地址:


https://www.52pojie.cn/thread-1863194-1-1.html

010网址

https://www.sweetscape.com/010editor/

宽高隐写:

出题人会将图片的宽高修改,使解题人看不到flag,我们将宽高修复后得到完整图片就可以得到flag

这里我们讲解一下png文件结构

八个字节89 50 4E 47 0D 0A 1A 0A为png的文件头
四个字节00 00 00 0D(即为十进制的13)代表数据块的长度为13
四个字节49 48 44 52(即为ASCII码的IHDR)是文件头数据块的标示(IDCH)
13位数据块(IHDR)
前四个字节代表该图片的宽
后四个字节代表该图片的高
这里宽高是可以修改的,但是文件宽度不能任意修改,需要根据 IHDR 块的 CRC 值爆破得到宽度,否则图片显示错
误不能得到flag,不过在做题过程中发现可以小幅度修改尝试得到flag

这里提供一个网上找的脚本,小幅度修改:

import zlib
import struct
import argparse
import itertools

parser = argparse.ArgumentParser()
parser.add_argument("-f", type=str, default=None, required=True)
args = parser.parse_args()

bin_data = open(args.f, 'rb').read()
crc32key = zlib.crc32(bin_data[12:29]) # 计算crc
original_crc32 = int(bin_data[29:33].hex(), 16) # 原始crc

if crc32key == original_crc32: # 计算crc对比原始crc
print('宽高没有问题')
else:
input_ = input("宽高错误, 是否CRC爆破宽高? (Y/n):")
if input_ not in ["Y", "y", ""]:
exit()
else:
for i, j in itertools.product(range(4095), range(4095)):
data = bin_data[12:16] + struct.pack('>i', i) + struct.pack('>i', j) + bin_data[24:29]
crc32 = zlib.crc32(data)
if(crc32 == original_crc32):
print(f"\nCRC32: {hex(original_crc32)}")
print(f"宽度: {i}, hex: {hex(i)}")
print(f"高度: {j}, hex: {hex(j)}")
exit(0)

使用:

python xxx.py png文件

你也可以根据crc值手动修改

LSB隐写:

lsb隐写即 最低有效位隐写

是一种图片隐写

图片的储存方式:

如果将一幅图像放大,我们可以看到它是由一个个的小格子组成的,每个小格子就是一个色块。如果我们用不同的数字来表示不同的颜色,图像就可以表示为一个由数字组成的矩阵,这样就可以在计算机中存储。这个小格子就是像素,矩阵的行数与列数,就是分辨率。

实现原因:

因为人类的视觉冗余,对相近的像素的敏感度比较低。所以改变部分像素的值,肉眼察觉不到。

原理:

修改RGB颜色分量的最低二进制位也就是最低有效位(LSB),人类的眼睛不会注意到这前后的变化,每个像素可以携带3比特的信息,因此就可以隐写字符串信息。

LSB隐写脚本:

github大佬的:https://github.com/librauee/Steganalysis/tree/master/LSB

csdn别人修改的:LSB隐写(最低有效位隐写)-CSDN博客

实现演示:

原图

隐写后

可以看出没有任何变化,实则不然。

使用工具StegSolve 1.4 的data extract功能,它还有很多功能,查看文件信息,gif逐帧查看等,遇到了详细解释。

下载网址:发布 ·Giotino/stegsolve (github.com)

可以看到huihuilikaile字符串

这里推荐另一款工具 zsteg

下载地址:zed-0xff/zsteg:检测 PNG 和 BMP 中的隐性隐藏数据 (github.com)

使用:

zsteg -h 可以查看所有指令
最常用的:
zsteg cats.png # 简单检测
zsteg -a filename 检测所有通道lsb
zsteg -e b8,a,lsb,xy 文件.png -> out 提取某个通道的文件
注:还可以隐写图片,zip等文件,下面详细阐述

官方演示:

zlib
# zsteg ndh2k12_sp113.bmp -b 1 -o yx -v

b1,rgb,lsb,yx .. zlib: data="%PDF-1.4\n%\xC3\xA4\xC3\xBC\xC3\xB6\xC3\x9F\n2 0 obj\n<</Length 3 0 R/Filter/FlateDecode>>\nstream\nx\x9C\x8DT\xC9n\xDB@\f\xBD\xCFW\xF0\x1C \x13\x92\xB3\x03\x86\x80\xC8K\xD1\xDE\\\b\xE8\xA1...", offset=4, size=186
00000000: 00 02 eb 9b 78 9c d4 b9 65 54 24 cc 92 36 58 b8 |....x...eT$..6X.|
00000010: d3 68 e3 ee ee 4e e3 ee ee 0e 85 bb 3b dd 68 23 |.h...N......;.h#|
00000020: 8d bb bb bb 3b 8d bb bb 3b 34 ee 6e 1f ef 7b ef |....;...;4.n..{.|
00000030: 9d 3b b3 e7 cc 9e d9 3d df 9e dd cd 8a 1f 99 19 |.;.....=........|
00000040: 99 55 11 99 4f 58 25 99 82 88 18 1d 13 3d 2b 2c |.U..OX%......=+,|
00000050: 59 6f 7e 6f 7b 6f 63 6f 16 2c 33 21 23 a1 9d 91 |Yo~o{oco.,3!#...|
00000060: 25 2c 2f 2f 83 0c d0 d6 cc d9 9c 90 e5 73 46 89 |%,//.........sF.|
00000070: 41 cc c2 da 19 e8 c8 20 66 6d e8 0c 14 01 1a db |A...... fm......|
00000080: 99 00 f9 f8 60 9d 9c 1d 81 86 36 b0 ee e9 bf 54 |....`.....6....T|
00000090: 86 6d 57 05 e0 3b 26 d5 2f 71 09 51 63 eb c0 82 |.mW..;&./q.Qc...|
000000a0: bf 0f 49 4f 6f e8 40 ff c9 f9 43 25 1d 9e 6b 1b |..IOo.@...C%..k.|
000000b0: a3 73 fd 42 c4 a6 65 3d ef 0a 07 32 17 2d dc f9 |.s.B..e=...2.-..|
000000c0: 10 8c 0d 4b d7 9d e6 01 12 4f 11 6f f0 cd 64 f2 |...K.....O.o..d.|
000000d0: f2 19 5c df 76 eb 01 49 dc fd cd 76 65 a2 3a 8a |..\.v..I...ve.:.|
000000e0: fd bb 13 a9 e6 3a c9 da 19 34 ae f0 43 bb 90 90 |.....:...4..C...|
000000f0: 58 88 de 46 ce 91 6f aa 8d d9 7d b8 d6 88 a6 65 |X..F..o...}....e|

注释:

文件自带的附加信息也可能有flag,常见在jpg(jpg下面详细讲)

盲水印:

盲水印分单图和双图,不仅可以隐藏字符还可以隐藏二维码

网站:guofei9987/blind_watermark:Blind&Invisible Watermark ,图片盲水印,提取水印无须原图!(github.com)

双图:

遇到给两张看着一样的图片时,我们就可以尝试使用双图盲水印

原理&实现:

盲水印是一种肉眼不可见的水印方式,对图片资源使用图片盲水印或者文字水印,借此避免数字媒体未经授权的复制和拷贝,可通过对原图进行解码操作,得到水印图来证明版权归属。

图片进行离散余弦、小波或者傅里叶变换,得到图片的频谱信息,再将水印的编码信息叠加到图片的频谱上,然后再进行一次逆变换,生成的图片就带有几乎无法检测、但又可以确切还原出来的盲水印了。

工具:

BlindWaterMark 
github:https://github.com/chishaxie/BlindWaterMark#blindwatermark
使用:python bwm.py decode hui.png hui_with_wm.png wm_from_hui.png

这里不再演示,GitHub有官方的演示。

单图:

如果尝试各种方法无法得到flag,可以使用watermark工具尝试单图盲水印

注:网上有在线的解盲水印的网站,以及各种工具,非常好找不再阐述

附加文件隐写:

出题人会将zip,txt,png,jpg等文件放在附件里,我们使用010在末尾可以看到,可以手工提取,

将16进制数据复制再创建16进制文件粘贴保存即可,这些都在010实现。

这里推荐两个工具:

binwalk:

使用:
binwalk filename 查看是否有附件文件
binwalk -e filename 提取文件 它会自动生成文件夹并将提取的文件放入
使用时可能会遇到报错,使用以下指令:
binwalk -e filename --run-as=root

foremost:

使用:
foremost -o 文件夹名 filename -o表示输出文件夹 需要命名
它会将文件细分生成各个文件属性的文件夹还有日志

两种工具都可以提取文件,有时候两种都使用有奇效,可能一种提取不出来另一种可以

lsb通道也可能隐藏文件,使用工具查看lsb通道时可能出现pk png字符串,这就是zip和png的数据,这就需要我们熟悉文件的格式,多记多看

IDAT块隐写:

图像数据块 IDAT:它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。IDAT 块只有当上一个块充满时,才会继续一个新的块。

图片会插入坏的数据块或者另一张图片的数据块

我们可以使用工具检测

pngcheck png文件
PNGdebugger png

数据块的数据大幅改变是有问题的,可以尝试删除,提取操作,提取后根据实际情况做下一步操作,可能是flag的编码,也可能需要添加文件头,这里提一嘴,misc是真杂!

png的隐写差不多就这些,还有一些工具的隐写后面集中讲

二、Jpg/Jpeg

补文件头同png

lsb,附件文件同上

宽高:

jpg与png文件格式不同

FF C0为起始头 后面为数据长度精度高宽
FF C0
00 11 数据长度
08 精度
XX XX 高
XX XX 宽

可以手动增加宽高,网上工具也很多

exif:

Exif就是用来记录拍摄图像时的各种信息:图像信息(厂商,分辨率等),相机拍摄记录(ISO,白平衡,饱和度,锐度等),缩略图(缩略图宽度,高度等),gps(拍摄时的经度,纬度,高度)等,将这些信息按照JPEG文件标准放在图像文件头部。

出题人会将flag,passwd,key,hint放置在exif,只出现在jpg文件上。

我们可以使用win查看详细信息查看exif,亦可以使用工具在线网站

https://exif.tuchong.com/
linux: exiftool
win: 元数据编辑器

三、BMP

补文件头同png

42 4D为头数据 后面的四位为图片大小

图片结构详细参考下面图片地址:

1723959494_66c188c621db2d840b978.png!small?1723959506322

宽高:

也是与png一样找到数据位修改

四、GIF

补文件头同png

逐帧:

使用stegsolver可以逐帧查看,出题人会将flag,passwd,hint放在某几帧

GIF帧拼接

我们可能遇到很细的gif需要分离再拼接

convert glance.gif flag.png   #逐帧分割图片
montage flag*.png -tile x1 -geometry +0+0 flag.png #合并图片

帧信息:

flag可能隐藏在每帧的时间等信息里

我们可以使用工具identify:

identify -format "%T" flag.gif

可能会输出一串数字,将其分析解码得到flag,可能是2进制,8进制等等

图片类的到这里结束,提几个点:

flag也可能放在文件16进制中我们使用linux命令:
strings filename or cat filename
两张图片也可能是文件对比,使用010也可以实现

五、音频

拨号音:

听到拨号的声音,此类题目可以使用DTMF提取:https://github.com/ribt/dtmf-decoder

SSTV:

wav文件常出题型,一种无线电传图片的方式,没啥好说的,上工具

MMSSTV

e2eSoft

wav:

flag可能藏在频谱图或者波形图中,使用工具au或者Audacity查看,频谱图会展示文字(pass.key.flag),波形图主要是高低线,短粗线组成的,这类一般是二进制,转化成01后解密就行(在线二进制解码网站)

DIFF:

用工具Adobe Audition反相将得到的音频文件与原曲Diff,可以发现隐藏在其下面的隐藏音频

MP3:

工具mp3stego

使用:

# 隐藏信息
# —E 读取隐藏信息文件的内容,-P 设置密码
encode.exe -E hidden_text.txt -P pass svega.wav svega_stego.mp3
# 解密信息
decode.exe -X svega_stego.mp3 -P pass

音频类的差不多就这些还有些工具下面讲

六、txt隐写

txt主要是修改编码,零宽隐写

snow隐写:

snow 是一款在html嵌入隐写信息的软件,原理是通过在文本文件的末尾嵌入空格和制表位的方式嵌入隐藏信息,不同空格与制表位的组合代表不同的嵌入信息。
snow在ascii文本末尾隐藏数据,可以通过插入制表符和空格是数据在浏览器不可见

工具:

SNOW.exe -p password filename > outfile
http://darkside.com.au/snow/snwdos32.zip

七、word,ppt,excel

word。ppt文件隐写主要是改后缀作为zip打开,在里面的文件找flag,再者就是文字颜色修改,图片遮盖。

ppt使用ctrl+a有奇效,再者就是密码爆破,一般会提供字典(放在文件中使用strings命令)

里面通常还会加上零宽隐写,有很多在线网站


https://www.qqxiuzi.cn/bianma/yincangjiami.php

http://330k.github.io/misc_tools/unicode_steganography.html

excel主要是方块找规律,两种不同,变为01解2进制或者黑白块即为二维码。

八、pyc隐写:

Stegosaurus 是一款隐写工具,它允许我们在 Python 字节码文件( pyc 或 pyo )中嵌入任意 Payload。由于编码密度较低,因此我们嵌入 Payload 的过程既不会改变源代码的运行行为,也不会改变源文件的文件大小。

AngelKitty/stegosaurus: A steganography tool for embedding payloads within Python bytecode. (github.com)

建议在linux中使用

九、隐写工具

oursecret
这工具很强大,什么文件都能用来隐藏,完全没有限制

Outguess
支持3种用来隐藏信息的文件格式: PPM(Portable Pixel Map)、PNM(Portable Any Map)、jpg,需要密码
下载地址:https://github.com/resurrecting-open-source-projects/outguess

steghide
steghide可以在图片和音频文件中隐藏各种数据,windows和linux系统都支持
支持jpg、bmp,不支持png,密码可选
https://github.com/StefanoDeVuono/steghide

F5隐写是java编写的隐写工具,支持bmp、gif、jpg图像文件,需要密码
github地址: https://github.com/matthewgao/F5-steganography

stegdetect
stegdetect 用于检测图片隐写方式
https://github.com/abeluck/stegdetect

SilentEye
https://github.com/achorein/silenteye/
将信息隐藏到图像和声音中 (LSB):JPEG、BMP、WAVE
加密数据:AES128、AES256

DeepSound
带key的wav,可以使用deepsound2john爆破密码
https://github.com/openwall/john/blob/bleeding-jumbo/run/deepsound2john.py

linux:
fls disk-imag 查看文件内容
extundelete disk-image --restore-all 文件恢复 chomd 777 flag 给权限 ./flag 运行得到flag
bftools decode braincopter 1.png > 1.txt
bftools run 1.txt

一些好用的集成工具:

一个工具网站:CTF站点导航 | 猫捉鱼铃 (mzy0.com)

ToolsFx
基于kotlin+tornadoFx的跨平台密码学工具箱.包含编解码,编码转换,加解密, 哈希,MAC,签名,大数运算,压缩,二维码功能,ctf等实用功能,支持插件
作者github:https://github.com/Leon406

TaowaTools
snow+stegohide+jsteg+ LSB steganogprahy+提取流量包指定列
https://ctf.mzy0.com/app/348.html

十、写在最后

杂项杂又杂,隐写无处不在。只有你想不到,没有misc做不到

# CTF # 隐写术 # misc # 隐写 # CTF知识
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录