IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 3 - Kontrola uživatelských účtů ve Windows - obcházení a závěr

Minulý díl miniseriálu o Kontrole uživatelských účtů končí popisem toho, jak operační systém (Windows) postupuje při hledání DLL knihovny, kterou je potřeba načíst do paměti, a jak tento postup může záškodník zneužít. Nadešel čas se pomalu přesunout k tomu, jak takové zneužití může vést k obejití UAC.

Další možnost obrany proti načtení podstrčené DLL knihovny představuje uvedení explicitních cest k DLL knihovnám do manifestu daného EXE souboru. Systém tedy ví, kde knihovny daných jmen hledat, a tak k prohledávání nedochází. Jako příklad poslouží úryvek manifestu procesu sysprep.exe na Windows 8.1.

<!--
Specifically load these DLLs from the specified path. This
is done as a defence-in-depth approach to closing a known UAC
exploit related to Sysprep.exe being auto-elevated. The list
need not contain KnownDlls since those are always loaded
by the loader from the system directory.
-->
<file
  loadFrom="%systemroot%\system32\actionqueue.dll"
  name="actionqueue.dll" />
<file
  loadFrom="%systemroot%\system32\bcryptprimitives.dll"
  name="bcryptprimitives.dll" />
<file
  loadFrom="%systemroot%\system32\cryptbase.dll"
  name="cryptbase.dll" />
<file
  loadFrom="%systemroot%\system32\unattend.dll"
  name="unattend.dll" />
<file
  loadFrom="%systemroot%\system32\wdscore.dll"
  name="wdscore.dll" />

Jak ale demonstruje praktická ukázka v závěru tohoto textu, na některé knihovny se v manifestu této utility zapomnělo.

Pořadí prohledávaných oblastí také ovlivňuje nastavení registrové hodnoty DllSearchMode. Hodnota má typ REG_DWORD a obsahuje-li nenulová data, pro prohledávání platí první a třetí sloupeček tabulky (sloupeček hlavičky se nepočítá).

Z tabulky 2 je patrné, že při načítání DLL knihovny systém začíná hledat v adresáři s EXE souborem aplikace, v jejímž kontextu k načítání dochází. Tato složka je preferována dokonce i před systémovým adresářem či adresářem Windows. Pokud se útočníkovi podaří nakopírovat vlastní knihovnu s příhodným jménem do adresáře aplikace, která prochází přes UAC dialog automaticky, stačí mu tuto aplikaci následně spustit a má vyhráno.

Plán útoku

Postup útočníka může tedy vypadat následovně:

  1. Vyhlédnutí obětního beránka. Nejprve je třeba najít aplikaci, která automaticky prochází přes UAC dialog a při načítání knihoven dochází k prohledávání umístění popsaných v tabulce 2. Seznamy aplikací splňující první kritérium lze pravděpodobně nalézt na internetu, případně je možné uchýlit se ke kvalifikovanému odhadu. Většina takových aplikací totiž sídlí v systémovém adresáři či v jeho podstromu.
  2. Určit název útočící knihovny. Po spuštění vyhlédnuté aplikace se útočník podívá, jaké knihovny používá (např. pomocí nástroje Process Explorer) a vybere si některé ze jemn nepatřící žádné ze známých knihoven.
  3. Nakopírovat útočící knihovnu k vybrané aplikaci. Je pravda, že snad všechni potenciální obětní beránci sídlí v systémovém adresáři či jeho podstromu, tedy na místech, kam běžný uživatel nemá právo zápisu. Zde útočníkovi nahrává další zvláštní vlastnost – některé procesy (například Průzkumník) se za využití metod COM objektu IFileOperation mohou dopustit kopírování do těchto zakázaných oblastí, aniž by jim byl odepřen přístup. Mohou vytvářet nové soubory, ale ne měnit existující. Útočník tedy musí donutit některý z takto privilegovaných procesů nakopírovat útočící knihovnu na příslušné místo. V případě Průzkumníka stačí obyčejná injekce kódu (ať už surového nebo v podobě DLL knihovny).
  4. Spuštění obětního beránka. Tento krok by neměl představovat problém, jelikož oprávnění pro čtení a spouštění souborů má i běžný uživatel prakticky všude (jednu z výjimek tvoří profily jiných uživatelů).
  5. Slavení úspěchu. Pokud se útočník při provádění kroků (1) a (2) nezmýlil, spuštěný obětní beránek načte útočící knihovnu, jejíž inicializační rutina se volá s jeho oprávněním, tedy administrátorským.

