0%

红蓝对抗之webshell与ndr的博弈

总览

在某演练行动的大背景下,防守方主要以流量监控设备如友商的某眼等进行流量监控与分析。作为攻击队,如何不触发告警,万一触发了告警又如何防止被追溯行为,避免攻击已有进度被防守方清除等的技术是值得关注的,所以笔者结合在攻防两端的经验编写了以下文章,希望能抛砖引玉。

动态aes加密之冰蝎马的特征博弈

现目前的成品主要是冰蝎的动态aes加密马,能在一定程度上避免告警,但是冰蝎连接的流量存在以下特征

特征一:Accept字段

原版冰蝎的accept字段是特殊的

upload successful

对于监控设备而言只要抓取到这个特定的Accept字段就可以实现告警,为了避免触发监控设备告警,最简单的办法可以通过覆盖请求头的方式避免特征

upload successful

特征二:密钥协商过程

冰蝎的密钥协商过程如下

upload successful

请求的参数是单一的,参数的值是随机数,结合响应中的16位密钥即可作为流量监测设备的特征,即一组req和resp同时满足

1
2
3
4
5
req:
\.(php|jsp|asp|asa|jspx|aspx)?(\w){1,10}=\d(2,3)

resp:
\r\n\r\n[a-z0-9]{16}$

req包的特征

针对密钥协商过程,通过webshell代码可以注意到只要参数和设置的密码匹配,参数的值是无所谓的

upload successful

所以设置密码的时候可以采取业务侧常用的参数名,传递的值可以通过修改代码避免

源代码如下

upload successful

简单修改下即可避免正则对此处的检测

upload successful

resp包的特征

冰蝎上获取key的部分如下

upload successful

冰蝎webshell设置key的代码如下(以php为例):

upload successful

可以看出key是随机生成的16位字符串,可以采取修改传输方式的方法实现特征的消除,如通过cookie传输,这样可以绕过现有的冰蝎监测规则,这里就不贴具体的修改代码,建议自己定义。

防溯源

攻击者利用aes加密webshell躲避了ndr设备的监控后,由于涉及到后渗透,会进行其他存在危害的命令执行,如后门预留等,为了避免后续的一系列行为因为某个行为触发告警导致所有后渗透维持权限的工作被一窝端,所以需要考虑如何避免溯源人员发现攻击者通过webshell进行的一系列操作。

传递数据的防溯源

部分ndr设备的局限

部分ndr设备为了节省存储空间采用告警流量存储全包,未告警流量存储es字段的形式,同时由于为了保证前端页面的完整,一般会采用unicode编码编码字符,这会导致一个问题,unicode编码在对不可视的二进制内容编码时部分内容会遗失,由于没有全流量包,导致从es数据库中获取的data被unicode编码破坏,最终无法还原攻击者使用webshell的具体行为。

效果展示

由于无法直接截图设备,这里展示预期的流量,各位看官一眼多半就明白是什么意思

upload successful

相关的shell部分用php举例

upload successful

当然响应的数据也得用同样的加密方式,这里只是为了方便说明。

密钥防溯源

以ES框架为核心的问题

ES框架是适用于大数据搜索的数据库,数据一半以键值对存储,故会存在特定的键名来存储特定的字符,一针对http协议常见的键名有:cookies,xff,host,data,referer等,而其他冷门的http头可能会被忽略掉,导致无法获取动态的key,自然也无法解密流量。

简单来说,就是ES结构预先采集的字段是写死的,如下

upload successful

在这种情况下只要动态密钥规避掉预制的字段,就能不被记录。预期采用自定义头去做,但是具体的服务端怎么实现还没找到很好的办法,先提个思路在这儿吧。