Primul trimestru al anului 2020 l-am petrecut pregătindu-mă pentru examenul OSCP. Căutarea informațiilor pe Google și numeroasele încercări „neselective” mi-au consumat tot timpul liber. A fost deosebit de dificil să înțeleg mecanismele de creștere a privilegiilor. Cursul PWK acordă o mare atenție acestui subiect, dar materialele didactice sunt întotdeauna insuficiente. Pe internet există o mulțime de manuale cu comenzi utile, dar nu sunt adeptul de a urma recomandările fără a înțelege consecințele acestora.
Vreau să împărtășesc cu voi ce am reușit să învăț în timpul pregătirii și susținerii cu succes a examenului (inclusiv darurile ocazionale pe Hack The Box). Am simțit o profundă recunoștință pentru fiecare fir de informație care m-a ajutat să parcurg drumul Try Harder mai conștient; acum este timpul să aduc omagiu comunității.
Vreau să vă ofer un manual despre creșterea privilegiilor în OS Linux, care să includă analiza celor mai frecvente vectori și trucuri conexe pe care cu siguranță le veți folosi. De cele mai multe ori, mecanismele de creștere a privilegiilor sunt destul de simple, dificultățile apar în structurarea și analiza informațiilor. Așadar, am decis să încep cu o 'prezentare generală' și să discut fiecare vector în articole separate. Sper să vă economisesc timp în studierea subiectului.