Praktické ukázky

Součástí tohoto textu je i zdrojový kód projektu demonstrujícího obejití Kontroly uživatelských účtů. Projekt se nese poněkud neoriginální jméno UACBypass a skládá se ze dvou částí: programu Injector zodpovědného za vložení zadané DLL knihovny do určitého běžícího procesu (v tomto případě je použit k vložení útočné DLL knihovny do Průzkumníka Windows) a z útočné DLL knihovny, jež provádní vlastní algoritmus obcházení UAC.

Jedná se o klasickou metodu popsanou v roce 2009 Leo Davidsonem, zdrojový kód UACBypass je ale v porovnání s tím Leovým asi šestkrát menší a pravděpodobně i přehlednější. Příčina spočívá v tom, že Leo do Průzkumníka nevkládá DLL knihovnu, ale pouze kód a data potřebné k obejití UAC, což je sice méně viditelné, ale může to pro některé zatemnit hlavní smysl ukázky.

Útočná knihovna je do Průzkumníka vkládána tak, že dojde k vytvoření nového vlákna v tomto procesu. Startovní adresa nového vlákna se shoduje s počátkem funkce LoadLibraryW v knihovně kernel32.dll a parametrem je adresa plného jména souboru útočné knihovny. Toto jméno je před samotným vytvořením vlákna do Průzkumníika nakopírováno. Program Injector předpokládá, že virtuální adresa knihovny kernel32.dll bude v obou procesech (tedy v Injectoru a v Průzkumníku) stejná.

Samotná DLL knihovna pracuje následovně:

  • Zjistí, zda disponuje administrátorskými právy.
    • Pokud ne, nakopíruje se do adresáře zadaného ve zdrojovém kódu. Následně spustí proces obětního beránka, který je též specifikován ve zdrojovém kódu, a počká na jeho ukončení. Předpokládá, že obětní beránek načte novou instanci útočné knihovny, tentokrát již ale s právy správce.
    • Pokud ano, spustí Příkazový řádek, který zdědí administrátorská práva od obětního beránka. Potom beránka ukončí.

Výsledkem úspěšného útoku je tedy nová instance Příkazového řádku běžící s oprávněním správce. Pro otestování, zda útok opravdu funguje, můžete vyzkoušt následující kombinace názvu útočné knihovny a obětního beránka:

  • shcore.dll a %windir%\system32\sysprep\sysprep.exe (Windows 7 – Windows 8.1),
  • NTWDBLIB.dll a %windir%\system32\cliconfig.exe (Windows 7 – Windows 10 TP 9996).

V prvním případě útok zafunguje pouze v případě, že máte povolené animace grafického uživatelského rozhraní. Ty jsou v klientských verzích Windows ve výchozím nstavení zapnuté, na serverech je tomu opačně. Zároveň je nutné po spuštění obětního beránka kliknout na některý z comboboxů.

Druhý popisovaný případ funguje bez problémů.

Použité zdroje

  1. Leo Davidson
  2. UACMe (GitHub)
  3. UACMe (kernelmode.info)

 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 52x (18.05 kB)
Aplikace je včetně zdrojových kódů

 

Předchozí článek
Kontrola uživatelských účtů ve Windows - pokračování
Všechny články v sekci
Kontrola uživatelských účtů ve Windows (UAC)
Článek pro vás napsal Martin Dráb
Avatar
Uživatelské hodnocení:
9 hlasů
Autor se věnuje studiu obecné teorie operačních systémů, vnitřnímu uspořádání jádra OS Windows, trochu také matematice a šifrování
Aktivity