工作来源
Virus Bulletin 2021
背景分析
开放目录是 Web 服务器上可公开访问的文件夹,开放目录可以提供有关攻击者的大量信息,包括 WebShell、C&C 面板、工具包和恶意软件等。根据研究显示,托管恶意软件的 Web 服务器中有 25% 有开放目录。
通过开放目录不仅可以加深对攻击团伙运营的了解,还可以帮助防护攻击者正在进行的攻击活动。
开放目录通常可以通过页面标题或者内容的开头包含 index of...
来进行识别。
设计架构
HP 使用 Python3 实现了 SubCrawl 用来发现开放目录、通过签名检测差异化内容,输出数据到其他平台。使用模糊哈希、Web服务器信息等上下文信息丰富扫描数据,并整合成 MISP 事件用以聚类。
SubCrawl 支持两种不同的操作模式:
一次性模式:在此模式下,用户在文件中提供要扫描的 URL,其中每个输入值由换行符分隔
服务模式:在此模式下,SubCrawl 在后台运行并依赖输入模块来提供要扫描的 URL
SubCrawl 旨在查找、扫描和分析开放目录,框架由四个组件组成:输入模块、爬虫模块、处理模块和输出模块。URL 作为输入,解析后加入爬取队列中。爬虫模块判断开放目录中的目录和文件以分别处理,文件直接交由处理模块,而目录再次添加到爬取队列中。每个 URL 的结果包括内容的 SHA256、模糊哈希、是否有开放目录、是否与 Yara 匹配。目前的输出模块包括与 MISP 的集成、打印到控制台和存储于 SQLite 数据库中。
下图概述了 SubCrawl 的架构,蓝色模块在两种模式下都使用,黄色模块在一次性模式下使用,绿色模块在服务模式下使用。
输入模块
从输入队列中删除之前扫描的 URL 后,剩余的 URL 将根据它们的子目录进行解析。解析输入 URL 的过程为每个子目录生成新的 URL,使框架能够枚举 Web 服务器上的内容。如下所示,URL 部署的是 Dridex 恶意软件。
SubCrawl 的数据来源之一是 URLHaus。
输出模块
在扫描完成后会调用输出模块,用于打印输出或者存储到 MISP 或者 SQLite 中。目前,SubCrawl 通过其 MISP 集成支持跟踪先前扫描的目标。MISP 可以配置为输出模块,使 SubCrawl 从新的扫描中排除已经扫描的目标。
爬虫模块
SubCrawl 使用 BeautifulSoup 解析网页进行匹配,从响应中提取超链接的 HREF 属性再次校验后加入爬取队列,如 CSS、图片文件和字体就不予处理。
SubCrawl 使用 Vectorized 的 Redpanda 代替 Kafka 作为队列。
按照域名对 URL 进行分组可以并行运行多个爬虫任务,这显著提高了效率。有一些影响性能的所在,比如超时问题、下载时间过长、重定向过多等。可以通过多项检查来尽可能地避免:如实例化时设置超时时间、会话建立后检查响应时间和响应大小、重定向过多则不再跟随。
处理模块
处理模块接收页面内容,使用 ClamAV 扫描,生成 TLSH 或者使用签名检测 WebShell。该主机的所有 URL 都被扫描后,将结果合并传递给输出模块。配置文件遵循 YAML 语法,在引擎初始化时解析。
处理模块包含如下七个:
PayloadProcessing:使用 libmagic 识别文件格式
WebshellProcessing:识别 WebShell
YARAProcessing:根据 YARA 规则匹配
ClamAVProcessing:返回 ClamAV 结果
JARMProcessing:返回 JARM 结果
SDhashProcessing : 返回 SDhash
TLSHProcessing:返回 TLSH 哈希
WebShell 处理
对于受密码保护的 WebShell,查找 HTML 的 password 字段和与 WebShell 密切相关的其他 HTML 属性来检查登录表单。
Yara 处理
通过 Yara 规则检测 WebShell 登录、潜在 JavaScript 木马等。以下为检测 WebShell 登录表单的 Yara 规则:
JARM 处理
由 Salesforce 开发的计算 TLS 连接指纹的工具,以此跟踪服务器。
TLSH 处理
使用 TLSH 计算 HTTP 响应的哈希值,不适用 SDHASH 和 SSDEEP 的原因是最小长度为 512 字节和 4096 字节,而 TLSH 最小长度为 50 字节。
基本使用
SubCrawl 可以将数据存储在 MISP 中,为每个域名相关的开放目录触发一个事件。对于每个开放目录,都提供了名为 opendir-url 的属性。
如果不想存在 MISP 中也可以使用 SQLite 作为存储,配备了简单的界面如下所示:
数据分析
2021 年 5 月,扫描了大约 2000 个开放目录。其中比较典型的是两类 WebShell 登陆页面。A 有两种变种,区别是提交按钮的文本是 >
还是 >>
。
而 B 则更加复杂,访问会首先显示 404 Not Found,但随后按下 Ctrl 键+单击鼠标右键即可正常显示:
通过 PyMISP 对属性进行聚类,还额外开发了识别 Web 服务器的脚本来提供更多的上下文数据。将这类页面的响应哈希进行关联聚类,发现了八个集群。
Dridex 是被发现的开放目录中最常见的恶意软件家族,但是同样的 WebShell 站点上也部署了 QakBot 和 Hancitor 样本。
进一步扫描了 625 个部署 Dridex 的网站、1442 个部署 QakBot 的网站。发现部署 Dridex 的服务器有 57% 有开放目录,部署 QakBot 的只有 5% 有开放目录,Hancitor 的相关开放目录则极少。但奇怪的是,在这些开放目录中都能找到这两类 WebShell 的登录页面。
部署 Hancitor 的 WebShell 登录表单与部署 Dridex 的登陆表单相同,与 QakBot 的区别是 HTML 的字段名称不同,这样可以再进一步聚成三类。
分析人员猜测有可能是恶意软件的运营者从其他攻击者手里买了失陷网站的访问权限,通过 WebShell 部署自己的恶意软件。统计这些 Web 服务器和 PHP 的基础环境如下所示:
使用的插件也多种多样,看情况确实不像是通过某些特定的 Web 漏洞攻陷的服务器。
文件分析
PHP 脚本中包含几个函数、几个变量和两个 Base64 编码串。
用户密码的 SHA-1 值的前 16 个字符作为 Cookie 响应。
解密函数如下所示:
研究人员发现许多 WebShell 和 WordPress 插件目录下的文件都有相同的时间戳,有可能是攻击者统一修改了时间戳,也有可能是 WebShell 直接和插件一起被安装进来。
研究人员发现攻击者在每个原本合法的 JavaScript 文件的末尾插入了混淆脚本。
分析此段代码后发现该脚本向预置的 URL 发起 GET 请求,并接收以下 JavaScript 代码。
根据这段代码顺藤摸瓜,发现在 GitHub 中有一个声称是 Laravel Web 框架的代码库。与 Laravel 的官方代码库相比,不仅修改了 JavaScript 文件还带有一个 PHP 的 WebShell。这表明,攻击者的一个渠道是冒充 Web 框架诱骗用户安装。
以此类推,在 GitHub 上发现了 565 个代码库都是类似的情况。
这段 JavaScript 代码是在受害者安装假文件触发 WebShell 后告知攻击者,攻击者随后就会利用植入的WebShell 分发恶意软件。
工作思考
HP 的这个工作的核心功能实现上并不复杂,从开放目录分析发现了利用 GitHub 来投毒的供应链安全问题使其增色不少,但确实处理模块中围绕 JARM、TLSH、SDHash 等部分还是做的比较扎实的。与开放目录类似的,前些年国内很常见的是 HFS 的广泛使用,也有很多围绕 HFS 展开的研究。HFS 通常来说只是作为分发恶意软件的 Web 服务器来使用,而使用 WordPress 等 CMS 框架的都要警惕这种隐蔽的供应链攻击,尽量通过官方渠道进行下载,安装时进行核实避免引狼入室。
SubCrawl 源码仓库
https://github.com/hpthreatresearch/subcrawl
声明:本文来自威胁棱镜,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。