攻击者利用ManageEngine ADSelfService Plus漏洞发起攻击(上)
2021-11-17
来源:嘶吼专业版
ADSelfService Plus是一个基于Web的自助服务应用程序,允许最终用户执行密码重置,帐户解锁和配置文件信息更新等任务,而不依赖于帮助台。ADSelfService Plus提供密码自助重置/解锁,密码到期提醒,自助服务目录更新程序,多平台密码同步器以及云应用程序的单点登录。使用ADSelfService Plus Android和iPhone移动应用程序,随时随地为最终用户提供自助服务。ADSelfService Plus通过减少密码重置票证和最终用户免受计算机停机造成的挫败感来支持IT服务台。
2021 年 9 月 16 日,美国网络安全和基础设施安全局 (CISA) 发布警报警告,高级持续攻击 (APT) 攻击者正在积极利用名为ManageEngine ADSelfService Plus的自助密码管理和单点登录解决方案中新发现的漏洞。警报解释说,观察到攻击者部署了一个特定的webshell和其他技术,以保持在受害者环境中的持久性;然而,在接下来的几天里,研究人员观察到第二个不相关的活动成功地对同一个漏洞进行了攻击。
早在 9 月 17 日,攻击者就利用在美国租用的基础设施扫描互联网上数百个易受攻击的组织。随后,利用尝试于 9 月 22 日开始,并可能持续到 10 月初。在那期间,攻击者成功地损害了至少9个全球性实体,涉及技术、国防、医疗保健、能源和教育行业。
漏洞被利用之后,一个有效载荷被上传到安装了Godzilla webshell的受害者网络。这项活动在所有受害者中都是一致的,然而,研究人员还观察到一小部分被攻击组织,他们随后收到了一个名为 NGLite 的新后门的修改版本。然后,攻击者使用 webshell或 NGLite 载荷来运行命令并横向移动到网络上的其他系统,同时他们只需从 Web 服务器下载感兴趣的文件即可窃取它们。一旦攻击者转向域控制器,他们就会安装一个新的凭据窃取工具,研究人员将其作为 KdcSponge 进行跟踪。
Godzilla 和 NGLite 都是用中文说明开发的,可以在 GitHub 上公开下载。研究人员认为,攻击者将这些工具以一种冗余形式结合起来部署,以维持对目标网络的访问。Godzilla 是一个函数丰富的 webshell,它解析入站 HTTP POST 请求、使用密钥解密数据、执行解密内容以执行附加函数并通过 HTTP 响应返回结果。这允许攻击者将可能被标记为恶意的代码保留在目标系统之外,直到他们准备好动态执行它。
NGLite 被其开发者描述为“基于区块链技术的匿名跨平台远程控制程序”。它利用新型网络 (NKN) 基础设施进行命令和控制 (C2) 通信,这在理论上会导致用户匿名。需要注意的是,NKN 是一种合法的网络服务,它使用区块链技术来支持去中心化的对等网络。将 NKN 用作 C2 通道非常罕见。研究人员总共只看到 13 个示例与 NKN 通信,其中9 个 NGLite 示例和 4 个与名为 Surge 的合法开源实用程序相关,该实用程序使用 NKN 进行文件共享。
由于KdcSponge 是一种新颖的凭据窃取工具,可针对域控制器进行部署以窃取凭据。KdcSponge 将自身注入本地安全授权子系统服务 (LSASS) 进程,并将挂钩特定函数以从尝试通过 Kerberos 对域进行身份验证的帐户中收集用户名和密码。恶意代码将窃取的凭据写入文件,但依赖其他函数进行渗漏。
Palo Alto Networks的用户可以通过以下措施缓解此活动的影响:
Cortex XDR 本地分析阻止了 NGLite 后门;
所有已知示例(Dropper、NGLite、KdcSponge)在 WildFire 中都被归类为恶意软件;
Cortex Xpanse能够准确识别跨客户网络的Zoho ManageEngine ADSelfServicePlus、ManageEngine Desktop Central或ManageEngine ServiceDeskPlus服务器;
初始访问
从 9 月 17 日开始一直持续到 10 月初,研究人员观察到针对 ManageEngine ADSelfService Plus 服务器的扫描。通过跟踪分析,研究人员认为攻击者仅在美国就针对至少 370 个 Zoho ManageEngine 服务器。获得扫描结果后,攻击者于 9 月 22 开始利用尝试。这些尝试主要针对 CVE-2021-40539,它允许绕过 REST API 身份验证,从而在易受攻击的设备中远程执行代码。为了实现这一结果,攻击者向 REST API LicenseMgr 提供了精心制作的 POST 语句。
虽然研究人员缺乏对在这次活动中被利用的组织的总体情况的了解,但研究人员认为,在全球范围内,技术、国防、医疗保健、能源和教育行业中至少有九个实体受到了攻击。在成功利用之后,攻击者上传了一个部署了Godzilla webshell 的有效载荷,从而能够额外访问受害网络。研究人员观察到以下在美国租用的 IP 地址与被攻击的服务器进行交互:
在部署 webshell 之后,在所有受害者中似乎都一致,研究人员还确定了在被攻击网络子集中部署的其他工具的使用。具体来说,攻击者部署了一个名为 NGLite 的开源后门的自定义变体和一个 KdcSponge 的凭证收集工具。下面几节将详细分析这些工具。
恶意软件分析
在利用时,两个不同的可执行文件被保存到被攻击的服务器:ME_ADManager.exe 和 ME_ADAudit.exe。ME_ADManager.exe 文件充当投放木马,不仅将Godzilla webshell 保存到系统,还会安装和运行保存到系统的其他可执行文件,特别是 ME_ADAudit.exe。ME_ADAudit.exe 可执行文件基于 NGLite,攻击者将其用作在系统上运行命令的有效载荷。
ME_ADManager.exe dropper
利用后,dropper被保存到以下路径:
c:\Users\[username]\AppData\Roaming\ADManager\ME_ADManager.exe
对该文件的分析表明,此有效载荷的开发者在构建示例时并未删除调试符号。因此,示例中存在以下调试路径,并建议使用用户名 pwn 来创建此载荷:
c:\Users\pwn\documents\visual studio 2015\Projects\payloaddll\Release\cmd.pdb
在执行时,该示例首先创建以下通用互斥锁,这些互斥锁在互联网上免费提供的许多代码示例中都可以找到,这是为了避免运行多个dropper实例:
cplusplus_me
然后,dropper尝试将硬编码的 Godzilla webshell 编写到以下位置,研究人员将在本报告的后面部分提供详细分析:
然后,dropper 创建文件夹 %APPDATA%\ADManager 并将其自身复制到 %APPDATA%\ADManager\ME_ADManager.exe,然后创建以下注册表项以在重新启动后持续运行:
dropper 不会将 ME_ADAudit.exe 文件写入磁盘,这意味着攻击者必须在执行 dropper 之前将此文件上传到服务器,这可能是最初利用 CVE-2021-40539 漏洞的一部分。在对多起事件的分析中,研究人员发现 ME_ADAudit.exe 示例保持了一致的 SHA256 哈希值 805b92787ca7833eef5e61e2df1310e4b6544955e812e60b5f834f904623fd9,这表明攻击者针对多个目标部署了相同的定制版本的NGLite后门。
Godzilla Webshell
如前所述,初始 dropper 包含一个硬编码的 Java Server Page (JSP) webshell。通过对webshell进行分析,确定为中文Godzilla webshell V3.00+版。Godzilla webshell 是由用户BeichenDream开发的,他说他们创建这个 webshell 是因为当时可用的 webshell 经常会在攻击期间被安全产品检测到。因此,开发者宣称它将通过对其网络流量利用 AES 加密来避免检测,并且它在安全供应商产品中保持非常低的静态检测率。
VirusTotal 上针对Godzilla webshell 的检测结果
Godzilla webshell 在攻击期间被区域性攻击组织采用并不奇怪,因为它提供了比同一组织使用的其他 webshell(例如 ChinaChopper)更多的函数,比如逃避网络检测。
就函数而言,JSP webshell本身相当简单,并保持了轻量级的内存占用。它的主要函数是解析HTTP POST,使用密钥解密内容,然后执行有效载荷。这允许攻击者将可能被标记为恶意的代码保留在目标系统之外,直到他们准备好动态执行它。
下图显示了默认 JSP webshell 的初始部分以及解密函数。
默认 Godzilla JSP webshell 的标题
值得注意的是变量 xc 以及传入上图所示代码的第一行和第二行。这些是每次操作员生成新 webshell 时都会发生变化的主要组件,变量表示用于内部 AES 解密的密钥 那个 webshell。
当你手动生成 webshell 时,需要指定明文通行证和密钥。默认情况下,这些是 pass 和 key。
Godzilla 默认 webshell 值
为了弄清楚这些在 webshell 中是如何呈现的,你可以看看 Godzilla JAR 文件。
如下所示,你可以看到代码在/shells/cryptions/JavaAES/GenerateShellLoder函数下替换嵌入的webshell模板中的字符串。
Generate.class 文件中的 GenerateShellLoder 函数
因此,研究人员知道 webshell 中的 xc 变量将是 AES 密钥,如模板中所示。
String xc=“{secretKey}”; String pass=“{pass}”; String md5=md5(pass+xc);
研究人员观察到 xc 值似乎是一个哈希值,在 /core/shell/ShellEntity.class 文件下,研究人员可以看到代码采用 MD5 哈希值的前 16 个字符作为明文密钥。
这样,研究人员就知道3c6e0b8a9c15224a的xc值是单词key的MD5哈希的前16个字符。
鉴于此,xc 和 pass 变量是两个主要字段,可用于跟踪和尝试跨事件映射活动。为了方便讲解,研究人员生成了一个带有默认分析选项的 Godzilla webshell;然而,默认值和攻击中观察到的值之间的唯一区别是不同的 xc 和 pass 值。
这个webshell的一个重要特点是,缺乏静态检测,并试图通过避免可能被安全产品签名识别的关键字或常见结构来隐藏这个文件。一个特别有趣的静态规避技术是使用Java三元条件运算符来表示解密。
这里的条件是 m?1:2 ,m 是传递给该函数的布尔值,如上图所示。如果 m 为 True,则使用第一个表达式常量 (1)。否则,通过第二个 (2)。参考 Java 文档,1 是 ENCRYPT_MODE,而 2 是 DECRYPT_MODE。
JavaX 加密常量的含义
webshell在执行这个函数x时,并没有设置m的值,从而强制m为False并设置为decrypt。
response.getWriter()。write(base64Encode(x(base64Decode(f.toString()), true)));
要了解Godzilla 的函数,研究人员可以查看/shells/payloads/java/JavaShell.class。该类文件包含提供给操作符的所有函数。下面是getFile函数的一个示例。
Godzilla 的 getFile 函数载荷
有效载荷函数:
正如函数名称所证明的那样,Godzilla webshell 提供了大量有效载荷,用于导航远程系统、传入和传出数据、远程命令执行和枚举。
这些有效载荷将使用之前描述的密钥加密,并且操作软件将向包含数据的被攻击系统发送 HTTP POST。
此外,如果研究人员检查 core/ui/component/dialog/ShellSetting.class 文件(如下所示),initAddShellValue() 函数包含远程网络访问的默认配置设置。因此,可以识别静态 HTTP 标头和 User-Agent 字符串等元素,以帮助搜索web访问日志查找潜在的漏洞。
为了说明这一点,下面是web服务器访问日志的一个片段,它显示了使用Curl应用程序的初始攻击,并发送自定义URL有效载荷来触发CVE-2021-40539漏洞。然后它显示了对 Godzilla webshell 的后续访问,它已被初始放置器放置到硬编码路径中。通过查看 User-Agent,研究人员可以确定攻击者从漏洞利用到初始 webshell 访问的时间仅超过四分钟。