随便写点之前做流量分析总结的经验,不保证有用,欢迎各位补充捏
总的来说咱目前遇到的流量分析可以大致分为3类:渗透流量,工控流量和其它流量(问就是自己瞎起的名字)
渗透流量主要就是指做渗透的时候抓包得到的流量,做这一类题目需要一定的Web知识,至少得会一点基础的php代码审计,这类就主要和TCP打交道
工控流量主要都是和Modbus协议相关的流量,主要大概是看协议下进行的操作指令
其它流量种类比较多,包括但不限于5G传输协议,USB协议,SMTP协议等,具体情况还得需要自行分析
工具使用
主要工具自然是Wireshark,不过有的时候得用到tshark,下面会提及
大量数据提取
有的时候流量包过多,直接用手收集需要的数据太麻烦了,这个时候就可以用下面的tshark指令:
1 | tshark -r 流量文件名 -Tfields -Y 过滤器 -e 需要提取的数据 > 输出文件名 |
比如DASCTF 2021八月赛的stealer,里面是DNS流量分析,请求的DNS前面是Base64,我需要提取出所有的Base64,但是数据太多了,那我可以这样做:
1 | tshark -r dump.pcapng -Tfields -Y "dns && ip.src == 172.27.221.13" -e 'dns.qry.name' > data.txt |
当然,提取出来的数据可能还会因为自己的一些疏漏而出现问题,这个时候可以人工拉出来,或者优化一下过滤器
有关过滤器
使用Wireshark要灵活使用过滤器,可以节省大量流量审计时间
如果发现有想检索的参数,但是忘记它的过滤器该怎么写,可以这么办:
比如:我想检索所有TCP Acknowledgement Number为1953的流量包,但是我不知道/忘记怎么写过滤器了:
左下对着对应的参数右键,光标移到”作为过滤器应用“或者”准备作为过滤器“处,右侧选项栏的最上面那栏就会告诉你对应的过滤器参数,非常好用,屡试不爽(笑死了,直接点下面选中就行了,如果过滤器已经有参数了就可以根据情况选“且选中”和“或选中”了)
其实点击选中字段之后,Wireshark左下角就会显示它的过滤器和字段长度,也可以利用一下
然后有一些过滤器参数非常好/常用,这里稍微记录一下,如果还有遇到/想起来其他的还会更新:
ip.addr,ip.dst,ip.src
分别是address,destination,source的意思,可以很方便地过滤特定IP发送/接收的流量
其中ip.addr == ***等价于 ip.src == *** && ip.dst == ***
_ws.expert
常用于提取异常/错误流量包,目前咱比较常用的是_ws.expert.severity和_ws.expert.group,错误包常用_ws.expert.group == “Malformed”;severity过滤视具体情况而定,通常”Note”和”Chat”会忽略
提取异常/错误流量包是因为可能题目是在这类流量包里面隐藏了信息,做题的时候可以稍微关注一下左下出现高亮颜色的参数,那个参数可能就是问题所在
http.request.method,http.response
毕竟有很多渗透流量,所以提取出特定方法的请求&响应的流量还是蛮有用的,就比如我想过滤出POST方法的流量,我就直接http.request.method == POST,就直接出来了,响应就直接http.response,如果是想过滤出返回特定状态码的话就http.response.code == (你需要的状态码) 就行了
一些杂七杂八的要点
除此之外,跟踪流也是非常好用的一个功能,在上面已选中的流量那里右键,光标移到”追踪流“,然后选择想要追踪的流,之后的弹窗就可以显示所有与选中流量同样流下的流量,非常有利于分析流量
还有一件事:那些长度较大的流量需要额外关注下,可能这些流量传输了一些重要的文件,这个时候需要观察相对较近的TCP/UDP流量中是否也在传输大量的数据,因为可能文件太大,需要分段传输
渗透流量
如最开头所说,这类流量常和TCP/IP协议打交道,所以主要还是要看HTTP流,因此除去PHP代码审计能力,还需要一些基础的HTTP/CSS知识,至少得能分清楚哪些是CSS
一般Webshell都会用POST方法传一个马上去,当然也不排除有些题目省去了传马的过程,不过POST方法下的流量还是值得拉出来看看的
目前常用的渗透工具有蚁剑,冰蝎,CobaltStrike,哥斯拉,中国菜刀等,本文先讲解一下前两个工具的流量特征,剩下的之后有空了会再补充的
蚁剑流量分析
这里使用AuroraCTF2022 Webshell2举例
关注到POST了一个shell上去,shell是经过Base64加密过的,这里我们解密一下:
得到的就是蚁剑的混淆,重点关注asenc函数和asoutput函数:
1 | function asenc($out){return @base64_encode($out);}; |
很明显,asenc是把传进来的$out参数进行Base64加密,而asoutput是先获取原先马里的内容,然后再输出”6cc7”和”435d5”,输出经过asenc(Base64)加密过的马,然后输出”d36cfa”和”879e0a”
换言之,就是这样的情况:混淆数据1 + Base64后的马 + 混淆数据2,之后返回的数据就是这样的一个格式,所以删掉混淆数据然后B64解个码就结束了
这就是蚁剑的流量混淆过程,之后基本上就是PHP代码审计了,这方面还请请教那些Web神,咱就一摆烂的Misc,啥都不会
冰蝎流量分析
这里使用忘记哪次DASCTF的题目New Grating举例
看一开始的upload_file.php
1 |
|
Wireshark没法直接输出UTF-8的中文,所以我这里稍微转了一下码
冰蝎最重要的流量特征就是这个AES128和这个$key,iv默认是0x0,但是视情况而定,主要还是看混淆流量里面有没有额外的操作
接下来就是分析一下冰蝎的流量混淆过程:
总体上,冰蝎是这样的一个流程:明文→Base64→AES128→Base64→流量数据,而解码的时候由于冰蝎是先把马B64然后套个eval再进行接下来的操作的,所以解密的时候最好是开着两个窗口,一个负责先B64解密和AES128解密,另一个把eval里面的马B64解密
上面的没搞错应该是冰蝎3.0的默认加密,冰蝎还自带一些其它的加密,比如default_aes,default_xor等,这里先把default_aes的shell.php拉出来:
1 |
|
和上面的其实差不多,就是这个shell是对上传的参数进行一个Decrypt操作,其中的openssl_decrypt里面的参数就告诉了我们参数是如何加密的(逆推一下就行了):
对Base64解密后的$data进行解密后以$key作为key,AES-128-ECB作为加密格式,PKCS1作为Padding进行解密,所以加密就是先AES再Base64,解密就是Base64再AES,和上面其实区别不大,iv也是默认0x0,但是不保证$data里面的东西一定没有Base64,不过各位应该还是能够看出来的吧
default_xor之类的等之后什么时候再补充
天蝎流量分析(Under Construction)
据说有些红队会使用天蝎进行webshell利用,
工控流量
太久没做了,就只记得一个Modbus,还有一些读写线圈的操作,之后做到相关的题目再补充一下吧,当然欢迎各位扔给我有关工控流量的题目(进行一个坑的挖)
(目前手上还有个20W+的工控流量,但是没有明确的flag,等之后有空慢慢看吧இ௰இ)
其它流量
这一部分只是因为咱实在懒得分了www
USB流量分析
USB流量分析大多数是有关键盘和鼠标的,主要还是看USB URB下的HID Data
HID有4个字节,但是会由于鼠标的不同有所差异(比如咱惠普的游戏鼠标,就有7个字节),这里给一下常见的鼠标流量,来源CTF中我的USB键盘鼠标流量解密指南和脚本 - FreeBuf网络安全行业门户:
第一个字节代表按键,当取
0x00
时,代表没有按键、为0x01
时,代表按左键,为0x02
时,代表当前按键为右键。第二个字节可以看成是一个 signed byte 类型,其最高位为符号位,当这个值为正(小于127)时,代表鼠标水平右移多少像素,为负(补码负数,大于127小于255)时,代表水平左移多少像素。
第三个字节与第二字节类似,代表垂直上下移动的偏移。
第四个是扩展字节,关于滚轮的操作记录
- 0 - 没有滚轮运动
- 1 - 垂直向上滚动一下
- 0xFF - 垂直向下滚动一下
- 2 - 水平滚动右键一下
- 0xFE - 水平滚动左键单击一下
键盘流量如下,来源同上:
字节下标(我还没发现这个在哪儿)
- 0 : 修改键(组合键)
- 1 : OEM 保留
- 2~7 : 按键码
BYTE1
- bit0: Left Control 是否按下,按下为 1
- bit1: Left Shift 是否按下,按下为 1
- bit2: Left Alt 是否按下,按下为 1
- bit3: Left WIN/GUI 是否按下,按下为 1
- bit4: Right Control 是否按下,按下为 1
- bit5: Right Shift 是否按下,按下为 1
- bit6: Right Alt 是否按下,按下为 1
- bit7: Right WIN/GUI 是否按下,按下为 1
BYTE2 - 暂不清楚,有的地方说是保留位
BYTE3-BYTE8 - 这六个为普通按键
0b10(0x02) 和 0b100000(0x20)都是按下了shift键
这类题主要还是靠脚本做,但是了解一下自然是好的
Net-NTLM流量分析(哈希爆破)
由于SMTP这种邮箱传输真没啥好讲的,这里就跳过吧(bushi)
NTLM是Windows下的一个安全认证协议,原因是Windows内部只存储明文密码的哈希而非明文密码本身,交互流程大致分为协商(Negotiate)→质询(Challenge)→身份认证(Auth)这三步,具体实现可以参考这篇文章
那么我们知道了哈希算法,有一个字典,不就可以用字典哈希爆破了吗(笑)
这里以Net-NTLMv2哈希爆破为例,我们先获取以下信息:
- username
- domain
- ServerChallenge
- NTLMv2response(最开头处16个字节为NTProofstring)
其中除了ServerChallenge在质询流量包中可以找到,其余的信息都在身份认证流量包里面可以找到
然后我们按照这样的格式排列上述信息(假如保存在一个叫crackme.txt文件里)
1 | username::domain:ServerChallenge:NTProofstring:NTLMv2response_without_NTProofstring_at_front |
然后假如我们确认密码在rockyou字典里面,那我们可以用hashcat进行哈希爆破:
1 | hashcat -m 5600 crackme.txt rockyou.txt |
5600指的是Net-NTLMv2,5500是Net-NTLMv1,两个需要的信息不一样,Net-NTLMv1需要的是:
1 | username::domain:ANSI Password:Union Password:Challenge |
感谢爹地qsdz提供的半自动化脚本(此处以geekchallenge2023 窃听风云为例),以后可以不用瞪眼法做这种题咯(这就回去补scapy)
1 | import base64 |
5G传输协议流量分析(以NAS-5GS为例)
(只能说是不懂装懂了www)
只凭借咱浅薄的理解,整个NAS-5GS的流程大致可以分为配置→注册请求→认证→协商→通信这几步,这个协议下的参数巨多,要翻起来真的头都大,就稍微简单讲讲好了
首先是NG Setup,擦除NG-RAN节点和AMF的应用程序级别配置数据,并替换为接收到的数据,同时清楚NG-RAN节点上AMF超载状态信息;如果里面出现错误(如国家与网络运营商参数识别错误),可能导致无法正常进行UE注册请求
然后就是UE注册请求,其中包括了所支持的加密和完保算法,5GS注册类型,NAS key设置等信息,当然如果不支持至少一个加密和完保算法的话,UE会以5GMM Cause: UE security capabilities mismatch拒绝注册请求
注册完成后如果开启UE安全模式,就是进行密钥的协商,即确认最终使用的加密和完保算法
之后InitialContextSetup后就开始通信了
蛮复杂的,协议完全看不懂QAQ,不过大致也能明白个七七八八…吧?
TLS流量分析(Under Construction)
ADS-B协议分析
前段时间强网杯看到的,一坨TCP流量,目前忙着搞期末没时间鼓捣,等放假有空再说(挖坑)
前面的区域,等想起来还有啥再探索吧~
- 本文作者: 9C±Void
- 本文链接: https://cauliweak9.github.io/2023/11/21/FlowAnalysis/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!