Dvigovanje privilegijev: do skrbnika in nazaj

Objavljeno: 25.9.2006 14:33 | Avtor: Edi Strosar | Kategorija: Nasveti | Revija: Julij 2006

Hekerji imajo le en cilj: popoln nadzor nad računalnikom. To pa lahko dosežejo le s skrbniškimi privilegiji na napadenem računalniku. Hekerski napad je v svojem bistvu vedno zreduciran na en sam preprost namen: dostop do skrbniške ravni Administrator, SYSTEM ali root. Napadalec najpogosteje doseže to raven z uporabo programa, t. i. "exploita", ki z izkoriščanjem specifične varnostne pomanjkljivosti v programski opremi dodeli napadalcu privilegije root (Unix/Linux) ali NT AUTHORITY\SYSTEM (Windows). Kadar imajo napadalci do računalnika dostop le prek računa, ki ima omejene pravice, uporabljajo metodo, imenovano dvigovanje (eskalacija) privilegijev. Namen eskalacije je privzdigovanje poverilnic (credentials) omejenega računa v sistemske oz. neomejene. V članku bodo opisani nekateri primeri eskalacij v okolju Windows, ki ne zahtevajo uporabe "hekerskih" aplikacij ali "exploitov". Najprej pa osnove...

Nadzor nad dostopom (Access Control) je mehanizem, ki določa, do katerih sredstev (resources) ima uporabnik dostop in katera opravila lahko izvaja. Dva najpogostejša načina izvedbe nadzora nad dostopom sta DAC (Discretionary Access Control) in MAC (Mandatory Access Control). DAC omogoča uporabnikom, da sami določajo, kdo ima dostop do objektov, katerih lastniki so. Pri načinu MAC pa lahko le skrbnik, prek definiranih pravil, določa dostop do sredstev. Način MAC je varnejši, a manj prilagodljiv. Windows in večina distribucij Linux/UNIX uporabljajo implementacijo DAC.

Najpogostejši način izvajanja nadzora nad dostopom je prek seznamov nadzora nad dostopom (Access Control Lists oz. ACLs). V okolju Windows je ACL sestavljen iz serije vnosov nadzora nad dostopom (Access Control Entries oz. ACEs), ki vsebujejo varnostni identifikator (Security IDentificator oz. SID) in skupek definicij, ki določajo, katere operacije (branje, pisanje, brisanje...) se lahko izvajajo na specifičnem objektu (mapa, datoteka, proces, storitev, cev...). SID je unikaten vsakemu uporabniku ali skupini uporabnikov, zato npr. preimenovanje računa Administrator ne spremeni skrbniškega varnostnega identifikatorja in ostane S-1-5-21-domain-500. Windows pozna dve obliki seznamov nadzora nad dostopom: DACL (Discretionary ACL) in SACL (System ACL). Slednji poleg avtorizacije izvaja tudi pregled (audit) in dnevnik (log). Poleg ACL se pri izvajanju nadzora nad dostopom uporablja tudi varnostne deskriptorje (security descriptors), ki vsebujejo štiri elemente: SID uporabnika, SID skupine, SACL in DACL. Ko želimo preveriti ali modificirati atribute določenega objekta, storimo to prek varnostnega deskriptorja.

Ko ustvarimo nov uporabniški račun, mu sistem določi unikaten in stalen SID, s katerim ga prepozna. Ob prijavi uporabnika v sistem se ustvari t. i. žeton (token), ki vsebuje SID uporabnika, SID skupine, ki ji uporabnik pripada, ter uporabnikove privilegije. Žeton se nato vnese v vse niti (threads), storitve in procese, ki pripadajo računu. Če uporabnik želi dostop do objekta, varovanega z ACL, se žeton primerja z vnosi ACE, na podlagi katerih mu je dostop nato dovoljen ali onemogočen. Vendar se v svetu Oken dogajajo tudi precej čudne stvari...

Program.exe

Ena najbolj čudaških je gotovo ta, da je program s skrbniškimi pravicami mogoče pognati le zato, ker Okna še vedno ne obvladajo najbolje dolgih imen datotek in imenikov...

Za razumevanje konkretnega primera moramo najprej vedeti, kako Okna zaganjajo programe. Npr:

1. Start, Zaženi, C:\Windows\System32\calc.exe

Ukaz požene calc.exe oz. Kalkulator.

2. Start, Zaženi, "C:\Program Files\WIDCOMM\Bluetooth Software\bin\btwdins.exe"

Skoraj enako kakor v prejšnjem primeru. Ukaz požene btwdins.exe oz. storitev bluetooth, ki je (bil) privzeto nameščen v večino notesov HP. Ključnega pomena je uporaba narekovajev, ki se pojavljajo zaradi presledkov v ukazu.

