Sem koren. Razumevanje stopnjevanja privilegijev OS Linux

Prvo četrtletje leta 2020 sem preživel v pripravah na izpit OSCP. Iskanje informacij na Googlu in veliko "slepih" poskusov mi je vzelo ves prosti čas. Izkazalo se je predvsem težko razumeti mehanizme stopnjevanja privilegijev. Tečaj PWK posveča tej temi veliko pozornosti, vendar metodoloških materialov vedno ni dovolj. Na internetu je veliko priročnikov z uporabnimi ukazi, vendar nisem pristaš slepega sledenja priporočilom, ne da bi razumeli, kam bo to pripeljalo.

Z vami bi rad delil, kaj sem se uspel naučiti med pripravo in uspešnim opravljanjem izpita (vključno z občasnimi napadi na Hack The Box). Občutil sem globok občutek hvaležnosti za vsako informacijo, ki mi je pomagala bolj zavestno hoditi po poti Poskusi. Zdaj je moj čas, da se vrnem skupnosti.

Želim vam dati vodnik za stopnjevanje privilegijev v OS Linux, ki vključuje analizo najpogostejših vektorjev in povezanih funkcij, ki jih boste zagotovo potrebovali. Pogosto so sami mehanizmi stopnjevanja privilegijev precej preprosti, težave se pojavijo pri strukturiranju in analizi informacij. Zato sem se odločil, da začnem z "ogledom" in nato vsak vektor obravnavam v ločenem članku. Upam, da vam bom prihranil čas za preučevanje teme.

Sem koren. Razumevanje stopnjevanja privilegijev OS Linux

Zakaj je torej stopnjevanje privilegijev leta 2020 sploh možno, če so metode dobro poznane že zelo dolgo? Pravzaprav, če uporabnik pravilno ravna s sistemom, res ne bo mogoče povečati privilegijev v njem. Glavni svetovni problem, ki povzroča takšne priložnosti, je nezanesljiva konfiguracija. Poseben primer nevarne konfiguracije je tudi prisotnost zastarelih različic programske opreme, ki vsebujejo ranljivosti v sistemu.

Stopnjevanje privilegijev prek nevarne konfiguracije

Najprej se posvetimo negotovi konfiguraciji. Začnimo z IT strokovnjaki pogosto uporabljajo priročnike in vire, kot je stackoverflow, od katerih mnogi vsebujejo nevarne ukaze in konfiguracije. Osupljiv primer je novice da je koda, ki je bila najbolj kopirana iz stackoverflowa, vsebovala napako. Izkušen administrator bo videl podboj, vendar je to v idealnem svetu. Tudi kompetentni strokovnjaki povečana delovna obremenitev sposobni delati napake. Predstavljajte si, da skrbnik pripravlja in potrjuje dokumentacijo za naslednji razpis, se hkrati poglablja v novo tehnologijo, ki bo uvedena v naslednjem kvartalu, občasno pa rešuje naloge podpore uporabnikom. In potem dobi nalogo, da na hitro postavi nekaj virtualnih strojev in na njih uvede storitve. Kaj mislite, kakšna je verjetnost, da admin preprosto ne opazi podboja? Potem se strokovnjaki menjajo, bergle pa ostajajo, podjetja pa vedno stremijo k minimiziranju stroškov, tudi za informatike.

Psevdo lupina in beg iz zapora

Sistemska lupina, pridobljena v produkcijski fazi, je pogosto omejena, še posebej, če ste jo pridobili z vdorom uporabnika spletnega strežnika. Na primer, omejitve lupine vam lahko preprečijo uporabo ukaza sudo z napako:

sudo: no tty present and no askpass program specified

Po pridobitvi lupine priporočam, da ustvarite polnopravni terminal, na primer s Pythonom.

python -c 'import pty;pty.spawn("/bin/bash")'

Sprašujete: "Zakaj potrebujem tisoč ukazov, če lahko enega uporabim na primer za prenos datotek?" Dejstvo je, da so sistemi drugače konfigurirani, na naslednjem gostitelju Python morda ne bo nameščen, Perl pa je morda na voljo. Spretnost je, da lahko počnete znane stvari v sistemu brez znanih orodij. Najdete lahko celoten seznam funkcij tukaj.

Lupino z nizkimi privilegiji je mogoče pridobiti z uporabo ekipe 1 и ekipe 2 (presenetljivo celo GIMP).

Ogled zgodovine ukazov

