首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ASUS ROG Armory Crate Lite Service v4.2.8 中的权限提升分析 (CVE-2021-40981)

ASUS ROG Armory Crate Lite Service v4.2.8 中的权限提升分析 (CVE-2021-40981)

作者头像
Khan安全团队
发布2022-03-28 10:32:54
发布2022-03-28 10:32:54
3.8K00
代码可运行
举报
文章被收录于专栏:Khan安全团队Khan安全团队
运行总次数:0
代码可运行

ASUS ROG Armory Crate软件安装了一个名为 Armoury Crate Lite Service 的服务,该服务容易受到幻像 DLL 劫持。这允许非特权用户在其他用户(包括管理员)的上下文中执行代码。要利用此漏洞,管理员必须在攻击者将恶意 DLL 放入路径后对受感染机器进行身份验证C:\ProgramData\ASUS\GamingCenterLib\.DLL。华硕已通过发布军械库 Crate Lite 服务 v4.2.10 版本修复了MITRE 分配 IDCVE-2021-40981的漏洞。

各位旅友,您好,这是他最后一次给您写信!最近我一直在到处寻找一些漏洞(我知道我必须利用我的空闲时间工作)。更准确地说,我专注于一种特殊类型的漏洞,称为幻像 DLL 劫持(“statece”,我将其保留为英文翻译有点废话可惜)在 Windows 上,它充其量会导致应用程序中的后门,或者在最坏的情况下,会导致 UAC 绕过和/或权限升级。

Phantom DLL hijacking 是 DLL hijacking 的一个子类别,这是一种攻击者强制受害者进程加载任意 DLL 并将其替换为合法 DLL 的漏洞。当文件系统中确实不存在所讨论的 DLL 时,它们被称为幻像,而经典的 DLL 替换存在的 DLL。

让我们记住对于迷路的人来说 DLL 是什么:动态链接库 (DLL) 是 Windows 上的一种可移植可执行文件 (PE),就像臭名昭著的 .exe,不同之处在于它不能使用普通的 double 执行-click,但必须从正在运行的进程中导入。导入后,该进程将执行DllMainDLL 中的函数内容,并可以利用从其中导出的函数。对于自由软件爱好者来说,DLL 与 Linux 上的 .so 文件(如 libc)本质上是相同的概念。如前所述,DLL 的代码DllMain在导入 DLL 本身的进程的上下文中运行,这意味着如果 DLL 将由具有特权令牌的进程加载,则 DLL 代码将在特权上下文中执行。

回到我们,使用Process Monitor我能够在ASUS ROG Armory Crate中找到一个幻像 DLL 劫持,该软件很容易在带有 TUF / ROG 主板的游戏 PC 和笔记本电脑中找到,用于管理 LED 和冷却风扇。

去年我组装了一台装有华硕 TUF 主板(华硕 ROG 来自北罗马的书呆子表亲)的 PC,并发现安装了这个神奇的软件。基本上这种类型的软件并不意味着安全——我不生华硕的气,其他制造商也是如此(呃呃…宏碁…呃呃)。这就是为什么我决定把精力集中在这种软件上,真正的懒惰。

登录后,Armory Crate 服务,想象中称为 Armory Crate Lite Service,创建了一系列进程,其中我们找到ArmouryCrate.Service.exe了子进程ArmouryCrate.UserSessionHelper.exe。正如您从下一个屏幕截图中看到的那样,第一个有一个 SYSTEM 令牌,而对于管理员用户来说,子级是一个高完整性令牌 - 要了解有关完整性概念的更多信息,请单击此处。如果经过身份验证的用户不是管理员,它将ArmouryCrate.UserSessionHelper.exe以中等完整性运行。记住这一点,以后会派上用场的。

我们去打猎

现在我们对我们的目标是什么有了一个模糊的概念,让我们继续分析我们将用来搜索漏洞的方法:

  1. 隔离所有导致CreateFile通过进程监视器并导致“NO SUCH FILE”或“PATH NOT FOUND”的调用;
  2. 我们检查调用堆栈(代码中调用的函数序列)以确保它CreateFile发生在对属于函数族的函数LoadLibrary(例如,LoadLibraryA或它们在LoadLibraryWntdllLoadLibraryExW中的本地对应项)的调用之后。NBCreateFile在 Windows 上它是一个假朋友,它不仅用于“创建文件”,还用于打开现有文件;
  3. 让我们记下加载 DLL 的文件系统上的路径,并确保非特权用户对路径本身具有写权限;
  4. 利润!

寻找这种漏洞实际上非常简单,方法遵循我在 Twitter 上的这个线程中已经解释过的内容:您必须以管理权限启动 Process Monitor,设置一些过滤器并检查结果。由于我们只对能够导致特权升级的幻像 DLL 劫持感兴趣(我们将后门和 UAC 绕过留给了skids),我们将设置过滤器以仅向我们显示具有操作的特权进程(即完整性> = 高) DLL 加载失败,PATH NOT FOUNDNO SUCH FILE. 要在进程监视器上打开过滤器掩码,请单击Filter -> Filter.... 让我们看看设置哪些过滤器来过滤所有不符合报告费用的操作:

  • 操作-is-CreateFile-Include
  • 结果 - 包含 - 未找到 - 包含
  • 结果 - 包含 - 没有 - 包含
  • 路径 - 以 - .dll 结尾 - 包括
  • 诚信——就是——制度——包容
  • 诚信-是-高-包括

