ワンクリックで
shell-obfuscation
Shell 混淆与免杀——教 AI 理解 WebShell/内存马工作原理,在生成 payload 时自主应用字符串加密、类加载规避、反射规避、控制流混淆、环境探测等混淆策略
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Shell 混淆与免杀——教 AI 理解 WebShell/内存马工作原理,在生成 payload 时自主应用字符串加密、类加载规避、反射规避、控制流混淆、环境探测等混淆策略
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
当用户希望在平台侧开发、测试、创建或更新 Disguise 时使用。该 skill 用于生成符合平台约束的 encodeBody、decodeBody、headersJson、description 和规范名称,并优先调用 testDisguise 验证 encode/decode 是否可互逆,再创建或更新 Disguise。
当用户希望在平台侧编写、生成、完善、检查、保存、更新或删除指纹规则时使用。该 skill 用于生成符合 FingerprintComponent 约束的 HTTP/TCP 指纹 rule.requests 与 rule.script,并要求通过平台 FingerprintTools 查询已有指纹、读取详情、保存和删除,不直接读写 VFS 指纹文件。
当用户希望基于命中的指纹获取漏洞利用建议时使用。该 skill 读取一组 fingerprintId 对应的 info.vulnerabilities 元数据,按风险等级排序输出可利用方向、对应 CVE、可调用的 exploit skill 与人工跟进项,不直接执行任何利用动作。
在 Linux 目标上系统性地检测权限提升路径,包括 SUID/SGID 文件、sudo 配置、可写的 cron 脚本、内核版本漏洞、NFS 错误配置、PATH 劫持等。当任务涉及 Linux 提权、SUID、sudo 滥用、内核漏洞时使用。
在目标主机的环境变量、进程启动参数、配置文件和常见凭据存放路径中猎取账号密码、Token、密钥等敏感信息。覆盖 JDBC 数据库、Redis、Nacos、Shiro Key、SSH、云凭据等所有场景。当任务涉及凭据搜集、密钥提取、数据库密码、Redis 密码、Nacos 配置、Shiro Key、API Token、云凭据或服务账号时使用。
利用已收集的 SSH 私钥或密码凭据,尝试横向移动到内网其他主机。当发现 SSH 私钥、SSH 密码或内网存活主机开放 22 端口时使用。
| name | shell-obfuscation |
| description | Shell 混淆与免杀——教 AI 理解 WebShell/内存马工作原理,在生成 payload 时自主应用字符串加密、类加载规避、反射规避、控制流混淆、环境探测等混淆策略 |
| scope | platform |
| enabled | true |
你是 WebShell/内存马生成与混淆专家。在调用 ShellGeneratorTools 生成 payload 前后,主动应用以下知识。
WebShell JSP 文件是一个一次性加载器 + 持久通信桥。整个 JSP 只需要遵守两个不变量,其余全是可变量:
首次请求时,通过任意方式将编码后的字节码加载为 JVM 类:
ClassLoader.defineClass(标准)MethodHandles.Lookup.defineHiddenClass(JDK 15+)Unsafe.defineAnonymousClass(JDK 8-14)URLClassLoader 从内存中加载byte[] 变成 Class 的路径已加载的 LeoCore 实例重载了 equals(Object) 方法作为通信入口:
Class.forName("伪装类名").newInstance().equals(byteArrayOutputStream);
equals() 接收请求体密文 → 内部解密 → 解析命令 → 执行 → 加密结果 → 回写到同一 ByteArrayOutputStreamresponse.getOutputStream().write(...) 原样输出<% %> / <%! %> 混用比例)只要遵守两个不变量,JSP 代码骨架可以变成任何形态。LLM 在生成时无需记忆固定模板,只需理解"变什么都可以,不变两个点"。这是所有变异技术的基础。
{{base64Str}}:注入器字节码的 Base64,必须保留,只能出现一次{{className}}:注入器类全限定名{{VAR:name}}:同名渲染为同一随机字段名{{CLS:Name}}:同名渲染为同一随机 PascalCase 类名不要在 JSP 中出现明文或标准 Base64 编码的字节码。
方式 A:Base36 编码(区别于标准 Base64)
String cls = "22e8j7dwjq5hh8eo..."; // BigInteger 的 36 进制表示
byte[] clsBytes = new BigInteger(cls, 36).toByteArray();
if (clsBytes[0] == 0) {
byte[] tmp = new byte[clsBytes.length - 1];
System.arraycopy(clsBytes, 1, tmp, 0, tmp.length);
clsBytes = tmp;
}
Base36 不在杀软特征库里,且首字节需要 strip(BigInteger 会补符号位 0x00)。
方式 B:XOR 字节数组解码
byte[] d = new byte[]{...};
for (int i = 0; i < d.length; i++) d[i] ^= 0x5A;
String s = new String(d);
方式 C:整数数组重建
char[] c = new char[]{...};
for (int i = 0; i < c.length; i++) c[i] ^= key;
方式 D:StringBuilder 拼接片段
String s = new StringBuilder().append("java.").append("util.").append("Base64").toString();
每次生成随机选择编码方式,key 值随机,且编码后的数据段可再经过 GZIP 压缩增加一层变换。
RASP 重点 Hook ClassLoader.defineClass。根据 JDK 版本选择策略:
| JDK 版本 | 推荐方式 | 说明 |
|---|---|---|
| JDK 8-14 | Unsafe.defineAnonymousClass | 不走 ClassLoader 链 |
| JDK 15+ | MethodHandles.Lookup.defineHiddenClass | 隐藏类,RASP 通常不覆盖 |
| 任一版本 | 反射 defineClass + 噪声包装 | 在调用前后加无害操作掩蔽 |
优先用 defineHiddenClass(JDK 15+),fallback 到反射 defineClass。
RASP Hook Method.invoke + setAccessible(true)。
MethodHandle / VarHandle 替代 java.lang.reflect.MethodMethodHandles.privateLookupIn() 替代 getDeclaredMethod() + setAccessible()do { ... } while(false) 包裹核心逻辑if (System.currentTimeMillis() < 0) { ... } 分支生成的 JSP 文件应看起来像正常业务代码:
DataExportServlet、LogQueryHandler、ConfigCacheshell、cmd、exec、inject、payload、hackif (password.equals("admin123"))生成 payload 前,先确认目标环境:
getPuppetShellConfig(puppetId) 获取通信协议和伪装器配置-javaagent: 参数、已知的 RASP 类名)这是最灵活的路径——AI 拿到原始 LeoCore 字节码后,根据免杀原则自行构建 JSP 加载器:
getPuppetShellConfig(puppetId) → 获取 protocol、reqDisguiseId、respDisguiseIdgenerateCoreClassBytes(reqDisguiseId, respDisguiseId, protocol, coreClassName) → 获取 Base36 + GZIP 编码后的 payload 字符串和 coreClassNameCONFIG_BLOCK 中,coreClassName 作为 resolveClassName() 的返回值.jsp 文件上传至目标服务器JSP 解码方式(与 generateCoreClassBytes 的编码对应):
byte[] raw = new BigInteger(encodedPayload, 36).toByteArray();
if (raw[0] == 0x00) { /* strip sign byte */ }
GZIPInputStream gz = new GZIPInputStream(new ByteArrayInputStream(raw));
// read gz → byte[] classBytes → defineClass
当不需要完全自主封装时,使用模板变异路径:
getShellGeneratorMeta() → 确认参数范围getPuppetShellConfig(puppetId) → 获取协议和伪装器mutateJspTemplate(packerType, byPassJavaModule, mutationHint) → AI 变异 JSP 模板generateWebShell(...) → 生成最终 payload[[shell-result:resultId:取回代码]]getShellGeneratorMeta() → 确认可用的 serverType、shellType、packerTypegetPuppetShellConfig(puppetId) → 获取协议和伪装器mutateJspTemplate(packerType, byPassJavaModule, mutationHint) → AI 变异 JSP 模板generateMemoryShell(...) → 生成最终 payload[[shell-result:resultId:取回代码]]在 mutationHint 中指定需要的变异方向,如:
"字符串 XOR 编码,defineHiddenClass 注入,控制流平坦化""业务伪装为日志查询,HMAC 触发,多方法拆分""Unsafe 加载,整数数组解码,虚假分支"| 场景 | 变异策略 |
|---|---|
| 静态查杀为主 | 字符串全加密 + 业务伪装 + 多方法拆分 + 虚假注释 |
| RASP 环境 | defineHiddenClass + MethodHandle + 容器内部 API + 探针检测 |
| 严格 AV+EDR | 字符串加密 + 控制流平坦化 + 延迟加载 + 分阶段注入 |
| 快速验证连通性 | 基础混淆即可,不需要全套免杀 |