目录
4.LSB(最低有效位 Least Significant Bit)(易考)
补充:怎么知道文件里哪个字节表示高度、宽度,哪个字节表示CRC
1.使用二维码扫描工具CQR.exe打开图片,找到内容字段。
1.使用wireshark可以自动提取通过HTTP传输的文件内容
aircrack-ng工具进行WiFi密码破解(LINUX)
杂项题目有些题目很简单,难题则可能包含杂项、流量分析、密码学、web的知识
杂项考的是快速学习能力,基本工具使用能力
一、文件操作与隐写
隐写:把flag隐藏在图片里边。最简单的隐写是对图片操作的。给你一个图片,使用记事本打开,发现flag。
文件类型识别
1.file命令
file命令为Linux系统命令。当文件没有后缀名或者有后缀名而无法正常打开时,根据识别出的文件类型来修改后缀名即可正常打开文件。
- 使用场景:不知道后缀名,无法打开文件
- 格式:file 文件路径
2.winhex
通过winhex程序中可以查看文件头类型,根据文件头类型判断文件类型。
【CTF杂项】常见文件文件头文件尾格式总结 各类文件头_ctf文件存储格式-CSDN博客
- 使用场景:Windows下通过文件头信息判断文件类型
- 使用方法:使用notepad++或010Editor打开文件,使用十六进制模式打开,查看文件头与上图对比
3.文件头残缺/错误
通常文件无法正常打开有两种情况,一种是文件头部残缺,另一种是文件头部字段错误。针对文件头部残缺的情况,使用winhex程序添加相应的文件头,针对头部字段错误,可以找一个相同类型的文件进行替换。
- 使用场景:文件头部残缺或文件头部字段错误无法打开。
- 格式:file 文件名
文件分离操作
1.Binwalk 工具
Binwalk 是 Linux下用来分析和分离文件的工具,可以快速分辨文件是否是由多个文件合并而成,并将文件进行分离。如果分离成功会在目标文件的同目录下创建一个分离后的文件夹。
- 使用场景:
- 格式:
- 分析文件:binwalk 文件名
- 分离文件:binwalk -e 文件名
2.foremost 命令
如果binwalk无法正确分理出文件,可以使用foremost,将目标文件复制到kali系统中,成功执行后会在目标文件的文件目录下生成一个文件夹,并按文件类型分类。
- 用法:foremost 文件名 -o 输出目录名
3.dd命令
当文件自动分离出错或者因为其他原因无法自动分离时,可以使用dd实现文件手动分离。
- 格式:dd if=源文件名 of=输出文件名 bs=1 count=分离结束的字节数 skip=开始分离的字节数
- 参数说明:
- if=file 输入文件名,缺省为标准输入
- of=file 输出文件名,缺省为标准输出
- bs=bytes 同时设置读写块的大小为bytes,可代替ibs和obs
- skip=blocks 从输入文件开头跳过blocks个块后再开始复制
- 示例:
文件1.txt 文件内容为: 1234567890abcdefg
- dd if=1.txt of=2.txt bs=5 count=1 创建一个2.txt文件,内容为:12345
- dd if=1.txt of=3.txt bs=5 count=2 创建一个3.txt文件,内容为:1234567890
- dd if=1.txt of=4.txt bs=5 count=3 skip=1 创建一个4.txt文件,内容为:67890abcdefg
4.winhex
除了使用dd外,还可以使用winhex实现文件手动分离,将目标文件拖入winhex中,找到要分离的部分,点击复制即可。
- 使用场景:Windows下利用winhex程序对文件进行手动分离。
- 例如:
新建一个文件,文件大小1byte,在文件开头位置点击粘贴,弹出提示框选否、确定,将文件保存为想要的后缀即可。
5.010Editor
使用010Editor将某块区域文件保存的方式如下:
使用010Editor打开文件->选中右键->Selection->Save Selection
6.010Editor
将16进制字符文件导入010Editor并保存为应有的格式:
打开010Editor->File->Import Hex->选择十六进制文件->另存为。
文件合并操作
出题人将一个文件拆分为若干个文件,并给你一个MD5校验值。你需要将这若干个文件合并成一个文件,并检验MD5校验值是否一致。
1.Linux下的文件合并
- 使用场景:Linux下,通常对文件名相似的文件要进行批量合并
- 格式:cat合并的文件 > 输出的文件
- Linux下计算文件MD5
- 格式:md5sum 文件名
- 例如:将当前目录下的以gif开头的文件合并为1.gif
#合并文件
cat gif* > 1.gif
#校验MD5,得到1.gif的MD5
md5sum 1.gif
2.Windows下的文件合并
- Windows下,通常对文件名相似的文件要进行批量合并
- 格式:copy /B 合并的文件 输出的文件
- Windows下计算文件MD5
- 格式:certutil -hashfile 文件名 md5
- 例如:将当前目录下的以gif开头的文件合并为2.gif
# 文件合并
copy /B gif01+gif02+gif03+gif04 2.gif
# 检验MD5
certutil -hashfile 2.gif md5
文件内容隐写
文件内容隐写,就是直接将KEY以十六进制的形式写在文件中,通常在文件的开头或结尾部分。分析时通常重点观察文件开头和结尾部分。如果在文件中间部分,通常搜索关键字KEY或者flag来查找隐藏内容使用场景:windows下,搜索隐写的文件内容。
二、图片隐写术
图片隐写的常见隐写方法
1.细微的颜色差别
2.GIF图多帧隐藏
- 颜色通道隐藏
- 不同帧图信息隐藏
- 不同帧对比隐写
3.Exif信息隐藏
4.图片修复
- 图片头修复
- 图片尾修复
- CRC校验修复(完整性校验)
- 长、宽、高度修复
5.最低有效位LSB隐写
6.图片加密
- Stegdetect
- outguess
- Jphide
- F5
图片文件隐写
1.Firework
使用winhex打开文件时会看到文件头部中包含fireword的标识,通过firework可以找到隐藏图片。
- 使用场景:查看隐写的图片文件
2.Exif
Exif按照JPEG的规格在JPEG中插入一些图像/数字相机的信息数据以及缩略图象。可以通过与JPEG兼容的互联网浏览器/图片浏览器/图像处理等一些软件来查看Exif格式的图像文件。就跟浏览器通常的JPEG图像文件一样。
图片右键->属性->查看Exif或者查看详细信息,在相关选项卡中查找flag信息。
3.Stegsolve(好用)
当两张jpg图片外观、大小、像素都基本相同时,可以考虑进行结合分析,即将两个文件的像素RGB值进行XOR、ADD、SUB等操作,看能否得到有用的信息,StegSolve可以方便的进行这些操作。
- 使用场景:两张图片信息基本相同
- 使用:
- 1.点击File->Open,打开第一张图片
- 2.点击analyse->Image combiner
- 3.在弹出的窗口中点击左右按钮选择处理方式,点击save保存有价值的结果
- 4.调换两张图片的顺序,再来一次,因为两张图片的减运算结果不同
- 原题连接:男神
http://ctf5.shiyanbar.com/stega/%E7%94%B7%E7%A5%9E.zip
4.LSB(最低有效位 Least Significant Bit)(易考)
LSB替换隐写基本思想是用嵌入的秘密信息取代载体图像的最低比特位,原来的7个高位平面与替代秘密信息的最低为平面组合成含隐藏信息的新图形。
- 像素三原色(RGB)
- 通过修改像素中最低位的1bit来达到隐藏的效果
- 工具:stegsolve、zsteg、wbstego4、python脚本
Stegsolve.jar工具解LSB题目方法:
- 点击File->Open,打开一张图片
- 打开文件->Analyse->Data Extract
- 调整Bit Planes、Bit Order、Bit Plane Order
zsteg工具解LSB题目方法:
- zsteg是Linux系统上的命令,检测LSB隐写,自动列出所有情况
- 格式:zsteg xxx.png
wbstego4工具
- 使用场景:解密通过lsb加密的图片,针对.bmp的图片
- 工具包名:wbs43open-win32
- 例题:女神
http://ctf5.shiyanbar.com/misc/nvshen.zip
python脚本来处理LSB
简单脚本示例:
#coding:utf-8
import PIL.Image
def foo():
im = PIL.Image.open('01.bmp')
im2 = im.copy()
pix = im2.load()
width,height = im2.size
for x in range(0,width):
for y in range(0,height):
if pix[x,y]&0x1 == 0:
pix[x,y] = 0
else:
pix[x,y] = 255
im2.show()
pass
if __name__ == '__main__':
foo()
print("OK")
pass
5.TweakPNG
TweakPNG是一款简单易用的PNG图像浏览工具,它允许查看和修改一些PNG图像文件的元信息存储。
- 使用场景:文件头正常却无法打开文件或者只显示一半,利用TweakPNG修改CRC
- 两种情况:
- 当PNG文件头正常当无法打开文件,可能是CRC校验出错,可以尝试通过TweakPNG打开PNG,会弹出校验错误的提示,这里显示CRC是fe1a5ab6,正确的是b0a7a9f1。打开winhex搜索fe1a5ab6将其改为b0a7a9f1。
- 文件头正常却无法打开文件,检测CRC发现CRC没有错误,这是图片的高度或者宽度发生了错误,需要通过CRC计算出正确的高度或者宽度。
- 脚本计算高度和宽度示例:
import os
import binascii
import struct
crcbp = open("2.png","rb").read() # 文件名
for i in range(1024):
for j in range(1024):
data = crcbp[12:16] + struct.pack('>i',i) + struct.pack('>i',j) + crcbp[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == 0xcbd6df8a: # 当前CRC值
print(i,j) # 计算正确的高度宽度值
print("hex",hex(i),hex(j))
补充:怎么知道文件里哪个字节表示高度、宽度,哪个字节表示CRC
一个PNG图片必须由PNG图片文件标识头和三个关键数据块IHDR、IDAT、IEND组成。一个PNG文件的标识头为89 50 4E 47 0D 0A 1A 0A。IHDR数据块主要描述影像的维度、色彩深度、色彩格式、压缩类型等。IDAT数据块主要用来存储影像的像素数据。IEND数据块用来标记PNG数据流结束。
下图中:标红的为PNG文件标识头,绿色的标识显示IHDR,这就是描述该文件属性的起始位置。蓝色部分代表图片的width(宽,占用4字节),黄色部分代表图片的Height(高,占用4字节)。红色下划线部分分别表示:bit Depth(图像深度,占用1字节),Color Type(颜色类型,占用1字节),Compression method(压缩方法,占用1字节),Filter Method(过滤器方法,占用1字节),Interlace method(隔行扫描方法,占用1字节)。橙色下划线部分表示图片的CRC值。
加密图片解密
1.Bftools解密
Bftools用于解密图片信息
- 使用场景:在Windows的cmd下,对加密过的图片文件进行解密
- 格式:
- Bftools.exe decode braincopter 要解密的图片名称 -output 输出文件名
- Bftools.exe run 上一步输出的文件名
2.SilentEye解密
silenteye是一款可以将文字或者文件隐藏到图片的解密工具。
- 使用场景:Windows下打开SilentEye工具,对加密的图片进行解密
- 操作:
- 使用silenteye程序打开目标图片,点击image->decode,点击decode,可以查看隐藏文件,点击保存即可。如果需要密码,勾选encrypted data,输入密码和确认密码,点击decode再解密。
3.Stegdetect工具针对JPG图像加密
Stegdetect程序主要用于分析JPEG文件,因此用Stegdetect可以检测到通过JSteg、JPHide、OutGuess、Invisible Secrets、F5、appendX和Camouflage等这些隐写工具隐藏的信息。返回使用的加密方式,再使用工具节目。
- 操作:
- stegdetect xxx.jpg
- stegdetect -s 敏感度 xxx.jpg
- Jphide
Jphide是基于最低有效位LSB的JPEG格式图像隐写算法。
Stegdetect提示jphide加密时,可以用Jphs工具进行解密,打开jphswin.exe, 使用open jpeg打开图片,点击seek, 输入密码和确认密码,在弹出文件框中选择要保存的解密文件位置即可,结果保存成txt文件。
- Outguess
outguess一般用于解密文件信息。
使用场景: Stegdetect识别出来或者题目提示是outguess加密的图片
该工具再Linux系统使用,需编译使用: ./configure && make && make install
格式: outguess -r 要解密的文件名输出结果文件名
- F5
F5一般用于解密文件信息。
使用场景: Stegdetect识别出来是F5加密的图片或题目提示是F5加密的图片
进入F5-steganography_ F5目录,将图片文件拷贝至该目录下,从CMD进入该目录
格式: Java Exrtact 要解密的文件名 -p 密码
二维码处理
-
1.使用二维码扫描工具CQR.exe打开图片,找到内容字段。
- 如果二维码某个定位角被覆盖了,该工具有时候也可以自动识别,如果识别失败,需要使用PS或画图工具将另外几个角的定位符移动到相应的位置,补全二维码。
- 如果某个二维码的定位点中间是白色,可能被反色了,使用画图工具把颜色反色回来即可。
男神http://ctf5.shiyanbar.com/stega/%E7%94%B7%E7%A5%9E.zip
三、压缩文件处理
涉及:压缩文件加密,真加密、假加密,压缩文件损坏与复原
1.伪加密
如果压缩文件是加密的,或文件头正常但解压缩错误,首先尝试文件是否为伪加密。zip文件是否加密是通过标识符来显示的,在每个文件的文件目录字段有一位专门标识了文件是否加密,将其设置为00表示该文件未加密,如果成功解压则表示文件为伪加密,如果解压出错说明文件为真加密。
- 使用场景:伪加密文件
- ZIP文件操作方法:
- 使用winhex打开文件搜索16进制504B0102,可以看到每个加密文件的文件头字段。
- 从50开始计算,第九第十个字符位为加密字段,将其改为0000即可变成无加密状态,若此时解压成功,则该文件是伪加密。
- RAR文件操作方法:
- RAR文件由于有头部校验,使用伪加密时打开文件会出现报错,使用winhex修改标志位后如报错消失且正常解压缩,说明是伪加密。
- 使用winhex打开RAR文件,从头开始,找到第24个字节,该字节尾数为4表示加密,0表示无加密,将尾数改为0即可破解伪加密。
2.暴力破解
ARCHPR.exe工具破解zip文件
- 使用场景: windows下加密过的zip文件
- 攻击类型选择暴力破解,在范围位置根据提示选择暴力破解范围选项设置暴力破解包含的类型、开始于和结束于选项具体范围,如果没有定义则全范围暴力破解。点击打开选择要破解的文件,点击开始进行破解。建议使用1~9位的数字密码,以及系统自带的英文字典作为密码字典。
- 攻击类型选择掩码可以进行复杂的暴力破解, 比如知道密码前3位是abc,后3位为数字,则在攻击类型选择掩码,在掩码处输入acb???,暴力范围选项选择所有数字,打开要破解的点击,点击破解。此时???的部分会被我们选择的暴力破解范围中的字符代替。明文攻击:
明文攻击
明文攻击指知道加密的ZIP中部分文件的明文内容,利用这些内容推测出密钥并解密ZIP文件的攻击方法,相比于暴力破解,这种方法在破解密码较为复杂的压缩包时效率更高。
- 使用场景:已知加密的zip部分文件明文内容
- 例:假设一个加密的压缩包中有两个文件readme.txt和flag.txt,其中flag.txt的内容是我们希望知道的内容,而我们拥有readme.txt的明文文件,使用上述两个文件即可进行明文攻击。
- 操作:
- 1、将readme.txt的明文文件进行压缩,变成readme1.zip。
- 2、打开archpr,攻击类型选择明文,明文文件路径选择readme1.zip ( 即将明文文件不加密压缩后的文件),加密的文件选择要破解的文件,点击开始,破解成功后会获得密码。
注:有时不一定能破解出文件口令,但是能够找到加密密钥等信息,可以直接将文件解密,点击确定保存解密后的文件即可。
使用明文攻击需要注意两个关键点:
- 有一个明文文件,压缩后CRC值与加密压缩包中的文件一致。
- 明文文件的压缩算法需要与加密压缩文件的压缩算法一致。
补充:RAR文件格式
有时候给出的RAR文件的头部各个字块会故意给错导致无法识别。
四、流量取证技术
涉及:磁盘取证、内存取证
CTF比赛中,流量包的取证分析是另一项重要的考察方向。
通常比赛中会提供一个包含流量数据的PCAP文件,有时候也会需要选手们先进性修复或重构传输文件后,再进行分析。
- 总体把握
- 协议分级
- 端点统计
- 过滤筛选
- 过滤语法
- Host,Protocol, contains, 特征值
- 发现异常
- 特殊字符串
- 协议某字段
- flag位于服务器中
- 数据提取
- 字符串取
- 文件提取
总的来说比赛中的流量分析可以概括为以下三个方向:
- 流量包修复
- 协议分析
- 数据提取
Wireshark使用
1.过滤IP,如源IP或者目标IP
ip.src eq x.x.x.x or ip.dst eq x.x.x.x 或者 ip.addr eq x.x.x.x
2.过滤端口
tcp.port eq 80 or udp.port eq 80
tcp.dstport == 80 只显示TCP协议的目标端口为80
tcp.srcport == 80 只显示TCP协议的源端口为80
tcp.port >= 1 and tcp.port <= 80
3.过滤协议
tcp / udp / arp / icmp / http / ftp / dns / ip...
4.过滤MAC
eth.dst == MAC地址
5.包长度过滤
过滤语句 | 说明 |
---|---|
udp.length == 26 | 这个长度是指udp本身固定长度8加上udp下面那块数据包之和 |
tcp.len >= 7 | 指的是IP数据包(tcp下面那块数据),不包括tcp本身 |
ip.len == 94 | 除了以太网头固定长度14,其它都算是ip.len,即从IP本身到最后 |
frame.len == 119 | 整个数据包长度,从eth开始到最后 |
6.HTTP模式过滤
http.request.method == "GET" |
http.request.method == "POST" |
http.request.uri == "/img/logo-edu.gif" |
http contains "GET" |
http contains "HTTP/1." |
http.request.method == "GET" && http contains "User-Agent:" |
http contains "flag" |
http contains "key" |
tcp contains "flag" |
常见的HTTP流关键内容:
- HTML中直接包含重要信息。
- 上传或下载文件内容,通常包含文件名、hash值等关键信息,常用POST请求上传。
- 一句话木马,POST请求,内容包含eval,内容使用base64加密
Wireshark数据提取
1.使用wireshark可以自动提取通过HTTP传输的文件内容
文件->导出对象->HTTP
在打开的对象列表中找到有价值的文件,如压缩文件、文本文件、音频文件、图片等,点击saveas进行保存,或者saveall保存所有对象再进入文件夹进行分析。
2.wireshark可以手动提取文件内容
点击想要的数据包,选定media type的位置
右键->导出分组字节流 或者点击菜单栏 文件->导出分组字节流,快捷方式CTRL+H
在弹出的框中将文件保存成二进制文件
无线WiFi流量包
- 特点:Source和Destination都不是IP地址,是设备的MAC地址。协议分析发现只有wireless LAN协议,很有可能是WPA或者WEP加密的无线数据包。
aircrack-ng工具进行WiFi密码破解(LINUX)
- 1.用aircrack-ng检查cap包:
- 格式:aircrack-ng xxx.cap
- 2.使用aircrack跑字典进行破解密码
- 格式:aircrack-ng xxx.cap -w pass.txt
USB流量
USB流量也是流量分析题的考察点,一般考察的流量涉及键盘击键,鼠标移动与点击,存储设备的明文传输通信,USB无线网卡网络传输内容等。
右键leftover capture data->应用为列
USB协议的数据部分在Leftover Capture Data域之中。可以将该域的值在主面板上显示,键盘数据包的数据长度为8个字节,击键信息集中在第3个字 节,每次key stroke 都会产生一个 keyboard event usb packet。
USB键盘流量抓取分析
1.Leftover Capture Data数据提取:
使用wireshark提供的命令行工具tshark(Linux),可以将Leftover Capture Data 数据单独复制出来。
- 格式:tshark -r usb1.pcap -T fields -e usb.capdata > usbdata.txt
2.利用python脚本匹配常用的键盘操作
USB鼠标流量抓取分析
鼠标流量与键盘流量不同,鼠标移动时表现为连续性,与键盘的离散性不一样。但是实际鼠标产生的数据是离散的。所以同样可以把数据抓取出来,构成二维坐标画出轨迹。
鼠标数据包的数据长度为4个字节,第一个字节代表按键,当取ox0o时,代表没有按键;为oxo1时 ,代表按左键;为0x02时,代表当前按键为右键。
第二个字节代表左右偏移; 当值为正时,代表右移多少像素。 当值为负时,代表左移多少像素。 同理,第三个字节代表上下偏移。
1.Leftover Capture Data数据提取:
同上
2.利用python脚本计算出坐标:
修改keys文件名和btn_flag的值
3.使用Linux中gnuplot工具把坐标画出来
- 命令:gnuplot回车启动gnuplot
- plot "xy.txt" 指定一个坐标文件
HTTPS流量包文件分析
HTTPS流量是经过TLS协议加密过的,需要导入key才能看到原始的HTTP流量