0x00 前言
对于各种各样的安全漏洞,经常会听到反序列化这个词,在攻击队外网打点过程中,它最常用的也是危害性最大的,可直接获取系统权限;内存马,也被称为无文件马,和落地的webshell文件马区别在于,内存马在服务器上不会有文件,而是利用中间件(tomcat、spring等等)去执行恶意代码。
将内存马和反序列化漏洞放一起是因为它们通常是绑定在一起的,即攻击者通过反序列化漏洞向服务器注入内存马,下面将逐一介绍反序列化漏洞和内存马,并通过实际例子(NC、Fastjson)去认识攻击过程,如使用漏洞去反序列化和注入内存马时数据包的特征,从而去检测与防护。0x01序列化数据
对于反序列化, Java在序列化时一个对象,会调用这个对象中的 writeObject 方法,将任何内容写入stream中;反序列化时,会调用 readObject ,也可以从中读取出前面写入的内容,并进行处理。
导致反序列化漏洞的就两点,反序列化的内容可控,并且存在通过各种函数调用关系最后去执行命令。对于各种调用关系可参考ysoserial,https://github.com/frohoff/ysoserial。
先来看下反序列化数据长什么样,一个简单的student类如下
import java.io.Serializable;
public class Student implements Serializable {
private String name ;
private int age ;
public Student(){}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
//省略set、get函数
}
Student{name=’jack’, age=18}0x02反序列化漏洞实例
通过上面student简单的例子,可以对序列化数据有初步的认识,攻击者在实际情况下反序列化的数据包肯定远不止这么简单,但是都有同样的特征。
用友反序列化漏洞的简单利用,使用工具进行反序列化攻击如下,直接回显。来看一下攻击时具体数据包形式,post的数据包请求体如下在十六进制下查看,以ACED开头以后的就是发送的恶意反序列化数据。
通常情况下流量采集设备会对这条流量告警,但是告警结果会显示尝试利用或者利用失败,至于漏洞是否攻击成功这就需人工去分析攻击数据包具体内容,该条流量执行的命令和结果在上面已经标识出。上面的例子数据包中直接为反序列化数据,在漏洞利用中除该种方式外,还有大量其他形式,如shiro反序列化漏洞中,反序列化数据在rememberMe字段中fastjson反序列化漏洞中,可以从远端服务器加载class,或者在bcel编码中
不管呈现形式是什么,最终的反序列化在十六进制呈现上都会以ACED开头。
0x03检测与防范
对于上述的各种攻击流量,攻击是否成功通常会依据请求头和响应体去判断,对于请求体需要还原出具体行为,响应体的话仅作参考,因为攻击者在反序列化后可以任意自定义响应体内容。
对于反序列化的检测防范,此处不以具体的反序列化漏洞来看,而是以它最后的行为——执行命令来判断。这需要监控服务器上的状态,这里利用一款产品椒图来测试。
使用开始的NC和fastjson执行命令,这里直接将命令用请求头传输,回显放在响应头里,实际情况下攻击者可以将其随意隐藏。都会触发了RCE利用告警,因为检测到了服务器执行了whoami操作。可以看到将进程树信息详细显示出,很清楚的看到服务器执行的whoami命令,并且是由用友这个服务引起的,这便可以精准定位到存在漏洞的web应用。
0x04内存马
内存马,也就是无文件webshell,检测难度较大,利用中间件(tomcat、spring等等)去执行恶意代码。适用场景为某些web应用为jar包启动,无web目录、想写文件找不到web目录绝对路径等。内存马的注入通常配合反序列化漏洞进行利用,如shiro反序列化漏洞、fastjson反序列化、weblogic反序列化等等;也有先上传落地文件,然后访问注入内存马的,这种其实没什么必要,暂时忽略。
一个最简单的内存马形式就是http://ip:port/shell?cmd=whoami,这里服务器上是没有shell这个文件的,通过访问shell这个uri并传入特定的参数,便可以执行命令。这里直接可以看到shell?cmd=whoami这个路径明显存在问题,实战下,内存马的访问路径与无关,可以是/css/style.css等静态资源文件的路径,也可以自定义为/userLogin这些极具迷惑性的路径,无论路径文件是否存在,只需要传入特定的请求给中间件即可,隐蔽性极高。
0x05内存马注入实例
fastjson反序列化漏洞注入内存马简单利用,这里直接用了写好的burp插件,payload和上述执行命令的类似,只是将执行命令改成了直接注入内存马。
0x06内存马检测
对于内存马这种情况,可以通过服务器日志或者流量采集设备去排查,可以看到存在大量对某一路径进行了POST请求,并且返回200,该路径也不是业务正常的使用。也可以用一些文件可以辅助检测内存马,java-memshell-scanner会扫描应用中当前路径所有的filter和servlet,显示出来,再进行判断。
通常情况在获取权限后攻击者会第一时间执行whoami和ipconfig去查看服务器的相关信息这样可以按照上述去检测最终在服务器上的行为——执行命令来判断是否被注入内存马,仍然使用椒图来测试。发现服务器存在可疑的命令执行ipconfig,然后配合流量采集设备或者中间件log日志去定位具体路径和恶意流量。0x07
国庆快乐!
监制:船长 策划:格纸 文案:铁子 美工:青柠