CTF-MISC文件隐写总结(图片,音频,视频,压缩包等文件)_视频隐写 misc-程序员宅基地

技术标签: # CTF  ctf  运维  linux  隐写  misc  

前置知识

  • 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

image-20210913205610015

​ 修复工具:

  • winrar修复(也可以修复其他的修改内容) 工具->修复

  • binwalk foremost无视伪加密

  • ZipCenOp.jar(win)

    找到所在文件夹,在地址栏输入cmd

    java -jar ZipCenOp.jar r 文件名
    

CRC32碰撞

原理:

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

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

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

明文攻击

基本条件

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

方法

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

tips:

image-20210913213429666

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

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 文件

    image-20210923215753104

  • steghide(win)

    查看图片中嵌入的文件信息:

    steghide info out.jpg
    

    提取含有密码的隐藏内容:

    steghide extract -sf out.jpg -p 123456
    

    提取不含有密码的隐藏内容:

    steghide extract -sf out.jpg
    

    steghide爆破密码

    有些题目用steghide加密文件但是不给密码,此时就需要爆破,steghide本身并不支持爆破,需要一些其他的方法: https://github.com/Va5c0/Steghide-Brute-Force-Toolpython

    steg_brute.py -b -d [字典] -f [jpg_file]
    

    需要安装的库:progressbar

    pip install progressbar2
    
  • F5(矩阵编码)

    (F5隐写,需要passwd)

    kail下切换到F5-steganography,在java Extract运行命令:

    java Extract 123456.jpg图片的绝对地址 -p 123456
    
  • outguess(基于频率变换)

    (kali图片隐写+可需要可不要passwd

    outguess -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

PNG

  • 特征

    文件头标识(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 Chunk

      png 数据流中第一个数据块

      一个 png 数据流中只能有一个文件头数据块

    2. png 格式内有很多 IDAT 数据块,每个数据块都是 zlib 格式压缩的,第一块 IDAT 数据块,有一个 zlib 格式的标志如:789c

      idat 块只有当上一个块充满时,才会继续下一个新的块,一个图片只有一个 789c 标志

  • 修改高度

    010 editor

    tweakpng.exe打开图片提示IDHRcyc错误,表示文件尺寸被修改,且未修改crc值

  • LSB隐写

    在通道的最低位隐藏数据

    适用于 png 文件(无损压缩)和 pmb 文件(无压缩)

    工具:stegsolve 和 zsteg

    stegsolve 提取 lsb 数据

    选择 extract preview,bit plane order 可以多试试,其他固定即可

    image-20210923164920394

  • XOR

    1.binwalk分析出两张图片

    2.用stegslove打开选择image combiner 选择XOR

    3.根据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 所在文件夹打开cmd

    pngcheck.exe -v 123.png
    

    可检查 pngIDAT 块是否有问题相关题目可参考: https://blog.csdn.net/u010391191/article/details/80818785

    有关解题脚本可参考 FzWjScJ 师傅的blog: http://www.fzwjscj.xyz/index.php/archives/17/

  • java 盲水印

    使用工具提取 F:\CTF\CTF工具合集\隐写\图像隐写

     java -jar .\BlindWatermark.jar decode -c .\flag.png output.png
    
  • apng图片

    实际是动图,使用apngdis.exe进行分离

  • 如果用tweakpng打开发现很多报错,就用pngdebuger看报错是不是藏了啥

GIF

  • 特征

    文件头标识(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

img

文件头:425047FB

在线网站查看即可:https://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可以替换

音频

WAV

无损压缩格式

基本结构 chunk

  • RIFF chunk
  • Format chunk
  • Data chunk(小端)

image-20210924154648790

基本思路

  • 时域隐写

    将数据隐藏在时域波形中

    解题方法:总体观察 + 提取数据

    工具:audacity 打开音频查看波形

    先确定数据在那个时间段,放大进行观察波形异常

  • 频域隐写

    使用工具 audacity 打开音频,切换至频谱图

    image-20210924162417812

  • LSB隐写

    wav 格式优先考虑lsb隐写,使用silenteye工具

  • steghide(wav隐藏信息)

    使用方法在本文jpg的介绍中

MP3

压缩格式

  • mp3steg mp3加解密工具

    有key的话用mp3steg

    在MP3stego文件夹中打开cmd,然后将 Decode.exe 拖到命令行里,将要解密的文件放在文件夹中

    encode -E hidden_text.txt -P pass svega.wavsvega_stego.mp3
    
    Decode.exe -X -P pass(密码) svega_stego.mp3(要拷贝到目录下) //解码 
    
  • m4a文件头

    00 00 00 20 66 74 79 70 4D 34 41 20 00 00 00 00

DTMF

DTMF 双音多频,现在电话拨号机制,每个电话按键都有不同的声音

特点就是电话按键声音

image-20210924162725787

音频图中查看

image-20210924163051213

  • 在线工具http://dialabc.com/sound/detect/
  • 本地工具 tdmf ton decoder
  • https://pas-products.com/download.html免费版有限制

脚本工具

wav

python wav 库

import wave
w = wave.open(file)
w.getframerate()	# 返回采样频率
w.getnframes()	# 返回总帧数
w.readframes(n)	# 读取前n帧(不一定是n字节)
python列表生成式

快速将01二进制转换成英文字符

''.join(chr(int(s[i:i+7],2)) for i in range(0,len(s),7))

视频

  • 逐帧分割

​ video to pic.exe或者ffmpeg.exe

  • 其他

​ 视频中的音频、视频放到010中查看

PYC隐写

导入 python 脚本时在目录下会生成个一个相应的 pyc 文件,是 pythoncodeobj 的持久化储存形式, 加速下一次的装载

  • uncompyle6(pyc文件反编译)
uncompyle6 test.pyc > test.py
  • Stegosaurus(pyc隐写_win)

    版本:Python 3.6 or later

    使用在 stegosaurus.py 所在文件夹打开cmd,输入:

    python stegosaurus.py -x [pyc_file]
    

    基本用法

    $ python3 -m stegosaurus -h
    usage: stegosaurus.py [-h] [-p PAYLOAD] [-r] [-s] [-v] [-x] carrier
    
    positional arguments:
      carrier               Carrier py, pyc or pyo file
    
    optional arguments:
      -h, --help            show this help message and exit
      -p PAYLOAD, --payload PAYLOAD
                            Embed payload in carrier file
      -r, --report          Report max available payload size carrier supports
      -s, --side-by-side    Do not overwrite carrier file, install side by side
                            instead.
      -v, --verbose         Increase verbosity once per use
      -x, --extract         Extract payload from carrier file
    

乐符解密

https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=yinyue

PDF

pdfinfo 文件名 #查看pdf属性
pdftotext 文件名 #导出文本

word/xlsx

  • 将文件后缀改为zip,查找里边的flag
  • flag为白色字符串,ctrl+a将颜色改为白色

pcap文件修复

  • winpcapfix工具• 在线修复• https://f00l.de/hacking/pcapfix.php

linux光盘文件(ext3)

linux挂载光盘,使用notepad或者strings、file命令来搜索关键词

strings test | grep -i flag 
find | grep 'flag'find -name 'flag*'

mount命令挂载文件

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/q20010619/article/details/120458407

智能推荐

Oracle DG--Rman备份集搭建备库 -程序员宅基地

文章浏览阅读296次。常用的在线备库搭建有Rman auxiliary 和Rman备份集恢复两种方式。(一)在环境配置OK的问题下,使用一条Rman命令就可以完成备库初始化同步,比较简单。# 登陆rman target sys/Oracle123@orcl_pri auxiliary sys/Oracle123@orcl_dg# 开始搭建辅助数据库RMAN>du..._oracle dg搭建备份集

Linux安装宝塔Linux环境搭建DVWA、pikachu、xss、sqli、upload靶场_能用宝塔搭建dvwa-程序员宅基地

文章浏览阅读4.8k次,点赞14次,收藏62次。一、安装宝塔Linux环境宝塔Linux官网腾讯云官网靶场-天翼云盘靶场-百度网盘 密码:b4ucUbuntu安装宝塔Linux命令wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.shCentOS安装宝塔Linux命令yum install -y wget && wget -O install.sh http://download_能用宝塔搭建dvwa

用js实现禁用浏览器的后退按钮_禁止点击浏览器返回按钮-程序员宅基地

文章浏览阅读1.7k次。再登录界面中的<title></title>下面添加以下js代码:<script> //防止点击页面后退 history.pushState(null, null, document.URL); window.addEventListener('popstate', function() { history.pushState(null, nul..._禁止点击浏览器返回按钮

node js学习 [第四篇] cli commander chalk Inquirer【新手向】-程序员宅基地

文章浏览阅读830次。commander开发方向GUI - Graphical User Interface : 图形用户界面office、vscode、浏览器、播放器……CLI - Command-Line Interface:命令行界面,也称为 CUI,字符用户界面虽然没有GUI操作直观,但是CLI更加节省计算机资源(所以一般用于服务器环境)babel、tsc / webpack / vue-cli..._commander chalk

linux 编译指定库、头文件的路径问题 (使用tslib函数出错)_tslib.h调用报错-程序员宅基地

文章浏览阅读672次。在编译第一个项目中电子书触摸屏的应用程序时,用到了tslib库,编译安装以后,还是提示以下的错误:built-in.o: In function `TouchScreenGetInputEvent':/home/ybx/project/09.show_file_Makefile/input/touchscreen.c:65: undefined reference to `ts_read'_tslib.h调用报错

html邮件格式完整规范,邮件模板css及html设计规范-程序员宅基地

文章浏览阅读1k次。邮件模板规范邮件模板,请严格按照下面的规则执行。邮件客户端和Web页面的需求不一样,在编写代码的时候,考虑的方向也不同。任何同窗,有什么问题,能够在下面提出。!Doctype声明为了向前兼容和避免某些浏览器的怪癖,使用html5的!doctype声明,格式以下:原则,及思惟出发点1. 不须要考虑DOM节点的精简和结构的优化。以完成设计样式为最优先。必要时,没必要吝啬使用表格嵌套,没必要吝啬使用空的..._手机端邮件内容html格式规范

随便推点

HDU1559:最大子矩阵_在一个m*n的矩阵中求x*y最大子矩阵-程序员宅基地

文章浏览阅读273次。题目描述http://acm.hdu.edu.cn/showproblem.php?pid=1559 给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大。题目分析只是求所有x*y子矩阵的元素和,可以先预处理一下,再计算代码#include &lt;iostream&gt;using namespace std;#define ..._在一个m*n的矩阵中求x*y最大子矩阵

十款经典游戏的Java版本(开源)_java游戏-程序员宅基地

文章浏览阅读10w+次,点赞217次,收藏1.3k次。开源Java小游戏前言看到标题可能有人要笑我,用Java写游戏?没办法,毕竟无论学什么语言我们都希望它能做出好玩有趣的应用。对于初学者来说,能做出个小游戏玩玩也是很大的学习动力嘛。下面就给大家介绍十几个开源的Java小游戏,供大家学习交流。下载链接都是我上传的资源,不收取任何资源分,毕竟开源才是我们的宗旨。如果链接坏了给我留言,我会尽快补上新的链接。这些程序都在我的机子上运行过,不要问我为_java游戏

MySQL基础教程4-SQL基础概念-程序员宅基地

文章浏览阅读1.7k次。前面文章我们介绍了数据库环境和如何连接数据,以及创建表和列,还有创建数据库的用户。应对数据库环境有一个基本了解,接下来我们要学的就是SQL查询。SQL的运用一般考察的都是查询和优化,我们在了解SQL查询语句之前,我们有必要了解几个基本的概念。1. 什么是SQLSQL是英文(Structured Query Language),结构化查询语言。SQL其实也是一种语言,就像Python是一门语_mysql基础教程4

『脚手架』方糖工具箱 | 一款采用 SpringCloud 微服务架构的脚手架_有比较好用的微服务脚手架么-程序员宅基地

文章浏览阅读2w次。文章目录????欢迎 Fork 和 Star????SugarTools????如何部署????️包含组件????正在开发中????贡献代码的步骤????欢迎 Fork 和 Star项目地址:https://github.com/xingly-cn/SugarTools请您小手点个Star。????SugarTools方糖工具箱,一款采用 SpringCloud 微服务架构的小巧工具箱,遵循不重复造轮子的原则,每个模块相互独立可直接实现到自己的项目中。目前很多功能处于开发中,有 Bug 或不去_有比较好用的微服务脚手架么

用gcc编译成可执行程序细节过程_gcc run-程序员宅基地

文章浏览阅读2.6k次。#gcc hello.c该命令将hello.c直接生成最终二进制可执行程序a.out这条命令隐含执行了(1)预处理、(2)汇编、(3)编译并(4)链接形成最终的二进制可执行程序。这里未指定输出文件,默认输出为a.out。从上面我们知道GCC编译源代码生成最终可执行的二进制程序,GCC后台隐含执行了四个阶段步骤。GCC编译C源码有四个步骤:预处理----->_gcc run

java swing web_Java-JFrame-swing嵌套浏览器步骤-程序员宅基地

文章浏览阅读1.2k次。Java-JFrame-swing嵌套浏览器步骤一、使用swing嵌套浏览器要实现的功能:通过java的swing实现在一个窗体中嵌套一个浏览器,可以在这个浏览器中将另一个项目的内容显示出来,只需要回去另一个项目首页的url即可,这样另一个项目就可以在swing嵌套的浏览器中进行正常的显示了;二、下面的浏览器工具类中的方法在使用的时候,只需要从另一个项目的服务端获取另一个项目的首页stirng类型..._swing能在一个窗口中嵌入另一个软件的界面吗

推荐文章

热门文章

相关标签