Združljivost s "staro" nomenklaturo 8.3 omogoča, da program poženemo tudi takole:

Start, Zaženi, C:\Progra~1\WIDCOMM\Blueto~1\bin\btwdins.exe

V tem primeru narekovajev ne potrebujemo.

3. Start, Zaženi, C:\Program Files\WIDCOMM\Bluetooth Software\bin\btwdins.exe

Čeprav je ukaz na prvi pogled videti popolnoma enako kakor v drugem primeru, so tu izpuščeni narekovaji. Windows v tem primeru po definiciji izvede naslednje operacije:

-    najprej poskuša pognati C:\Program.exe,

-    če ga ni, poskuša zagnati C:\Program Files\WIDCOMM\Bluetooth.exe,

-    če tudi tega ni, v naslednjem koraku najde C:\Program Files\WIDCOMM\Bluetooth Software\bin\btwdins.exe in ga požene.

Ker vemo, da se btwdins.exe oz. storitev bluetooth, tako kakor večina storitev, zaganja v privilegiranem kontekstu LocalSystem, je dvigovanje privilegijev v tem primeru trivialna. V korenski imenik računalnika prekopiramo cmd.exe in ga preimenujemo v Program.exe. Ob naslednjem zagonu bo sistem izvedel naš "program.exe" in nam s tem ponudil ukazno lupino s polnimi skrbniškimi privilegiji! Windows 2000 in novejši nas sicer obvestijo o "potencialno nevarni aplikaciji", vendar to ne predstavlja resnejše ovire. Velja omeniti, da je med aktualnejšimi različicami Oken omenjena ranljivost bolj izjema kot pravilo, saj je vrzel že davno zakrpana. Tu in tam pa izvedenci kljub temu odkrijejo še kak program s pomanjkljivo definirano potjo izvajanja. Microsoftov protivohunski program je bil eden izmed takih (v novejši izdaji je Windows Defender imun za omenjeno pomanjkljivost). Ranljivi so bili tudi Real Player, iTunes, VMWare, McAfee, Kaspersky... Če želimo tudi sami sodelovati pri "lovu", je dovolj, da imamo v korenskem imeniku kopijo Program.exe.

Sistem nas opozori na izvajanje programa Program.exe

Sistemske storitve

Kot rečeno, se storitve izvajajo v kontekstu LocalSystem, zato so priljubljena tarča hekerskih napadov in imajo pomembno vlogo tudi pri elevaciji privilegijev. Začnemo lahko tako, da poiščemo storitev, ki dovoljuje delo tudi uporabnikom z omejenim računom.

Service Security Viewer omogoča popravljanje storitvenih varnostnih atributov.

Številna orodja omogočajo delo z lokalnimi storitvami. Service Security Viewer je odličen in do uporabnikov Windows zelo prijazen program, vendar je v našem primeru uporabnejši accesschk (Sysinternals). Ta prikaže pravice do dostopa za določenega uporabnika ali skupine do specifičnih objektov (registrskih ključev, storitev in imenikov). V ukazno vrstico vpišemo: accesschk -cw "users". Dvig pravic izvedemo s programom sc.exe (Service Control), ki je standardni del Windows XP/2003, sicer pa je na CDju z Resource Kitom. Tam so zbrana uporabna orodja, ki iz različnih razlogov niso dobila svojega mesta v operacijskem sistemu. Nekatere izmed storitev, ki (še vedno?) omogočajo delo vsem uporabnikom, so "Adobe LM Service", "Macromedia Licensing Service", "Autodesk Licensing Service" in "Novell NetDrive". Ranljivi so (bili) tudi nekateri protivirusni programi. V konzoli torej izvedemo naslednje ukaze:

sc stop "Adobe LM Service"

sc config "Adobe LM Service" type= own type= interact

sc config "Adobe LM Service" binpath= "cmd /c start cmd"

sc start "Adobe LM Service"

Odpre se ukazno okno, v katerega vpišemo ukaz:

net localgroup administrators naše_uporabniško_ime /add

in računu dodelimo skrbniške pravice.

Poimenovane cevi

Dvigovanje s poimenovanimi cevmi (named pipes) je vsekakor preveč zanimiva, da bi jo lahko enostavno izpustili. Čeprav bo opisana zgolj "hipotetično", je znanih veliko primerov zlorabe poimenovanih cevi z namenom elevacije privilegijev.

