CTF文件隐写总结之图片

本文已参与「新人创作礼」活动,一起开启掘金创作之路

前置知识

  • file 命令根据文件头,识别文件类型,如果文件头前边有数据就识别不出来了* strings 输出文件中的可打印字符可以发现一些提示信息或者特殊编码的信息可以配合-o参数获取所有的ASCII字符偏移(字符串的位置)* binwalk命令根据文件头识别文件-e提取文件* foremost命令提取文件,建议两个分离命令都试一遍* 各种文件头本地搜索:文件头压缩包

基本思路

1.尽量用winrar避免异常
2.看属性
3.伪加密
4.暴力破解
5.明文攻击
6.crc32碰撞
7.多个压缩文件合并 cat 文件名(按需) > 保存文件名

文件结构

[记录文件头 + 文件结构 + 数据描述符] {此处可重复多次} + 核心目录 + 目录结束标识

暴力破解密码

仅适用于密码长度小于等于6位的,大于6位时间会非常的长

直接用apchpr爆破

zip伪加密

原理:

记录文件头以及核心目录区存在一个通用位标记(General purpose bit flag)的两个字节,不同的比特位有着不同的涵义

无加密:
压缩源文件数据区(ushort frFlags)的全局加密应当为 00 00,
且压缩源文件目录区的全局方式标记(ushort deFlags)应当为00 00

伪加密
压缩源文件数据区的全局加密应当为 00 00
且压缩文件目录区的全局方式标记应当为 09 00

真加密
压缩源文件数据区的全局加密应当为 09 00
且压缩源文件目录区的全局方式应当为 09 00 

修复工具:

  • winrar修复(也可以修复其他的修改内容) 工具->修复* binwalk foremost无视伪加密* ZipCenOp.jar(win)找到所在文件夹,在地址栏输入cmdjava -jar ZipCenOp.jar r 文件名 ### CRC32碰撞

原理:

压缩包的crc32的值是未加密状态计算来的 

如果文件内容很少(4字节左右)加密的密码却很长,可以使用crc32爆破获取原文件的内容

脚本F:\CTF\CTF工具合集\脚本\CRC32碰撞\crc32-linux.py

明文攻击

基本条件

  • 一个加密的压缩包文件
  • 已知压缩文件的压缩工具,如winrar,7z
  • 已知压缩工具的版本
  • 已知压缩包文件中部分连续的内容,至少12字节,任意文件

方法

1.将明文文件压缩成压缩包
2.确认两者的压缩方式相同,即对比压缩之后的crc32值
3.使用apchpr进行明文攻击

tips:

在攻击过程中密钥框如果有字符了就可以停止攻击,点击右侧使用已知密钥解密按钮

docx

包含xml文件的zip压缩包

可能隐藏文件,信息在压缩包里,在word中看不到

可以将docx后缀改为zip

图片

图片内容、图片分析、图片拼接、图片修复、EXIF、LSB

基本思路

1.看属性详细信息可以使用exiftool(linux)或者 identify 查看2.010editor或winhex或notepad++打开看有无特殊信息,然后搜索ctf、CTF、flag、key等关键字string、file命令(kali)strings test | grep -i flag file 1.txt 3.检查图像的开头标志和结束标志是否正确,若不正确修改图像标志恢复图像,打开查看是否有flag或ctf信息,(往往gif属于动图,需要分帧查看各帧图像组合所得数据 若不是直接的ctf或flag信息 需要考虑将其解码)4.stegslove或者binwalk/foremost分离文件注意:foremost、binwalk会根据IEND块提取png文件,IEND块后的内容会被忽略,提取不出来,可以隐藏信息5.修改高度png改IHDR、jpg改ffc2(16进制搜索)三个字节后的数据6.根据对应格式使用响应隐写检测工具7.看图片有无异常 盲水印 、f5、Lsb、guess、stegpy、steg、jphide、stegdetect### JPG

  • 特征文件头标识(2 bytes):FF D8文件结束标识(2 bytes):FF D9* #### Lsb* #### IDAT隐写1.使用pngcheck分析 pngcheck.exe -v file

