CTF思路
文件操作与隐写
识别文件
首先当文件没有后缀名或者有后缀名而无法打开时,就需要识别出文件类型
1、File命令
格式:file 文件路径
结果为data说明文件可能存在头部残缺或字段错误
2、winhex工具
windows下通过文件头信息判断文件类型
常见文件头类型如下图所示:
文件可能会出现的情况
1、文件无法正常打开(头部残缺/字段错误)
头部头部残缺
使用winhex添加相应的文件头
头部字段错误
可以找一个相同类型的文件进行替换
2、文件由多个文件合并而成(文件分离)
使用Binwalk工具
Binwalk是Linux下用来分析和分离文件的工具
命令格式:
binwalk 文件名 //分析文件
binwalk -e 文件名 //分离文件使用foremost工具
如果Binwalk无法正确分离出文件,可以尝试使用foremost
命令格式:
foremost 文件名 -o 输出目录名
-o:设置输出目录
使用dd工具
当文件自动分离出错或者因为其他原因无法自动分离时,可以先使用Binwalk分析,再使用dd实现文件手动分离
命令格式:
dd if=源文件 of=输出文件名 bs=1 count=1 skip=开始分离的字节数
bs=bytes:同时设置读写块的大小为bytes,可代替ibs和obs
count:设置读写块的个数
skip=blocks:从输入文件开头跳过blocks个块后再开始复制
例1:
例2:
使用010Editor分离文件
选中文件16进制后保存为新文件即可
eg:Insert键可切换插入或替换模式
3、题目中有多个文件,需要将它们合并(文件合并)
Linux下的文件合并
命令格式:
cat [文件1 文件2 ...] > 输出文件名
eg:完整性检测(计算文件md5),命令格式如下
md5sum 文件名
Windows下的文件合并
命令格式:
copy /B [文件1+文件2+...] 输出文件名
eg:完整性检测(计算文件md5),命令格式如下
certutil -hashfile 文件名 md5
隐写术
文件内容隐写
文件内容隐写就是直接将flag以十六进制的形式写在文件中,通常在文件的开头或结尾部分。如果在文件中间部分,通常搜索关键字KEY或flag来查找隐藏内容
Winhex/010Editor
Notepad++
查看文件中可能存在的URL等隐写内容
图片隐写
图片隐写常见的隐写方法:
①细微的颜色差别
②GIF图多帧隐藏
- 颜色通道隐藏
- 不同帧图信息隐藏
- 不同帧对比隐写
③Exif信息隐藏(通过照片获取到GPS等信息)
④图片修复
- 图片头修复
- 图片尾修复
- CRC校验修复
- 长、宽、高度修复
⑤最低有效位LSB隐写(二进制最后一位)
⑥图片加密
- Stegdetect
- outguess
- Jphide
- F5
常用解题方法:
1、Photoshop
可以用于图层分解、帧分解等
2、Exif
windows可以直接右键属性查看exif信息
Linux命令如下:
exiftool 文件名
3、Stegsolve
Stegsolve可以用于通道分离、LSB分离、图像对比等
当两张jpg图片外观、大小、像素都基本相同时,可以考虑进行结合分析。即将两个文件的像素RGB值进行XOR、ADD、SUB等操作,查看能否得到有用的信息。
eg:有时候合并顺序不同,结果也不同,比如SUB操作
4、LSB(最低有效位)
LSB替换隐写基本思想是用嵌入的秘密信息取代载体图像的最低比特位,原来的的7个高位平面与替代秘密信息的最低位平面组合成含隐藏信息的新图形
可以总结为通过修改像素中最低位的1bit来达到隐藏的效果
一般使用工具:stegsolve、zsteg、wbstego4、python脚本
Stegsolve
zsteg
zsteg可以检测PNG和BMP中的隐写隐藏数据,在kali中需要先进行安装,安装命令如下:
gem install zsteg
检测LSB隐写命令
zsteg 文件名
wbstego4
解密通过lsb加密的图片(特别针对.bmp文件解密,也可以对pdf、txt进行解密)
eg:可以使用画图工具将文件转为.bmp文件
python脚本
某些情况下,常规解法无法解出时,就需要使用py脚本来进行解题
如使用以下py脚本解题:
5、TweakPNG检验CRC
TweakPNG是一个PNG图像浏览工具,它可以查看和修改一些PNG图像文件的元信息存储(针对PNG)。原理是根据图片的长宽高算出CRC校验值
使用场景:文件头正常却无法打开文件
首先排除CRC错误,利用TweakPNG检验CRC,如果错误,使用winhex进行修改,例:
当修改完CRC没有错误时,还没有想要的flag,就可能是图片的高度或者宽度发生了错误(将之前修改的CRC还原),通过最初的CRC计算出正确的高度或者宽度。
使用下面的python脚本可以计算高度或宽度,下图为PNG数据格式
eg:jpg数据格式(根据标记找到jpg修改宽高度的位置)
6、Bftools解密
Bftools用于解密图片信息
使用方式:在windows的cmd下,对加密过的图片文件进行解密
命令格式:
Bftools.exe decode braincopter 需要解密的图片名 -output 输出文件名
Bftools.exe run 上一步输出文件名
7、SilentEye解密
silenteye是一款针对将文字或者文件隐藏到图片的加解密工具(分析jpg和bmp)
使用方式:(新版中image为Media)
8、Stegdetect工具探测加密方式
Stegdetect工具主要用于分析JPEG文件。使用Stegdetect可以检测到通过JSteg、JPHide、OutGuess、Invisible Secrets、F5、appendX和Camouflage等这些隐写工具隐藏的信息
kali环境需先进行安装,安装命令如下:
apt-get install stegdetect
命令格式:(windows下加.exe)
stegdetect XXX.jpg
stegdetect -s 敏感度 XXX.jpgexi
-s:修改检测算法的敏感度,算法敏感度的值越大,检测出的可疑文件包含敏感信息的可能性越大,默认值为1
知道了是哪种方式进行隐写的,就使用相应工具进行解密即可
JPHide
jphide是基于最低有效位LSB的JPEG格式图像隐写算法
使用方式:
Outguess
outguess一般用于解密文件信息
Linux需在网上下载到其源码包,然后在关键目录下编译后再使用,编译命令如下:
./configure && make && make install
Linux下命令格式:(Windows工具有图形界面)
outguess -r 需解密的文件名 输出文件名
-r:解密
-k "key":如有密钥,需加上该参数
-d:加密
F5
F5一般用于解密文件信息(主要要调好java环境)
Windows下命令格式:
java Extract 需解密的文件名 -p 密码
9、二维码处理
eg:二维码黑白颠倒处理:使用画图工具直接取反
音频隐写
1、mp3stego
mp3stego主要用于mp3隐写
使用方式:
encode -E hidden_text.txt -P pass svega.wav svega_stego.mp3 //加密
decode -X -P pass svega_stego.mp3 //解密
-E:选择需要加密的文件 -P:密码(加密需要将密码放入wav文件) -X:选择需要解密的文件
压缩文件处理
1、伪加密
如果压缩文件是加密的,或文件头正常但解压缩错误,首先尝试文件是否为伪加密。
zip文件是否加密是通过标识符来显示的,在每个文件的文件目录字段有一位专门标识了文件是否加密,将其设置为00表示该文件未加密后,如果成功解压则表示文件为伪加密,如果解压岀错说明文件为真加密。
操作方式:从文件头504B0102的50开始数,一直到第九和第十个字节就是设置加密的字段,将其修改为0000(ZIP)
RAR文件由于有头部校验,使用伪加密时打开文件会出现报错,使用winhex修改标志位后如报错消失且正常解压缩,说明是伪加密。
操作方式:使用winhex打开RAR文件,找到第24个字节,该字节尾数为4表示加密,0表示无加密,将尾数改为0即可破解伪加密
2、暴力破解
可以使用ARCHPR.exe工具来破解zip文件
3、明文攻击
明文攻击指知道加密的ZIP中部分文件的明文内容,利用这些内容推测岀密钥并解密ZI文件的攻击方法,相比于暴力破解,这种方法在破解密码较为复杂的压缩包时效率更高
攻击方式:
有时候不一定能破解出文件口令,但能获取到加密秘钥,有可能加密秘钥就是flag
使用该方法需要注意两个关键点: 1、有一个明文文件,压缩后CRC值与加密压缩包中的文件一致 2、明文文件的压缩算法需要与加密压缩文件的压缩算法一致
可以使用好压来对明文文件进行压缩
4、RAR文件修复
有时候给出的RAR文件的头部各个字块故意给错,导致无法识别而少文件
下图为RAR文件快类型位置说明:
流量取证
这种题型通常比赛中会提供一个包含流量数据的PCAP文件,有时候也会需要选手们先进行修复或重构传输文件后,再进行分析
比赛中的流量分析可以概括为以下三个方向:
- 流量包修复
- 协议分析
- 数据提取
流量取证一般使用Wireshark工具对PCAP文件进行分析
Wireshark过滤
Wireshark工具常用的过滤命令如下:
Wireshark协议分级
当流量包的数据特别大和复杂时,可以使用协议分级统计功能,能够更好地分析数据(主要观察占百分比大的包)
Wireshark流汇聚
在关注的http数据包或tcp数据包中选择流汇聚,可以将HTTP流或TCP流汇聚或还原成数据,在弹出的框中可以看到数据内容
常见的HTTP流关键内容:
- HTML中直接包含重要信息
- 上传或下载文件内容,通常包含文件名、hash值等关键信息,常用POST请求上传
- 一句话木马,特征有:POST请求、内容包含eval、内容使用base64加密
Wireshark数据提取
自动提取http传输的文件内容(与文件分离相似)
手动提取文件内容
无线流量包
Wireshark协议分析发现只有wireless LAN协议,则很有可能是WPA或者WEP加密的无线数据包。这时我们可以用到kali中相关的无线工具
1、kali使用aircrack-ng检查cap包
命令格式:
aircrack-ng xxx.cap
2、aircrack-ng跑字典进行握手包破解
命令格式:
aircrack-ng xxx.cap -w 字典txt文件
USB流量包
USB流量一般考察项涉及键盘击键、鼠标移动与点击、存储设备的明文传输通信、USB无线网络传输内容等
USB流量分析
USB协议的数据部分在Leftover Capture Data域之中
USB鼠标流量规则如下图所示:
USB键盘流量规则如下图所示:
USB键盘流量抓取
使用wireshark提供的命令行工具tshark,可以将Leftover Capture Data数据单独复制出来
命令格式:(输出的文件中如果没有冒号,可以配合python脚本将冒号加上去)
tshark -r xxx.pcap -T fields -e usb.capdata > xxx.txt
之后使用python脚本对键盘数据进行相应转换即可
USB鼠标流量抓取分析
首先将Leftover Capture Data数据提取出,命令如下:
tshark -r xxx.pcap -T fields -e usb.capdata > xxx.txt
kali使用gnuplot工具把坐标画出来
gnuplot
plot "xxx.txt"
HTTPS流量
HTTPS流量是经过TLS协议加密过的,需要导入key才能看到原始的HTTP流量(key需要在题目中寻找)
导入key后会出现原始的HTTP流量
Crypto密码学
密码学概述
- 目的:为了保证数据传输的可靠性
- 核心:密码学(用于数据动态传输和静态存储)
编码
编码相当于有一张映射表
常见编码
ASCII编码
Base64编码
URL编码
Unicode编码
JS混淆
JSFuck
Jother
先将
{
和}
分别替换成[
和]
后再解密即可aaencode
直接在浏览器的控制台上解密即可
加密算法
RSA基本原理
公钥与秘钥的产生原理
加密消息的过程
解密消息的过程
常见的几种算法
换位加密:栅栏密码、曲路密码、列位移密码
栅栏密码
曲路密码
位列移密码
替换加密:凯撒密码、摩斯密码、ROT5/13/18/47、维吉尼亚密码、培根密码、键盘密码
凯撒密码
摩斯密码
ROT5/13/18/47
维吉尼亚密码
培根密码
这里注意培根密码有两种对应关系,分别为大写和小写的对应
键盘密码
其他密码:MD5、SHA(摘要)
摘要算法
摘要算法有两大特点:雪崩效应和不可逆
MD5和SHA主要应用领域:
Web基础
HTTP请求报文
http请求由三部分组成,分别是:请求行、消息报头、请求正文
请求行
请求行包括http请求的种类/方法、请求资源、http协议版本三个部分,以空格符(%20)分割,以回车换行符结尾(%0d%0a)
请求消息报头
请求消息报头说明了客户端的基本信息,以及如何与客户端进行交互,消息报头由多行组成,每行以key:value的形式体现,每行末尾包括一个回车换行符(0%0a0d),消息报头末尾以两个回车换行符(%0a%0d)作为结束
HTTP响应报文
http响应由三部分组成,分别是:状态行、消息报头、响应正文
状态行
状态行包括http协议版本、状态码、状态描述三个部分,以空格符(%20)分隔,以回车换行符结尾(%0d%0a)
响应消息报头
请求响应报头说明了服务端的基本信息、客户端如何处理返回的消息等,消息报头由多行组成,每行以key: value的形式体现,每行未尾包括一个回车换行符(%0a%0d),消息报头末尾以两个回车换行符(%0a%0d)作为结束
SQL注入
SQL注入介绍
SQL注入万能密码
从万能密码中可以看出SQL注入的基本原理及如何利用
自动化注入
有时候手工注入非常累且费时间,因此可以使用自动化注入工具,如椰树等工具
文件上传漏洞
介绍
如果WEB应用在文件上传过程中没有对文件的安全性进行有效的校验,攻击者可以通过上传Webshell等恶意文件对服务器进行攻击,这种情况下认为系统存在文件上传漏洞
上传绕过方式
前端JS校验
先将php后缀改为符合前端JS校验的后缀,再使用Burp截获上传操作,将后缀名再改为php放行即可
后端校验
使用burp拦截上传流,将请求消息报头中Content-Type的值修改为符合后端校验的文件格式即可
利用
最常见利用文件上传漏洞的方法就是上传网站木马(webshell)文件,webshell又称网页木马文件,根据开发语言的不同又分为ASP木马、PHP木马、JSP木马等,该类木马利用了脚本语言中的系统命令执行、文件读写等函数的功能,一旦上传到服务器被脚本引擎解析,攻击者就可以实现对服务器的控制
小马介绍
例:使用一句话木马控制服务器
首先准备好一个小马,这里以PHP为例,代码可以为如下:
<?php eval($_POST['gok']);?>
Eval函数可以将传入的内容作为php脚本执行
$_POST['v']
传入想要执行的代码
gok
是传递数据的参数,只有使用正确的参数名提交代码才能够被执行,因此也称为一句话木马的密码
利用上传漏洞将该PHP文件上传至服务器后,使用菜刀进行连接
连接成功之后可以对其文件、数据库进行操作,以及使用终端进行命令的输入
大马介绍
大马可以直接通过浏览器对服务器进行相关操作和管理