Files
MeshSate/rules/webshell.yar

346 lines
14 KiB
Plaintext
Raw Permalink Normal View History

// =============================================================================
// 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)
}