2.判断异常IDAT串,使用winhex等工具创建新文件
3.根据创建后的新文件继续分析

  • 修改高度jpg改ffc2(16进制搜索)三个字节后的数据* stegdetect (win)先用这个工具检测隐写,然后再用下边的工具提取(检查jpg图片隐写方法,Stegdetect可以检测到通过JSteg、JPHide、OutGuess、Invisible Secrets、F5、appendX和Camouflage等这些隐写工具隐藏的信息)将图片复制到 stegdetect.exe 所在文件夹,打开 cmd 输入:stegdetect.exe -tjopi -s 10.0 [stego_file]-s 修改检测算法的敏感度,该值的默认值为1。检测结果的匹配度与检测算法的敏感度成正比,算法敏感度的值越大,检测出的可疑文件包含敏感信息的可能性越大。-t 设置要检测哪些隐写工具(默认检测jopi),可设置的选项如下: j检测图像中的信息是否是用jsteg嵌入的。o 检测图像中的信息是否是用outguess嵌入的。p 检测图像中的信息是否是用jphide嵌入的。i 检测图像中的信息是否是用invisible secrets嵌入的 jphide用于提取 jpg 隐写的信息图形化操作,使用工具打开文件,点击工具栏的 seek 按钮,输入密码,点击 ok 保存为 txt 文件<img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1f8f603052994aa28b6dd11445daa44c~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image) steghide(win)查看图片中嵌入的文件信息:steghide info out.jpg 提取含有密码的隐藏内容:steghide extract -sf out.jpg -p 123456 提取不含有密码的隐藏内容:steghide extract -sf out.jpg steghide爆破密码有些题目用steghide加密文件但是不给密码,此时就需要爆破,steghide本身并不支持爆破,需要一些其他的方法: github.com/Va5c0/Stegh…steg_brute.py -b -d [字典] -f [jpg_file] 需要安装的库:progressbarpip install progressbar2 * F5(矩阵编码)(F5隐写,需要passwd)在kail下切换到F5-steganography,在java Extract运行命令:java Extract 123456.jpg图片的绝对地址 -p 123456 * outguess(基于频率变换)(kali图片隐写**+可需要可不要passwdoutguess -r /root/angrybird.jpg(绝对路径) 123.txt(信息存放的文本)outguess -k 12345 -r 2.jpg out.txt -k后接密码 -r后接解密图片 输出文件 win下F:\CTF\CTF工具合集\隐写\图像隐写\F5\f5-steganography\tests需要密码:java -jar f5.jar e -e msg.txt -p mypasswd -q 70 in.jpg out.jpg不需要密码:java -jar f5.jar x -e out.txt pic.jpg### PN" style=“margin: auto” />
  • 特征文件头标识(8 bytes):89 50 4E 47 0D 0A 1A 0A文件结束:00 00 00 00 49 45 4E 44 AE 42 60 82* 格式1.IHDR:Header Chunkpng 数据流中第一个数据块一个 png 数据流中只能有一个文件头数据块2.png 格式内有很多 IDAT 数据块,每个数据块都是 zlib 格式压缩的,第一块 IDAT 数据块,有一个 zlib 格式的标志如:789cidat 块只有当上一个块充满时,才会继续下一个新的块,一个图片只有一个 789c 标志* 修改高度010 editortweakpng.exe打开图片提示IDHRcyc错误,表示文件尺寸被修改,且未修改crc值* LSB隐写在通道的最低位隐藏数据适用于 png 文件(无损压缩)和 pmb 文件(无压缩)工具:stegsolve 和 zstegstegsolve 提取 lsb 数据选择 extract preview,bit plane order 可以多试试,其他固定即可<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6db4d68b899f49fa98fa51f8e1d1adf0~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)* #### XOR1.binwalk分析出两张图片2.用stegslove打开选择image combiner 选择XOR3.根据XOR后的结果继续分析* zsteg(kali)zsteg可以检测PNG和BMP图片里的隐写数据(lsb隐写、zlib、openstego等),一般来讲用 zsteg 解密的文件都为 bmp 文件zsteg 图片名 发现隐藏的数据,位置处于extradata:0将数据提取出来:zsteg -E "extradata:0" /home/volcano/桌面/misc17.png > 1.txt然后再binwalk -e把1.txt中的数据分离出来,拿到flag* **BlindWaterMark (盲水印,kali)第一种 正常的bwm 打开 bwm.py项目地址)所在文件夹,在文件夹中打开终端# 1.png 为无水印原图# 2.png 为有盲水印的图# flag.png 为解出来的图片> python bwm.py decode 1.png 2.png flag.png 第二种 频域盲水印import cv2import numpy as npimport randomimport osfrom argparse import ArgumentParserALPHA = 5def build_parser():parser = ArgumentParser()parser.add_argument('--original', dest='ori', required=True)parser.add_argument('--image', dest='img', required=True)parser.add_argument('--result', dest='res', required=True)parser.add_argument('--alpha', dest='alpha', default=ALPHA)return parserdef main():parser = build_parser()options = parser.parse_args()ori = options.oriimg = options.imgres = options.resalpha = options.alphaif not os.path.isfile(ori):parser.error("original image %s does not exist." % ori)if not os.path.isfile(img):parser.error("image %s does not exist." % img)decode(ori, img, res, alpha)def decode(ori_path, img_path, res_path, alpha):ori = cv2.imread(ori_path)img = cv2.imread(img_path)ori_f = np.fft.fft2(ori)img_f = np.fft.fft2(img)height, width = ori.shape[0], ori.shape[1]watermark = (ori_f - img_f) / alphawatermark = np.real(watermark)res = np.zeros(watermark.shape)random.seed(height + width)x = range(height / 2)y = range(width)random.shuffle(x)random.shuffle(y)for i in range(height / 2):for j in range(width):res[x[i]][y[j]] = watermark[i][j]cv2.imwrite(res_path, res, [int(cv2.IMWRITE_JPEG_QUALITY), 100])if __name__ == '__main__': main() ​ 使用python pinyubwm.py --original 1.png --image 2.png --result out.png ​ 查看 out.png 即可,如果无法得到正常图片,可将 1.png2.png 调换位置再次尝试 **lsb的py脚本解密(lsb隐写+需要passwd)*F:\CTF\CTF工具合集\脚本\cloacked-pixel-master使用python lsb.py extract [stego_file] [out_file] [password] *pngcheck(检查IDAT块_win)pngcheck.exe 所在文件夹打开cmdpngcheck.exe -v 123.png 可检查 pngIDAT 块是否有问题相关题目可参考: blog.csdn.net/u010391191/…有关解题脚本可参考 FzWjScJ 师傅的blog: www.fzwjscj.xyz/index.php/a… java 盲水印使用工具提取 F:\CTF\CTF工具合集\隐写\图像隐写java -jar .\BlindWatermark.jar decode -c .\flag.png output.png apng图片实际是动图,使用apngdis.exe进行分离 如果用tweakpng打开发现很多报错,就用pngdebuger看报错是不是藏了啥### GI” style=“margin: auto” />
  • 特征文件头标识(6 bytes):47 49 46 38 39(37) 61 即GIF89a* 动图,多张图片组成,有多个元数据(属性信息)* 时间轴隐写,利用多帧之间的时间间隔不同,来隐藏信息(大多为二进制 01 )### BMP

  • 特征无损,无压缩格式* LSB隐写* 频域盲水印隐写使用 matlab### WebP

