Ja sam root. Razumijevanje eskalacije privilegija Linux OS-a

Prvi kvartal 2020. proveo sam pripremajući se za OSCP ispit. Traženje informacija na Guglu i puno "slijepih" pokušaja oduzimali su mi svo slobodno vrijeme. Pokazalo se da je posebno teško razumjeti mehanizme za eskalaciju privilegija. Kurs PWK ovoj temi posvećuje veliku pažnju, ali metodološki materijali uvijek nisu dovoljni. Na internetu postoji mnogo priručnika sa korisnim komandama, ali ja nisam pristalica slijepog praćenja preporuka bez razumijevanja kuda će to dovesti.

Želeo bih da podelim sa vama šta sam uspeo da naučim tokom pripreme i uspešnog polaganja ispita (uključujući periodične racije na Hack The Box). Osjećao sam duboku zahvalnost za svaku informaciju koja mi je pomogla da svjesnije hodam putem Try Harder, sada je moje vrijeme da vratim zajednici.

Želim vam dati vodič za eskalaciju privilegija u OS Linuxu, koji uključuje analizu najčešćih vektora i povezanih funkcija koje će vam svakako trebati. Često su sami mehanizmi eskalacije privilegija prilično jednostavni, poteškoće se javljaju prilikom strukturiranja i analize informacija. Stoga sam odlučio da počnem s "razgledanjem", a zatim razmotrim svaki vektor u posebnom članku. Nadam se da ću vam uštedjeti vrijeme za proučavanje teme.

Ja sam root. Razumijevanje eskalacije privilegija Linux OS-a

Dakle, zašto je eskalacija privilegija uopće moguća 2020. godine ako su metode poznate već jako dugo? Zapravo, ako korisnik pravilno rukuje sistemom, zaista neće biti moguće povećati privilegije u njemu. Glavni globalni problem koji stvara takve mogućnosti je nesigurna konfiguracija. Poseban slučaj nesigurne konfiguracije je i prisustvo zastarjelih verzija softvera koje sadrže ranjivosti u sistemu.

Eskalacija privilegija kroz nesigurnu konfiguraciju

Prije svega, pozabavimo se nesigurnom konfiguracijom. Počnimo sa IT profesionalci često koriste priručnike i resurse kao što je stackoverflow, od kojih mnogi sadrže nesigurne komande i konfiguracije. Upečatljiv primjer je vest da je kod koji se najviše kopirao iz stackoverflow-a sadržavao grešku. Iskusni administrator će vidjeti dovratak, ali ovo je u idealnom svijetu. Čak i kompetentni profesionalci povećano opterećenje sposoban da pravi greške. Zamislite da administrator priprema i odobrava dokumentaciju za naredni tender, istovremeno se upuštajući u novu tehnologiju koja će biti uvedena u narednom kvartalu, uz periodično rješavanje zadataka korisničke podrške. A onda dobija zadatak da brzo podigne par virtuelnih mašina i na njima uvede servise. Šta mislite, kolika je vjerovatnoća da admin jednostavno ne primijeti dovratak? Tada se stručnjaci mijenjaju, ali štake ostaju, dok kompanije uvijek nastoje da minimiziraju troškove, uključujući i one za IT stručnjake.

Pseudo shell i jailbreak

Sistemska školjka dobijena u fazi proizvodnje često je ograničena, posebno ako ste je dobili hakiranjem korisnika web servera. Na primjer, ograničenja ljuske mogu vas spriječiti da koristite naredbu sudo s greškom:

sudo: no tty present and no askpass program specified

Nakon što dobijete ljusku, preporučujem kreiranje punopravnog terminala, na primjer s Pythonom.

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

Pitate: "Zašto mi treba hiljadu komandi, ako jednu mogu koristiti, na primjer, za prijenos datoteka?" Činjenica je da su sistemi drugačije konfigurisani, na sledećem hostu Python možda neće biti instaliran, ali Perl je dostupan. Vještina je biti u stanju raditi poznate stvari u sistemu bez poznatih alata. Potpunu listu funkcija možete pronaći ovdje.

Shell s niskim privilegijama može se dobiti korištenjem timovi 1 и timovi 2 (iznenađujuće čak i GIMP).

Pogledajte historiju komandi