Linux zbira zgodovino vseh izvedenih ukazov v datoteki ~ / .bash_history. Če je strežnik v aktivni uporabi in njegova zgodovina ni izbrisana, obstaja velika verjetnost, da so poverilnice najdene v tej datoteki. Brisanje zgodovine je banalno neprijetno. Če je skrbnik prisiljen izbirati desetnivojske ukaze prek , mu bo seveda bolj priročno, da ta ukaz pokliče iz zgodovine, kot da ga znova vnese. Poleg tega mnogi ne vedo za ta "kramp". Če so v sistemu alternativne lupine, kot sta Zsh ali Fish, imajo svojo zgodovino. Če želite prikazati zgodovino ukazov v kateri koli lupini, preprosto vnesite zgodovino ukazov.

cat ~/.bash_history
cat ~/.mysql_history
cat ~/.nano_history
cat ~/.php_history
cat ~/.atftp_history

Obstaja skupno gostovanje, pri katerem se strežnik uporablja za gostovanje več spletnih mest. Običajno ima pri tej konfiguraciji vsak vir svojega uporabnika z ločenim domačim imenikom in navideznim gostiteljem. Torej, če je nepravilno konfigurirana, lahko datoteko .bash_history najdete v korenskem imeniku spletnega vira.

Iskanje gesel v datotečnem sistemu in napadi na sosednje sisteme

Vaš trenutni uporabnik lahko prebere konfiguracijske datoteke za različne storitve. V njih najdete poverilnice v čistem besedilu – gesla za dostop do podatkovne baze ali povezanih storitev. Isto geslo je mogoče uporabiti tako za dostop do baze podatkov kot za avtorizacijo korenskega uporabnika (credential staffing).
Zgodi se, da najdene poverilnice pripadajo storitvam na drugih gostiteljih. Razvoj napada na infrastrukturo prek ogroženega gostitelja ni nič hujši od izkoriščanja drugih gostiteljev. Sosednje sisteme je mogoče najti tudi z iskanjem naslovov IP v datotečnem sistemu.

grep -lRi "password" /home /var/www /var/log 2>/dev/null | sort | uniq #Find string password (no cs) in those directories
grep -a -R -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' /var/log/ 2>/dev/null | sort -u | uniq #IPs inside logs

Če ima ogroženi gostitelj spletno aplikacijo, dostopno prek interneta, je bolje, da njene dnevnike izključite iz iskanja naslovov IP. Naslovi uporabnikov virov iz interneta nam verjetno ne bodo koristili, vendar naslovi notranjega omrežja (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) in kam gredo, sodeč po dnevniki, bi lahko bili zanimivi.

Sudo

Ukaz sudo omogoča uporabniku, da izvede ukaz v kontekstu root z lastnim geslom ali brez njegove uporabe. Številne operacije v Linuxu zahtevajo korenske pravice, vendar se izvajanje kot root šteje za zelo slabo prakso. Namesto tega je bolje uporabiti selektivno dovoljenje za izvajanje ukazov v korenskem kontekstu. Vendar pa je veliko orodij Linux, vključno s standardnimi, kot je vi, mogoče uporabiti za stopnjevanje privilegijev na zakonite načine. Če želite najti pravo pot, priporočam, da pogledate tukaj.

Prva stvar, ki jo morate narediti po pridobitvi dostopa do sistema, je zagon ukaza sudo -l. Prikazalo se bo dovoljenje za uporabo ukaza sudo. Če je pridobljen uporabnik brez gesla (na primer apache ali www-data), vektor eskalacije privilegijev sudo ni verjeten. Pri uporabi sudo bo sistem zahteval geslo. Tudi uporaba ukaza passwd za nastavitev gesla ne bo delovala, zahtevalo bo trenutno uporabniško geslo. Toda če je sudo še vedno na voljo, potem morate dejansko iskati:

  • vsi tolmači, vsak lahko ustvari lupino (PHP, Python, Perl);
  • vsi urejevalniki besedil (vim, vi, nano);
  • morebitni gledalci (manj, več);
  • morebitne možnosti dela z datotečnim sistemom (cp, mv);
  • orodja, ki imajo izhod v bash, interaktivno ali kot izvršljiv ukaz (awk, find, nmap, tcpdump, man, vi, vim, ansible).

Suid/Sgid

Na internetu je veliko priročnikov, ki svetujejo gradnjo vseh ukazov suid / sgid, vendar redek članek poda podrobnosti o tem, kaj storiti s temi programi. Najdete lahko možnosti stopnjevanja privilegijev, ki ne upoštevajo uporabe podvigov tukaj. Poleg tega imajo številne izvršljive datoteke posebne ranljivosti za različico OS, na primer.

