// ============================================================================= // MeshSafe L2B YARA 规则集 — Webshell 专项(C3) // ============================================================================= // // 设计原则: // - 所有规则使用 2-3 个特征组合命中,避免单一关键词导致误杀 // - 光闸场景误报代价极高(阻断合法文件传输),宁可漏报不轻易阻断 // - 命中后作为 finding 交给 PolicyEngine 权重累加,不直接零容忍 // // 元数据规范: // risk_level = critical | high | medium | low // category = "C3" // false_positive_rate = low | medium | high // // 维护: // - 新 Webshell 工具/变体出现时,优先新增"工具特征"组合规则 // - 纯 PHP/JSP 反序列化 payload 单特征也可能有价值,但组合原则仍适用 // ============================================================================= // ============================================================================= // PHP Webshell —— 一行马 / 变形马 // ============================================================================= // PHP 一行 eval($_POST) 组合(常见的菜刀/蚁剑/冰蝎基础形态) // 单一 eval + $_GET/$_POST 误伤太大,必须"动态执行入口 + 用户输入 + 输出回显"三点组合 rule C3_PHP_Webshell_Oneliner { meta: risk_level = "critical" category = "C3" false_positive_rate = "low" reference = "OWASP Web Shell Cheat Sheet" description = "PHP 一行 Webshell:eval + 超全局变量 + 输出回显 组合命中" strings: $entrypoint = /eval\s*\(\s*\$\s*_(GET|POST|REQUEST|COOKIE)\s*\[.+\]\s*\)/ ascii // 备选入口:assert / create_function / preg_replace / system $entryp2 = /assert\s*\(\s*\$\s*_(GET|POST|REQUEST)/ ascii $entryp3 = /create_function\s*\(\s*['"]['"]\s*,\s*\$\s*_(GET|POST|REQUEST)/ ascii // 回显手段:print / echo / var_dump / die $echo = /print|echo|var_dump|die/ ascii condition: ($entrypoint or $entryp2 or $entryp3) and $echo } // PHP Webshell —— 多层解码(base64 + gzinflate + str_rot13) rule C3_PHP_Webshell_Obfuscated { meta: risk_level = "high" category = "C3" false_positive_rate = "medium" reference = "典型 Webshell 变形手段" description = "PHP 解码链组合(base64_decode + gzinflate / str_rot13 + eval)" strings: $b64 = "base64_decode" ascii wide $eval = "eval(" ascii wide $gzinflate = "gzinflate" ascii wide $rot13 = "str_rot13" ascii wide $assert = "assert(" ascii wide $createfn = "create_function" ascii wide condition: // base64_decode + (eval|assert|create_function) = 解码后动态执行 $b64 and ($eval or $assert or $createfn) or // 解码链:base64 + gzinflate / str_rot13 + 执行 $b64 and ($gzinflate or $rot13) and ($eval or $assert) } // PHP Webshell —— 变量变形($$a = $_POST['cmd'];$$a($_POST['arg'])) rule C3_PHP_Webshell_VariableDeformation { meta: risk_level = "high" category = "C3" false_positive_rate = "medium" reference = "PHP 变量变形 Webshell 特征" description = "PHP 可变变量组合:$$ 或 ${$ 配合超全局变量" strings: $doubledollar = /\$\$\w+\s*=\s*\$\s*_(GET|POST|REQUEST)/ ascii $curlyvar = /\$\{\$\w+\}\s*\(/ ascii $superglobal = /\$_/ ascii $invoke = /\$\$\w+\s*\(/ ascii condition: ($doubledollar or ($curlyvar and $invoke)) and $superglobal } // ============================================================================= // JSP / Java Webshell —— 反射执行 + 反序列化 // ============================================================================= // JSP Runtime.exec + ProcessBuilder 反射执行链 rule C3_JSP_Webshell_RuntimeExec { meta: risk_level = "critical" category = "C3" false_positive_rate = "low" reference = "https://blog.csdn.net/JavaWebshell" description = "JSP 通过 Runtime.exec / ProcessBuilder 执行命令,配合反射 / 密码变量(cmd/pass/pwd)" strings: $runtime = "Runtime.getRuntime()" ascii $exec = ".exec(" ascii $processbuilder = "ProcessBuilder" ascii $cmdparam = /(cmd|pass|pwd|exec|shell)\s*=/ ascii $reflection = /Class\.forName|getMethod|getDeclaredMethod|Method\.invoke/ ascii $requestparam = /request\.getParameter\s*\(\s*['"](cmd|pass|pwd|exec|shell)['"]/ ascii $printwriter = /PrintWriter|getWriter|out\.println/ ascii condition: // Runtime.exec + 命令参数名 + 回显 = 完整 Webshell $runtime and $exec and ($requestparam or $printwriter) or // ProcessBuilder + 命令参数名 $processbuilder and ($cmdparam or $requestparam) or // 反射链 + getRuntime().exec $runtime and $exec and any of ($reflection*) } // JSP 反序列化 CommonsCollections / ysoerial rule C3_JSP_Webshell_Deserialization { meta: risk_level = "critical" category = "C3" false_positive_rate = "low" reference = "https://github.com/frohoff/ysoserial" description = "Java 反序列化利用链:CommonsCollections / Gadgets / InvokerTransformer" strings: $icc = "InvokerTransformer" ascii wide $lzy = "LazyMap" ascii wide $trn = "TransformerFactory" ascii wide $ccimpl = "TemplatesImpl" ascii wide $gadget = "CommonsCollections" ascii wide $readobj = /readObject\s*\(/ ascii wide $objectinputstream = "ObjectInputStream" ascii wide $execchain = /getRuntime\(\)\.exec|ProcessBuilder/ ascii wide condition: // 反序列化链:readObject + InvokerTransformer / LazyMap / TemplatesImpl + Runtime.exec $readobj and ($icc or $lzy or $trn or $ccimpl or $gadget) and any of ($execchain*) or // 直接 ObjectInputStream + 已知 Gadget $objectinputstream and ($icc or $ccimpl or $gadget) } // JSP Servlet Filter / Listener 注入型内存马 rule C3_JSP_Webshell_MemoryShell { meta: risk_level = "high" category = "C3" false_positive_rate = "medium" reference = "Tomcat / JBoss 内存马分析" description = "JSP 动态注册 Filter / Listener / Valve 实现内存 Webshell" strings: $filterdef = "FilterDef" ascii $applicationfilter = "ApplicationFilterConfig" ascii $addfilter = /addFilterDef|addFilterMap|addListener/ ascii $servletcontext = /ServletContext|getServletContext/ ascii $filter = "implements Filter" ascii $listener = /implements\s+(HttpSession|Servlet|Request)Listener/ ascii $standardctx = "StandardContext" ascii // 命令执行特征 $runtime = "Runtime.getRuntime()" ascii $execchain = /getRuntime\(\)\.exec|ProcessBuilder/ ascii wide condition: // 动态 Filter 注册链:StandardContext + addFilterDef + FilterDef + ApplicationFilterConfig $standardctx and $addfilter and $filterdef and $applicationfilter or // Listener 注册链:ServletContext + Listener interface + addListener $servletcontext and $listener and any of ($addfilter) or // Filter 接口 + 命令执行(反射/内联) $filter and ($runtime or $execchain) } // ============================================================================= // 冰蝎 / 哥斯拉 / 蚁剑 —— 工具专属特征 // ============================================================================= // 冰蝎(Behinder)—— AES 加密通道 + 固定类名特征 rule C3_Webshell_Behinder { meta: risk_level = "critical" category = "C3" false_positive_rate = "low" reference = "https://github.com/rebeyond/Behinder" description = "冰蝎 Webshell 特征:AES/CBC/PKCS5Padding 或反射解密" strings: $aes = /AES\s*\/?\s*CBC\s*\/?\s*PKCS5Padding|AES\/CBC\/PKCS5Padding/ ascii wide $cipherget = "Cipher.getInstance" ascii wide $doFinal = /\.doFinal\s*\(/ ascii wide $secret = /secretKey|SecretKeySpec|PasswordKey/ ascii wide $toolname = /Behinder|behinder|冰蝎/ ascii wide nocase // JSP 命令执行特征 $execchain1 = /getRuntime\(\)\.exec/ ascii wide $execchain2 = "ProcessBuilder" ascii wide // PHP 执行特征 $phpdecrypt = "openssl_decrypt" ascii $phpb64 = "base64_decode" ascii $phpeval = "eval(" ascii $phpassert = "assert(" ascii condition: // 冰蝎 JSP:AES 加密解密 + secretKey + Runtime.exec $cipherget and $aes and $doFinal and $secret and any of ($execchain*) or // 冰蝎 PHP:openssl_encrypt + base64 + eval/assert $phpdecrypt and $phpb64 and ($phpeval or $phpassert) or // 直接工具名(极低概率误报) $toolname } // 哥斯拉(Godzilla)—— 加密通信 + 动态字节码加载 rule C3_Webshell_Godzilla { meta: risk_level = "critical" category = "C3" false_positive_rate = "low" reference = "https://github.com/whale1017/godzilla" description = "哥斯拉 Webshell 特征:ASM 字节码生成 + ClassLoader 动态加载" strings: $asm = "org.objectweb.asm" ascii wide $classloader = /defineClass|ClassLoader|loadClass/ ascii wide $bytes = /toByteArray|writeByteArray/ ascii wide $reflect = /setAccessible|getDeclaredMethod/ ascii wide $deserialize = "deserialize" ascii wide $toolname = /Godzilla|godzilla|哥斯拉/ ascii wide nocase condition: // ASM 字节码 + ClassLoader.defineClass = 动态加载 $asm and ($classloader or $bytes) and any of ($reflect*) or // 反序列化 + ClassLoader $deserialize and $classloader or $toolname } // 蚁剑(AntSword)—— 基础 eval + 加密通信 + 自定义 Header rule C3_Webshell_AntSword { meta: risk_level = "high" category = "C3" false_positive_rate = "medium" reference = "https://github.com/AntSwordProject/AntSword-Labs" description = "蚁剑 Webshell 特征:assert + 特定请求参数加密 + 自定义 HTTP 头" strings: $phpassert = /assert\s*\(\s*\$\s*_(GET|POST|REQUEST)/ ascii $phpcipher = /openssl_(encrypt|decrypt)|mcrypt_(encrypt|decrypt)/ ascii $header = /X-Request-Id|AntSword|antsword/ ascii $jspcipher = /AES|DES|RSA|Cipher/ ascii wide condition: // PHP:assert + openssl/mcrypt + 蚁剑特征 header $phpassert and $phpcipher and $header or // JSP:加密算法 + 特征 header(可能是蚁剑 JSP 变体) any of ($jspcipher) and $header } // ============================================================================= // ASP / ASP.NET Webshell // ============================================================================= // ASP.NET Eval / Execute + Server.CreateObject("Wscript.Shell") rule C3_Webshell_ASPNET { meta: risk_level = "high" category = "C3" false_positive_rate = "low" reference = "ASP.NET Webshell 常见手法" description = "ASP.NET Webshell:Eval/Execute + Server.CreateObject/Wscript.Shell + Process.Start" strings: $eval = /\bEval\s*\(\s*Request\s*\(/ ascii wide $execute = /\bExecute\s*\(\s*Request\s*\(/ ascii wide $wscript = /Server\.CreateObject\s*\(\s*["']Wscript\.Shell["']\s*\)/ ascii wide $processstart = /Process\.Start|Diagnostics\.Process/ ascii wide $reflect = /Activator\.CreateInstance|Assembly\.Load|BinaryFormatter/ ascii wide condition: // Eval + 动态执行 ($eval or $execute) and ($wscript or $processstart or any of ($reflect*)) or // Wscript.Shell + Process.Start $wscript and $processstart or // BinaryFormatter 反序列化 + 命令执行 any of ($reflect*) and $processstart } // ============================================================================= // ASP Classic (VBScript) // ============================================================================= rule C3_Webshell_ASP_Classic { meta: risk_level = "high" category = "C3" false_positive_rate = "medium" reference = "ASP Classic Webshell" description = "ASP Classic (VBScript) Webshell:Execute + Wscript.Shell + Request" strings: $execute = /\bExecute\s*\(\s*Request\s*\(/ ascii $wscript = "WScript.Shell" ascii $shellrun = /\.Run\s*\(\s*["']cmd/ ascii $servercreate = "Server.CreateObject" ascii $request = "Request(" ascii condition: // Execute + Request 取参 $execute and $request or // Server.CreateObject(WScript.Shell) + cmd Run $servercreate and $wscript and $shellrun } // ============================================================================= // 通用:所有 Webshell 类(PHP/JSP/ASP)的 ProcessBuilder + 输出回显 // ============================================================================= rule C3_Webshell_CommandExecutionEcho { meta: risk_level = "critical" category = "C3" false_positive_rate = "low" reference = "综合 Webshell 命令执行链" description = "任何语言的 Webshell:命令执行 + 输出回显(三特征同时命中)" strings: $exec_php = /(system|exec|passthru|shell_exec|popen|proc_open)\s*\(\s*\$\s*_(GET|POST|REQUEST)/ ascii $exec_java = /Runtime\.getRuntime\(\)\.exec|ProcessBuilder/ ascii $exec_asp = /\.Run\s*\(\s*["']cmd|Process\.Start/ ascii // 回显通道 $echo_php = /echo|print|passthru/ ascii $echo_java = /getWriter|getOutputStream|PrintWriter|out\.println|response\.getWriter/ ascii $echo_asp = /Response\.Write|output\.Write/ ascii // 参数来源(外部可控) $param_java = /request\.getParameter|HttpServletRequest|getParameter/ ascii wide $param_php = /\$_(GET|POST|REQUEST)\s*\[/ ascii $param_asp = /Request\("|\bRequest\(/ ascii condition: // PHP 路径 $exec_php and $echo_php and $param_php or // Java/JSP 路径 $exec_java and any of ($echo_java*) and any of ($param_java*) or // ASP 路径 $exec_asp and $echo_asp and ($param_php or $param_asp) }