WebShell分析器 webshell analyzer

WebShell分析器 webshell analyzer

Web Shell分析器是跨平台的独立二进制文件,仅用于识别解码标记怀疑是Web Shell的文件而构建。Web Shell分析器是Web Shell扫描器项目(http://github.com/tstillz/webshel​​l-scan)更强大的兄弟,该项目仅通过正则表达式扫描文件,不进行解码或属性分析。

免责声明

扫描仪随附的正则表达式及其内置的解码例程无法保证找到磁盘上的每个WebShell,并可能识别出一些误报。还建议您在生产系统上运行之前测试分析仪并评估其影响。分析仪没有保修,风险自负。

特征

  • 跨平台,静态编译的二进制文件。
  • JSON输出
  • 目前支持大多数PHPASP/X网络语言。JSP/XCFM以及其他类型的作品。
  • 递归的多线程扫描,能够快速遍历嵌套目录
  • 能够处理多层混淆的WebShell,例如base64,gzinflate和char代码。
  • 支持PRE / POST操作,为分析引擎提供分层的反混淆和解码功能
  • 具有模块化接口的可调节正则表达式逻辑,可轻松扩展分析仪功能
  • 可调属性标记
  • 比赛中捕获原始内容
  • 系统信息
  • 已针对Web Shell存储库进行了测试:github.com/tennc/webshel​​l

前/后动作

可以通过PRE和/或POST操作运行每个扫描的文件:

  • 预解码:执行匹配之前调用的函数,例如base64解码或字符串替换。
  • POST解码:执行匹配后调用的函数,例如url脱模。

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: "Looks for magic bytes associated with a PE file",
    Regex:       *regexp.MustCompile(`(?i)(?:(?:0x)?4d5a)`),
},

基于正则表达式,我们可以看到它基于魔术头字节寻找嵌入式Windows PE文件4D 5A。如果找到,将导致检测到该文件并生成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: "Looks for common PHP functions used for interacting with a database.",
        Regex:       *regexp.MustCompile(`(?i)(?:'mssql_connect\|mysql_exec\()`),
        Attribute: 	 true,
    },
}

我们看到在struct之下Tags_Php,我们创建了一个新的PHP标记。在扫描过程中找到匹配项时,将Attribute选中该标志,如果将其设置为True,则检测到的Web Shell将在PHP_Database_Operations其JSON报告中附加标签 以及频率和匹配文本块,如以下示例输出所示:

{
   "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的功能,而且还可以帮助IR顾问等团队进行实时响应互动,这是下一步可能寻找焦点的关键点。

要求

没有!只需下载适用于您的OS的二进制文件,提供要扫描的目录(其他参数是可选的),然后将其翻录即可。

运行二进制文件

wsa不带参数运行将显示以下选项:

/Users/beastmode$ ./wsa
Options:
    -dir string
      	Directory to scan for web shells
    -raw_contents
      	If a match is found, grab the raw contents and base64 + gzip compress the file into the JSON object.
    -size int
      	Specify max file size to scan (default is 10 MB) (default 10)
    -verbose bool
        If set to true, the analyzer will print all files analyzer, not just matches

唯一需要的参数是dir。如果需要,可以覆盖其他程序的默认设置。

分析仪的输出将被写入控制台(标准输出)。下面的示例(为获得最佳结果,请将stdout发送到json文件并离线查看/发布过程):

Linux: ./wsa -dir /opt/www
Windows: wsa.exe -dir C:\Windows\Inetput\wwwroot

### With STDOUT and full web shell file encoded and compressed:
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"}}
WebShell分析器 webshell analyzer
WebShell分析器 webshell analyzer

从源码构建

如果决定修改源代码,则可以使用以下命令来构建项目:

cd <path-to-project>

## Windows
GOOS=windows GOARCH=386 go build -o wsa32.exe main.go
GOOS=windows GOARCH=amd64 go build -o wsa64.exe main.go

## Linux
GOOS=linux GOARCH=amd64 go build -o wsa_linux64 main.go

## Darwin
GOOS=darwin GOARCH=amd64 go build -o wsa_darwin64 main.go

项目地址:

GitHub https://github.com/tstillz/webshell-analyzer