设置正确的过滤器后,返回菜单栏并单击保存过滤器,Filter -> Save Filter...以便我们以后重复使用。由于许多高完整性进程和服务在用户身份验证或启动时运行,我们需要使用 Process Monitor 来跟踪启动和登录过程。为此,请返回菜单栏并单击Options -> Enable Boot Logging,将其余部分保留为默认值,关闭进程监视器并重新启动设备。重新验证后,重新打开 Process Monitor 并保存Bootlog.pml包含 Process Monitor 完成的所有引导跟踪的文件。保存后,Process Monitor 将自动解析并显示结果。返回菜单栏,按Filter -> Load Filter,加载之前保存的过滤器,你应该会发现几行操作,如果你很幸运并且你没有做错任何事情。你看到的一切都可能导致幻像 DLL 劫持。

是时候调查结果了!在 Armory Crate 的情况下,您可以看到它尝试加载一个名为.DLLpath的文件C:\ProgramData\ASUS\GamingCenterLib\.DLL。这条路径非常有趣,因为与 的子文件夹不同C:\Program Files\,默认情况下 的子文件夹C:\ProgramData\没有安全 ACL,因此非特权用户极有可能在其中一个中写入。

为了确保CreateFile与我们观察到的事件相关的操作实际上是调用家庭函数的结果LoadLibrary,我们可以打开事件(双击它),打开选项卡Stack并查看堆栈称为函数。正如您从屏幕截图中看到的那样,在 Armory Crate 的情况下,CreateFile它会在调用以下命令后发生LoadLibraryExW

为了确保目录 ACLC:\ProgramData\ASUS\GamingCenterLib\是松散的,我们可以使用非常方便的 Powershell cmdlet,如下Get-Acl所示:

代码语言:javascript
代码运行次数:0
运行
复制
Get-Acl 'C:\ProgramData\ASUS\GamingCenterLib' | Select-Object *

此命令为我们提供了一个包含 SDDL(安全描述符定义语言)格式的 ACL 的字符串,人类可以通过 cmdlet 以易于理解的方式对其进行解释ConvertFrom-SddlString。通过此命令,我们可以看到该组BUILTIN\Users对相关路径具有写入权限:

在 Windows 上检查对象的 ACL 的一种更粗俗但功能相同的方法是通过 tab View effective access,隐藏在对象本身的属性中(在我们的例子中是 folder C:\ProgramData\ASUS\GamingCenterLib\)。要通过此功能查看用户或用户组的“有效访问权限”,只需打开文件夹属性,单击选项卡Security,然后Advanced选择一个用户或一组用户(在我的情况下,我使用的是非管理员测试),然后单击View effective access。此操作的结果是一个掩码,显示单个用户对文件夹具有哪些权限,并将其与所属组一起放入系统中。

现在我们知道任何人都拥有写权限,C:\ProgramData\ASUS\GamingCenterLib\我们只需要编译一个包含我们想要执行的代码的 DLL,并将其“拖放”到磁盘上名为.DLL. 作为 PoC,我们将使用一个简单的 DLL,它将添加一个aptortellini以密码命名的新用户,aptortellini并通过将他添加到本地管理员组来授予他管理权限。

代码语言:javascript
代码运行次数:0
运行
复制
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    system("C:\\Windows\\System32\\cmd.exe /c \"net user aptortellini aptortellini /add\"");
    system("C:\\Windows\\System32\\cmd.exe /c \"net localgroup administrators aptortellini /add\"");
    return TRUE;
}

现在我们已经准备好了一切,我们只需要等待管理员用户在机器上进行身份验证。这是必要的,因为有问题的 DLL 是由进程加载的ArmouryCrate.UserSessionHelper.exe,正如我们在文章开头所说的那样,该进程以经过身份验证的用户允许的最大权限运行。在验证管理员用户时,我们最终会得到一个新的管理员用户,确认权限提升。

根本原因分析

现在让我们简要地看看是什么导致了有问题的漏洞。从前面的截图之一中显示的调用堆栈可以看出,调用发生在函数LoadLibraryExW的偏移处,在进程加载的 DLL 内。通过 IDA Pro 逆向 DLL 也可以看出,这个 DLL 中的大多数函数都有某种形式的日志记录,其中包含调用函数的原始名称。由此可以推断,负责调用的函数是函数:0x167dQueryLibraryGameBoxPlugin.dllArmouryCrate.UserSessionHelper.exeLoadLibraryExWDllLoadLibraryImplement

在这种情况下,我们有两个“罪魁祸首”:

  1. 加载 DLL 时无需任何形式的检查。华硕已通过在新版本的 Armory Crate Lite 服务中实施加密检查来解决此问题,以确保加载的 DLL 由华硕签名;
  2. 目录 ACLC:\ProgramData\ASUS\GamingCenterLib\设置不正确。这件事华硕并没有修复,这意味着如果将来再次出现这样的问题,就会有新漏洞的条件。除其他外,该进程ArmouryCrate.UserSessionHelper.exe在同一目录中查找具有通配符名称的 DLL ??????.DLL,这可能是可利用的。理事会“手动”修复相关文件夹的 ACL,并删除所有非本地管理员组成员的用户的写入权限。

负责任的披露时间表(YYYY / MM / DD)

  • 2021/09/06:通过其披露门户向华硕报告了漏洞;
  • 2021/09/10:华硕确认已收到报告并将其转发给其开发团队;
  • 2021/09/13:开发团队确认漏洞的存在,并表示将在下一个版本中修复,计划在当年的第 39 周(27/09 - 01/10);
  • 2021/09/24:华硕确认漏洞已在4.2.10版本服务中修复;
  • 2021/09/27:MITRE 将代码CVE-2021-40981的 CVE 分配给此漏洞;

感谢华硕在漏洞管理方面的速度和专业精神。今天就是这样,直到下一次!

本文系转载,前往查看

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

本文系转载前往查看

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 我们去打猎
  • 根本原因分析
  • 负责任的披露时间表(YYYY / MM / DD)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档