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. 冰蝎解决了“两大难题”
解决流量加密问题
冰蝎使用起来和传统的一句话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攻防对抗。
-完-