Ovo je stara izmjena dokumenta!
U ovom radu će biti obrađene teme eskalacije privilegija i kako od korisnika s malo ovlasti postati korisnik s puno više ovlasti. Tijekom cijelog rada će biti pretpostavljeno da je nulti korak - dobivanje pristupa serveru, već napravljen i nakon njega može započeti postupak eskalacije privilegija. Također, samo će se objasniti neki od najčešćih postupaka eskalacije privilegija na Linux operacijskim sustavima.
Keywords: linux; privilege escalation; linpeas; suid; cronjob
Nakon uspješnog pronalska ranjivosti u nekoj od aplikacija koje su pokrenute na serveru i nakon dobivene RCE (remote command execution) ranjivosti koja nam omogućuje pokretanje bilo koje naredbe na serveru, često nemamo ovlasti koje ima root korisnik na Linux operacijskom sustavu jer je većina servisa pokrenuta s ovlastima nekog korisnika koji ima puno manje ovlasti od root korisnika. RCE ranjivost je samo jedan od primjera kako možemo dobiti pristup serveru i taj proces dobivanja pristupa serveru zahtjeva poseban rad. Tema ovog rada je što učiniti nakon inicijalnog pristupa serveru, kako od korisnika s relativno malo ovlasti postati korisnik s puno više ovlasti. Ali, najprije treba dati definiciju eskalacije privilegija.
Eskalacija privilegija (privilege escalation) je proces u kojem se iskorištava pogreška (bug), mana u dizajnu (design flaw) ili pogreška u konfiguraciji opereacijskog sustava ili neke aplikacije kako bi se dobila viša razina pristupa nekom resursu kojem inače trenutni korisnik ima ograničen pristup. Na skoro svakoj Linux distribuciji postoji /root
direktorij i sadržaju tog direktorija samo root (korisnik s najviše prava na računalu, nešto poput superadmin korisnika) korisnik ima pristup. Primjer eskalacije privilegija bi bilo kada bi običan korisnik uspio pristupiti sadržaju tog /root
tako što je iskoristio manu u nekom procesu (aplikaciji ili OS-u) koji je pokrenut s pravima root korisnika.
Postoje dvije vrste eskalacije privilegija:
Prvi korak prilikom postupka eskalacije privilegija je enumeracija. Enumeracija je postupak prikupljanja informacija o sustavu i može se provoditi ručno ili automatizirano. Današnji sustavi su toliko veliki i postoji toliko informacija u njima da je teško provoditi enumeraciju ručno pa se zato koriste automatizirane skripte za takve postupke. Najpoznatija skripta za enumeraciju Linux računala u postupku eskalacije privilegija je linPEAS. Sam ispis skripte je jako velik i zahtjeva posebnu knjigu kako bi se pokrili svi mogući načini iskorištavanja ranjivosti kako bi se odradila eskalacija privilegija, zato će u idućim poglavljima biti nabrojani samo neki načini.
Na Linux operacijskom sustavu datoteke imaju posebne zastavice koje označavaju koje dozvole imaju pojedine datoteke. Također, u metapodacima postoje i oznake tko je vlasnik pojedine datoteke u sustavu. Najčešće je to korisnik koji je kreirao tu datoteku, ali se vlasnik može naknadno promijeniti. Jedna od tih zastavica koje se nalaze u metapodacima datoteke je i SUID zastavica. SUID ima značenje “set user ID up on execution” i ako datoteka koja ima ovu zastavicu postavljenu tada će ta datoteka (uglavnom se radi o binarnim datotekama) biti pokrenuta s pravima korisnika koji ju je kreirao, umjesto s pravim korisnika koji ju je pokrenuo.
Primjer datoteke s postavljenim SUID bitom prilikom korištenja naredbe ls
, SUID zastavica ima oznaku s:
╭─user@racfor ~ ╰─$ ls /usr/bin/sudo -alh -rwsr-xr-x 1 root root 138K 23 nov. 16:04 /usr/bin/sudo
Iskorištavanje ove ranjivosti počinje tako da se da se pronađu binarne datoteke koje imaju ovu zastavicu postavljenu i koje korisnik može pokrenuti, to se može učiniti naredbom:
find / -uid 0 -perm -4000 -type f 2>/dev/null
Jednom kada su izlistane sve binarne datoteke, potrebno je pronaći onu koja se može iskoristiti za eskalaciju privilegija, jer nije svaka datoteka koja ima SUID zastavicu postavljenu prikladna za eskalaciju privilegija. Opširan popis mogućih ranjivih binarnih datoteka se može pronaći na GTFOBins stranici zajedno s postupkom kako iskoristiti tu ranjivost.
Jedan od primjera je kako se može pristupiti bilo kojoj datoteci ako base64
binarna datoteka ima postavljenu SUID zastavicu:
LFILE=file_to_read base64 "$LFILE" | base64 --decode
Ovdje se prvo koristi naredba base64
kako bi se datoteka kojoj obični korisnik nema pristup kodirala u base64 encodingu te se odmah ta datoteka dekodira i ispisuje se njen sadržaj.
cron
je program na Linux operacijskom sustavu koji služi za postavljanje periodičkih poslova. Pomoću njega je moguće zakazati određene poslove da se periodički izvršavaju u točno određeno vrijeme. Jedan od primjera njegovog korištenja bi bilo izvršavanje skripte za backup podataka svaki dan u isto vrijeme (npr. u 12:00).