Deci, de ce este posibilă creșterea privilegiilor în 2020, dacă metodele sunt bine cunoscute de mult timp? De fapt, dacă utilizatorul interacționează corect cu sistemul, nu va reuși să crească privilegiile în acesta. Principala problemă globală care generează aceste oportunități constă în configurația nesigură. Prezența versiunilor învechite de software, care conțin vulnerabilități, este de asemenea un caz particular al configurației nesigure.
Creșterea privilegiilor prin configurația nesigură
În primul rând, să ne ocupăm de configurația nesigură. Să începem cu faptul că specialiștii IT folosesc adesea manuale și resurse precum stackoverflow, multe dintre care conțin comenzi și configurații nesigure. Un exemplu elocvent este faptul că cel mai copiat cod de pe stackoverflow conținea o eroare. Un admin experimentat va observa greșeala, dar aceasta este în lumea ideală. Chiar și specialiștii competenți în fața unei sarcini de lucru crescută pot exista erori. Imaginați-vă că un administrator se ocupă de pregătirea și aprobarea documentației pentru o nouă licitație, în timp ce se familiarizează cu o nouă tehnologie care trebuie implementată în trimestrul următor, iar periodic rezolvă problemele utilizatorilor. Și atunci primește o sarcină rapidă de a ridica câteva mașini virtuale și de a instala servicii pe ele. Credeți că există vreo șansă ca administratorul să nu observe un defect? Apoi, specialiștii se schimbă, dar improvizațiile rămân, în timp ce companiile caută întotdeauna să minimizeze cheltuielile, inclusiv pe cele cu IT-iștii.
Pseudoconsole și jailbreak
Consolele de sistem obținute în timpul exploatării sunt adesea limitate, mai ales dacă le-ați obținut prin atacuri asupra utilizatorului serverului web. De exemplu, limitările consolei pot împiedica aplicarea comenzii sudo cu un mesaj de eroare:
sudo: no tty present and no askpass program specifiedDupă obținerea consolei, recomand să creați un terminal complet, de exemplu, folosind Python.
python -c 'import pty;pty.spawn("/bin/bash")'Veți întreba: „De ce am nevoie de o mie de comenzi, dacă pot folosi una, de exemplu, pentru a transfera fișiere?” Problema este că sistemele pot fi configurate diferit, pe un alt host poate să nu fie instalat Python, dar trebuie să existe Perl. Măiestria este de a putea face lucrurile obișnuite într-un sistem fără instrumentele obișnuite. O listă completă a posibilităților poate fi găsită .
O shell cu privilegii reduse poate fi obținută folosind și (ciudat, dar chiar și GIMP).
Vizualizarea istoricului comenzilor
Linux colectează istoricul tuturor comenzilor executate într-un fișier ~/.”bash_history. Dacă serverul este folosit activ și istoricul său nu este curățat, există o mare probabilitate de a găsi în acest fișier datele de autentificare. Acurățarea istoricelor este pur și simplu inconfortabilă. Dacă administratorul este nevoit să caute comenzi de zece etaje, desigur, îi va fi mai ușor să apeleze la această comandă din istoric decât să o tasteze din nou. Plus că mulți nu știu de acest „hack”. Dacă în sistem sunt prezente shell-uri alternative cum ar fi Zsh sau Fish, acestea își conduc propriul istoric. Pentru a lista istoricul comenzilor în orice shell, este suficient să tastați comanda history.
cat ~/.”bash_history
cat ~/.”mysql_history
cat ~/.”nano_history
cat ~/.”php_history
cat ~/.”atftp_historyExistă hosting shared, în care serverul este utilizat pentru a găzdui mai multe site-uri. De obicei, în această configurație, se creează un utilizator propriu pentru fiecare resursă, cu un director home separat și un virtual host. Așadar, în cazul unei configurări greșite, în directorul rădăcină al resursei web, se poate găsi fișierul .bash_history.
Căutarea parolelor în sistemul de fișiere și atacurile asupra sistemelor adiacente
Fișierele de configurare ale diferitelor servicii pot fi accesibile pentru citire utilizatorului tău curent. În acestea se pot găsi credențiale în clar — parole pentru accesul la baza de date sau servicii adiacente. Aceeași parolă poate fi utilizată atât pentru accesul la baza de date, cât și pentru autorizarea utilizatorului root (credential staffing).
Se poate întâmpla ca credențialele găsite să aparțină serviciilor de pe alte gazde. Dezvoltarea atacului asupra infrastructurii prin intermediul unei gazde compromise nu este cu nimic mai prejos decât exploatarea altor gazde. Sistemele adiacente pot fi de asemenea găsite prin căutarea adreselor IP în sistemul de fișiere.
grep -lRi "password" /home /var/www /var/log 2>/dev/null | sort | uniq #Găsește șirul password (fără cs) în aceste directoare
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 #IP-uri în jurnaleÎn cazul în care pe gazda compromisă există o aplicație web, accesibilă din Internet, este mai bine să excludem jurnalele sale din căutarea adreselor IP. Adresele utilizatorilor resursei din Internet nu ne vor fi foarte utile, dar adresele rețelei interne (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) și locurile unde accesează, potrivit jurnalelor, pot reprezenta interes.
Sudo
Comanda sudo oferă utilizatorului posibilitatea de a executa o comandă în contextul root folosind propria parolă sau chiar fără utilizarea acesteia. Multe operațiuni în Linux necesită privilegii root, însă a lucra din perspectiva root este considerată o practică foarte proastă. În schimb, este mai bine să aplici permisiuni selective pentru executarea comenzilor în contextul root. Totuși, multe instrumente Linux, inclusiv cele de tip standard precum vi, pot fi utilizate pentru a ridica privilegiile în moduri complet legitime. Pentru a căuta o metodă potrivită, recomand să consulți .
Primul lucru pe care trebuie să-l faci după ce ai acces la sistem este să execuți comanda sudo -l. Aceasta va afișa permisiunile pentru utilizarea comenzii sudo. Dacă ai un utilizator fără parolă (de exemplu, apache sau www-data), vectorul de creștere a privilegiilor prin sudo este puțin probabil. Atunci când folosești sudo, sistemul va solicita parola. Comanda passwd nu va permite, de asemenea, setarea parolei, deoarece va solicita parola curentă a utilizatorului. Dar, dacă sudo este totuși disponibil, în esență, trebuie să cauți:
- orice interpreți, fiecare putând să deschidă un shell (PHP, Python, Perl);
- orice editoare de text (vim, vi, nano);
- orice vizualizatoare (less, more);
- orice oportunități de a lucra cu sistemul de fișiere (cp, mv);
- unelte care au acces la bash, interactiv sau sub formă de comandă executabilă (awk, find, nmap, tcpdump, man, vi, vim, ansible).
Suid/Sgid
Există multe manuale pe internet care recomandă să aduni toate comenzile suid/sgid, însă puține articole oferă detalii despre ce să faci cu aceste programe. Opțiunile de creștere a privilegiilor, care nu iau în considerare utilizarea exploit-urilor, pot fi găsite . De asemenea, o serie de fișiere executabile au vulnerabilități specifice versiunii de OS, .
Într-o lume ideală, ar trebui să treci toate pachetele instalate cel puțin prin searchsploit. În practică, acest lucru ar trebui să se facă cu cele mai populare programe de tip sudo. De asemenea, întotdeauna există opțiunea de a utiliza și a menține dezvoltarea uneltelor automatizate, care să evidențieze fișierele executabile interesante, din perspectiva creșterii privilegiilor, cu biturile suid/sgid setate. O listă a acestor unelte voi prezenta în secțiunea corespunzătoare a articolului.
Scripturi accesibile pentru scriere, executate de Cron sau Init, în contextul Root
Sarcinile cron pot rula în contextul diferitelor utilizatori, inclusiv root. Dacă în cron este setată o sarcină cu un link către un fișier executabil, iar acesta îți este accesibil pentru scriere, îl poți înlocui cu unul malițios și să execuți o creștere a privilegiilor. În plus, implicit, fișierele cu sarcini cron sunt accesibile pentru citire oricărui utilizator.
ls -la /etc/cron.d # afișează sarcinile cron Situația este similară și cu init. Diferența constă în faptul că sarcinile din cron sunt executate periodic, iar cele din init - la pornirea sistemului. Pentru exploatare, va fi necesară o repornire a sistemului, iar unele servicii s-ar putea să nu pornească (dacă nu au fost specificate în autostart).
ls -la /etc/init.d/ # arată scripturile de inițiere De asemenea, puteți căuta fișiere accesibile pentru orice utilizator.
find / -perm -2 -type f 2>/dev/null # găsește fișiere scriabile la nivel mondialMetoda este destul de cunoscută, administratorii de sistem cu experiență folosesc cu grijă comanda chmod. Totuși, în majoritatea manualelor de pe internet este descrisă setarea celor mai mari permisiuni. Abordarea neexperimentată a administratorilor de sistem de tip „doar să funcționeze” creează oportunități pentru o creștere a privilegiilor în principiu. Dacă există posibilitatea, este mai bine să căutați în istoria comenzilor utilizarea nesigură a chmod.
chmod +w /path
chmod 777 /pathObținerea accesului la shell-ul altor utilizatori
Verificăm lista utilizatorilor în /etc/passwd. Acordați atenție celor care au shell. Puteți încerca să brutezi acești utilizatori – nu este exclus că prin utilizatorul obținut veți putea, în cele din urmă, să creșteți privilegiile.
Pentru a spori securitatea, vă recomand să respectați întotdeauna principiul privilegiilor minime. De asemenea, are sens să dedicați timp verificării configurațiilor nesigure care ar fi putut rămâne după depanare – acesta este „datoria tehnică” a administratorului de sistem.
Cod scris de mână
Merită să analizați cu atenție fișierele executabile din directorul de acasă al utilizatorului și al serverului web (/var/www/, dacă nu este specificat altceva). Aceste fișiere pot reprezenta o soluție complet nesigură și să conțină soluții incredibile. Desigur, dacă aveți un cadru în directorul serverului web, nu are sens să căutați în el zero-day în cadrul unui test de penetrare, dar este recomandat să găsiți și să studiați modificările personalizate, pluginurile și componentele.
Pentru a spori securitatea, este mai bine să renunțați la utilizarea datelor de autentificare în scripturile scrise de mână, precum și la funcționalitatea potențial periculoasă, cum ar fi citirea /etc/shadow sau manipularea cu id_rsa.
Creșterea privilegiilor prin exploatarea vulnerabilităților
Înainte de a încerca să creșteți privilegiile prin exploatare, este important să înțelegeți transferul de fișiere către gazda țintă. Pe lângă instrumentele obișnuite precum ssh, ftp, http (wget, curl), există un întreg .
Pentru a spori securitatea sistemului, actualizați-l regulat la versiuni stabile versiuni, și de asemenea încercați să folosiți distribuții destinate Enterprise. În caz contrar, rareori, dar pot exista situații în care apt upgrade face sistemul nefuncțional.
Exploatarea serviciilor care rulează în contextul utilizatorului root
Unele servicii Linux funcționează sub utilizatorul privilegiate root. Acestea pot fi găsite folosind comanda ps aux | grep root. Totuși, serviciul poate să nu fie anunțat în rețea și să fie accesibil local. Dacă are exploate publice, acestea pot fi aplicate fără rezerve: căderea serviciului în caz de eșec este mult mai puțin critică decât căderea sistemului de operare.
ps -aux | grep root # LinuxCea mai reușită situație poate fi considerată funcționarea unui serviciu compromis în contextul utilizatorului root. Exploatarea serviciului SMB oferă acces privilegiate SYSTEM în sistemele Windows (de exemplu, prin ms17-010). Totuși, în sistemele Linux, acest lucru se întâlnește rar, așa că este posibil să petreceți mult timp sporind privilegii.
Exploatarea vulnerabilităților nucleului Linux
Aceasta este calea pe care trebuie să mergi în ultimul rând. O exploatare eșuată poate duce la căderea sistemului, iar în cazul unui reboot, unele servicii (inclusiv cele prin care ați obținut inițial shell-ul) pot să nu se repornesc. Se întâmplă ca administratorul să fi uitat pur și simplu să aplice comanda systemctl enable. Plus că va provoca nemulțumiri cu privire la munca ta, dacă exploatarea nu a fost convenită.
Dacă ai decis să folosești coduri sursă din exploitdb, asigură-te că citești comentariile de la începutul scriptului. Pe lângă altele, acolo este de obicei scris cum ar trebui să compilezi corect acest exploit. Dacă nu ai chef sau, din cauza termenelor limită, ai avut nevoie de «ieri», poți căuta repozitorii cu exploate deja compilate, . Totuși, trebuie să înțelegi că în acest caz vei obține o pisică într-un sac. Pe de altă parte, dacă programatorul ar înțelege până la byte cum funcționează computerul și software-ul utilizat, nu ar fi scris niciodată o linie de cod în întreaga sa viață.
cat /proc/version
uname -a
searchsploit "Linux Kernel" Metasploit
Pentru a capta și a prelucra o conexiune, este întotdeauna mai bine să folosești modulul exploit/multi/handler. Important este să alegi payload-ul corect, de exemplu, generic/shell/reverse_tcp sau generic/shell/bind_tcp. Shell-ul obținut în Metasploit poate fi îmbunătățit la Meterpreter folosind modulul post/multi/manage/shell_to_meterpreter. Având Meterpreter, poți automatiza procesul de post-exploatare. De exemplu, modulul post/multi/recon/local_exploit_suggester verifică platforma, arhitectura și entitățile necesare pentru exploatare și propune module Metasploit pentru creșterea privilegiilor pe sistemul țintă. Datorită Meterpreter, creșterea privilegiilor se reduce uneori la lansarea modulului necesar, însă hack-ul fără a înțelege ce se întâmplă sub capotă nu este „adevărat” (mai ai de scris un raport).
Instrumente
Instrumentele de automatizare a colectării informațiilor locale îți vor salva o mulțime de efort și timp, totuși ele nu pot dezvălui în totalitate calea de creștere a privilegiilor, mai ales în cazul exploatării vulnerabilităților kernel-ului. Instrumentele de automatizare vor executa pentru tine toate comenzile necesare pentru a colecta informații despre sistem, dar este important să să fie analizate te ocupi de datele obținute. Sper că articolul meu îți va fi de folos. Desigur, există mult mai multe instrumente decât cele pe care le voi enumera mai jos, dar toate fac aproximativ același lucru - aici este vorba mai degrabă despre gust.
Un tool destul de nou, primul commit datează din ianuarie 2019. În prezent, este instrumentul meu preferat. Ideea este că acesta evidentiază cele mai interesante vectori pentru creșterea privilegiilor. E mai convenabil să primești o evaluare de expert la un astfel de nivel decât să analizezi datele brute monolitice.
Al doilea instrument preferat, de asemenea, colectează și sistematizează datele obținute în urma enumerării locale.
Acest exploit va analiza sistemul pentru a verifica condițiile adecvate pentru exploite. Practic, va face același lucru ca modulul Metasploit local_exploit_suggester, dar va propune nu module Metasploit, ci linkuri către codurile sursă de exploit-db.
Acest script va colecta și sistematiza, pe secțiuni, o cantitate mare de informații care pot fi utile pentru formarea unui vector de creștere a privilegiilor.
Într-o altă ocazie, voi analiza în detaliu .
Sursa: habr.com
