0xffd8
和 0xffd9
)即从FFC0
后第三个字节开始,两个字节为高度,两个字节为宽度
上图为例015C
为图片高度,01A4
为图片宽度
- f5隐写(需要password)
- outguess(可需要password)
- steghide
- 图片备注藏信息
- 文件尾后藏信息(可用十六进制编辑器查看)
kali
中用 zsteg
命令可解# 假设文件名为 1.bmp
> zsteg 1.bmp
zsteg
安装:> gem install zsteg
常见隐写方式
png文件的16进制文件头格式为 89 50 4E 47 0D 0A 1A 0A
png文件结构分析:https://www.cnblogs.com/lidabo/p/3701197.html
可优先考虑为LSB隐写,可将图片用 stegsolve 打开后依次查看各个通道,有可能会在特定通道中出现二维码或其他图片
详解png的文件头:(以下图为例)
89 50 4E 47 0D 0A 1A 0A
为PNG的文件头00 00 00 0D
(即为十进制的13)代表数据块的长度为1349 48 44 52
(即为ASCII码的IHDR)是文件头数据块的标示(IDCH)- 前四个字节代表该图片的宽 `00 00 00 00`
- 后四个字节代表该图片的高 `00 00 02 F8`
- 最后五个字节依次为:Bit depth、ColorType、Compression method、Filter method、Interlace method `08 06 00 00 00`(可变)剩余四个字节为该PNG的CRC验证码,由从 IDCH 到 IDHR 的共17位字节进行crc计算得到
关于CRC值:将图片拖入kali中打开如果报错 IHDR: CRC error
,则有可能是图片的 宽度或高度不正确,如过高度不正确直接修改即可,如果宽度不正确则需要通过CRC值爆破得到正确的图片宽度,也有可能是 CRC值不正确,错误或正确CRC值隐藏着信息,可用 stegsolve 的 File Format 选项查看CRC值
附上一个可同时爆破宽高的脚本(python3)
import zlib
import struct
#读文件
file = '1.png'
fr = open(file,'rb').read()
data = bytearray(fr[12:29])
crc32key = eval(str(fr[29:33]).replace('\\x','').replace("b'",'0x').replace("'",''))
#crc32key = 0xCBD6DF8A #补上0x,copy hex value
#data = bytearray(b'\x49\x48\x44\x52\x00\x00\x01\xF4\x00\x00\x01\xF1\x08\x06\x00\x00\x00') #hex下copy grep hex
n = 4095 #理论上0xffffffff,但考虑到屏幕实际,0x0fff就差不多了
for w in range(n):#高和宽一起爆破
width = bytearray(struct.pack('>i', w))#q为8字节,i为4字节,h为2字节
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x+4] = width[x]
data[x+8] = height[x]
#print(data)
crc32result = zlib.crc32(data)
if crc32result == crc32key:
print(width,height)
#写文件
newpic = bytearray(fr)
for x in range(4):
newpic[x+16] = width[x]
newpic[x+20] = height[x]
fw = open(file+'.png','wb')#保存副本
fw.write(newpic)
fw.close
# return None
例题:WDCTF-FINALS-2017
上图可以看到该png的 IHDR 块中代表图片的宽的四个字节都为00,也就是说这道题我们需要通过修改图片的宽度来得到完整的图片,需要注意的是,图片宽度不能任意修改,而是需要根据 IHDR 块的 CRC 值爆破得到宽度,否则图片会显示错误无法打开,下面为爆破脚本:
import struct import binascii import os misc = open('misc4.png','rb').read() for i in range(1024): data = misc12:16 + struct.pack('>i',i) + misc20:29 #misc12:16是IDCH,misc20:29是IHDR中除去宽度四个字节的剩余部分 crc32 = binascii.crc32(data) & 0xffffffff if crc32 == 0x932f8a6b: print i
得到 i 的值为709,将宽度改为16进制的709(即 00 00 02 C5
)即可恢复图片得到flag
下载文件得到一张图片,用 010Editor 打开会报错:
可知在文件尾还有其他本不属于原图片的信息,查看可知在 IEND 块后隐藏有 BPG 的文件信息:
查找信息后发现 425047FB
也确实是BPG文件的文件头:
将 425047FB
以及之后的信息全部提取出来另存为bpg后缀的文件
在线网站查看即可:https://webencoder.libbpg.org/show.html
得到一串字符,base64解码即可得到flag:bsides_delhi{BPG_i5_b3tt3r_7h4n_JPG}
gif文件的文件头为 47 49 46 38
gif隐写可用stegsolve分别查看每一帧的内容,隐写方法也可能与时间轴或空间轴有关
由于gif的动态特性,由一帧一帧的图片构成,所以每一帧的图片,多帧图片间的结合,都成了隐藏信息的一种载体,对于空间轴隐写,我们可以将gif文件每一帧的图片分离开来,可以在kali中使用convert命令来实现: convert 1.gif out.png 在 1.gif 所在文件夹就会出现一系列 out.png 图片
gif文件的每一帧之间的时间间隔也可以作为信息隐藏的载体,可以用identify命令打印出gif每一帧的时间间隔: identify -format '%s %T \n' 1.gif 一般此种题在打印出时间间隔后,时间间隔会有明显的规律,比如: 0 10 1 20 2 20 3 20 4 10 5 10 6 10 7 10 8 10 9 20 10 20 ... 此种情况即可把时间间隔
20 & 10
转化为0 & 1
字符串(或1 & 0
)然后转化成 ASCII码 即可,此时建议使用以下命令,更为方便: identify -format '%T' 1.gif 10202020101010101020201010101020102020201010201010202020102010101010202010202020101020202010201010102020102020101010202010101020101020201020102010102020102020101010202010102010
sudo apt-get install imagemagick 测试是否安装成功: convert -version 如果出现下面的信息,则表示安装成功: Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org Copyright: © 1999-2019 ImageMagick Studio LLC License: https://imagemagick.org/script/license.php Features: Cipher DPC Modules OpenMP ...
个人总结的简单粗暴的做法:
① 导出http(按大小顺序排列找大的)
② 追踪TCP流
③ 查找 flag
相关字符串
00 00 00 20 66 74 79 70 4D 34 41 20 00 00 00 00
- 频谱图信息涂抹(audacity查看)
- 音频藏Morse码
- MP3stego
52 61 72 21 1A 07 01 00
52 61 72 21 1A 07 00
,文件尾为 C4 3D 7B 00 40 07 00
有关rar伪加密的题很少,几乎没有,但是rar伪加密也是可以实现的,而且与zip伪加密不同的是,rar伪加密无法直接用
binwalk
进行分离,下面讲一下rar伪加密的实现方式(ctfwiki里也有) 用010editor
打开rar文件,在模板中可以看到:
蓝色的那一行指的是rar文件的加密位,如果此rar文件没有被加密,那么这一行中的数字为0
,将其修改为1
(就是现在这样)即可达到rar伪加密的目的,在打开这个伪加密的文件时会显示文件头损坏,其中的内容也已被加密:
再将1
改为0
就可以正常打开文件了
50 4B 03 04
- 爆破password
- 伪加密(可直接尝试binwalk分离)
- 已知明文攻击
- crc爆破
crc32爆破通常用于爆破一些较小的加密文件(比如6字节以内),通过他们爆破字符计算crc值从而达到不用解压密码便可知道加密内容的目的
爆破脚本:https://github.com/theonlypwner/crc32
python crc32.py reverse [crc校验值] # 例:0xcc86365b
例题:攻防世界 crc
下载得到压缩包,其中含有四个加密文档,前三个都是特别小的文档,可以推测为crc爆破
用脚本爆破crc值:
得到解压密码:forum_91ctf_com_66
打开convert.txt,将其中的01序列转为字符串:
import libnum f=open('convert.txt','r') a=f.read() print libnum.b2s(a)
得到base64编码的图片,在线网站还原得到二维码,扫描得到flag:flag{owid0-o91hf-9iahg}
strings
命令查找 flag
有关字符(不分大小写)# 假设文件名为 2333
> strings 2333 | grep -i flag
如果一个文档中只有这四个数字,那么这种类型的题通常都是一个解法
首先我们先看这四个数字的共同点,将这四个数字转换成8位二进制后发现,只有最高两位二进制不同,所以我们可以写一个脚本将其提取出来并且4个一组转换为ASCII,脚本如下:
fp = open('t.txt','r')
a = fp.readlines()
p = []
for i in a:
p.append(int(i))
s = ''
for i in p:
if i == 63:
a = '00'
elif i == 127:
a = '01'
elif i == 191:
a = '10'
elif i == 255:
a = '11'
s += a
import binascii
flag = ''
for i in range(0,len(s),8):
flag += chr(int(s[i:i+8],2))
flag = binascii.unhexlify(flag)
wp = open('ans','wb')
wp.write(flag)
wp.close()
将得到的 ans 文件扔进winhex观察它的格式再确定它是什么类型的文件即可
NTFS交换数据流(Alternate DataStreams,简称ADS)是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流。通俗的理解,就是其它文件可以“寄宿”在某个文件身上。
在NTFS分区创建ADS数据流文件有两种形式:一是指定宿主文件;二是创建单独的ADS文件。
常用的创建命令有两个: echo 和 type ,echo 用于输入常规字符,type 则用于将文件寄生到目标文件
- 指定宿主文件
type 456.txt >> 123.txt:456.txt 查看txt文件时和echo相同: notepad 123.txt:456.txt 图片文件也可以利用type命令寄生到其他文件上 type flag.png >> 123.txt:flag.png 当查看寄生的文件为图片时,可用系统自带的mspaint查看: mspaint 123.txt:flag.png
type 456.txt >> :456.txt
此时 456.txt 文件寄生到其所在的文件夹,需要返回上层目录进行查看:
cd ../ notepad test:456.txt
寄生图片文件时:
type flag.jpg >> :flag.jpg
查看:
cd ../ #切换到上级目录 mspaint test:flag.jpg
- 指定宿主文件
这类情况可以使用一下命令来创建目标文件: echo 2333 > 1.txt:flag.txt 正常情况下无法查看到该文件,可以使用一下命令查看:(ctf常用) dir /r 文件内容则可以使用命令:(ctf常用) notepad 1.txt:flag.txt 进行查看和编辑:
此类文件可以通过直接删除宿主文件清除。
单独的ADS数据流文件
此类文件可以通过以下命令进行创建:
创建之后再目录下无文件,也没有依赖的宿主文件,并且此类文件在当前目录的命令行下是无法查看的,因为它是依赖于文件夹的ADS数据流文件:
因此需要退到上级目录进行查看:
cd ../ notepad test:misc.txt
此种文件可以通过删除其依附的文件夹来清除。
- [https://www.cnblogs.com/-mo-/p/12206603.html](https://www.cnblogs.com/-mo-/p/12206603.html) (较全面,包含webshell后门等)
- [https://www.cnblogs.com/nightnine/p/5170179.html](https://www.cnblogs.com/nightnine/p/5170179.html) (较详细)