查看原文
其他

从流量加密到内存攻击:冰蝎Webshell的狂飙式发展

yps233 青藤智库 2023-03-26

赛博空间,攻防之战,此起彼伏矛与盾的对决,攻与守的碰撞在这里,我们一起来看道德黑客使用了哪些杀手锏正义蓝军如何见招拆招

冰蝎是一个Webshell工具,在每年的攻防演练中,都是攻击队武器库中必不可少的一个大杀器。而且,随着攻防双方激战不断升级加剧,冰蝎每年都会在攻防演练开始后进行版本更新,每次更新都让防守方手忙脚乱。在2022年的攻防演练开始后,冰蝎更新了4.0版本,随后蓝队红队、甲方乙方都马上开始研究,重视程度不言而喻。本文就来分析一下冰蝎横空出世的背景,以及如何在几年时间内经历狂飙式发展到和webshell几乎等价的,以及冰蝎带来的颠覆性变化。

Webshell

1. 冰蝎横空出世

Webshell作为一种web渗透常用的方法可谓家喻户晓。随着攻防对抗不断升级,攻击方在使用webshell过程中,也遇到了一些挑战:

挑战1:jsp webshell灵活性很差

Java是最流行的业务开发语言,其与php/asp/aspx最明显的区别是,后三种语言都有一个eval函数,可以把任意字符串作为代码执行,同时也有能执行系统命令的函数,比如php的system();而java只能使用Runtime.exec()执行系统命令,无法把字符串作为代码执行。换言之,想要执行java代码,只能重新传一个新的webshell,比如在上传了一个一句话木马后,攻击者想挂载一个web代理,就只能重新再传一个代理的webshell。

挑战2:急需全自动的流量对抗机制   

随着流量对抗越来越深入,WAF越来越普及,不做流量加密,Webshell几乎没有使用的机会。举例而言,一般的一句话webshell连接流量如下:

虽然部分流量做了base64编码,但仍有非常多的特征可以被检测到。若要不被检测到,则需要流量中只有纯粹的二进制字符串,且每次都不同。


在这种背景下,冰蝎1.0横空出世。


Wehbshell

2. 冰蝎解决了“两大难题”

解决流量加密问题   

冰蝎是典型的C/S架构,需要配套使用,冰蝎的webshell是服务端,jar包是客户端,这也是流量对抗的必然结果。自动化流量加解密,用来解决挑战2,其工作流程如下图所示。

冰蝎使用起来和传统的一句话webshell、中国菜刀的方式没什么区别,但冰蝎自动封装了流量加密。冰蝎在第一次请求时会协商密钥,后面所有的流量不管是请求还是响应,都是加密后的纯二进制字符串。但第一次协商密钥的请求还是带有一定特征,因此,冰蝎3.0时去掉了预协商机制,使用预共享密钥,即把密钥写死在webshell中,在客户端连接时手动输入,实现了全流量加密。

解决Jsp Webshell不灵活问题   

流量加密本身并不难,很多自己开发的工具也实现了类似效果,但冰蝎创造的一句话webshell颠覆了Java攻防,直接把Java攻防技术推进到下一个时代。


Java中没有提供把字符串当做代码执行的接口,但代码总归是要执行的,Java的代码执行都是基于JVM虚拟机和Class文件,简化步骤如下:

1. JVM收到执行请求,将Class文件的字节码加载到内存

2. 对字节码进行解析,得到一个java.lang.Class对象

3. 通过java.lang.Class对象,调用里面的方法


冰蝎的作者提出,不能直接把字符串格式的代码发过去执行,那可以发class字节码,让服务端去解析,然后执行。笔者认为这里有三个关键思路:

* 服务端动态加载Class执行

* 巧妙调用equal()方法传入上下文的requset和response

* 客户端动态修改Class文件中的属性值

在原作者的文章中都有详细分析 https://xz.aliyun.com/t/2744

综合下来,这种方法变相实现了Java任意代码执行,也把类动态加载这个关键技术摆在台面上。同时由于.Net架构和Java很相似,同样的思路在asp/aspx上也能实现。例如,下面的asp Webshell源码也可以实现类似效果:

冰蝎1.0发布后,原来Runtime.exec()的Jsp一句话webshell被扔到了垃圾桶,无论是使用冰蝎,还是修改冰蝎,或者手写新客户端,Jsp和Asp的Webshell都脱离不开冰蝎的基本模式,冰蝎开始替代一句话木马成为Webshell技术最常讨论的话题。


Webshell

3. 冰蝎3.0:内存攻防时代

随着冰蝎的不断更新,功能越来越完善,到3.0已经具备了红队需要的各种功能,特别是反弹shell的msf和cs上线,以及自定义代码执行,灵活性很强。基本做到开箱即用且功能齐全,唯一的问题是,工具流行之后,webshell本体容易被查杀,需要做webshell本体的免杀。

由于冰蝎把类动态加载这个关键技术摆在台面上,在一段时间的研究后,Java内存马已经有了很多可用的思路,比如新增filter,只从内存操作,不依赖落地文件,就能访问到内存中的Webshell,这就解决了webshell本体免杀问题。


这种情况下冰蝎更新v3.0 beta7版本,增加了Java内存马功能,并且使用了更高级的Java Agent技术,通过hook Java进程中原本正常的类,实现内存马功能,并在beta8增加了内存马防查杀机制。

至此,冰蝎成为了一个完美的开箱即用的工具,本体内存马免杀,流量免杀,功能齐全,兼容性好,在连续几年的攻防演练中,成为最热门的工具。


Webshell

4. 冰蝎4.0:流量加密再上新高度

在去年的攻防演练中,冰蝎更新了4.0版本,增加了webshell生成功能,可以完全自定义流量加密方法,对流量加密的灵活性又大大增加。

因此,目前在webshell工具领域,冰蝎独占鳌头。在去年的攻防演练中统计到的webshell有效攻击中,有80%都是使用的冰蝎或冰蝎变种,足以证明冰蝎的强大功能。


Webshell

5. 冰蝎的检测

冰蝎虽然强大,但也只是一个工具。在实战应用,总是需要一个入口,无论是先上传webshell再注入内存马,还是直接用漏洞注入内存马,总是有一些痕迹。在检测冰蝎时,主要有两个思路:

1. 对于先上传webshell的攻击,按照传统的webshell落盘检测即可。攻防对抗的关键主要在于文件落盘时间短,能否抓到对应文件。

2. 对于内存马的检测,这是目前攻防对抗的主战场。常用的检测机制是java agent,目前也已经有了很多使java agent无效的对抗方案。


目前青藤万相的webshell和内存后门功能已在上面这两方面覆盖了对冰蝎4.0的检测。


检测思路1:利用传统的字符串匹配与文件相似度检测,针对执行函数和类加载函数进行字符串匹配。

检测思路2:青藤雷火·AI Webshell检测系统,将动态检测方法和AI推理相结合,把复杂的变形和混淆回归成等价最简形式,也就是使用函数执行外部输入的代码,或者加载外部输入的字节码,还原后用AI推理的方式给出结果。

关于作者:

yps233:青藤73lab实验室成员,主要研究webshell和内存webshell攻防对抗。


-完-

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存