Linux prikuplja istoriju svih izvršenih naredbi u datoteci ~ / .bash_history. Ako je server u aktivnoj upotrebi i njegova historija nije obrisana, postoji velika šansa da se vjerodajnice pronađu u ovoj datoteci. Brisanje istorije je banalno nezgodno. Ako je administrator primoran da izabere komande deset nivoa preko , naravno, biće mu zgodnije da ovu komandu pozove iz istorije nego da je ponovo unese. Osim toga, mnogi ne znaju za ovaj "hak". Ako u sistemu postoje alternativne školjke poput Zsh ili Fish, one imaju svoju istoriju. Da biste prikazali istoriju komandi u bilo kojoj ljusci, samo unesite istoriju komandi.

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

Postoji dijeljeni hosting, u kojem se server koristi za hostovanje nekoliko lokacija. Obično, sa ovom konfiguracijom, svaki resurs ima svog korisnika sa zasebnim kućnim direktorijumom i virtuelnim hostom. Dakle, ako je pogrešno konfigurisana, možete pronaći datoteku .bash_history u korijenskom direktoriju web resursa.

Pronalaženje lozinki u sistemu datoteka i napadi na susjedne sisteme

Vaš trenutni korisnik može čitati konfiguracijske datoteke za različite usluge. U njima možete pronaći vjerodajnice u čistom tekstu - lozinke za pristup bazi podataka ili srodnim uslugama. Ista lozinka se može koristiti i za pristup bazi podataka i za ovlašćivanje root korisnika (credential staffing).
Dešava se da pronađeni akreditivi pripadaju servisima na drugim hostovima. Razvoj napada na infrastrukturu preko kompromitovanog hosta nije ništa gori od eksploatacije drugih hostova. Susedni sistemi se takođe mogu pronaći traženjem IP adresa u sistemu datoteka.

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

Ako kompromitovani host ima web aplikaciju dostupnom sa Interneta, bolje je isključiti njegove zapise iz pretraživanja IP adresa. Adrese korisnika resursa sa Interneta verovatno nam neće biti od koristi, ali adrese interne mreže (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) i gde idu, sudeći po dnevnici, mogu biti od interesa.

Sudo

Naredba sudo omogućava korisniku da izvrši naredbu u kontekstu root-a koristeći vlastitu lozinku ili je uopće ne koristi. Mnoge operacije u Linuxu zahtijevaju root privilegije, ali se pokretanje kao root smatra vrlo lošom praksom. Umjesto toga, bolje je primijeniti selektivnu dozvolu za izvršavanje naredbi u korijenskom kontekstu. Međutim, mnogi Linux alati, uključujući standardne kao što je vi, mogu se koristiti za eskalaciju privilegija na legitimne načine. Da biste pronašli pravi put, preporučujem da pogledate ovdje.

Prva stvar koju treba uraditi nakon što dobijete pristup sistemu je da pokrenete naredbu sudo -l. Prikazaće dozvolu za korišćenje naredbe sudo. Ako se dobije korisnik bez lozinke (kao što je apache ili www-data), vektor eskalacije sudo privilegija je malo vjerojatan. Kada koristite sudo, sistem će tražiti lozinku. Korištenje naredbe passwd za postavljanje lozinke također neće raditi, tražit će trenutnu korisničku lozinku. Ali ako je sudo još uvijek dostupan, tada, zapravo, trebate potražiti:

  • bilo koji interpretator, svako može pokrenuti ljusku (PHP, Python, Perl);
  • bilo koji uređivač teksta (vim, vi, nano);
  • bilo koji gledalac (manje, više);
  • sve mogućnosti rada sa datotečnim sistemom (cp, mv);
  • alati koji imaju izlaz u bash-u, bilo interaktivno ili kao izvršna naredba (awk, find, nmap, tcpdump, man, vi, vim, ansible).

Suid/Sgid

Na Internetu postoji mnogo priručnika koji savjetuju pravljenje svih suid/sgid komandi, ali rijedak članak daje pojedinosti o tome što učiniti s ovim programima. Mogu se pronaći opcije eskalacije privilegija koje ne uzimaju u obzir korištenje eksploatacije ovdje. Također, određeni broj izvršnih datoteka ima specifične ranjivosti za verziju OS-a, na primjer.