V idealnem svetu bi morali vse nameščene pakete izvajati vsaj prek searchsploita. V praksi bi to morali narediti z najbolj priljubljenimi programi, kot je sudo. Vedno je tudi možnost, da uporabite in podprete razvoj avtomatiziranih orodij, ki bodo poudarila zanimive, z vidika eskalacije privilegijev, izvedljive datoteke z nastavljenimi biti suid/sgid. Seznam takih orodij bom podal v ustreznem razdelku članka.

Zapisljivi skripti, ki jih izvajata Cron ali Init v korenskem kontekstu

Opravila Cron se lahko izvajajo v kontekstu različnih uporabnikov, vključno z root. Če je v cronu naloga s povezavo do izvedljive datoteke in je na voljo za pisanje, jo lahko preprosto zamenjate z zlonamerno in izvedete stopnjevanje privilegijev. Hkrati so privzeto datoteke z nalogami cron na voljo za branje kateremu koli uporabniku.

ls -la /etc/cron.d  # show cron jobs 

Podobno je z init. Razlika je v tem, da se naloge v cronu izvajajo občasno, v init pa ob zagonu sistema. Za delovanje boste morali znova zagnati sistem, medtem ko se nekatere storitve morda ne bodo dvignile (če niso bile registrirane v samodejnem nalaganju).

ls -la /etc/init.d/  # show init scripts 

Iščete lahko tudi datoteke, ki jih lahko piše kateri koli uporabnik.

find / -perm -2 -type f 2>/dev/null # find world writable files

Metoda je precej znana, izkušeni sistemski skrbniki previdno uporabljajo ukaz chmod. V spletu pa velika večina priročnikov opisuje nastavitev največjih pravic. Pristop neizkušenih sistemskih skrbnikov »samo poskrbi, da deluje« načeloma ustvarja možnosti za stopnjevanje privilegijev. Če je mogoče, je najbolje, da v zgodovini ukazov poiščete nevarne uporabe chmod.

chmod +w /path 
chmod 777 /path

Pridobivanje dostopa do lupine za druge uporabnike

Ogledamo si seznam uporabnikov v /etc/passwd. Pozorni smo na tiste, ki imajo lupino. Te uporabnike lahko brutate - možno je, da boste prek nastalega uporabnika sčasoma lahko povečali privilegije.

Za izboljšanje varnosti priporočam, da se vedno držite načela najmanjših privilegijev. Smiselno si je tudi vzeti čas in preveriti nevarne konfiguracije, ki bi lahko ostale po odpravljanju težav – to je »tehnična dolžnost« skrbnika sistema.

Samonapisana koda

Vredno si je natančno ogledati izvedljive datoteke v domačem imeniku uporabnika in spletnega strežnika (/var/www/, razen če ni navedeno drugače). Te datoteke se lahko izkažejo za popolnoma nevarno rešitev in vsebujejo neverjetne bergle. Seveda, če imate neko ogrodje v imeniku vašega spletnega strežnika, ni smiselno iskati zero-day v njem kot del pentesta, vendar je priporočljivo poiskati in preučiti prilagojene spremembe, vtičnike in komponente.

Če želite povečati varnost, se je bolje izogibati uporabi poverilnic v samonapisanih skriptih, pa tudi potencialno nevarnim funkcijam, kot je branje /etc/shadow ali manipulacija id_rsa, če je to mogoče.

Povečanje privilegijev z izkoriščanjem ranljivosti

Preden poskušate povišati privilegije z izkoriščanjem, je pomembno razumeti prenos datotek na ciljnega gostitelja. Poleg običajnih orodij, kot so ssh, ftp, http (wget, curl), obstaja celota »živalski vrt« možnosti.

Če želite izboljšati varnost svojega sistema, ga redno posodabljajte na najnovejše stabilno različice in poskusite uporabiti tudi distribucije, zasnovane za Enterprise. Sicer redko, vendar pride do situacij, ko apt nadgradnja naredi sistem neuporaben.

Izkoriščanje storitev, ki se izvajajo v kontekstu korenskega uporabnika

Nekatere storitve Linux se izvajajo kot privilegirani uporabnik root. Najdete jih lahko s pomočjo ps aux | grep root. V tem primeru storitev morda ne bo objavljena na spletu in bo na voljo lokalno. Če ima javne podvige, jih je mogoče varno uporabiti: zrušitev storitve v primeru okvare je veliko manj kritična kot zrušitev OS.