Poimenovane cevi so mehanizem IPC (InterProcess Communication) na platformi UNIX/Windows, ki omogoča procesom medsebojno komunikacijo prek skupnega pomnilnika. Cevi (pipes) so lahko poimenovane (named) ali anonimne (anonymous). Zaradi standarda UNC so imena cevi vedno v obliki \\.\pipe\ime_cevi. Zanimivost pri poimenovanih ceveh je impersonacija odjemalčevih privilegijev. Poskusimo poenostaviti na stvarnem zgledu: kot omejeni uporabnik naredimo cev, poimenovano \\.\pipe\null, in nato prepričamo privilegiranega sistemskega uporabnika, da se poveže na cev \\računalnik\pipe\null. Ko je komunikacija vzpostavljena, lahko izvajamo ukaze v odjemalčevem privilegiranem kontekstu. Konkretno lahko elevacijo izvedemo tako, da poskusimo preusmeriti pot dnevniške (log) datoteke iz npr. C:\Program Files\Anti-Virus\dnevnik.log v \\računalnik\pipe\null. Zelo znana (zdaj že odpravljena) oblika eskalacije s pomočjo poimenovanih cevi je bila opisana v Phrack Magazinu. Uporablja Microsoft SQL Server, ki deluje v privilegiranem kontekstu SYSTEM, dostop do njega pa imajo tudi omejeni uporabniki:

V konzoli1 izvedemo ukaz createpipe cmd.exe. V navedenem primeru je createpipe poljuben program za ustvarjanje poimenovanih cevi, saj Windows ne premore podobnega orodja.

>createpipe cmd.exe    

Created Named Pipe: \\.\pipe\GetSys

Waiting for connection...

V konzoli2 se z neprivilegiranim računom prijavimo v strežnik SQL in povežemo na poimenovano cev.

>isql -U user

Password: ********

1> xp_fileexist '\\ComputerName\pipe\GetSys'

2> go

File ExistsFile is a Directory Parent Directory Exists

------------ -------------------------------------------------

1 0 1

V konzoli1 se izvede poosebljenje sistemskih privilegijev in prikaže ukazna vrstica z neomejenimi pravicami.

Impersonate...

Open Thread Token...

Duplicating Token...

Impersonating: SYSTEM

Creating New Process cmd.exe

Enumeracijo poimenovanih cevi lahko izvedemo s PipeList (Sysinternals) in PipeACL (Symantec) ali PipeSEC (BeyondLogic). Kakor vsem objektom lahko tudi cevem spremenimo varnostne atribute, a le, če imamo zadostne privilegije, saj je Microsoft v Windows XP/2003 uvedel zelo restriktivno politiko glede dostopa do poimenovanih cevi in dela z njimi.

Symantecov PipeACL - kdo ima pravice do izbrane cevi

Slabo nastavljeni ACLji

Napačno nastavljeni seznami nadzorov nad dostopom (ACLs) so zelo pereč problem, saj nekateri programi med namestitvijo spremenijo dovoljenja (permissions) različnih imenikov v Everybody (Users):FULL, kar preprosto pomeni, da imajo vsi uporabniki neomejen in popoln dostop do mape in njenih datotek. Pri namestitvi programov je priporočljivo uporabljati program InCtrl5 (PC Magazine), ki zazna vse spremembe v sistemu, nastale kot posledica namestitve (spremembe registra, map, datotek...). Za iskanje imenikov s slabo nastavljenimi ACLji lahko uporabimo že omenjeni accesschk (ukaz accesschk -dws "everyone"; slednji parameter lahko, po potrebi, nadomestimo z "users") ali enostavnejši AccessEnum (Sysinternals).

PC Magazinov InCTRL zapisuje vse spremembe, ki v sistemu nastanejo ob namestitvi programov.

Ko odkrijemo privilegiran program, ki je v nepravilno varovanem imeniku, sta možna (najmanj) dva vektorja napada (attack vectors). V prvem primeru ustvarimo prazno datoteko, ki jo poimenujemo kakor ciljni program s končnico .local, npr. program.exe.local. Potrebujemo še prirejeno knjižnico DLL (Dynamic-Link Library), ki bo izvedla želene ukaze (npr. pognala cmd.exe). Microsoft to funkcionalnost imenuje preusmeritev DLL, uporabna pa je pri reševanju konfliktov med različnimi različicami dinamičnih knjižnic (problem je bolj znan pod imenom DLL hell), saj ime datoteke aplikacija.exe.local deluje kakor vodnik, naj se ob naslednjem izvajanju poleg standardnih (le-te so definirane v registru) prioritetno naložijo knjižnice DLL iz dotičnega imenika.

Enumeracija slabo nastavljenih ACLjev z AccessEnum