U idealnom svijetu, trebali biste pokrenuti sve instalirane pakete barem kroz searchsploit. U praksi, to bi trebalo učiniti sa najpopularnijim programima kao što je sudo. Također je uvijek opcija za korištenje i podršku razvoju automatiziranih alata koji će istaknuti zanimljive, sa stanovišta eskalacije privilegija, izvršne datoteke sa postavljenim suid/sgid bitovima. Dat ću popis takvih alata u odgovarajućem odjeljku članka.

Skripte koje se mogu pisati pokreću Cron ili Init u korijenskom kontekstu

Cron poslovi se mogu izvoditi u kontekstu različitih korisnika, uključujući root. Ako u cron-u postoji zadatak sa vezom do izvršne datoteke, a dostupan je za pisanje, možete ga lako zamijeniti zlonamjernim i izvršiti eskalaciju privilegija. Istovremeno, prema zadanim postavkama, datoteke sa cron zadacima dostupne su za čitanje svakom korisniku.

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

Sličan je slučaj i sa init. Razlika je u tome što se zadaci u cron-u izvršavaju periodično, au init-u - pri pokretanju sistema. Za rad, morat ćete ponovo pokrenuti sistem, dok se neke usluge možda neće pokrenuti (ako nisu registrirane u automatskom učitavanju).

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

Također možete pretraživati ​​datoteke na koje može pisati bilo koji korisnik.

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

Metoda je prilično poznata, iskusni sistem administratori pažljivo koriste komandu chmod. Međutim, na Webu, velika većina priručnika opisuje postavljanje maksimalnih prava. Pristup neiskusnih sistemskih administratora „samo neka radi“ stvara mogućnosti za eskalaciju privilegija u principu. Ako je moguće, najbolje je potražiti u istoriji komandi nesigurnu upotrebu chmod-a.

chmod +w /path 
chmod 777 /path

Dobivanje pristupa ljusci za druge korisnike

Gledamo listu korisnika u /etc/passwd. Obraćamo pažnju na one koji imaju školjku. Možete brutirati ove korisnike - moguće je da ćete preko rezultirajućeg korisnika na kraju moći povećati privilegije.

Da biste poboljšali sigurnost, preporučujem da se uvijek pridržavate principa najmanje privilegija. Takođe ima smisla odvojiti vrijeme za provjeru nesigurnih konfiguracija koje bi mogle ostati nakon rješavanja problema - to je "tehnička dužnost" administratora sistema.

Samopisni kod

Vrijedi pažljivo pogledati izvršne datoteke u korisničkom i web serverovom kućnom direktoriju (/var/www/ osim ako nije drugačije navedeno). Ove datoteke mogu se pokazati kao potpuno nesigurno rješenje i sadrže nevjerovatne štake. Naravno, ako imate neki framework u direktoriju vašeg web servera, nema smisla tražiti nulti dan u njemu kao dio pentesta, ali se preporučuje da pronađete i proučite prilagođene modifikacije, dodatke i komponente.

Da biste povećali sigurnost, bolje je izbjegavati korištenje vjerodajnica u skriptama koje sami pišu, kao i potencijalno opasne funkcije, kao što je čitanje /etc/shadow ili manipulacija id_rsa, ako je moguće.

Podizanje privilegija kroz iskorištavanje ranjivosti

Pre nego što pokušate da podignete privilegije kroz eksploataciju, važno je razumeti prijenos datoteka na ciljni host. Pored uobičajenih alata kao što su ssh, ftp, http (wget, curl), postoji cjelina "zoološki vrt" mogućnosti.

Da biste poboljšali sigurnost vašeg sistema, redovno ga ažurirajte na najnovije stabilan verzije, a također pokušajte koristiti distribucije dizajnirane za Enterprise. Inače, rijetko, ali postoje situacije kada apt upgrade čini sistem neupotrebljivim.

Iskorišćavanje usluga koje se pokreću u kontekstu osnovnog korisnika

Neki Linux servisi rade kao privilegirani korisnik root. Mogu se pronaći pomoću ps aux | grep root. U tom slučaju usluga možda neće biti objavljena na webu i biti dostupna lokalno. Ako ima javne eksploatacije, oni se mogu bezbedno koristiti: rušenje usluge u slučaju kvara je mnogo manje kritično od pada OS-a.

