主流webshell工具流量初探
蚁剑流量分析
一、首先服务器写入一句话,密码为pass,连接抓包。默认为明文:
眼花缭乱,捋一下,首先是对返回输出结果进行加工的部分:
在结果前后各加些随机字符进行扰乱 :
接着对当前路径及当前系统进行判定,遍历所有盘看有几个磁盘,获取当前用户等:
再执行个命令看下:
结果中头尾都加了相应的随机字符串。这个也是waf规则之一,取值范围都是固定的,关于修改:
- 可以通过在编码器中,修改代码来定义首尾的随机数目及范围,可以每次随机产生不同位数
- 在设置中自定义,不过每次都是固定的
其中会传递三个参数:这里截取X位可以自定义设置:
这里截取X位可以自定义设置
去掉wU两位,Y21k就是cmd的base64。可以说特征是比较明显了:
二、关于编码、解码器:
编码器:对发送的流量进行编码,服务端进行解码。
解码器:服务端对返回的流量进行编码,客户端通过解码器进行解码还原。
蚁剑提供了base64、chr、chr16、rot13四种编码方式,和base64、rot13两种解码方式:
1. 我们设置base64看抓包结果:
变量值进行了base64加密。逻辑是执行pass这条语句,也就是base64解密并执行上面这一大堆代码。套娃??和菜刀的源码差不多。
2. 设置rot13编码看一下:
进行url解码看到发送的rot13函数:
进行在线解密看到是和之前一样数据包:
3. 关于rsa编码:
蚁剑可以自定义rsa编码,原理是先用生成的私钥对发送数据进行加密,服务端再用脚本里的对应公钥进行解密。
使用前提:目标php要开启openssl(开启openssl方法:在配置php.ini中
搜索extension=php_openssl.dll,取消前面分号,重启web服务)
连接shell、抓下流量:
发送内容进行了加密,不过返回包还是明文。这个后续就需要我们对结果进行加密返回,再配合解码器进行解码。
冰蝎2流量分析
先看下webshell对数据都做了哪些操作:
特征是连接会get方式向服务端请求密匙。
附一张经典图及过程(来自网络):
- 首先客户端以Get形式发起带密码的请求。
- 服务端产生随机密钥,将密钥写入Session并将密钥返回客户端。
- 客户端获取密钥后,将payload用AES算法加密,用POST形式发送请求。
- 服务端收到请求,用Session中的密钥解密请求的Body部分,之后执行Payload,将直接结果返回到客户端。
16位长度字符特征,每次新连接都是get获取两次、之后正常通信。为什么是两次呢?
(参考:http://t.zoukankan.com/0daybug-p-12749547.html)
后续发送的数据包是通过密匙进行加密的,所以我们反向用到的密匙进行aes解密,发现是base64编码,再base64解一次即可看到传输的内容:
整理下结果,从发送的内容看,是对返回的json字符串进行aes128加密:
以下为返回包解码后内容:
其他特征:
- 不论是get还是post请求,Content-Type字段总是application/x-www-form-urlencoded。常理来说,Get请求一般没有这个字段值。
- Accept字段与正常请求有差异,比较奇怪,这是源码默认值导致的。
冰蝎3流量分析
webshell相比2代取消了密匙的交互,改为直接写到webshell里:
执行过程是客户端post传输数据,webshell通过用key进行aes加密的流量。
以执行whoami命令为例,aes解密后关键代码如下:
进入路径通过一系列函数执行我们的命令,最终将结果以aes128加密的json格式返回,这点和2代一样。
对返回结果解码可得:
流量全程通过aes加密,下面是天眼流量告警展示:
看其他师傅说还有些强特征如content-type为application/octet-stream:
可惜我这里没有抓到,可能是新版本修改了吧。
哥斯拉流量分析
先看下生成的种类,php异或加密:
第一个就是最简单的一句话。我们选第二个复杂一些的看看。秒了,暂且加白:
特征是连接时会发3个数据包,第一个数据包巨大,并且返回内容为空:
后续请求都是较少的流量。统一开头都是明文pass,也就是我们设置的密码:
从webshell里可以看到,将post的数据进行base64解码,再通过加密函数与key值进行异或运算:
那我们提取函数解密看下发送了什么内容吧:
第一次发送的包进行解码,代码中集成了很多函数及功能:
第二个包内容:
第三个包内容:
第二个包是测试用的,除了首次包集成了很多功能,后续执行发送很小的流量,返回包也严格做了加密。
前后各16位key和pass MD5后生产的固定字符串。
天眼设备流量告警展示:
