====== Eskalacija privilegija na Linux operacijskom sustavu ======
===== Sažetak =====
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
===== Uvod =====
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.
===== Što je eskalacija 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 operacijskog 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 super-admin 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:
* **vertikalna eskalacija privilegija** - eskalacija u kojoj korisnik s manje privilegija uspijeva pristupiti korisniku s više privilegija unutar istog sustava (npr: korisnik uspijeva doći do administratorskog korisničkog računa).
* **horizontalna eskalacija privilegija** - eskalacija u kojoj običan korisnik uspijeva pristupiti sadržaju koji je dostupan drugom običnom korisniku. (npr: prilikom korištenja internetskog bankarstva, korisnik A uspijeva pristupiti internetskom bankarstvu korisnika B)
===== Najčešći postupci eskalacije privilegija na Linux OS-u =====
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 [[https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS|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.
=== SUID binarne datoteke ====
Na Linux operacijskom sustavu datoteke imaju posebne zastavice koje označavaju koje dozvole imaju pojedine datoteke. Također, u meta podacima 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 meta podacima datoteke je i **SUID** zastavica. //SUID// ima značenje //"set user ID up on execution"// i ako datoteka 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 pravima 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 [[https://gtfobins.github.io/#+suid|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 kodiranju te se odmah ta datoteka dekodira i ispisuje se njen sadržaj.
=== Cron poslovi (jobs) ===
**''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 back-up podataka svaki dan u isto vrijeme (npr. u 12:00).
Za ovu iskorištavanje moguće ranjivosti ovdje je ideja slična kao i kod SUID ranjivosti, prvi korak je pronaći sve cron poslove koji se izvršavaju pod ''root'' korisnikom, a kada se pronađu, potrebno je provjeriti svaku skriptu koja se izvršava i vidjeti može li možda neku od tih skripti korisnik uređivati. Ukoliko se pokaže da običan korisnik može urediti neku od skripti koja se izvršava kao ''cron job'' ''root'' korisnika, tada je samo pitanje trenutka kada će se naša modificirana skripta izvršiti i omogućiti nam eskalaciju privilegija.
Sve cron poslove je moguće izlistati pomoću bilo koje od idućih naredbi:
crontab -l
ls -al /etc/cron* /etc/at*
cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#"
Ako nije moguće uređivati skripte koje pokreće ''root'' korisnik, još uvijek je možda moguće iskoristiti ranjivost ukoliko skripta koja se pokreće koristi neke resurse kojima imamo pristup. Primjer toga bi bilo da skripta pokrece neku binarnu datoteku kojoj imamo potpuni pristup; tada možemo jednostavno zamijeniti tu binarnu datoteku sa proizvoljnom datotekom koja će nam omogućiti eskalaciju privilegija.
Ovo nisu jedini načini eskalacija privilegija, već samo najčešći i najjednostavniji oblici koji se mogu iskoristiti.
=== Sudo ranjivost (CVE-2021-3156) ===
Jedna od najvećih ranjivosti u 2021. godini (da se nije pojavio [[https://en.wikipedia.org/wiki/Log4Shell|Log4shell]], bila bi zasigurno najveća ranjivost) bila je ranjivost u ''sudo'' naredbi stara više od 10 godina, no otkrivena je tek početkom 2021. godine. Sve verzije ''sudo'' naredbe još od 2011. godine su bile ranjive na **//heap overflow//** napad i na jednostavan način je
moguće iskoristiti tu ranjivost, sve što je potrebno je pokrenuti [[https://github.com/worawit/CVE-2021-3156|Python skriptu]] na sustavu koji napadamo i ukoliko postoji verzija ''sudo'' naredbe koja je ranjiva, dobit ćemo ''root shell'' na tom računalu i možemo izvršavati bilo koju naredbu kao ''root'' korisnik. Većina sustava je odmah instalirala hitne zakrpe, no postoje još uvijek neki sustavi koji nisu ažurirali instalirane aplikacije.
=== DirtyCow (CVE-2016-5195) ===
//**Dirty Cow**// (Dirty copy-on-write) ranjivost je možda i najpoznatija ranjivost kojom se može izvesti eskalacija privilegija. Ranjivost cilja na grešku u kodu Linux kernela koja u sustavu za upravljanje memorijom ima pogrešku u implementaciji [[https://en.wikipedia.org/wiki/Copy-on-write|copy-on-write]] mehanizma. Ranjivost je uvedena u Linux kernel još davne 2007. godine i postojala je sve do 2016. godine u svim verzijama Linux kernela, čak i u onima koje su se nalazile na Android telefonima. Za ovu ranjivost postoje već brojne [[https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs|gotove skripte]] koje za nas odrađuju "prljavi posao" i omogućuju nam ostvarivanje ''root'' prava i izvršavanje naredbi kao ''root'' korisnik.
Antivirusni programi možda mogu detektirati eskalaciju ovlasti trenutnog korisnika, ali ne mogu nikako spriječiti napad i jedina obrana od ovog napada je ažuriranje kernela na novije verzije.
===== Zaključak =====
Svakodnevno se otkrivaju novi načini eskalacije privilegija na Linux računalima te iako su najpoznatije ranjivosti one kojima je uzrok bug u nekom od osnovnih Linux komponenti (Sudo ranjivost ili DirtyCoW), najčešći uzrok ranjivostima je pogreška prilikom konfiguracije nekog relativno sigurnog programa. Kako bi se držao sustav što sigurnijim, najvažnije je pratiti upute i pravila kako ispravno napraviti konfiguraciju aplikacija koje koristimo i redovito ažurirati sustav. Najlakši posao koji napadač može imati je kada pokušava izvršiti eskalaciju privilegija na sustavu koji nije redovito ažuriran i pun je neispravnih konfiguracija.
===== Literatura =====
[[https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Linux%20-%20Privilege%20Escalation.md#cron-jobs|Payload all the things]]
[[https://en.wikipedia.org/|Wikipedia]]
[[https://book.hacktricks.xyz/linux-unix/privilege-escalation|Carlos Polop: Hack Tricks - online book]]