一、文件隐写
1.当遇到文件类型未知的文件时怎么办?
①linux系统可以使用file命令查看文件的类型,格式:file 文件名
②使用winhex或者010editor查看文件头,从而判断文件的类型,①中file命令的本质也是查看文件的文件头。
2.当文件头残缺或错误怎么办?
当打开文件时提示文件打开失败,使用file查看文件类型时,只显示“data”,说明文件头残缺或错误,需要我们用010editor或者winhex手动添加
3.如果一个文件由多个文件合并而成怎么分离?
①可以使用Binwalk工具,它是linux下自带的文件分析和分离工具,可以直接在命令行输入命令.
分析文件命令:binwalk 文件名
分离文件命令:binwalk -e 文件名
②另一个工具foremost也可以分离文件,同样是linux下自带的工具
用法:foremost 文件名 -o 输出目录名
③当文件自动分离出错或者因为其他原因无法自动分离时,可以使用dd实现文件手动分离
if表示输入文件名,of表示输出文件名,bs表示想要分离的大小,count表示重复次数,skip表示跳过几个bs值
比如下图,将1.txt中前五个数字分离出来,输出到2.txt中,bs=5,重复一次
如果想分离前十个数字,那就让count=2
如果跳过前3个数字,那就使用skip
④也可以使用010editor直接分离文件
4.如果一个文件被分离成好几个文件怎么合并?
在Linux下,使用cat命令合并,合并后查看md5值对比,判断合并后的文件是否正确
格式:cat 文件名1 文件名2 文件名3 > 输出文件名
二、图片文件隐写
1.Exif
windows下图片右键属性,查看ecif或查看详细信息,在相关选项卡中查找flag信息
linux下可以使用exiftool命令查看详细信息,格式:exiftool 图片名
2.stegsolve
当两张jpg图片外观、大小、像素都基本相同时,可以考虑进行结合分析,即将两个文件的像素RGB值进行XOR、ADD、SUB等操作,看能否得到有用的信息。但是要注意导入stegsolve图片的顺序,顺序不同得到的结果也不同
3.LSB(最低有效位Least)
RGB是由8位二进制显示出的颜色,但是修改最后一位二进制数字并不会改变图片的颜色,那就可以更改最后一位的数值,连起来形成ASCII码,隐写信息,如下图
解决办法有四种
①使用stegsolve查看最后一位,但是因为顺序不同,要多点几下,多去尝试
②zsteg工具,会把各种顺序列出来,比stegsolve好用,但是在Linux下需要安装,安装命令:gem install zsteg
③如果文件类型是bmp,推荐使用westrgo4,或者用画图软件转成png格式并且使用stegslove查看图片
④编写python脚本(小白忽略)
4.当png文件无法打开,或者图片只有一部分时怎么办
当文件无法正常打开时,使用TweakPNG打开文件后,提示crc错误,需要更改。然后需要winhex修改 ,打开winhex搜索原crc,替换成错误信息中的crc
当图片高度或宽度发生了错误,需要根据 正确的CRC计算出正确的高度或者宽度,计算的py脚本如下
(其实作者之前做过某题,没有根据CRC计算出高度,随便填写一个高度,就能让图片中高度变高,flag就出来了,此处根据CRC计算高度和宽度更加严谨)
5.如果图片被加密了怎么办?
使用bftools解密图片信息,格式:
Bftools.exe decode braincopter 要解密的图片名称 -o 输出文件名
Bftools.exe run 上一步输出的文件名
另一款解密工具:SilentEye 如果有文字或者文件隐藏到图片中,就可以用它解密
其他工具:
①针对于JPEG的Stegdetect,可识别多种加密方式
②outguess加密的图片,使用outguess工具
6.针对二维码的操作
①二维码缺失一角,使用ps等图片编辑软件补上即可
②二维码反色,使用画图软件取反即可
③彩色二维码,使用画图软件取反后,再使用stegslove一帧一帧的看
三、压缩文件处理
1.伪加密
①ZIP压缩文件被加密,或者文件头正常但是解压错误,就需要尝试文件是否为伪加密。方法:使用winhex打开压缩文件,搜索16进制504B0102,从50开始计算,第九第十个字符为加密字段,将其设置成0000即可变成无加密状态
②RAR压缩文件被加密,使用winhex打开文件后,找到第24个字符,该字节尾数为4表示加密,0表示无加密,将尾部改成0即可破解伪加密
2.真加密:暴力破解
如果已知部分明文信息,可使用ARCHPR工具进行暴力破解
3.压缩包损坏
当一个压缩包解压后可能有部分文件没有被解压出来,原因就是解压软件无法识别错误的文件头
修改没有解压出来的文件的文件头,再次解压即可
四、流量取证技术
想要做流量分析,不可避免的要用到WireShark
1.常见的过滤命令
2.协议分级统计
当数据包很大时,可以通过协议分级统计找最大占比的传输,可能就是在传输某个压缩包
3.WireShark流汇聚
在关注的http数据包或者tcp数据包中选择追踪流,可以将HTTP或者TCP流汇聚或还原成数据,在弹出的框中可以看到数据内容。
常见的HTTTP流关键内容:
①HTML中直接包含重要信息
②上传或下载文件内容,通常包含文件名, hash值等关键信息,常用POST请求上传
③一句话木马,POST请求,内容包含eval,内容使用base64加密
4.WireShark数据提取
①使用wireshark可以自动提取通过http传输的文件内容
②如果找到最大占比的字段名, 就可以导出分组字节流,缩小导出范围
5.无线wifi流量包
无线wifi流量包的Source不是IP地址,而是MAC地址。无线协议是802.11
遇到无线wifi流量包,如果要解出wifi密码,剋使用linux下的aircrack-ng工具破解
命令格式:aircrack -ng 流量包名 -w 字典
6.USB流量包文件分析
①键盘流量抓取分析,键盘流量会存放在LCD这个字段中,这个字段的数据长度为8个字节,击键信息集中在第三个字节。这个字节的十六进制与键盘上的值一一对应,部分对照如下
下图是USB流量包中LCD字段的示例
再使用linux自带的tshark工具,将流量包中这个字段的数据提取出来
命令格式为:tshark -r 流量包名 -T fields -e usb.capdata >导出的文件名.txt
最后使用python脚本,将第三个字节转换后数据,脚本代码如下
mappings = { 0x04:"A", 0x05:"B", 0x06:"C", 0x07:"D", 0x08:"E", 0x09:"F", 0x0A:"G", 0x0B:"H", 0x0C:"I", 0x0D:"J", 0x0E:"K", 0x0F:"L", 0x10:"M", 0x11:"N",0x12:"O", 0x13:"P", 0x14:"Q", 0x15:"R", 0x16:"S", 0x17:"T", 0x18:"U",0x19:"V", 0x1A:"W", 0x1B:"X", 0x1C:"Y", 0x1D:"Z", 0x1E:"1", 0x1F:"2", 0x20:"3", 0x21:"4", 0x22:"5", 0x23:"6", 0x24:"7", 0x25:"8", 0x26:"9", 0x27:"0", 0x28:"\n", 0x2a:"[DEL]", 0X2B:" ", 0x2C:" ", 0x2D:"-", 0x2E:"=", 0x2F:"[", 0x30:"]", 0x31:"\\", 0x32:"~", 0x33:";", 0x34:"'", 0x36:",", 0x37:"." }
nums = []
keys = open('out.txt')
for line in keys:if line[0]!='0' or line[1]!='0' or line[3]!='0' or line[4]!='0' or line[9]!='0' or line[10]!='0' or line[12]!='0' or line[13]!='0' or line[15]!='0' or line[16]!='0' or line[18]!='0' or line[19]!='0' or line[21]!='0' or line[22]!='0':continuenums.append(int(line[6:8],16))
keys.close()
output = ""
for n in nums:if n == 0 :continueif n in mappings:output += mappings[n]else:output += '[unknown]'
print 'output :\n' + output
②鼠标流量分析。鼠标数据包的数据长度为4个字节
- 第一个字节代表按键,当取0x00时,代表没有按键;为0x01时,代表按左键;为0x02时,代表当前按键为右键
- 第二个字节代表左右偏移,当值为正时,代表右移多少像素;当值为负时,代表左移多少像素
- 第三个字节代表上下偏移
前面分析方法与键盘流量相同,使用tshark得到数据包的txt文档后,再使用python脚本得到鼠标的移动轨迹坐标,再使用kali自带的gnuplot工具,根据坐标画出轨迹得到flag。
使用python脚本得到坐标
nums = []
keys = open('Python\\USBread\\mouse\\out.txt','r',encoding="utf_16")
f = open('Python\\USBread\\mouse\\xy.txt','w',encoding="utf_16")
posx = 0
posy = 0
for line in keys:# if len(line) != 11:# continuex=int(line[3:5],16)y=int(line[6:8],16)if x>127:print ("aaa")x-=256if y>127:print ("bbb")y-=256posx += xposy += ybtn_flag = int(line[0:2],16) #1 for left,2 for right , 0 for nothingif btn_flag == 0:#此处的0可以修改为0(未按按键)、1(左键)、2(右键),将单独输出相应坐标文件。print (posx,posy)f.write(str(posx))f.write(' ')f.write(str(posy))f.write('\n')
f.close()
根据坐标,使用gnuplot得到图形得到结果