Web shell analyzer 是一个跨平台的独立二进制文件,专门用于识别、解码和标记疑似Web Shell的文件。Web shell analyzer 是 Web shell scanner 项目(http://github.com/tstillz/webshell-scan)的升级版,后者仅通过正则表达式扫描文件,不进行解码或属性分析。
扫描器附带的正则表达式及其内置解码例程不能保证找到磁盘上的每一个Web Shell,并可能识别出一些误报。建议在生产系统上运行前先测试分析器并评估其影响。分析器不含任何担保,使用风险自负。
PHP、ASP/X Web Shell。JSP/X、CFM 及其他类型正在开发中。每个被扫描的文件都可以经过PRE和/或POST操作:
PreDecodeActions 函数的设计思路是使用正则表达式识别匹配的字符串或模式,获取其原始匹配内容,执行定义的解码/清理步骤,然后将最终输出送回分析引擎进行重新扫描/处理。
一个非常简单的例子是Base64解码。为了检查针对base64编码的Web Shell是否有检测逻辑,我们必须先移除所有base64层。为此,我们可以使用以下 PreDecodeAction:
{
Name: "PHP_Base64Decode",
Regex: *regexp.MustCompile(`(?i)(?:=|\s+)(base64_decode\('('?\"?[A-Za-z0-9+\/=]+'?\"?))`),
DataCapture: *regexp.MustCompile(`(?i)((?:'|")[A-Za-z0-9+\/=]+(?:'|"))`),
PreDecodeActions: []cm.Action{
{Function: cm.StringReplace, Arguments: []interface{}{"\"", "", -1}},
{Function: cm.StringReplace, Arguments: []interface{}{"'", "", -1}},
},
Functions: []cm.Base_Func{cm.DecodeBase64},
},
查看上面的代码块,首先有函数名称、用于匹配的正则表达式、数据捕获正则表达式(有时你可能想调整捕获的内容与匹配的内容)以及 PreDecodeActions。在这种情况下,在将函数 cm.DecodeBase64 应用于匹配文本之前,系统会先移除以下字符 " 和 '。
PostDecodeActions 则相反,它会在解码后检查输出。使用这种模型,我们可以制作多个自定义解码器,拥有无限的PRE/POST和解码函数,以满足大多数Web Shell分析需求。
检测是一个带有名称和描述的正则表达式。这种模型的设计理念是使检测模块化、可扩展,并与实际检测保持上下文关联。 检测与属性的格式相同,但属性不能生成检测,它们只能为现有检测添加上下文。让我们看看下面的检测逻辑示例:
{
Name: "Generic_Embedded_Executable",
Description: "查找与PE文件关联的魔术字节",
Regex: *regexp.MustCompile(`(?i)(?:(?:0x)?4d5a)`),
},
根据正则表达式,我们可以看到它正在查找基于魔术头字节 4D 5A 的内嵌Windows PE文件。如果找到,将产生一个检测,并为该文件生成JSON报告。
目前,检测是根据文件扩展名或对所有文件类型通用应用的。例如,PHP的解码例程定义在 cm.GlobalMap.Function_Php 下,属性标记定义在 cm.GlobalMap.Tags_Php 下。
函数 cm.GlobalMap.Function_Generics 和标记 cm.GlobalMap.Tags_Generics 作为一个总括应用于所有Web Shell扩展。
属性标记是我创建的一个新概念,用于为现有的Web Shell检测添加"上下文"。属性本身目前不能单独生成检测。在传统的扫描引擎中,扫描器只会在检测到Web Shell时发出警报,但很少提供关于Web Shell可能具有哪些能力(属性)的额外上下文。属性标记的工作原理与检测逻辑相同,但它们仅在识别出检测后显示,且不能自行生成检测。查看下面的示例逻辑:
cm.GlobalMap.Tags_Php = []cm.TagDef{
{
Name: "PHP_Database_Operations",
Description: "查找常用于与数据库交互的PHP函数。",
Regex: *regexp.MustCompile(`(?i)(?:'mssql_connect\|mysql_exec\()`),
Attribute: true,
},
}
我们看到在结构体 Tags_Php 下,我们创建了一个新的PHP标记。当扫描过程中找到匹配时,会检查 Attribute 标志,如果设置为 True,则检测到的Web Shell将在其JSON报告中附加标签 PHP_Database_Operations,以及频率和匹配文本块,如下面的示例输出所示:
{
"filePath": "/testers/1.php",
"size": 66109,
"md5": "6793d8ebab93e5a0f91e5a331221f331",
"timestamps": {
"birth": "2019-02-03 02:02:22",
"created": "2020-07-29 02:50:15",
"modified": "2019-02-03 02:02:22",
"accessed": "2020-07-29 02:51:07"
},
"matches": {
"FilesMAn": 5,
"FilesMan": 29,
"cmd": 20,
"eval(": 4,
"exec(": 2,
"ipconfig": 1,
"netstat": 2,
"passthru(": 1,
"shell_exec(": 1
},
"decodes": {
"Generic_Base64Decode": 40,
"Generic_Multiline_Base64Decode": 165
},
"tags": {
"Generic_Embedding_Code_C": {
"bind(": 2,
"listen(": 2
},
"PHP_Banned_Function": {
"exec(": 3,
"get_current_user(": 1,
"getmyuid(": 1,
"link(": 7,
"listen(": 2,
"passthru(": 1,
"realpath(": 1,
"set_time_limit(": 1
},
"PHP_Database_Operations": {
"mysql_query(": 1
},
"PHP_Disk_Operations": {
"@chmod(": 1,
"@filegroup(": 4,
"@fileowner(": 4,
"@rename(": 2,
"fopen(": 7,
"fwrite(": 6
}
}
}
这些标记不仅有助于定义Web Shell能做什么,还能帮助应急响应顾问等团队在执行实时响应时获得切入点,以确定下一步可能调查的方向。
无需任何依赖!只需下载适合您操作系统的二进制文件,提供要扫描的目录(其他参数可选),然后运行即可。
不带参数运行 wsa 会显示以下选项:
/Users/beastmode$ ./wsa
选项:
-dir string
要扫描Web Shell的目录
-pretty
如果设置为true,分析器将以JSON缩进形式输出结果
-raw_contents
如果找到匹配项,获取原始内容并将文件以base64 + gzip压缩后放入JSON对象中。
-size int
指定要扫描的最大文件大小(默认为10 MB)(默认10)
-verbose
如果设置为true,分析器将打印所有分析的文件,而不仅仅是匹配项
唯一必需的参数是 dir。如果需要,可以覆盖其他程序默认值。
分析器的输出将写入控制台(标准输出)。示例如下(为获得最佳效果,将stdout发送到json文件并离线审查/后处理):
Linux: ./wsa -dir /opt/www
Windows: wsa.exe -dir C:\Windows\Inetput\wwwroot
### 使用STDOUT并对完整的Web Shell文件进行编码和压缩:
Linux: ./wsa -dir /opt/www -raw_contents=true > scan_results.json
分析器完成后,会将总体扫描指标输出到STDOUT,如下例所示:
{"scanned":311,"matches":122,"noMatches":189,"directory":"/webshell-master/php","scanDuration":1.4757737378333333,"systemInfo":{"hostname":"Beast","envVars":[""],"username":"beastmode","userID":"501","realName":"The Beast","userHomeDir":"/Users/beastmode"}}