ps -aux | grep root # Linux

Najuspješnijim slučajem može se smatrati rad hakovanog servisa u kontekstu root korisnika. Upravljanje SMB uslugom daje SISTEMU privilegovani pristup na Windows sistemima (npr. preko ms17-010). Međutim, ovo nije uobičajeno na Linux sistemima, tako da možete potrošiti dosta vremena na eskalaciju privilegija.

Iskorištavanje ranjivosti Linux kernela

Ovo je posljednji put kojim treba ići. Neuspješan rad može dovesti do pada sistema, a u slučaju ponovnog pokretanja, neke usluge (uključujući one preko kojih je bilo moguće dobiti originalnu ljusku) možda neće rasti. Dešava se da je administrator jednostavno zaboravio koristiti naredbu systemctl enable. Osim toga, to će izazvati mnogo nezadovoljstva vašim radom ako eksploatacija nije dogovorena.
Ako odlučite koristiti izvore iz exploitdb, obavezno pročitajte komentare na početku skripte. Između ostalog, obično piše kako pravilno kompajlirati ovaj exploit. Ako ste bili previše lijeni ili vam je trebalo "jučer" zbog rokova, možete potražiti spremišta s već kompajliranim exploitima, na primjer. Međutim, treba shvatiti da ćete u ovom slučaju dobiti svinju u šaci. S druge strane, da je programer do bajta razumio kako računar radi i softver koji koristi, ne bi napisao ni liniju koda u svom životu.

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

metasploit

Za hvatanje i rukovanje vezom, uvijek je bolje koristiti modul exploit/multi/handler. Glavna stvar je postaviti ispravan teret, na primjer, generic/shell/reverce_tcp ili generic/shell/bind_tcp. Školjka dobijena u Metasploitu može se nadograditi na Meterpreter pomoću modula post/multi/manage/shell_to_meterpreter. Uz Meterpreter, možete automatizirati proces nakon eksploatacije. Na primjer, modul post/multi/recon/local_exploit_suggester provjerava platformu, arhitekturu i eksploatativne entitete i predlaže Metasploit module za eskalaciju privilegija na ciljnom sistemu. Zahvaljujući Meterpreter-u, eskalacija privilegija se ponekad svodi na pokretanje pravog modula, ali hakovanje bez razumijevanja šta se dešava ispod haube nije istina (još uvijek morate napisati izvještaj).

Alat

Alati za automatizaciju lokalnog prikupljanja informacija će vam uštedjeti mnogo truda i vremena, ali sami po sebi nisu u stanju da u potpunosti identificiraju put eskalacije privilegija, posebno u slučaju iskorištavanja ranjivosti kernela. Alati za automatizaciju će izvršiti sve potrebne komande za prikupljanje informacija o sistemu, ali je takođe važno da budete u mogućnosti da analiza primljenih podataka. Nadam se da će vam moj članak biti koristan u ovome. Naravno, postoji mnogo više alata nego što ću navesti u nastavku, ali svi rade otprilike istu stvar – to je više stvar ukusa.

Linpeas

Prilično svjež alat, prvo urezivanje je iz januara 2019. Trenutno moj omiljeni instrument. Suština je da ističe najzanimljivije vektore eskalacije privilegija. Slažem se, zgodnije je dobiti stručnu procjenu na ovom nivou nego analizirati monolitne neobrađene podatke.

LinEnum

Moj drugi omiljeni alat, također prikuplja i organizira podatke primljene kao rezultat lokalnog popisivanja.

linux-exploit-suggester(1,2)

Ovaj eksploat će analizirati sistem za prikladne uslove za eksploataciju. U stvari, on će obavljati posao identičan Metasploit local_exploit_suggester modulu, ali će nuditi veze do exploit-db izvornih kodova, a ne Metasploit modula.

Linuxprivchecker

Ova skripta će prikupiti i organizirati po sekcijama veliku količinu informacija koje mogu biti korisne za formiranje vektora eskalacije privilegija.

Drugi put ću elaborirati Eskalacija Linux privilegija putem suid/sgid.

izvor: www.habr.com

Dodajte komentar