Preusmeritev in zamenjava dinamične knjižnice bo najverjetneje povzročila sesutje programa, vendar bo le-ta predhodno izvedel ukaze, definirane v naši modificirani knjižnici DLL. Seveda omenjena metoda zahteva določeno programersko znanje. Veliko laže je izvesti zamenjavo samega programa. TrendMicro PC-cillin je imel do nedavna npr. naslednjo težavo: vsak neprivilegiran uporabnik je lahko ustavil storitev TrendMicro in preprosto zamenjal tmntsrv.exe (PC-cillin Real-time Scan) s cmd.exe. Ob vnovičnem zagonu storitve se je prikazala ukazna vrstica s sistemskimi privilegiji.

Pravice si lahko privzdignemo tudi s pomočjo nepravilno varovanih registrskih ključev. Za enumeracijo registrskih ključev uporabimo accesschk -wsk "users" hklm\software ali AccessEnum. Ko naletimo na ključ, v katerem je definirana pot izvajanja privilegiranega programa, na konec parametra le dodamo "&& cmd.exe" (brez navednic).

Zakrpan in odpravljen, a omembe vreden način elevacije je tudi t. i. "F1 metoda", saj nam prikaže vso iznajdljivost hekerjev. Gre za izvajanje ukazov ob pomoči ukaznega okolja HTML Help, ki je namenjen prikazovanju datotek pomoči. V oknu privilegiranega programa, ki dovoljuje manipulacijo tudi navadnim uporabnikom (različni protivirusni programi, požarni zidovi...) pritisnemo tipko F1, z menuja izberemo "Jump to URL..." in vnesemo pot do programa, ki ga želimo izvesti (npr. c:\windows\system32\cmd.exe). Ranljive različice pomoči izvedejo ukaz v privilegiranem načinu.

Znižanje privilegijev

Priznajmo si, uporabniki vedno poganjamo svoje mlinčke s skrbniškim računom. Uživamo v občutku popolnega nadzora in neomejenih privilegijev. Napaka. V času, ko na vsakem koraku prežijo na nas velikanske in zelo izpopolnjene oblike zlobne kode, je takšno početje, milo rečeno, nespametno. Zato eksperti za računalniško varnost že nekaj časa promovirajo koncept, imenovan najmanj privilegirani uporabniški račun ali LUA (Least-privileged User Account). Stvar je preprosta: strokovnjaki nas skušajo prepričati, naj, če se le da, uporabljamo račun z minimalnimi pravicami. Zlobna koda se bo tako v primeru okužbe izvajala v omejenem uporabniškem kontekstu. LUA namreč omejuje spreminjanje sistemskih imenikov, vnose v register, izvajanje ActiveX komponent,...

Microsoftov SetSafer izbranim programom zniža pravice, v katerih se izvajajo.

Ker pa smo uporabniki razvajeni, so v Microsoftu razvili programa DropMyRights in SetSAFER. Uporaba orodij je preprosta in nam omogoča, da se določeni programi, ki jih sami izberemo, izvajajo v kontekstu LUA, čeprav smo v sistem prijavljeni kot skrbnik. Tako je priporočljivo znižati privilegije naslednjim (kritičnim) programom: Internet Explorerju, Outlook Expressu, Windows Media Playerju, Windows Messengerju, MSN Explorerju in celotni zbirki Microsoft Office. Orodji odlično opravljata svoje delo (SetSAFER je za odtenek močnejši), saj težav in omejitev sploh ne opazimo. Manjša nevšečnost nastane, ko se želimo z IE povezati na Microsoftovo uradno stran za popravke, saj LUA, kot že omenjeno, onemogoča izvajanje komponent ActiveX. Težavo odpravimo s kopijo iexplore.exe (Internet Explorer) na namizju, ki jo nato uporabljamo zgolj za posodabljanje sistema prek Windows Update.

Uporabne povezave:

evgenii.rudnyi.ru/soft/sid/

msdn.microsoft.com/msdnmag/issues/05/03/SecurityBriefs/default.aspx

www.sysinternals.com/utilities/accesschk.html

www.sysinternals.com/utilities/accessenum.html

www.sysinternals.com/Files/PipeList.zip

www.bindview.com/Services/RAZOR/Utilities/Windows/pipeacltools1_0.cfm

www.beyondlogic.org/consulting/pipesec/pipesec.htm

www.gentlesecurity.com/04302006.html

www.pcmag.com/article2/0,4149,9882,00.asp

msdn.microsoft.com/security/securecode/columns/default.aspx?pull=/library/en-us/dncode/html/secure11152004.asp

msdn.microsoft.com/security/securecode/columns/default.aspx?pull=/library/en-us/dncode/html/secure01182005.asp

Naroči se na redna tedenska ali mesečna obvestila o novih prispevkih na naši spletni strani!
Prijava

Komentirajo lahko le prijavljeni uporabniki