Debuggovací privilegia v systému Windows

U každého operačního systému se mluví o tom, že nejvyššími právy, která může útočník získat, jsou práva administrátorská. Už ale méně je známo, že debug privilegia poskytují mnohem větší možnosti než ‚obyčejná‘ administrátorská. Tento trik je velmi oblíbenou součástí malware a je vykonán hned na začátku činnosti malwaru. Následující článek se snaží popsat, jak je možné programově tato práva získat v systému Windows.

Hned na začátek, bych rád poznamenal, že se nejedná o skutečná práva, ale pouze o nastavení bezpečnostní politiky umožňující pracovat s procesy, se kterými bychom jinak pracovat nemohli. Klasickým příkladem může být debuggování procesu služby s právy local system, možnost zasahovat do procesů jádra, případně debuggovat vzdálené procesy. Předpokladem je, že daný účet, u kterého chceme nastavit debuggovací privilegia, je buď administrátorským účtem nebo patří do skupiny, která má tato práva povolena.

Princip nastavení je velice jednoduchý: V prvním kroku se pokusíme otevřít náš aktuální proces s právy TOKEN_ADJUST_PRIVILEGES. Tato práva nám umožní přidávat/nastavovat nebo odebírat/vypínat privilegia daného procesu. K tomu využijeme Windows API funkci OpenProcessToken. Jako první argument přebírá handle procesu. Protože nám jde o aktuální proces, použijeme Windows API funkci GetCurrentProcess. Ta vrací pseudohandler aktuálního procesu. když se nám proces povede otevřít, využijeme Windows API funkci LookupPrivilegeValue a zkontrolujeme si, jaká práva jsou na daném systému dostupná. Nás zajímají práva spojená se SE_DEBUG_NAME. Získaná data jsou vrácena ve struktuře LUID (locally unique identifier). Tato struktura má velikost 64 bajtů a je tvořena dvěma prvky – DWORD pro dolní část dat a LONG pro horní část dat. LUID zajišťuje, že daná data jsou unikátní po dobu běhu počítače. Po restartu se LUID začíná vytvářet zcela od začátku. Pokud se nám úspěšně podařilo získat LUID data, můžeme přikročit k závěrečnému kroku a tím je nastavení debuggovacích práv. Využít můžeme Windows API funkci AdjustTokenPrivileges. Před samotným voláním funkce musíme naplnit strukturu TOKEN_PRIVILEGES. Ta uchovává informace, o právech, které jsou cílem našeho zájmu. Prvek PrivilegeCount udává počet práv, která budou ve struktuře obsažena. V našem případě tedy bude tato hodnota nastavena na 1. Prvek Privileges[0].Attributes již konkrétně popisuje privilegia, jež nás zajímají. Zde půjde o hodnotu SE_PRIVILEGE_ENABLED. Posledním prvkem, který budeme nastavovat je Privileges[0].Luid. Ten si naplníme výše při volání Windows API funkce LookupPrivilegeValue. Pokud i tato funkce proběhne úspěšně, máme nastavená debuggovací privilegia a můžeme si v systému dělat prakticky vše, co potřebujeme.

Samotná funkce realizující výše popsaný popis může vypadat například následovně:

int EnableDebugPrivileges(){
  HANDLE hToken;
  int ret = 0;
  TOKEN_PRIVILEGES token_priv;
 
  token_priv.PrivilegeCount = 1;
  token_priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
  if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)){
    if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &token_priv.Privileges[0].Luid) != 0)
       if(AdjustTokenPrivileges(hToken, 0, &token_priv, 0, NULL, NULL) != 0)
          ret = 1;
 
    CloseHandle(hToken);
  }
 
  return ret;
}

1 komentář u „Debuggovací privilegia v systému Windows

  1. Martin Dráb

    Privilegia (kam patří i zde diskutované SE_DEBUG_NAME) představují možnost, jak aplikace s vysokým oprávněním mohou snadno provádět některé úkoly, aniž by jim v tom příliš překážel bezpečnostní model. Tzn. nejsou to žádná „práva navíc“, ale spíš vlastnosti, kterými daný uživatelský účet (nebo skupina) disponovat mohou, ale nemusejí. Přičemž i když určitý účet daným privilegiem disponuje, nemusí jej mít ve výchozím stavem zapnuté; to se provádí právě voláním funkce AdjustTokenPrivileges.

    Privilegia jsou jakési „zkratky“. SE_DEBUG_NAME zajistí, že máš přístup ke všem procesům (pokud jej nezakáže ovladač, nebo se nejedná o tzv. protected procesy a tvůj proces k nim nepatří) bez ohledu na nastavení jejich zabezpečení (security descriptor). Podobně existují i další mocná privilegia (někdy se označují jako superprivilegia), která po povolení dovolují číst či dokonce měnit obsah souborového systému či registrů, opět bez ohledu na zabezpečení příslušných objektů. Zajímavé je, že tato mocná privilegia ani nemůžeš přiřadit obyčejnému uživateli (platí od Windows Vista), protože kdyby je měl, stal by se vlastně neomezeným vládcem (i když by se musel trochu snažit, pravda).

    Dále, funkce OpenProcessToken nezískává přístup (handle) k procesu, ale k jeho tokenu (handle procesu předáváš v prvním paremetru, takže již jej musíš nějak získat, např. skrz funkce OenProcess či CreateProcess). Token je objekt, který v sobě shromažďuje veškerá oprávnění (privilegia, identita uživatele a skupin, integritní úroveň…). Když se proces snaží získat přístup k nějakému objektu, svůj nárok zakládá právě na svém tokenu (popř. tokenu žádajícího vlákna).

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *