优秀的人,不是不合群,而是他们合群的人里面没有你
解题大纲
- 右键查看属性,打开查看信心和exiftools查看详细数据
- 在010里面搜索flag,ctf字样查询线索
- 文件分离
- setgslove和zsteg梭哈一下
- 文件长度宽度被修改
- 独特的加密工具,比如f5,outguess,steghide
常规套路与文件分离
- 直接 cat + file 查看,有时候属性不一定显示,用exiftool查看图片属性
- 文件属性
- 直接丢winhex搜索flag,ctf字样,当心flag可能用栅栏密码或者摩斯密码或者凯撒密码进行加密过,也有可能是二进制,三进制,八进制等等的代码块,一定要看看,要留心。
- 直接查看文件头,如果不认识丢百度搜索一下
- 如果内容是很明显的16进制编码的数据,可以直接丢CyberChef,自动解码爽歪歪!
- 有时候可能是base64加密过的图片数据,直接用随波逐流工具箱或者CyberChef一键寄出来了!
- binwalk有时候不一定分离出来
- 适当的使用foremost
- 上面两个是重点,分离出来的图片,就算没有文件名后缀,也可以拉进010里面查看数据!!!!
- 如果用binwalk发现有多个文件,但是使用命令信息显示但是没有生成分离文件夹,而且foremost也没卵用,就换命令强制使用binwalk -e misc14.jpg -D=jpeg 然后把生成分离出来的图片修改后缀.jpg直接查看,凡是不认识或无法识别的文件均可以使用binwalk检测
实在不行就上dd,命令:dd if=输入文件名 bs=1同时设置读写块的大小为 bytes skip=开始分离的字节数,从输入文件开头跳过 blocks 个块后再开始复制 of=输出文件名,比如:需要将获得的文件去除前 364 个字节:
dd if=s1 bs=1 skip=364 of=d1
或者binwalk发现文件后,看到显示的行数,直接用dd分离
dd if=ada.jpg of=ada.zip skip=218773 bs=1
图片内容修改隐写
- 直接右键查看属性
- 用honeyview查看图片,然后exif查看详细信息,注意提防一些纯数字字母可能就是加密过的
- 图片直接导入随波逐流工具箱,如果有修改自动恢复,PuzzleSolver里面自带的bmp修复和png修复更加好用
- 看属性详细信息,看图片,kali exiftool+txxx.jpg,010editor或winhex或notepad++打开看有无特殊信息,然后搜索ctf、CTF、flag、key等关键字
- 可以使用在线的exif工具,网址:https://exif.tuchong.com/
图片开头结束标志修复
检查图像的开头标志和结束标志是否正确,若不正确修改图像标志恢复图像,打开查看是否有flag或ctf信息,(往往gif属于动图,需要分帧查看各帧图像组合所得数据 若不是直接的ctf或flag信息 需要考虑将其解码),使用winhex修复即可
图片文件头
JPEG (jpg) 文件头:FF D8 FF 文件尾:FF D9
PNG (png),文件头:89504E47
Windows Bitmap (bmp), 文件头:424D 文件尾:
GIF (gif),文件头:47494638
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
Adobe Acrobat (pdf),文件头:255044462D312E
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
TIFF (tif), 文件头:49492A00 文件尾:
以上连续背8位即可,因为有些题可能是补充文件头齐全。
lsb隐写
LSB 隐写,也就是最低有效位 (Least Significant Bit)。图片中的像数一般是由三原色组
成,由这三种原色可以组成其他各种颜色,例如在 PNG 图片的储存中,每个颜色会有 8bit,
LSB 隐写就是修改了像数中的最低的 1bit,写入加密信息,而人眼无法注意到前后的变化
lsb隐写主要有3个考点,第一个就是不同通道左右看看有没有啥敏感的,第二个就是data分析看看有没有敏感的,第三个也是重要的,lsb隐写可以需要密码,这个时候用随波逐流工具箱自带的工具搜索lsb,输入密码试一试
修改像素三原色,R红G绿B蓝中最低一位的bit达到隐写效果,使用stegsolve逐帧的查看即可。
如果修改数据比较多,得用分析数据,一般使用stegsolve逐个提取数据分析,步骤:打开第一张图片依次点击下一章,下一章,看哪一张图片数据不对,比如下图
这里明细多了一条杠出来
这里没有杠,说明Green的2可能有问题,然后提取数据的时候勾选上这个。然后尝试全部,记录下,然后在column和table以及msb和lsb还有按照颜色排序rgb,bgr这种6个都试一下,都试一试。
多次测试,有时候会把别的文件的代码块显示出来,比如pk开头的就是zip文件,save bin保存为xxx.zip就行,还有发现是png这种,也是同样的道理,保存下来
偶尔也有奇葩的问题,比如全部通道都可能有数据,就是0-7全选试试看
还可以在kali下更加简单的安装使用zsteg,关键是有些时候zsteg不一定出的来结果….zsteg可以检测PNG和BMP图片里的隐写数据(lsb隐写、zlib、openstego等),一般来讲用 zsteg 解密的文件都为 bmp 文件,简而言之,用来检测PNG和BMP中隐藏数据的工具,可以快速提取隐藏信息
kali自带zsteg,可以用这个指令使用
gem install zsteg
直接使用命令:
zsteg xxx.png
可以发现不同色道隐藏文件
用这个命令提取
zsteg 1.png -E b1,r,lsb,xy > 1.zip
然后是其他的用法
zsteg -a xxx.png 查看所有通道下的文件
检测zlib,注意:-b的位数是从1开始的
zsteg zlib.bmp -b 1 -o xy -v
如果zsteg出现栈报错
tack level too deep (SystemStackError)”,
可以将命令改成
“zsteg --msb 瞅啥.bmp”或“zsteg -o xY 1.bmp”,
改变扫描顺序。
-o 是设置行列的读取顺序 --msb:most significant BIT comes first,最高有效位排在第一位
图片加密隐写
- 使用stegdetect查看知道那种隐写方式,这个玩意主要用于jpeg,主要可以检测jsteg,jphide,outguess,invisible ,f5,appendx,gamouflag这些隐写工具隐藏的信息
stegdetect使用时将要识别的图片放到与stegdetect同一文件下
stegdetect.exe -t jopi -s 10 图片名
stegdetect.exe -t jopi -s 100 图片名
-t 检测加密方式
-s 敏感登记吧,越大越好
下面的例子。加密方式直接就出来了,隐写需要使用jphs工具,直接用jphs这个工具,选择图片,然后点seek,密码为空(前提是没有密码),保存为1.txt,直接打开就有flag。如果有密码,还需要用stegdetect进行密码爆破
stegbreak.exe -r rules.ini -f password.txt -r p 图片名
结果:jphide[v5](123456)中的123456即为密码
- OutGuess加密隐写
OutGuess 是一款强大的通用隐写工具,它能将隐藏的信息嵌入到数据源的冗余位中,无论数据源的性质如何。该项目的主要焦点是在PPM(便携式像素映射)、PNM(便携式任意映射)和JPEG图像格式上,但理论上可以扩展以支持任何类型的数据,只需提供相应的处理程序。
outguess的使用方法:
加密:
outguess -k “my secret key” -d hidden.txt demo.jpg out.jpg
加密之后,demo.jpg会覆盖out.jpg,
hidden.txt中的内容是要隐藏的东西
解密:
outguess -k 123456 -r 4.jpg hidden.txt
解密之后,解密内容放在hidden.txt中
- steghide加密隐写
这个不仅仅隐写图片,好多文件都能用,我在另一篇文章有写,这里集合在一起吧
这玩意可恶,我在win下用报错,只能在linux用
Steghide是一款开源的隐写术软件,它可以让你在一张图片或者音频文件中隐藏你的秘密信息,而且你不会注意到图片或音频文件发生了任何的改变。
使用steghide来分离文件:
steghide extract -sf xxxx.jpg
运用如上命令,然后输入设置方设置的密码就可以得到隐藏文件
也可以直接使用命令
steghide extract -sf xxxxxx.jpg -p 123456
#-sf 参数
#test.jpg 图片名称
#-p 密码参数,后面空格跟密码,无密码可不加参数,回车就好
或者使用交互式来解密
steghide info xxx.jpg
然后还有一个爆破脚本,在主文章中。
setgseek作为Steghide项目的分支进行开发,因此该工具的运行速度非常快,要比其他破解工具快好几千倍
Stegseek最关键的功能就是基于字典的密码破解,参考命令如下:
stegseek [stegofile.jpg] [wordlist.txt]
安装方法和使用方法
─# wget https://github.com/RickdeJager/stegseek/releases/download/v0.6/stegseek_0.6-1.deb
┌──(root㉿kali)-[/home/ailx10/002]
└─# apt install ./stegseek_0.6-1.deb
┌──(root㉿kali)-[/home/ailx10/002]
└─# stegseek doubletrouble.jpg /usr/share/wordlists/rockyou.txt
- Image Steganography加密隐写
这个就是个工具,挺有意思的,要根据题目的提示,玩意有这个相关提示,就用这个试一下哈
把图片放进去后,选择解密在文本框里就会得到flag,记得选择decode
网上有个在线网址,试一试看看
http://www.atoolbox.net/Tool.php?Id=699
- wbStego4open加密隐写
BMP、TXT、HTM和PDF文件中都有可能用这狗屎加密
这个逼玩意是需要密码的,如果你得到了一个密码,可以试一试这个吊玩意。
图片结构修改隐写
图片的文件结构被修改,具体如下:
直接用案例说明。
右击属性可以看到目前像素是900 x 153=137700,
丢到010里面,显示675056字节,除去文件头文件尾部56个字节,文件就是675000字节,
用010editor查看文件,点击信息块,发现大小为675000字节,除以3(代表3个颜色),得225000。像素是225000,但是根据显示出来的数据,计算的数据是137700,所以对不上,那么就要修改高度或者长度。
用225000除以高度900,得到宽度为250,再次提醒下,修改高度的地址在这里
图片高度被修改
遇到这种题,直接丢进随波逐流工具箱梭哈一把,然后会自动修复高度。
修改图片高度png改IHDR、jpg改ffc2(16进制搜索)三个字节后的数据,也可以用010里面编辑,修改图片高度,使用010在这个位置
另外,tweakpng.exe打开图片提示IDHRcyc错误,表示文件尺寸被修改,且未修改crc值
根据提示,用010修改成对应的
像这种题,自动修复后,要你把真实高度添加进去,虽然已经修复得到了真实的高度,但是还是要按照题目要求把真实高度添加进去。
可以看到高度是606,那么根据提示要hex,直接将606从十进制转16进制,得到结果25e,把这个25e加进去提交。注意是十进制转16进制,不是hex加密
有时候在模板可以看到图片的大小
根据提示图片的宽度没问题,那么计算高度就是
487202/3/150=1082.66
直接修改高度咯看看
直接修改高度修改秒杀方法
在不知道没计算出真实高度长度情况下,使用010里面的模板,到菜单栏-模板-image-jpg里找,打开后下面有struct sofx那一栏点开,有word y_image,就是高度,直接随便改大,这个不会改坏图片。改完就有了,别的一样直接修改试一试看。
PuzzleSolver里面有现成的
gif图片高度问题
gif图片高度有很多个!!!一帧就有一张图,然后每一帧都修改高度后,在厕所,用010打开,找找看,需要修改高度在这个地方
最上面还有一个
PNG图片题目
- exiftools
如上
- 修改高度
直接一把锁哈
png有自己独特的图片结构
1、开头的0~7八个字节为png的文件头:89 50 4E 47 0D 0A 1A 0A (固定格式)
2、8~11四个字节:00 00 00 0D 表示头部数据块的长度为13(固定格式)
3、12~15四个字节:49 48 44 52 表示文件头数据块的标示(固定格式)
4、16~19四个字节:00 00 03 84表示图片的宽(不固定)
5、20~23四个字节:00 00 00 96表示图片的高(不固定)
6、24~28五个字节:08 02 00 00 00表示Bit depth(图像深度)、ColorType(颜色类型)、 Compression method(压缩方法)、 Filter method(滤波器方法)、Interlace method(隔行扫描方法)这五个字节不固定,均为可变数据
7、29~32四个字节:76 EC 1E 40为图片的crc校验值由从第12个字节到第28个字节的十七位字节进行crc计算得到
说白了主要就四个重要的数据块
他的主要特点在于,IHDR控制的是图像显示大小,不是图像真实大小,如果修改IHDR的值,那么可以控制只显示一半出来,从而达到隐藏数据的目的。
然后在对他的hex查看
这图的宽有效值是0030,把hex转换成10进制,就是48
这就对上了
- 如果是直接修改IHDR高度问题
首先看看分辨率是不是常规范围,直接修改长宽高看看有没有信息,在上面文章有写。
- 如果是crc校验的问题
这种题目有固定套路,第一步计算拿到这类的题目之后,首先要验证图片的crc值是否正确。打开在线网站:http://www.ip33.com/crc.html
输入第12到第28共十七位字节,参数模型选择crc32,点击计算,得到图片crc校验值
按照这个格式输入进入
校验值为09 DA D1 61,与图片校验值76 EC 1E 40不等,说明该图片crc校验有问题。一般是由于高度或者宽度所引起的,这里需要用到脚本对其宽高进行爆破。
import binascii
import struct
crcbp = open("misc25.png", "rb").read() #打开图片
crc32frombp = int(crcbp[29:33].hex(),16) #读取图片中的CRC校验值
print(crc32frombp)
for i in range(4000): #宽度1-4000进行枚举
for j in range(4000): #高度1-4000进行枚举
data = crcbp[12:16] + \
struct.pack('>i', i)+struct.pack('>i', j)+crcbp[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
# print(crc32)
if(crc32 == crc32frombp): #计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定
print(i, j)
print('hex:', hex(i), hex(j))
exit(0)
爆破不出来试一试python2这个脚本
#coding = utf-8
import os
import binascii
import struct
misc = open("flag.png","rb").read()
for i in range(1024):
data = misc[12:16] + struct.pack('>i',i)+ misc[20:29]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == 0x84B2E9CE: #CRC
print i
- 通过stegslove查看不同色道看看有没有数据
- stegslove最低位数据提取
- 图片添加多个数据块
当图片文件头正确,但是无法打开(有时候也可以打开),或者没有其他办法了,可以考虑此工具
此工具可以编辑查看PNG图片数据块,通过删除色素块的方法来更正图片
IDAT隐写
用Tweakpng.exe如果发现有多个IDAT可以用weak逐个删除,保存,查看能不能正常显示
当然tweakpng还可以合并idat数据块!!!在这里,edit-combine all iDAt点击,然后使用binwalk看看有没有多的数据。
gif图片题目
- 空间域,动图分开成一张一张图
- 时间域,动图的时间间隔提取出来
也可能修改高度,注意gif修改高度的话,如果有三个图画,那就三个位置都需要修改。
bmp图片题目
会用到wbStego4open是一个隐写开源工具,它支持Windows和Linux平台,可以使用wbStego4open把文件隐藏到BMP、TXT、HTM和PDF文件中,而且不会被看出破绽。
这玩意pdf也用的到
遇到修改高度的问题,计算一下高度就行,然后再010里面修改
还能用PuzzleSolver一键修复高度
jpg图片题目
- exiftool隐写
打开看看就知道咯
- 文件头尾,中间部位插数据
有些时候不会直接把flag写在末尾,但是搜索flag不一定都得到,因为可能加密,那么就记录一下jpg常见的图片快信息,在十六进制搜索
FFE0 标记号
FFDB 定义量化
FFC0 帧图像开始
FFC4 哈夫曼表
FFDA 扫描开始
可以搜索相关字节,看看前后有没有写入敏感数据
- 算法题,F5,outguess之类的
文件码倒转
通过打开winhex或者0.0发现,文件码是全部到转过来,比如正常应该行pkxxxxx,结果变成了xxxxkp,这个要本人对文件头很名贵,一眼就能看出,下面有个脚本,将他正过来
import re
import binascii
def read_file(filepath):
with open(filepath,'rb') as fp:
content=fp.read();
return content
#以二进制读取图片,并转为16进制
a = read_file('n.png')
hexstr = str(binascii.b2a_hex(a))
hexstr = re.findall("b'(.*?)'",hexstr)[0]
#每俩位分割成列表元素
result = []
result.append(re.findall(r'.{2}', hexstr))
result = result[0]
#按倒序排列,拼接列表为文本
daoxu = result[::-1]
hex= ''
for i in daoxu:
hex +=i
with open('PNG写正.txt', 'w') as f:
for i in hex:
f.write(i )
把结果导入010后,检查一下文件头没问题,有问题微调一下
还可以直接把文件导入CyberChef,然后左边搜索reverse,点击以下魔法棒有惊喜~~
两张一样的图片
异或算法
用setgslove打开最下面的图片对比,image compile,打开两个图片,然后依次左右点击,看看有没有什么信息。
注意!信息不仅仅在一个通道,三个通道都要点进去看看,and,or,xor
或者用随波工具箱-图片-有三种算法比较。
还有就是单纯的对比文件差异,用010-工具-比较文件-选择另一个文件-点击下方比较
盲水印
如果给了两张一样的图,除了大小其他都一样,就是盲水印解题思路,使用脚本
BlindWaterMark-master
下面有用法说明,注意python23区别,或者直接用PuzzleSolver集成工具,批量测试图片盲水印和视频域盲水印一共四种!
注意:单张图片也可能存在盲水印,用52工具打开
二维码扫描
网址在线版:
https://ntool.chinaz.com/tools/qrCode
工具也有现成的QCR
有时候扫描不出来二维码,就用工具箱反转一下颜色!或者右键编辑图片,全选,右键反色,保存!
补充一个常识性问题,二维码的左上角,右上角,左下角三个方块是定位用的,长的是一样,你可以自己给他画上去补充那个角
然后如果有一大堆的黑白图片,考虑是二维码拼接,用随波逐流工具,拖进去第一张图片,然后直接点击图片-图片方形合并。
python扫描二维码代码,首先安装必要的库
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pyzbar -i https://pypi.tuna.tsinghua.edu.cn/simple
使用代码
import cv2
qrcode_filename = "1.png"
qrcode_image = cv2.imread(qrcode_filename)
qrCodeDetector = cv2.QRCodeDetector()
data, bbox, straight_qrcode = qrCodeDetector.detectAndDecode(qrcode_image)
print(data)
或者用这个
import cv2
from pyzbar.pyzbar import decode
# 读取图片
image = cv2.imread('1.png')
# 使用pyzbar解码图像中的二维码
decoded_objects = decode(image)
# 遍历所有找到的二维码
for obj in decoded_objects:
# 提取二维码的矩形边界框
barcode_data = obj.data.decode('utf-8')
points = obj.polygon
# 在图像上绘制矩形边界框
for i in range(len(points)):
if i == len(points) - 1:
cv2.line(image, points[i], points[0], (0, 255, 0), 3)
else:
cv2.line(image, points[i], points[i+1], (0, 255, 0), 3)
# 显示识别的二维码数据
print(barcode_data)
# 显示图像
cv2.imshow('Image with QR code', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果找到的二维码是拼凑在一起的长这样
可以用脚本切割白边
from PIL import Image
img=Image.open('solved.bmp')
box=(50,50,675,675)
im_crop=img.crop(box)
im_crop.save('1.bmp')
然后使用脚本分割成单独的图片~
from PIL import Image
filename = '1.bmp'
img = Image.open(filename)
n=0
for i in range(25):
for j in range(25):
region = img.crop((25 * j, 25 * i, 25 * (j + 1), 25 * (i + 1))).resize((500, 500), Image.ANTIALIAS)#分割时要放缩才能处理利用pyzbar处理
out='%d.png'%(n)
region.save(out)
n+=1
注意pillow版本要是9.5.0
然后批量扫描二维码
import pyzbar.pyzbar as pyzbar
from PIL import Image
for i in range(0,625):
str_image = str(pyzbar.decode(Image.open('%d.png'%i))[0].data.decode())
if 'flag' in str_image:
print(str_image)