安装(kali中)apt install webp需要的时候按 Y 即可

使用

cwebp - 编码器工具:可将png转为webp

cwebp 1.png -o 2.webp 

dwebp - 解码器工具:可将webp转为png

dwebp 1.webp -o 2.png 

vwebp - 查看器工具:可直接查看webp格式图片

vwebp 1.webp 

webpinfo - 格式查看工具:可打印出WebP文件的块级结构以及基本完整性检查

webpinfo 1.webp 

其余(gif2webp、img2webp等可见 官方文档)

  • exiftool(查看图片exif信息)exiftool 1.jpg # 显示图片所有信息exiftool 1.jpg | grep flag # 查看图片有关‘flag’字符的信息exiftool * #查看此文件夹所有图片信息exiftool -b -ThumbnailImage attachment.jpg >flag.jpg # 提取缩略图* ### BPG

文件头:425047FB

在线网站查看即可:webencoder.libbpg.org/show.html

工具脚本使用

Pillow

pil 升级版,下边是简单使用

from PIL import Image
# 打开一个png图像文件,注意是当前路径:
im = Image.open("file.png")
# 获得图像尺寸:
w, h = im.size
im.show()
# 把图像用png格式保存:
im.save("another.png")
# 图像处理-改变尺寸
im.resize((32,32))
# 图像处理-旋转
im.rotate(90)