ps -aux | grep root # Linux

Najuspešnejši primer se lahko šteje za delovanje vdrte storitve v kontekstu uporabnika root. Upravljanje storitve SMB daje SYSTEM privilegiran dostop v sistemih Windows (npr. prek ms17-010). Vendar to ni običajno v sistemih Linux, zato lahko porabite veliko časa za stopnjevanje privilegijev.

Izkoriščanje ranljivosti jedra Linuxa

To je zadnja pot. Neuspešno delovanje lahko povzroči zrušitev sistema in v primeru ponovnega zagona se nekatere storitve (vključno s tistimi, prek katerih je bilo mogoče pridobiti izvirno lupino) morda ne bodo dvignile. Zgodi se, da je skrbnik preprosto pozabil uporabiti ukaz systemctl enable. Poleg tega bo povzročilo veliko nezadovoljstva z vašim delom, če izkoriščanje ni bilo dogovorjeno.
Če se odločite za uporabo virov iz exploitdb, obvezno preberite komentarje na začetku skripta. Med drugim običajno piše, kako pravilno prevesti ta exploit. Če ste bili preleni ali ste zaradi rokov potrebovali "včeraj", lahko poiščete repozitorije z že prevedenimi exploiti, na primer. Vendar je treba razumeti, da boste v tem primeru dobili prašiča v žapu. Po drugi strani pa, če bi programer do potankosti razumel, kako računalnik deluje in programsko opremo, ki jo uporablja, v svojem življenju ne bi napisal niti vrstice kode.

cat /proc/version
uname -a
searchsploit "Linux Kernel" 

Metasploit

Da bi ujeli in obravnavali povezavo, je vedno bolje uporabiti modul exploit/multi/handler. Glavna stvar je, da nastavite pravilno obremenitev, na primer generic/shell/reverce_tcp ali generic/shell/bind_tcp. Lupino, pridobljeno v Metasploitu, je mogoče nadgraditi na Meterpreter z uporabo modula post/multi/manage/shell_to_meterpreter. Z Meterpreterjem lahko avtomatizirate postopek po izkoriščanju. Na primer, modul post/multi/recon/local_exploit_suggester preveri platformo, arhitekturo in entitete, ki jih je mogoče izkoristiti, ter predlaga module Metasploit za stopnjevanje privilegijev v ciljnem sistemu. Zahvaljujoč Meterpreterju se stopnjevanje privilegijev včasih zmanjša na zagon pravega modula, vendar hekanje, ne da bi razumeli, kaj se dogaja pod pokrovom, ni res (še vedno morate napisati poročilo).

Orodja

Orodja za avtomatizacijo lokalnega zbiranja informacij vam bodo prihranila veliko truda in časa, vendar sama po sebi ne morejo v celoti prepoznati poti eskalacije privilegijev, zlasti v primeru izkoriščanja ranljivosti jedra. Orodja za avtomatizacijo bodo za vas izvedla vse potrebne ukaze za zbiranje informacij o sistemu, pomembno pa je tudi, da lahko analizirati prejete podatke. Upam, da vam bo moj članek pri tem koristen. Seveda obstaja veliko več orodij, kot jih bom naštel spodaj, vendar vsa delujejo približno enako – to je bolj stvar okusa.

Linpeas

Precej sveže orodje, prva potrditev je datirana januarja 2019. Trenutno moj najljubši instrument. Bistvo je, da izpostavlja najbolj zanimive vektorje stopnjevanja privilegijev. Strinjam se, da je bolj priročno dobiti strokovno oceno na tej ravni kot razčleniti monolitne neobdelane podatke.

LinEnum

Moje drugo najljubše orodje, prav tako zbira in organizira podatke, prejete kot rezultat lokalnega popisovanja.

linux-exploit-suggester(1,2)

To izkoriščanje bo analiziralo sistem glede ustreznih pogojev za izkoriščanja. Pravzaprav bo opravljal nalogo, ki je enaka modulu Metasploit local_exploit_suggester, vendar bo ponujal povezave do izvornih kod exploit-db namesto modulov Metasploit.

Linuxprivchecker

Ta skript bo zbral in organiziral po razdelkih veliko količino informacij, ki so lahko uporabne za oblikovanje vektorja stopnjevanja privilegijev.

Drugič bom podrobneje razložil Stopnjevanje privilegijev za Linux prek suid/sgid.

Vir: www.habr.com

Dodaj komentar