pastebin - collaborative debugging tool
rovema.kpaste.net RSS


win32: run_something_as_SYSTEM
Posted by Anonymous on Tue 19th Sep 2023 12:25
raw | new post

  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <iostream>
  4. #include <string>
  5. #include <tlhelp32.h>
  6.  
  7. void get_file_size(std::string path)
  8. {
  9.     struct _stat fileinfo;
  10.     _stat(path.c_str(), &fileinfo);
  11.     std::cout << "file size is " << fileinfo.st_size << std::endl;
  12. }
  13.  
  14. BOOL isElevated(VOID) {
  15.     HANDLE          hToken;
  16.     BOOL            bResult = FALSE;
  17.     DWORD           dwSize;
  18.     TOKEN_ELEVATION te;
  19.  
  20.     if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) {
  21.         if (GetTokenInformation(hToken, TokenElevation, &te,
  22.             sizeof(TOKEN_ELEVATION), &dwSize)) {
  23.             bResult = te.TokenIsElevated != 0;
  24.         }
  25.         CloseHandle(hToken);
  26.     }
  27.     return bResult;
  28. }
  29.  
  30. BOOL SetPrivilege(HANDLE hInToken, const wchar_t *szPrivilege, BOOL bEnable) {
  31.     HANDLE           hToken;
  32.     BOOL             bResult;
  33.     LUID             luid;
  34.     TOKEN_PRIVILEGES tp;
  35.  
  36.     if (hInToken) {
  37.         hToken = hInToken;
  38.         bResult = TRUE;
  39.     }
  40.     else {
  41.  
  42.         bResult = OpenProcessToken(GetCurrentProcess(),
  43.             TOKEN_ADJUST_PRIVILEGES, &hToken);
  44.     }
  45.  
  46.     if (bResult) {
  47.         bResult = LookupPrivilegeValue(NULL, szPrivilege, &luid);
  48.         if (bResult) {
  49.             tp.PrivilegeCount = 1;
  50.             tp.Privileges[0].Luid = luid;
  51.             tp.Privileges[0].Attributes = (bEnable) ? SE_PRIVILEGE_ENABLED : 0;
  52.  
  53.             bResult = AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
  54.         }
  55.         if (!hInToken)
  56.             CloseHandle(hToken);
  57.     }
  58.     return bResult;
  59. }
  60.  
  61.  
  62. DWORD GetProcessId(const wchar_t *szName) {
  63.     DWORD          dwId = 0;
  64.     HANDLE         hSnap;
  65.     BOOL           bResult;
  66.     PROCESSENTRY32 pe32;
  67.  
  68.     hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  69.  
  70.     if (hSnap != INVALID_HANDLE_VALUE) {
  71.         pe32.dwSize = sizeof(PROCESSENTRY32);
  72.  
  73.         bResult = Process32First(hSnap, &pe32);
  74.         while (bResult) {
  75.             if (lstrcmpi(pe32.szExeFile, szName) == 0) {
  76.                 dwId = pe32.th32ProcessID;
  77.                 break;
  78.             }
  79.             bResult = Process32Next(hSnap, &pe32);
  80.         }
  81.         CloseHandle(hSnap);
  82.     }
  83.     return dwId;
  84. }
  85.  
  86. BOOL ImpersonateSystem(VOID) {
  87.     BOOL   bImpersonating = FALSE;
  88.     HANDLE hToken, hProcess;
  89.     // get id of a LocalSystem process
  90.     DWORD  dwId = GetProcessId(L"lsass.exe");
  91.  
  92.     if (dwId != 0) {
  93.         // enable debug privilege
  94.  
  95.         if (SetPrivilege(NULL, SE_DEBUG_NAME, TRUE)) {
  96.             // attempt to open process
  97.             hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwId);
  98.             if (hProcess != NULL) {
  99.                 // attempt to open process token
  100.                 if (OpenProcessToken(hProcess,
  101.                     TOKEN_IMPERSONATE | TOKEN_READ | TOKEN_QUERY | TOKEN_DUPLICATE /* | TOKEN_ADJUST_PRIVILEGES */ , &hToken)) {
  102.  
  103.                     SetPrivilege(hToken, SE_TCB_NAME, TRUE);
  104.                     SetPrivilege(hToken, SE_ASSIGNPRIMARYTOKEN_NAME, TRUE);
  105.                     SetPrivilege(hToken, SE_INCREASE_QUOTA_NAME, TRUE);
  106.  
  107.  
  108.                     // attempt to impersonate LocalSystem
  109.                     bImpersonating = ImpersonateLoggedOnUser(hToken);
  110.                     if (bImpersonating) {
  111.                         std::string path = "C:\\cygwin64\\bin\\getent.exe";
  112.                         puts("#mark2");
  113.                         get_file_size(path);
  114.  
  115.                         char wszCommand[256] = "C:\\cygwin64\\bin\\id.exe";
  116.                         STARTUPINFOA si = { sizeof(STARTUPINFO) };
  117.                         PROCESS_INFORMATION pi = { 0 };
  118.                         /* Unicode version of CreateProcess modifies its command parameter... Ansi doesn't.
  119.                            Apparently this is not classed as a bug ???? */
  120.                         if (!CreateProcessAsUserA(hToken, NULL, wszCommand, NULL, NULL, TRUE, CREATE_NO_WINDOW | CREATE_PRESERVE_CODE_AUTHZ_LEVEL, NULL, NULL, &si, &pi))
  121.                         {
  122.                             fprintf(stderr, "CreateProcess returned error %d\n", GetLastError());
  123.                         }
  124.                         CloseHandle(pi.hProcess);
  125.                         CloseHandle(pi.hThread);
  126.                     }
  127.                     else {
  128.                         std::cerr << "ImpersonateLoggedOnUser failed : " << GetLastError() << std::endl;
  129.                     }
  130.  
  131.                     CloseHandle(hToken);
  132.                 }
  133.                 else {
  134.                     std::cerr << "OpenProcessToken failed : " << GetLastError() << std::endl;
  135.                 }
  136.                 CloseHandle(hProcess);
  137.             }
  138.             else {
  139.                 std::cerr << "OpenProcess(\"lsass.exe\") failed : " << GetLastError() << std::endl;
  140.             }
  141.         }
  142.         else {
  143.             std::cerr << "SetPrivilege(SE_DEBUG_NAME, TRUE) failed : " << GetLastError() << std::endl;;
  144.         }
  145.     }
  146.     else {
  147.         std::cerr << "GetProcessId(\"lsass.exe\") failed : " << GetLastError() << std::endl;;
  148.     }
  149.     return bImpersonating;
  150. }
  151.  
  152.  
  153. int main()
  154. {
  155.     puts("#mark0");
  156.  
  157.     ImpersonateSystem();
  158.     return 0;
  159. }

Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:

To highlight particular lines, prefix each line with {%HIGHLIGHT}




All content is user-submitted.
The administrators of this site (kpaste.net) are not responsible for their content.
Abuse reports should be emailed to us at