# 像素处理-将图像像素数组方式读取(整体)
im.getdata()
# 像素处理-数组生成图像(整体)
im.putdata()
# 像素处理-读取单个像素的rgb值(单个像素)
im.getpixel((x,y))
# 像素处理-读取单个像素的rgb值(单个像素)
im.putpixel((x,y),(0,0,0))

im.copy()
im = Image.new("RGB",(1,1),data) 

二进制数据生成二维码

根据二进制字符串的长度,开方确定图片尺寸

from PIL import Pillow
s = "二进制字符串"
im = Image.new("RGB",(25,25))
im.putdata([(255,255,255) if i=="1" else (0,0,0) for i in s])
im.resize((100,100)).show() 
identify

功能和exiftool相同,显示信息更多,用法如下

identify -verbose pic.png 

获取指定信息

identify -format "%[EXIF:copyright] %c\n" pic.png
# copyright可以替换 

最后

从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。

因为入门学习阶段知识点比较杂,所以我讲得比较笼统,大家如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。

干货主要有:

①1000+CTF历届题库(主流和经典的应该都有了)

②CTF技术文档(最全中文版)

③项目源码(四五十个有趣且经典的练手项目及源码)

④ CTF大赛、web安全、渗透测试方面的视频(适合小白学习)

⑤ 网络安全学习路线图(告别不入流的学习)

⑥ CTF/渗透测试工具镜像文件大全

⑦ 2023密码学/隐身术/PWN技术手册大全

扫码领取

需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。

干货主要有:

①1000+CTF历届题库(主流和经典的应该都有了)

②CTF技术文档(最全中文版)

③项目源码(四五十个有趣且经典的练手项目及源码)

④ CTF大赛、web安全、渗透测试方面的视频(适合小白学习)

⑤ 网络安全学习路线图(告别不入流的学习)

⑥ CTF/渗透测试工具镜像文件大全

⑦ 2023密码学/隐身术/PWN技术手册大全

扫码领取

  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图片是指将一张图片藏在另外一张图片里面,而 PNG 文件是一种常见的图片格式,因此可以将一张图片藏在 PNG 文件中。以下是一个简单的例子: 1. 首先,将要藏的图片命名为 image.jpg,将要图片的 PNG 文件命名为 cover.png。 2. 将 image.jpg 转换为二进制文件,并将其插入 cover.png 中。 ```bash $ xxd -p -c 99999 image.jpg > image.hex $ cat image.hex | tr -d '\n' | xxd -r -p | dd of=cover.png bs=1 seek=100000 conv=notrunc ``` 这里的 `xxd -p -c 99999 image.jpg` 将 `image.jpg` 转换为十六进制,然后 `cat image.hex | tr -d '\n' | xxd -r -p` 将十六进制转回二进制,最后使用 `dd` 命令将二进制插入到 `cover.png` 的第 100000 个字节处。注意,这个位置可以根据具体情况进行调整。 3. 查看生成的 PNG 文件,可以看到图片已经被成功藏。 ```bash $ file cover.png cover.png: PNG image data, 800 x 600, 8-bit/color RGB, non-interlaced $ eog cover.png ``` 可以使用 `file` 命令检查文件类型,并使用图片查看器查看图片内容。 4. 提取藏的图片。 ```bash $ dd if=cover.png of=image2.jpg bs=1 skip=100000 ``` 这里的 `dd` 命令将 `cover.png` 中的图片提取到 `image2.jpg` 中。同样地,提取位置可以根据具体情况进行调整。 以上是一个简单的示例,实际情况可能更加复杂。在实际的 CTF 中,可能需要使用更加高级的技巧来图片,例如使用 Least Significant Bit (LSB) 算法或者 F5 算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值