Skip to content

Commit fff1db1

Browse files
committed
Fixed the failure to escalate privileges due to enabling LSA protection
1 parent 4f7df36 commit fff1db1

File tree

2 files changed

+16
-13
lines changed

2 files changed

+16
-13
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ endif()
7171
#
7272
set(PRIVEXEC_VERSION_MAJOR 5)
7373
set(PRIVEXEC_VERSION_MINOR 0)
74-
set(PRIVEXEC_VERSION_PATCH 3)
74+
set(PRIVEXEC_VERSION_PATCH 4)
7575
set(PACKAGE_VERSION "${PRIVEXEC_VERSION_MAJOR}.${PRIVEXEC_VERSION_MINOR}.${PRIVEXEC_VERSION_PATCH}")
7676

7777
string(TOLOWER "${CMAKE_C_COMPILER_ARCHITECTURE_ID}" COMPILER_ARCH_ID)

lib/exec/elevator.cc

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include <wtsapi32.h>
55

66
namespace wsudo::exec {
7-
87
bool IsUserAdministratorsGreater(bela::error_code &ec) {
98
HANDLE hToken{nullptr};
109
auto closer = bela::finally([&] {
@@ -13,13 +12,13 @@ bool IsUserAdministratorsGreater(bela::error_code &ec) {
1312
}
1413
});
1514
if (::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken) != TRUE) {
16-
ec = bela::make_system_error_code(L"OpenProcessToken");
15+
ec = bela::make_system_error_code(L"open current process token: ");
1716
return false;
1817
}
1918
TOKEN_ELEVATION info{0};
2019
DWORD len = sizeof(info);
21-
if (::GetTokenInformation(hToken, TOKEN_INFORMATION_CLASS::TokenElevation, &info, len, &len) != TRUE) {
22-
ec = bela::make_system_error_code(L"GetTokenInformation");
20+
if (::GetTokenInformation(hToken, TokenElevation, &info, len, &len) != TRUE) {
21+
ec = bela::make_system_error_code(L"get current token elevation: ");
2322
return false;
2423
}
2524
return info.TokenIsElevated != 0;
@@ -92,12 +91,13 @@ bool InitializeAsSystem(bela::error_code &ec) {
9291
}
9392

9493
// bela::EqualsIgnoreCase
95-
[[maybe_unused]] constexpr std::wstring_view LsassName = L"lsass.exe";
94+
[[maybe_unused]] constexpr std::wstring_view WinLogonName = L"winlogon.exe";
9695
constexpr DWORD INVALID_PROCESS_ID = 0xFFFFFFFF;
97-
DWORD LookupSystemProcess() {
96+
DWORD LookupSystemProcess(DWORD sid, bela::error_code &ec) {
9897
PWTS_PROCESS_INFOW pi{nullptr};
9998
DWORD count{0};
10099
if (::WTSEnumerateProcessesW(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pi, &count) != TRUE) {
100+
ec = bela::make_system_error_code(L"WTSEnumerateProcessesW: ");
101101
return INVALID_PROCESS_ID;
102102
}
103103
auto closer = bela::finally([&] {
@@ -107,11 +107,12 @@ DWORD LookupSystemProcess() {
107107
});
108108
auto end = pi + count;
109109
for (auto it = pi; it != end; it++) {
110-
if (it->SessionId == 0 && bela::EqualsIgnoreCase(LsassName, it->pProcessName) &&
110+
if (it->SessionId == sid && bela::EqualsIgnoreCase(WinLogonName, it->pProcessName) &&
111111
IsWellKnownSid(it->pUserSid, WinLocalSystemSid) == TRUE) {
112112
return it->ProcessId;
113113
}
114114
}
115+
ec = bela::make_error_code(1, L"a suitable system process could not be found");
115116
return INVALID_PROCESS_ID;
116117
}
117118

@@ -212,18 +213,21 @@ bool Elavator::impersonation_system_token(bela::error_code &ec) {
212213
HANDLE hExistingToken = INVALID_HANDLE_VALUE;
213214
auto hProcess = ::OpenProcess(MAXIMUM_ALLOWED, FALSE, systemProcessId);
214215
if (hProcess == INVALID_HANDLE_VALUE) {
215-
ec = bela::make_system_error_code(L"Elavator::impersonation_system_token<OpenProcess> ");
216+
ec = bela::make_system_error_code(
217+
bela::StringCat(L"impersonation_system_token OpenProcess (WinLogon - ", systemProcessId, L") error: "));
216218
return false;
217219
}
218220
auto hpdeleter = bela::finally([&] { CloseHandle(hProcess); });
219221
if (OpenProcessToken(hProcess, MAXIMUM_ALLOWED, &hExistingToken) != TRUE) {
220-
ec = bela::make_system_error_code(L"Elavator::impersonation_system_token<OpenProcessToken> ");
222+
ec = bela::make_system_error_code(
223+
bela::StringCat(L"impersonation_system_token OpenProcessToken (WinLogon - ", systemProcessId, L") error: "));
221224
return false;
222225
}
223226
auto htdeleter = bela::finally([&] { CloseHandle(hExistingToken); });
224227
if (DuplicateTokenEx(hExistingToken, MAXIMUM_ALLOWED, nullptr, SecurityImpersonation, TokenImpersonation, &hToken) !=
225228
TRUE) {
226-
ec = bela::make_system_error_code(L"Elavator::impersonation_system_token<DuplicateTokenEx> ");
229+
ec = bela::make_system_error_code(
230+
bela::StringCat(L"impersonation_system_token DuplicateTokenEx (WinLogon - ", systemProcessId, L") error: "));
227231
return false;
228232
}
229233
return true;
@@ -234,8 +238,7 @@ bool Elavator::ImpersonationSystemPrivilege(const privilege_entries *pv, bela::e
234238
if (!EnableSeDebugPrivilege(currentSessionId, ec)) {
235239
return false;
236240
}
237-
if (systemProcessId = LookupSystemProcess(); systemProcessId == INVALID_PROCESS_ID) {
238-
ec = bela::make_error_code(1, L"Elevator::ImpersonationSystemPrivilege unable lookup system process pid");
241+
if (systemProcessId = LookupSystemProcess(currentSessionId, ec); systemProcessId == INVALID_PROCESS_ID) {
239242
return false;
240243
}
241244
if (!impersonation_system_token(ec)) {

0 commit comments

Comments
 (0)