Linux Privilege Escalation
Last updated
Last updated
Naučite i vežbajte hakovanje AWS-a: HackTricks Obuka AWS Crveni Tim Stručnjak (ARTE) Naučite i vežbajte hakovanje GCP-a: HackTricks Obuka GCP Crveni Tim Stručnjak (GRTE)
Hajde da počnemo sticanjem nekog znanja o OS-u koji se izvršava
Ako imate dozvole za pisanje u bilo kom folderu unutar promenljive PATH
, možda ćete moći da preuzmete kontrolu nad nekim bibliotekama ili binarnim fajlovima:
Interesantne informacije, lozinke ili API ključevi u okruženjskim promenljivama?
Proverite verziju jezgra i da li postoji neki eksploatacioni kod koji se može koristiti za eskalaciju privilegija
Možete pronaći dobar popis ranjivih jezgara i već kompajlirane eksploate ovde: https://github.com/lucyoa/kernel-exploits i exploitdb sploits. Druge stranice gde možete pronaći neke kompajlirane eksploate: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack
Za izvlačenje svih ranjivih verzija jezgara sa te veb lokacije možete uraditi:
Alati koji mogu pomoći u pretrazi za eksploate kernela su:
linux-exploit-suggester.sh linux-exploit-suggester2.pl linuxprivchecker.py (izvršiti NA žrtvi, proverava eksploate samo za kernel 2.x)
Uvek pretražite verziju kernela na Google-u, možda je vaša verzija kernela navedena u nekom eksploatu kernela i tada ćete biti sigurni da je taj eksploat validan.
Linux Eskalacija privilegija - Linux Kernel <= 3.19.0-73.8
Na osnovu ranjivih verzija sudo-a koje se pojavljuju u:
Možete proveriti da li je verzija sudo programa ranjiva korišćenjem ovog grep-a.
Od @sickrov
Proverite smasher2 kutiju na HTB-u za primer kako bi ova ranjivost mogla biti iskorišćena
Ako se nalazite unutar docker kontejnera, možete pokušati da pobegnete iz njega:
Docker SecurityProverite šta je montirano i odmontirano, gde i zašto. Ako je nešto odmontirano, možete pokušati da ga montirate i proverite da li ima privatnih informacija
Nabrojte korisne binarne datoteke
Takođe, proverite da li je instaliran bilo koji kompajler. Ovo je korisno ako trebate da koristite neki kernel eksploit jer se preporučuje da ga kompajlirate na mašini na kojoj ćete ga koristiti (ili na sličnoj).
Proverite verziju instaliranih paketa i servisa. Možda postoji stara verzija Nagiosa (na primer) koja bi mogla biti iskorišćena za eskalaciju privilegija... Preporučuje se ručno proveriti verziju sumnjivijeg instaliranog softvera.
Ako imate SSH pristup mašini, takođe možete koristiti openVAS da proverite da li su unutar mašine instalirani zastareli i ranjivi softveri.
Napomena da će ove komande prikazati mnogo informacija koje će uglavnom biti beskorisne, stoga se preporučuje korišćenje nekih aplikacija poput OpenVAS-a ili sličnih koje će proveriti da li je bilo koja instalirana verzija softvera ranjiva na poznate eksploate
Pogledajte koji se procesi izvršavaju i proverite da li neki proces ima više privilegija nego što bi trebalo (možda se tomcat izvršava kao root?)
Uvek proveravajte moguće debuggere elektrona/cef/chromiuma koji se izvršavaju, možete ih zloupotrebiti za eskalaciju privilegija. Linpeas ih otkriva proverom parametra --inspect
unutar komandne linije procesa.
Takođe proverite svoje privilegije nad binarnim fajlovima procesa, možda možete prepisati nečiji.
Možete koristiti alate poput pspy za praćenje procesa. Ovo može biti veoma korisno za identifikaciju ranjivih procesa koji se često izvršavaju ili kada se ispune određeni zahtevi.
Neke usluge servera čuvaju kredencijale u čistom tekstu unutar memorije. Obično će vam biti potrebne root privilegije da biste čitali memoriju procesa koji pripadaju drugim korisnicima, stoga je ovo obično korisnije kada već imate root privilegije i želite otkriti više kredencijala. Međutim, zapamtite da kao običan korisnik možete čitati memoriju procesa koje posedujete.
Imajte na umu da danas većina mašina ne dozvoljava ptrace podrazumevano što znači da ne možete dumpovati druge procese koji pripadaju vašem neprivilegovanom korisniku.
Fajl /proc/sys/kernel/yama/ptrace_scope kontroliše pristupačnost ptrace-a:
kernel.yama.ptrace_scope = 0: svi procesi mogu biti debugovani, sve dok imaju isti uid. Ovo je klasičan način na koji je ptracing radio.
kernel.yama.ptrace_scope = 1: samo roditeljski proces može biti debugovan.
kernel.yama.ptrace_scope = 2: Samo admin može koristiti ptrace, jer zahteva CAP_SYS_PTRACE sposobnost.
kernel.yama.ptrace_scope = 3: Nijedan proces ne sme biti praćen ptrace-om. Nakon podešavanja, potreban je ponovni start da bi se omogućilo ponovno praćenje.
Ako imate pristup memoriji FTP servisa (na primer) možete dobiti Heap i pretražiti njegove kredencijale.
Za dati ID procesa, maps pokazuje kako je memorija mapirana unutar virtualnog adresnog prostora tog procesa; takođe prikazuje dozvole svake mapirane regije. Mem pseudo fajl otkriva samu memoriju procesa. Iz maps fajla znamo koje memorijske regije su čitljive i njihove ofsete. Koristimo ove informacije da bismo tražili u mem fajlu i izbacili sve čitljive regije u fajl.
/dev/mem
pruža pristup fizičkoj memoriji sistema, a ne virtuelnoj memoriji. Virtuelni prostor adresa jezgra može se pristupiti korišćenjem /dev/kmem.
Obično, /dev/mem
je samo čitljiv od strane root korisnika i kmem grupe.
ProcDump je Linux reinterpretacija klasičnog alata ProcDump iz skupa alata Sysinternals za Windows. Preuzmite ga sa https://github.com/Sysinternals/ProcDump-for-Linux
Za ispuštanje memorije procesa možete koristiti:
https://github.com/hajzer/bash-memory-dump (root) - _Možete ručno ukloniti zahteve za root i isprazniti proces koji je u vašem vlasništvu
Skripta A.5 sa https://www.delaat.net/rp/2016-2017/p97/report.pdf (potreban je root)
Ako otkrijete da je proces autentifikacije pokrenut:
Možete isprazniti proces (videti prethodne sekcije da biste pronašli različite načine za isprazniti memoriju procesa) i pretražiti akreditacije unutar memorije:
Alatka https://github.com/huntergregal/mimipenguin će ukrasti lozinke u čistom tekstu iz memorije i iz nekih dobro poznatih datoteka. Potrebne su privilegije root korisnika da bi pravilno funkcionisao.
Funkcija | Naziv procesa |
---|---|
GDM lozinka (Kali Desktop, Debian Desktop) | gdm-password |
Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon |
LightDM (Ubuntu Desktop) | lightdm |
VSFTPd (Aktivne FTP konekcije) | vsftpd |
Apache2 (Aktivne HTTP Basic Auth sesije) | apache2 |
OpenSSH (Aktivne SSH sesije - Sudo korišćenje) | sshd: |
Proverite da li je neki od planiranih poslova ranjiv. Možda možete iskoristiti skriptu koju izvršava root (ranjivost sa zvezdicom? možete menjati fajlove koje root koristi? koristiti simboličke veze? kreirati specifične fajlove u direktorijumu koji root koristi?).
Na primer, unutar /etc/crontab možete pronaći PUTANJU: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
(Primetite kako korisnik "user" ima privilegije pisanja nad /home/user)
Ako unutar ovog crontaba korisnik root pokuša da izvrši neku komandu ili skriptu bez postavljanja putanje. Na primer: * * * * root overwrite.sh Tada možete dobiti root shell korišćenjem:
Ako skriptu izvršava root i unutar komande sadrži "*", možete iskoristiti ovo da biste izvršili neočekivane radnje (kao što je eskalacija privilegija). Primer:
Ako je zamjenski znak prethodio putanji poput /some/path/*, nije ranjiv (čak ni _./* nije).
Pročitajte sledeću stranicu za više trikova eksploatacije zamenskih znakova:
Wildcards Spare tricksAko možete izmeniti skriptu Cron-a koju izvršava root, možete veoma lako dobiti shell:
Ako skripta izvršena od strane root koristi direktorijum u kom imate pun pristup, možda bi bilo korisno obrisati taj folder i napraviti simboličan folder ka drugom koji služi skriptu kojom vi upravljate
Možete pratiti procese kako biste tražili one koji se izvršavaju svakih 1, 2 ili 5 minuta. Možda možete iskoristiti to i eskalirati privilegije.
Na primer, da biste pratili svakih 0.1s tokom 1 minuta, sortirali po manje izvršenim komandama i obrisali komande koje su najviše puta izvršene, možete uraditi:
Takođe možete koristiti pspy (ovo će pratiti i navesti svaki proces koji se pokrene).
Moguće je kreirati cron posao ubacivanjem povratnog znaka nakon komentara (bez znaka za novi red), i cron posao će raditi. Primer (obratite pažnju na znak za povratni red):
Proverite da li možete da pišete u bilo koji .service
fajl, ako možete, možete ga izmeniti tako da izvršava vaš zadnji prolaz kada se servis pokrene, ponovo pokrene ili zaustavi (možda ćete morati da sačekate da se mašina ponovo pokrene).
Na primer, kreirajte svoj zadnji prolaz unutar .service fajla sa ExecStart=/tmp/script.sh
Imajte na umu da ako imate dozvole za pisanje nad binarnim fajlovima koji se izvršavaju od strane servisa, možete ih promeniti u zadnje prolaze tako da kada se servisi ponovo izvrše, zadnji prolazi će biti izvršeni.
Možete videti PUTANJE koje koristi systemd sa:
Ako otkrijete da možete pisati u bilo kojem od foldera na putanji, možda ćete moći da dignete privilegije. Morate tražiti da li se koriste relativne putanje u konfiguracionim fajlovima servisa kao što su:
Zatim, kreirajte izvršnu datoteku sa istim imenom kao relativna putanja binarnog fajla unutar systemd PATH foldera u koji možete pisati, i kada se servis zatraži da izvrši ranjivu akciju (Start, Stop, Reload), vaš zadnji prolaz će biti izvršen (neprivilegovani korisnici obično ne mogu pokrenuti/zaustaviti servise, ali proverite da li možete koristiti sudo -l
).
Saznajte više o servisima sa man systemd.service
.
Tajmeri su systemd unit fajlovi čije ime završava na **.timer**
koji kontrolišu **.service**
fajlove ili događaje. Tajmeri se mogu koristiti kao alternativa cron-u jer imaju ugrađenu podršku za kalendar događaje i monotonu vremensku događaje i mogu se pokretati asinhrono.
Možete nabrojati sve tajmere sa:
Ako možete izmeniti tajmer, možete ga naterati da izvrši neke postojeće systemd.unit-e (kao što su .service
ili .target
datoteke).
U dokumentaciji možete pročitati šta je jedinica:
Jedinica koja se aktivira kada ovaj tajmer istekne. Argument je ime jedinice, čiji sufiks nije ".timer". Ako nije navedeno, ova vrednost podrazumevano odgovara servisu koji ima isto ime kao jedinica tajmera, osim sufiksa. (Vidi gore.) Preporučuje se da ime jedinice koja se aktivira i ime jedinice tajmera budu identična, osim sufiksa.
Dakle, da biste iskoristili ovu dozvolu, trebalo bi da:
Pronađete neku systemd jedinicu (kao što je .service
) koja izvršava zapisivu binarnu datoteku
Pronađete neku systemd jedinicu koja izvršava relativnu putanju i imate dozvole za pisanje nad systemd putanjom (da biste se predstavili kao ta izvršna datoteka)
Saznajte više o tajmerima sa man systemd.timer
.
Da biste omogućili tajmer, potrebne su vam administratorske privilegije i da izvršite:
Napomena da se tajmer aktivira tako što se pravi simbolična veza ka njemu u /etc/systemd/system/<WantedBy_section>.wants/<name>.timer
Unix Domain Sockets (UDS) omogućavaju komunikaciju procesa na istom ili različitim mašinama unutar modela klijent-server. Koriste standardne Unix deskriptorske datoteke za međuračunarsku komunikaciju i postavljaju se putem .socket
datoteka.
Soketi se mogu konfigurisati korišćenjem .socket
datoteka.
Saznajte više o soketima sa man systemd.socket
. Unutar ove datoteke, mogu se konfigurisati nekoliko interesantnih parametara:
ListenStream
, ListenDatagram
, ListenSequentialPacket
, ListenFIFO
, ListenSpecial
, ListenNetlink
, ListenMessageQueue
, ListenUSBFunction
: Ove opcije su različite, ali se koristi sažetak da ukazuje gde će slušati soket (putanja AF_UNIX soket datoteke, IPv4/6 i/ili broj porta za slušanje, itd.)
Accept
: Prihvata boolean argument. Ako je true, instanca servisa se pokreće za svaku dolaznu vezu i samo se soket veze prosleđuje njoj. Ako je false, svi slušajući soketi sami se prosleđuju pokrenutom servisnom jedinicom, i samo jedna servisna jedinica se pokreće za sve veze. Ova vrednost se ignoriše za datagram sokete i FIFO-ove gde jedna servisna jedinica bezuslovno obrađuje sav dolazni saobraćaj. Podrazumevano je false. Iz performansnih razloga, preporučuje se pisanje novih demona samo na način koji je pogodan za Accept=no
.
ExecStartPre
, ExecStartPost
: Prihvata jednu ili više komandnih linija, koje se izvršavaju pre ili nakon što se slušajući soketi/FIFO-ovi kreiraju i povežu, redom. Prvi token komandne linije mora biti apsolutno ime datoteke, a zatim slede argumenti za proces.
ExecStopPre
, ExecStopPost
: Dodatne komande koje se izvršavaju pre ili nakon što se slušajući soketi/FIFO-ovi zatvore i uklone, redom.
Service
: Navodi ime servisne jedinice za aktiviranje na dolazni saobraćaj. Ovo podešavanje je dozvoljeno samo za sokete sa Accept=no. Podrazumevano je servis koji nosi isto ime kao soket (sa zamenjenim sufiksom). U većini slučajeva, ne bi trebalo da bude potrebno koristiti ovu opciju.
Ako pronađete pisivu .socket
datoteku, možete dodati na početak [Socket]
odeljka nešto poput: ExecStartPre=/home/kali/sys/backdoor
i zadnja vrata će biti izvršena pre nego što se soket kreira. Stoga, verovatno će vam biti potrebno da sačekate da se mašina ponovo pokrene.
Napomena da sistem mora koristiti tu konfiguraciju soket datoteke ili zadnja vrata neće biti izvršena
Ako identifikujete bilo koji pisivi soket (sada govorimo o Unix soketima, a ne o konfiguracionim .socket
datotekama), onda možete komunicirati sa tim soketom i možda iskoristiti ranjivost.
Primer eksploatacije:
Socket Command InjectionImajte na umu da može postojati nekoliko soketa koji slušaju HTTP zahteve (ne mislim na .socket fajlove već na fajlove koji deluju kao unix soketi). Možete proveriti ovo sa:
Docker socket, često pronađen na /var/run/docker.sock
, je kritična datoteka koja treba da bude obezbeđena. Podrazumevano, može se pisati od strane korisnika root
i članova grupe docker
. Posedovanje pristupa za pisanje u ovaj socket može dovesti do eskalacije privilegija. Evo detaljnog objašnjenja kako to može biti urađeno i alternativnih metoda ako Docker CLI nije dostupan.
Ako imate pristup za pisanje u Docker socket, možete eskalirati privilegije koristeći sledeće komande:
Ovi naredbe vam omogućavaju pokretanje kontejnera sa pristupom nivou korena fajl sistema domaćina.
U slučajevima kada Docker CLI nije dostupan, Docker socket može i dalje biti manipulisan korišćenjem Docker API-ja i curl
naredbi.
Lista Docker slika: Preuzmite listu dostupnih slika.
Kreiranje kontejnera: Pošaljite zahtev za kreiranje kontejnera koji montira koreni direktorijum sistema domaćina.
Pokrenite novo kreirani kontejner:
Povezivanje na kontejner: Koristite socat
za uspostavljanje veze sa kontejnerom, omogućavajući izvršavanje komandi unutar njega.
Nakon uspostavljanja veze putem socat
, možete izvršavati komande direktno u kontejneru sa pristupom nivou korena fajl sistema domaćina.
Imajte na umu da ako imate dozvole za pisanje preko docker socketa jer ste unutar grupe docker
imate više načina za eskalaciju privilegija. Ako docker API osluškuje na portu takođe možete biti u mogućnosti da ga kompromitujete.
Proverite više načina za izlazak iz docker-a ili zloupotrebu kako biste eskalirali privilegije u:
Docker SecurityAko otkrijete da možete koristiti ctr
komandu pročitajte sledeću stranicu jer možda možete zloupotrebiti kako biste eskalirali privilegije:
Ako otkrijete da možete koristiti runc
komandu pročitajte sledeću stranicu jer možda možete zloupotrebiti kako biste eskalirali privilegije:
D-Bus je sofisticiran sistem međuprocesne komunikacije (IPC) koji omogućava aplikacijama efikasnu interakciju i deljenje podataka. Dizajniran sa modernim Linux sistemom na umu, pruža robustan okvir za različite oblike komunikacije aplikacija.
Sistem je fleksibilan, podržava osnovnu IPC koja poboljšava razmenu podataka između procesa, podsećajući na unapređene UNIX domain socket-e. Osim toga, pomaže u emitovanju događaja ili signala, podstičući besprekornu integraciju među komponentama sistema. Na primer, signal od Bluetooth demona o dolaznom pozivu može pokrenuti muzički plejer da se stiša, poboljšavajući korisničko iskustvo. Pored toga, D-Bus podržava sistem udaljenih objekata, pojednostavljujući zahteve za usluge i pozive metoda između aplikacija, olakšavajući procese koji su tradicionalno bili složeni.
D-Bus funkcioniše na modelu dozvole/odbijanja, upravljajući dozvolama poruka (pozivi metoda, emitovanje signala, itd.) na osnovu kumulativnog efekta podudarnih pravila politike. Ove politike specificiraju interakcije sa autobusom, potencijalno omogućavajući eskalaciju privilegija kroz iskorišćavanje ovih dozvola.
Primer takve politike u /etc/dbus-1/system.d/wpa_supplicant.conf
je pružen, detaljno opisujući dozvole za korisnika root da poseduje, šalje i prima poruke od fi.w1.wpa_supplicant1
.
Politike bez specificiranog korisnika ili grupe se primenjuju univerzalno, dok politike konteksta "default" važe za sve koji nisu obuhvaćeni drugim specifičnim politikama.
Saznajte kako da nabrojite i iskoristite D-Bus komunikaciju ovde:
D-Bus Enumeration & Command Injection Privilege EscalationUvek je interesantno nabrojati mrežu i utvrditi poziciju mašine.
Uvek proverite mrežne servise koji se izvršavaju na mašini sa kojima niste mogli da interagujete pre pristupanja:
Proverite da li možete da špijunirate saobraćaj. Ako možete, možda ćete moći da pokupite neke akreditive.
Proverite ko ste, koje privilegije imate, koji korisnici se nalaze u sistemima, koji od njih mogu da se prijave i koji imaju root privilegije:
Neke verzije Linuxa bile su pogođene greškom koja omogućava korisnicima sa UID > INT_MAX da eskaliraju privilegije. Više informacija: ovde, ovde i ovde.
Iskoristite to koristeći: systemd-run -t /bin/bash
Proverite da li ste član neke grupe koja bi vam mogla omogućiti root privilegije:
Interesting Groups - Linux PrivescProverite da li se unutar clipboard-a nalazi nešto interesantno (ukoliko je moguće)
Ako znate bilo koju lozinku okoline, pokušajte se prijaviti kao svaki korisnik koristeći tu lozinku.
Ako vam ne smeta pravljenje puno buke i ako su binarni fajlovi su
i timeout
prisutni na računaru, možete pokušati da probate korisnika forsniranjem korišćenjem su-bruteforce.
Linpeas sa parametrom -a
takođe pokušava da forsnira korisnike.
Ako otkrijete da možete pisati unutar nekog foldera u $PATH-u, možda ćete moći da eskalirate privilegije tako što ćete napraviti tajni prolaz unutar foldera u koji možete pisati sa imenom neke komande koja će biti izvršena od strane drugog korisnika (idealno root) i koja nije učitana iz foldera koji se nalazi pre vašeg foldera u $PATH-u.
Možda vam je dozvoljeno da izvršite neku komandu korišćenjem sudo-a ili ta komanda može imati suid bit. Proverite to korišćenjem:
Neke neočekivane komande vam omogućavaju da čitate i/ili pišete fajlove ili čak izvršite komandu. Na primer:
Sudo konfiguracija može dozvoliti korisniku da izvrši neku komandu sa privilegijama drugog korisnika, a da pritom ne zna šifru.
U ovom primeru korisnik demo
može pokrenuti vim
kao root
, sada je trivijalno dobiti shell dodavanjem ssh ključa u root direktorijum ili pozivom sh
.
Ova direktiva omogućava korisniku da postavi promenljivu okruženja dok nešto izvršava:
Ovaj primer, baziran na HTB mašini Admirer, bio je ranjiv na PYTHONPATH preusmeravanje kako bi učitao proizvoljnu Python biblioteku prilikom izvršavanja skripte kao root:
Skoknite da biste pročitali druge fajlove ili koristite simboličke veze. Na primer u sudoers fajlu: haker10 SVE= (root) /bin/less /var/log/*
Ako se koristi zvezdica (*), još je lakše:
Mere zaštite: https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/
Ako je sudo dozvola data za jednu komandu bez navođenja putanje: hacker10 ALL= (root) less možete iskoristiti promenom PATH promenljive.
Ova tehnika takođe može biti korišćena ako suid binarni fajl izvrši drugu komandu bez navođenja putanje do nje (uvek proverite sa strings sadržaj čudnog SUID binarnog fajla).
Primeri payload-a za izvršavanje.
Ako suid binarni fajl izvrši drugu komandu navodeći putanju, tada možete pokušati da izvezete funkciju nazvanu kao komanda koju suid fajl poziva.
Na primer, ako suid binarni fajl poziva /usr/sbin/service apache2 start morate pokušati da kreirate funkciju i izvezete je:
LD_PRELOAD okružna promenljiva se koristi da se specificira jedna ili više deljenih biblioteka (.so fajlova) koje će biti učitane od strane loader-a pre svih ostalih, uključujući standardnu C biblioteku (libc.so
). Ovaj proces je poznat kao pred-ucitavanje biblioteke.
Međutim, radi održavanja sigurnosti sistema i sprečavanja zloupotrebe ove funkcije, posebno sa suid/sgid izvršljivim fajlovima, sistem sprovodi određene uslove:
Loader ignoriše LD_PRELOAD za izvršljive fajlove gde stvarni korisnički ID (ruid) se ne poklapa sa efektivnim korisničkim ID-om (euid).
Za izvršljive fajlove sa suid/sgid, samo biblioteke u standardnim putanjama koje takođe imaju suid/sgid se pred-ucitavaju.
Eskalacija privilegija može da se desi ako imate mogućnost izvršavanja komandi sa sudo
i izlaz sudo -l
uključuje izjavu env_keep+=LD_PRELOAD. Ova konfiguracija dozvoljava LD_PRELOAD okružnoj promenljivoj da ostane prisutna i bude prepoznata čak i kada se komande izvršavaju sa sudo
, potencijalno dovodeći do izvršavanja proizvoljnog koda sa povišenim privilegijama.
Sačuvaj kao /tmp/pe.c
Zatim ga kompajlirajte koristeći:
Konačno, digni privilegije pokretanjem
Sličan privesc može biti zloupotrebljen ako napadač kontroliše LD_LIBRARY_PATH env promenljivu jer kontroliše putanju gde će biblioteke biti tražene.
Kada naiđete na binarni fajl sa SUID dozvolama koje deluju neobično, dobra praksa je da proverite da li pravilno učitava .so fajlove. Ovo možete proveriti pokretanjem sledeće komande:
Na primer, susretanje greške poput "open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)" sugeriše na potencijal za iskorišćavanje.
Da biste iskoristili ovo, trebalo bi da nastavite tako što ćete kreirati C fajl, recimo "/path/to/.config/libcalc.c", koji sadrži sledeći kod:
Ovaj kod, jednom kada se kompajlira i izvrši, ima za cilj da poveća privilegije manipulišući dozvolama datoteka i izvršavanjem ljuske sa povećanim privilegijama.
Kompajlirajte gorenavedenu C datoteku u deljeni objekat (.so) datoteku sa:
Konačno, pokretanje pogođenog SUID binarnog fajla trebalo bi da pokrene eksploataciju, omogućavajući potencijalno ugrožavanje sistema.
Sada kada smo pronašli SUID binarnu datoteku koja učitava biblioteku iz foldera u koji možemo pisati, napravimo biblioteku u tom folderu sa potrebnim imenom:
Ako dobijete grešku poput
To znači da biblioteka koju ste generisali mora imati funkciju nazvanu a_function_name
.
GTFOBins je odabrani spisak Unix binarnih fajlova koje napadač može iskoristiti da zaobiđe lokalna sigurnosna ograničenja. GTFOArgs je isto to, ali za slučajeve kada možete samo ubaciti argumente u komandu.
Projekat prikuplja legitimne funkcije Unix binarnih fajlova koje mogu biti zloupotrebljene da bi se izašlo iz ograničenih shell-ova, eskalirale ili održavale povišene privilegije, prenosili fajlovi, pokretali bind i reverse shell-ove, i olakšavale druge zadatke nakon eksploatacije.
gdb -nx -ex '!sh' -ex quit sudo mysql -e '! /bin/sh' strace -o /dev/null /bin/sh sudo awk 'BEGIN {system("/bin/sh")}'
Ako možete pristupiti sudo -l
, možete koristiti alatku FallOfSudo da proverite da li pronalazi način da iskoristi bilo koju sudo pravilo.
U slučajevima kada imate sudo pristup ali ne i lozinku, možete eskalirati privilegije čekajući izvršenje sudo komande i zatim preuzimajući sesijski token.
Uslovi za eskalaciju privilegija:
Već imate shell kao korisnik "sampleuser"
"sampleuser" je koristio sudo
da izvrši nešto u poslednjih 15 minuta (podrazumevano je trajanje sudo tokena koje nam omogućava korišćenje sudo
bez unošenja bilo koje lozinke)
cat /proc/sys/kernel/yama/ptrace_scope
je 0
gdb
je dostupan (možete ga otpremiti)
(Možete privremeno omogućiti ptrace_scope
sa echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
ili trajno modifikujući /etc/sysctl.d/10-ptrace.conf
i postavljajući kernel.yama.ptrace_scope = 0
)
Ako su ispunjeni svi ovi uslovi, možete eskalirati privilegije koristeći: https://github.com/nongiach/sudo_inject
Prva eksploatacija (exploit.sh
) će kreirati binarni fajl activate_sudo_token
u /tmp. Možete ga koristiti da aktivirate sudo token u vašoj sesiji (nećete automatski dobiti root shell, uradite sudo su
):
Drugi eksploit (exploit_v2.sh
) će kreirati sh shell u /tmp vlasništvu root-a sa setuid-om
Treći eksploit (exploit_v3.sh
) će kreirati sudoers fajl koji čini sudo token-e večnim i omogućava svim korisnicima korišćenje sudo-a.
Ako imate dozvole za pisanje u fascikli ili na bilo kojem od kreiranih fajlova unutar fascikle, možete koristiti binarni fajl write_sudo_token da kreirate sudo token za korisnika i PID. Na primer, ako možete prebrisati fajl /var/run/sudo/ts/sampleuser i imate shell kao taj korisnik sa PID-om 1234, možete dobiti sudo privilegije bez potrebe da znate lozinku koristeći:
Fajl /etc/sudoers
i fajlovi unutar /etc/sudoers.d
podešavaju ko može koristiti sudo
i kako. Ovi fajlovi podrazumevano mogu biti čitani samo od strane korisnika root i grupe root.
Ako možete čitati ovaj fajl, možete biti u mogućnosti dobiti neke zanimljive informacije, a ako možete pisati bilo koji fajl, moći ćete doseći privilegije.
Ako možete pisati, možete zloupotrebiti ovo ovlašćenje
Još jedan način za zloupotrebu ovih dozvola:
Postoje neke alternative za binarni sudo
poput doas
za OpenBSD, ne zaboravite da proverite njegovu konfiguraciju na lokaciji /etc/doas.conf
Ako znate da se korisnik obično povezuje na mašinu i koristi sudo
za povećanje privilegija i dobijete shell unutar tog korisničkog konteksta, možete napraviti novi sudo izvršni fajl koji će izvršiti vaš kod kao root, a zatim korisnikovu komandu. Zatim, izmenite $PATH korisničkog konteksta (na primer dodavanjem novog puta u .bash_profile) tako da kada korisnik izvrši sudo, vaš sudo izvršni fajl bude izvršen.
Imajte na umu da ako korisnik koristi drugi shell (ne bash), moraćete da izmenite druge fajlove da biste dodali novi put. Na primer, sudo-piggyback modifikuje ~/.bashrc
, ~/.zshrc
, ~/.bash_profile
. Možete pronaći još jedan primer u bashdoor.py
Ili pokretanje nečega poput:
Datoteka /etc/ld.so.conf
pokazuje odakle se učitavaju konfiguracione datoteke. Tipično, ova datoteka sadrži sledeći put: include /etc/ld.so.conf.d/*.conf
To znači da će se čitati konfiguracione datoteke iz /etc/ld.so.conf.d/*.conf
. Ove konfiguracione datoteke ukazuju na druge foldere gde će se tražiti biblioteke. Na primer, sadržaj /etc/ld.so.conf.d/libc.conf
je /usr/local/lib
. Ovo znači da će sistem tražiti biblioteke unutar /usr/local/lib
.
Ako iz nekog razloga korisnik ima dozvole za pisanje na bilo kom od navedenih puteva: /etc/ld.so.conf
, /etc/ld.so.conf.d/
, bilo koja datoteka unutar /etc/ld.so.conf.d/
ili bilo koji folder unutar konfiguracione datoteke unutar /etc/ld.so.conf.d/*.conf
, može biti u mogućnosti da eskalira privilegije.
Pogledajte kako iskoristiti ovu lošu konfiguraciju na sledećoj stranici:
Kopiranjem lib datoteke u /var/tmp/flag15/
koristiće je program na ovom mestu kako je navedeno u RPATH
promenljivoj.
Zatim kreiraj zlonamernu biblioteku u /var/tmp
pomoću gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6
Linux mogućnosti pružaju podskup dostupnih root privilegija procesu. Ovo efikasno razbija root privilegije na manje i različite jedinice. Svaka od ovih jedinica može zasebno biti dodeljena procesima. Na ovaj način kompletan set privilegija je smanjen, smanjujući rizik od zloupotrebe. Pročitajte sledeću stranicu da saznate više o mogućnostima i kako ih zloupotrebiti:
Linux CapabilitiesU direktorijumu, bit za "izvršavanje" implicira da korisnik može "cd" u folder. Bit "čitanja" implicira da korisnik može listati datoteke, a bit "pisanja" implicira da korisnik može brisati i kreirati nove datoteke.
Access Control Lists (ACL-ovi) predstavljaju sekundarni sloj diskrecionih dozvola, sposoban za premošćavanje tradicionalnih ugo/rwx dozvola. Ove dozvole poboljšavaju kontrolu pristupa datotekama ili direktorijumima omogućavajući ili odbijajući prava specifičnim korisnicima koji nisu vlasnici ili deo grupe. Ovaj nivo granularnosti osigurava preciznije upravljanje pristupom. Više detalja možete pronaći ovde.
Dajte korisniku "kali" dozvole za čitanje i pisanje nad datotekom:
Preuzmite fajlove sa određenim ACL-ovima sa sistema:
U starijim verzijama možete preuzeti kontrolu nad nekom sesijom ljuske drugog korisnika (root). U najnovijim verzijama moći ćete se povezati samo na sesije ekrana vašeg korisnika. Međutim, možete pronaći zanimljive informacije unutar sesije.
Lista sesija ekrana
Povežite se sa sesijom
Ovo je bio problem sa starijim verzijama tmux-a. Nisam mogao da preuzmem kontrolu nad tmux (v2.1) sesijom kreiranom od strane root korisnika kao neprivilegovani korisnik.
Lista tmux sesija
Povežite se sa sesijom
Proverite Valentine box from HTB za primer.
Svi SSL i SSH ključevi generisani na sistemima zasnovanim na Debianu (Ubuntu, Kubuntu, itd) između septembra 2006. i 13. maja 2008. godine mogu biti pogođeni ovim bagom. Ovaj bag se javlja prilikom kreiranja novog ssh ključa na ovim operativnim sistemima, jer je bilo moguće samo 32,768 varijacija. To znači da su sve mogućnosti izračunate i imajući ssh javni ključ možete tražiti odgovarajući privatni ključ. Izračunate mogućnosti možete pronaći ovde: https://github.com/g0tmi1k/debian-ssh
PasswordAuthentication: Određuje da li je autentikacija lozinkom dozvoljena. Podrazumevana vrednost je no
.
PubkeyAuthentication: Određuje da li je autentikacija javnim ključem dozvoljena. Podrazumevana vrednost je yes
.
PermitEmptyPasswords: Kada je autentikacija lozinkom dozvoljena, određuje da li server dozvoljava prijavljivanje na naloge sa praznim lozinkama. Podrazumevana vrednost je no
.
Određuje da li root može da se prijavi korišćenjem ssh, podrazumevana vrednost je no
. Moguće vrednosti:
yes
: root može da se prijavi korišćenjem lozinke i privatnog ključa
without-password
ili prohibit-password
: root se može prijaviti samo sa privatnim ključem
forced-commands-only
: Root se može prijaviti samo korišćenjem privatnog ključa i ako su navedene opcije komandi
no
: ne
Određuje datoteke koje sadrže javne ključeve koji se mogu koristiti za autentikaciju korisnika. Može sadržati oznake poput %h
, koje će biti zamenjene kućnim direktorijumom. Možete navesti apsolutne putanje (počinjući sa /
) ili relativne putanje od korisnikovog kućnog direktorijuma. Na primer:
Ta konfiguracija će ukazati da ako pokušate da se prijavite sa privatnim ključem korisnika "testusername" ssh će uporediti javni ključ vašeg ključa sa onima koji se nalaze u /home/testusername/.ssh/authorized_keys
i /home/testusername/access
SSH agentno prosleđivanje vam omogućava da koristite svoje lokalne SSH ključeve umesto što ostavljate ključeve (bez lozinki!) na vašem serveru. Takođe, bićete u mogućnosti da skočite putem ssh do hosta i odatle skočite na drugi host koristeći ključ koji se nalazi na vašem početnom hostu.
Potrebno je postaviti ovu opciju u $HOME/.ssh.config
na sledeći način:
Primetite da ako je Host
*
, svaki put kada korisnik pređe na drugu mašinu, ta mašina će moći da pristupi ključevima (što predstavlja sigurnosni problem).
Fajl /etc/ssh_config
može zameniti ove opcije i dozvoliti ili zabraniti ovu konfiguraciju.
Fajl /etc/sshd_config
može dozvoliti ili zabraniti prosleđivanje ssh-agenta pomoću ključne reči AllowAgentForwarding
(podrazumevano je dozvoljeno).
Ako otkrijete da je Forward Agent konfigurisan u okruženju, pročitajte sledeću stranicu jer možda možete iskoristiti to za eskalaciju privilegija:
SSH Forward Agent exploitationFajl /etc/profile
i fajlovi u /etc/profile.d/
su skripte koje se izvršavaju kada korisnik pokrene novu ljusku. Dakle, ako možete pisati ili menjati bilo koji od njih, možete eskalirati privilegije.
U zavisnosti od OS-a, fajlovi /etc/passwd
i /etc/shadow
mogu imati drugačije ime ili postojati rezervna kopija. Stoga se preporučuje pronaći sve njih i proveriti da li možete da ih pročitate kako biste videli da li unutra postoje heševi:
U nekim situacijama možete pronaći hash-ove lozinki unutar datoteke /etc/passwd
(ili ekvivalentne).
Prvo generišite lozinku pomoću jedne od sledećih komandi.
Zatim dodajte korisnika hacker
i dodajte generisanu lozinku.
Na primer: haker:$1$haker$TzyKlv0/R/c28R.GAeLw.1:0:0:Haker:/root:/bin/bash
Sada možete koristiti su
komandu sa haker:haker
Alternativno, možete koristiti sledeće linije da dodate lažnog korisnika bez lozinke. UPOZORENJE: možete smanjiti trenutnu sigurnost mašine.
NAPOMENA: Na BSD platformama /etc/passwd
se nalazi na lokaciji /etc/pwd.db
i /etc/master.passwd
, takođe se /etc/shadow
preimenuje u /etc/spwd.db
.
Treba da proverite da li možete pisati u neke osetljive datoteke. Na primer, da li možete pisati u neku konfiguracionu datoteku servisa?
Na primer, ako mašina pokreće tomcat server i možete izmeniti konfiguracioni fajl Tomcat servisa unutar /etc/systemd/, tada možete izmeniti linije:
Sledeći folderi mogu sadržati rezervne kopije ili zanimljive informacije: /tmp, /var/tmp, /var/backups, /var/mail, /var/spool/mail, /etc/exports, /root (Verovatno nećete moći da pročitate poslednji, ali pokušajte)
Pročitajte kod linPEAS, on pretražuje nekoliko mogućih fajlova koji bi mogli sadržati lozinke. Još jedan zanimljiv alat koji možete koristiti za to je: LaZagne koji je aplikacija otvorenog koda korišćena za pronalaženje mnogo lozinki sačuvanih na lokalnom računaru za Windows, Linux i Mac.
Ako možete čitati logove, možda ćete moći pronaći zanimljive/poverljive informacije unutar njih. Što su logovi čudniji, to će verovatno biti interesantniji. Takođe, neki "loše" konfigurisani (sa zadnjim vratima?) audit logovi mogu vam omogućiti da snimite lozinke unutar audit logova kako je objašnjeno u ovom postu: https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/.
Da biste čitali dnevnike grupe adm će biti zaista korisno.
Trebalo bi da proverite i da li postoje fajlovi koji sadrže reč "password" u svom nazivu ili unutar sadržaja, kao i da proverite IP adrese i email adrese unutar logova, ili hash regexps. Neću ovde navesti kako da uradite sve ovo, ali ako ste zainteresovani možete proveriti poslednje provere koje linpeas vrši.
Ako znate odakle će se izvršavati python skripta i možete pisati unutar te fascikle ili možete modifikovati python biblioteke, možete modifikovati OS biblioteku i ugraditi zadnja vrata (ako možete pisati gde će se izvršavati python skripta, kopirajte i nalepite os.py biblioteku).
Da biste ugradili zadnja vrata u biblioteku, samo dodajte na kraj os.py biblioteke sledeću liniju (promenite IP i PORT):
Ranjivost u logrotate
-u omogućava korisnicima sa dozvolama za pisanje na datoteci zapisa ili njenim nadređenim direktorijumima da potencijalno steknu povišene privilegije. Ovo je zato što se logrotate
, često pokreće kao root, može manipulisati da izvrši proizvoljne datoteke, posebno u direktorijumima poput /etc/bash_completion.d/. Važno je proveriti dozvole ne samo u /var/log već i u bilo kom direktorijumu gde se primenjuje rotacija zapisa.
Ova ranjivost utiče na logrotate
verziju 3.18.0
i starije
Detaljnije informacije o ranjivosti mogu se pronaći na ovoj stranici: https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition.
Možete iskoristiti ovu ranjivost sa logrotten.
Ova ranjivost je vrlo slična CVE-2016-1247 (nginx zapisi), pa svaki put kada primetite da možete menjati zapise, proverite ko upravlja tim zapisima i proverite da li možete povišiti privilegije zamenom zapisa simboličkim linkovima.
Reference ranjivosti: https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
Ako, iz bilo kog razloga, korisnik može pisati skriptu ifcf-<bilo šta>
u /etc/sysconfig/network-scripts ili može prilagoditi postojeću, onda je vaš sistem kompromitovan.
Mrežne skripte, ifcg-eth0 na primer, koriste se za mrežne veze. Izgledaju tačno kao .INI datoteke. Međutim, na Linuxu se ~izvršavaju~ pomoću Network Managera (dispatcher.d).
U mom slučaju, atribut NAME=
u ovim mrežnim skriptama nije pravilno obrađen. Ako imate beli/prazan prostor u imenu, sistem pokušava da izvrši deo nakon belog/praznog prostora. Ovo znači da se sve posle prvog belog prostora izvršava kao root.
Na primer: /etc/sysconfig/network-scripts/ifcfg-1337
Direktorijum /etc/init.d
je dom za skripte za System V init (SysVinit), klasični Linux sistem upravljanja uslugama. Uključuje skripte za start
, stop
, restart
, i ponekad reload
usluga. Ove se mogu izvršiti direktno ili putem simboličkih veza pronađenih u /etc/rc?.d/
. Alternativna putanja u Redhat sistemima je /etc/rc.d/init.d
.
S druge strane, /etc/init
je povezan sa Upstart, novijim sistemom upravljanja uslugama koji je predstavio Ubuntu, koristeći konfiguracione datoteke za zadatke upravljanja uslugama. Iako je prešlo na Upstart, SysVinit skripte se i dalje koriste zajedno sa Upstart konfiguracijama zbog sloja kompatibilnosti u Upstart-u.
systemd se pojavljuje kao moderni inicijalizator i upravljač uslugama, nudeći napredne funkcije poput pokretanja demona po potrebi, upravljanja automatskim montiranjem i snimaka stanja sistema. Organizuje datoteke u /usr/lib/systemd/
za distribucione pakete i /etc/systemd/system/
za administratorske modifikacije, olakšavajući proces administracije sistema.
Statični impacket binarni fajlovi
LinEnum: https://github.com/rebootuser/LinEnum(-t opcija) Enumy: https://github.com/luke-goddard/enumy Unix Privesc Check: http://pentestmonkey.net/tools/audit/unix-privesc-check Linux Priv Checker: www.securitysift.com/download/linuxprivchecker.py BeeRoot: https://github.com/AlessandroZ/BeRoot/tree/master/Linux Kernelpop: Enumeracija ranjivosti kernela u Linuxu i MAC-u https://github.com/spencerdodd/kernelpop Mestaploit: multi/recon/local_exploit_suggester Linux Exploit Suggester: https://github.com/mzet-/linux-exploit-suggester EvilAbigail (fizički pristup): https://github.com/GDSSecurity/EvilAbigail Kompilacija više skripti: https://github.com/1N3/PrivEsc
Naučite i vežbajte hakovanje AWS-a:HackTricks Training AWS Red Team Expert (ARTE) Naučite i vežbajte hakovanje GCP-a: HackTricks Training GCP Red Team Expert (GRTE)