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

Windows Pokročilé Kontrola uživatelských účtů (UAC) 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)

 

Stáhnout

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

 

  Aktivity (1)

Článek pro vás napsal Martin Dráb
Avatar
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í

Jak se ti líbí článek?
Celkem (4 hlasů) :
55555


 



 

 

Komentáře

Avatar
msprg
Člen
Avatar
msprg:

Ehm... Zauimalo by ma co znamena "oběžní eránek" v odstavci

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ěžní erá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čí.

Ale beriem to sor ako zamerny vtip inak len informativne ;)

 
Odpovědět 16.6.2015 21:33
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na msprg
Martin Dráb:

Tak, samozřejmě, že tam má být "obětní beránek" (tedy proces, který je spuštěn pouze za účelem načtení útočné knihovny do své paměti a spuštění její inicializační funkce) :-). Díky za upozornění.

Odpovědět  +2 17.6.2015 0:09
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.