Unë jam rrënjë. Kuptimi i përshkallëzimit të privilegjeve të Linux OS

Kam kaluar tremujorin e parë të 2020 duke u përgatitur për provimin e OSCP. Kërkimi i informacionit në Google dhe shumë përpjekje "të verbëra" më morën të gjithë kohën e lirë. Doli të ishte veçanërisht e vështirë të kuptoheshin mekanizmat për përshkallëzimin e privilegjeve. Kursi PWK i kushton vëmendje të madhe kësaj teme, por materialet metodologjike nuk janë gjithmonë të mjaftueshme. Ka shumë manuale në internet me komanda të dobishme, por unë nuk jam mbështetës i ndjekjes verbërisht të rekomandimeve pa e kuptuar se ku do të çojë kjo.

Do të doja të ndaja me ju atë që arrita të mësoja gjatë përgatitjes dhe kalimit të suksesshëm të provimit (përfshirë bastisjet periodike në Hack The Box). Ndjeva një ndjenjë të thellë mirënjohjeje për çdo pjesë të informacionit që më ndihmoi të ecja në rrugën "Përpiqu më shumë" me më shumë vetëdije, tani është koha ime t'i kthej komunitetit.

Unë dua t'ju jap një udhëzues për përshkallëzimin e privilegjeve në OS Linux, i cili përfshin një analizë të vektorëve më të zakonshëm dhe veçorive të lidhura që do t'ju duhen patjetër. Shpesh, vetë mekanizmat e përshkallëzimit të privilegjeve janë mjaft të thjeshtë, lindin vështirësi gjatë strukturimit dhe analizimit të informacionit. Prandaj, vendosa të filloj me një "turne turistike" dhe më pas të shqyrtoj secilin vektor në një artikull të veçantë. Shpresoj se do t'ju kursej kohë për të studiuar temën.

Unë jam rrënjë. Kuptimi i përshkallëzimit të privilegjeve të Linux OS

Pra, pse është i mundur edhe përshkallëzimi i privilegjeve në vitin 2020 nëse metodat kanë qenë të njohura për një kohë shumë të gjatë? Në fakt, nëse përdoruesi e trajton sistemin në mënyrë korrekte, nuk do të jetë vërtet e mundur të rriten privilegjet në të. Problemi kryesor global që krijon mundësi të tilla është konfigurim i pasigurt. Prania e versioneve të vjetëruara të softuerit që përmbajnë dobësi në sistem është gjithashtu një rast i veçantë i një konfigurimi të pasigurt.

Përshkallëzimi i privilegjeve përmes konfigurimit të pasigurt

Para së gjithash, le të merremi me konfigurimin e pasigurt. Le të fillojmë me Profesionistët e TI-së shpesh përdorin manuale dhe burime si stackoverflow, shumë prej të cilave përmbajnë komanda dhe konfigurime të pasigurta. Një shembull i mrekullueshëm është lajmet që kodi më i kopjuar nga stackoverflow përmbante një gabim. Një administrator me përvojë do ta shohë bllokimin, por kjo është në një botë ideale. Edhe profesionistë kompetentë ngarkesa e rritur e punës të aftë për të bërë gabime. Imagjinoni që administratori është duke përgatitur dhe miratuar dokumentacionin për tenderin e radhës, në të njëjtën kohë duke u thelluar në teknologjinë e re që do të prezantohet në tremujorin e ardhshëm, ndërsa zgjidh periodikisht detyrat e mbështetjes së përdoruesit. Dhe më pas atij i jepet detyra për të ngritur shpejt disa makina virtuale dhe për të ofruar shërbime në to. Si mendoni, sa është probabiliteti që administratori thjesht të mos e vërejë bllokimin? Më pas specialistët ndryshojnë, por patericat mbeten, ndërsa kompanitë përpiqen gjithmonë të minimizojnë kostot, përfshirë ato për specialistët e IT.

Pseudo shell dhe jailbreak

Predha e sistemit e marrë gjatë fazës së prodhimit është shpesh e kufizuar, veçanërisht nëse e keni marrë atë duke hakuar një përdorues të serverit në internet. Për shembull, kufizimet e guaskës mund t'ju pengojnë të përdorni komandën sudo me një gabim:

sudo: no tty present and no askpass program specified

Pasi të keni marrë një guaskë, unë rekomandoj krijimin e një terminali të plotë, për shembull me Python.

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

Ju pyesni: "Pse më duhen një mijë komanda, nëse mund të përdor një, për shembull, për të transferuar skedarë?" Fakti është se sistemet janë konfiguruar ndryshe, në hostin tjetër Python mund të mos instalohet, por Perl mund të jetë i disponueshëm. Aftësia është të jesh në gjendje të bësh gjëra të njohura në sistem pa mjete të njohura. Mund të gjendet një listë e plotë e veçorive këtu.

Një guaskë me privilegje të ulët mund të merret duke përdorur ekipet 1 и ekipet 2 (çuditërisht edhe GIMP).

Shikoni historinë e komandave

Linux mbledh një histori të të gjitha komandave të ekzekutuara në një skedar . / .bash_history. Nëse serveri është në përdorim aktiv dhe historia e tij nuk është pastruar, ka shumë mundësi që kredencialet të gjenden në këtë skedar. Pastrimi i historisë është banalisht i papërshtatshëm. Nëse administratori detyrohet të zgjedhë komanda me dhjetë nivele përmes , sigurisht, do të jetë më i përshtatshëm për të që ta thërrasë këtë komandë nga historia sesa ta fusë përsëri. Plus, shumë nuk dinë për këtë "hak". Nëse ka predha alternative si Zsh ose Fish në sistem, ato kanë historinë e tyre. Për të shfaqur historinë e komandave në çdo predhë, thjesht shkruani historinë e komandës.

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

Ekziston një host i përbashkët, në të cilin serveri përdoret për të pritur disa site. Në mënyrë tipike, me këtë konfigurim, çdo burim ka përdoruesin e vet me një direktori të veçantë në shtëpi dhe një host virtual. Pra, nëse konfigurohet gabimisht, mund ta gjeni skedarin .bash_history në direktorinë rrënjë të burimit të ueb-it.

Gjetja e fjalëkalimeve në sistemin e skedarëve dhe sulmet në sistemet ngjitur

Skedarët e konfigurimit për shërbime të ndryshme mund të lexohen nga përdoruesi juaj aktual. Në to, ju mund të gjeni kredencialet në tekst të qartë - fjalëkalime për të hyrë në bazën e të dhënave ose shërbime të ngjashme. I njëjti fjalëkalim mund të përdoret si për të hyrë në bazën e të dhënave, ashtu edhe për të autorizuar përdoruesin rrënjë (stafi i kredencialeve).
Ndodh që kredencialet e gjetura i përkasin shërbimeve në hostet e tjerë. Zhvillimi i një sulmi ndaj infrastrukturës përmes një hosti të komprometuar nuk është më i keq se shfrytëzimi i hosteve të tjerë. Sistemet ngjitur mund të gjenden gjithashtu duke kërkuar adresat IP në sistemin e skedarëve.

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

Nëse hosti i komprometuar ka një aplikacion në internet të aksesueshëm nga Interneti, është më mirë të përjashtoni regjistrat e tij nga kërkimi për adresat IP. Adresat e përdoruesve të burimeve nga interneti nuk kanë gjasa të jenë të dobishme për ne, por adresat e rrjetit të brendshëm (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) dhe ku shkojnë, duke gjykuar nga regjistrat, mund të jenë me interes.

sudo

Komanda sudo lejon përdoruesin të ekzekutojë një komandë në kontekstin e root me fjalëkalimin e tij ose pa e përdorur fare atë. Shumë operacione në Linux kërkojnë privilegje root, por ekzekutimi si root konsiderohet praktikë shumë e keqe. Në vend të kësaj, është më mirë të aplikoni leje selektive për të ekzekutuar komanda në kontekstin rrënjë. Megjithatë, shumë mjete Linux, duke përfshirë ato standarde si vi, mund të përdoren për të përshkallëzuar privilegjet në mënyra të ligjshme. Për të gjetur rrugën e duhur, ju rekomandoj të shikoni këtu.

Gjëja e parë që duhet bërë pasi të keni akses në sistem është të ekzekutoni komandën sudo -l. Do të shfaq lejen për të përdorur komandën sudo. Nëse merret një përdorues pa fjalëkalim (si apache ose www-data), një vektor i përshkallëzimit të privilegjeve sudo nuk ka gjasa. Kur përdorni sudo, sistemi do të kërkojë një fjalëkalim. Përdorimi i komandës passwd për të vendosur një fjalëkalim gjithashtu nuk do të funksionojë, do të kërkojë fjalëkalimin aktual të përdoruesit. Por nëse sudo është ende i disponueshëm, atëherë, në fakt, duhet të kërkoni:

  • çdo interpretues, çdokush mund të krijojë një guaskë (PHP, Python, Perl);
  • çdo redaktues teksti (vim, vi, nano);
  • çdo shikues (më pak, më shumë);
  • çdo mundësi për të punuar me sistemin e skedarëve (cp, mv);
  • mjete që kanë dalje në bash, qoftë në mënyrë interaktive ose si një komandë e ekzekutueshme (awk, find, nmap, tcpdump, man, vi, vim, ansible).

Suid/Sgid

Ka shumë manuale në internet që këshillojnë ndërtimin e të gjitha komandave suid / sgid, por një artikull i rrallë jep specifika se çfarë të bëni me këto programe. Mund të gjenden opsione për përshkallëzimin e privilegjeve që nuk marrin parasysh përdorimin e shfrytëzimeve këtu. Gjithashtu, një numër skedarësh të ekzekutueshëm kanë dobësi specifike për versionin e OS, për shembull.

Në një botë ideale, ju duhet të ekzekutoni të gjitha paketat e instaluara përmes të paktën searchsploit. Në praktikë, kjo duhet të bëhet me programet më të njohura si sudo. Është gjithashtu gjithmonë një opsion për të përdorur dhe mbështetur zhvillimin e veglave të automatizuara që do të nxjerrin në pah, nga pikëpamja e përshkallëzimit të privilegjeve, ekzekutues interesantë me grup bit suid/sgid. Unë do të jap një listë të mjeteve të tilla në seksionin përkatës të artikullit.

Skriptet e shkrueshme të drejtuara nga Cron ose Init në kontekstin Root

Punët Cron mund të ekzekutohen në kontekstin e përdoruesve të ndryshëm, duke përfshirë root. Nëse ka një detyrë në cron me një lidhje në një skedar të ekzekutueshëm dhe është e disponueshme për ju për ta shkruar, mund ta zëvendësoni lehtësisht me një qëllim të keq dhe të kryeni përshkallëzimin e privilegjeve. Në të njëjtën kohë, si parazgjedhje, skedarët me detyra cron janë të disponueshëm për t'u lexuar për çdo përdorues.

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

I ngjashëm është rasti me init. Dallimi është se detyrat në cron ekzekutohen periodikisht, dhe në init - në fillimin e sistemit. Për funksionimin, do t'ju duhet të rindizni sistemin, ndërsa disa nga shërbimet mund të mos ngrihen (nëse nuk janë regjistruar në ngarkim automatik).

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

Ju gjithashtu mund të kërkoni për skedarë që mund të shkruhen nga çdo përdorues.

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

Metoda është mjaft e njohur, administratorët me përvojë të sistemit përdorin me kujdes komandën chmod. Megjithatë, në ueb, shumica dërrmuese e manualeve përshkruajnë vendosjen e të drejtave maksimale. Qasja "vetëm bëje të funksionojë" e administratorëve të papërvojë të sistemit krijon mundësi për përshkallëzimin e privilegjeve në parim. Nëse është e mundur, është më mirë të shikoni në historikun e komandave për përdorime të pasigurta të chmod.

chmod +w /path 
chmod 777 /path

Fitimi i aksesit të guaskës për përdoruesit e tjerë

Ne shikojmë listën e përdoruesve në /etc/passwd. Ne i kushtojmë vëmendje atyre që kanë një guaskë. Ju mund t'i dhunoni këta përdorues - është e mundur që përmes përdoruesit që rezulton ju përfundimisht të jeni në gjendje të rritni privilegjet.

Për të përmirësuar sigurinë, ju rekomandoj që t'i përmbaheni gjithmonë parimit të privilegjit më të vogël. Gjithashtu ka kuptim të gjesh kohë për të kontrolluar konfigurimet e pasigurta që mund të mbeten pas zgjidhjes së problemeve - kjo është "detyra teknike" e administratorit të sistemit.

Kodi i shkruar vetë

Vlen t'i hedhim një vështrim nga afër ekzekutuesit në direktorinë kryesore të përdoruesit dhe të serverit të uebit (/var/www/ nëse nuk specifikohet ndryshe). Këto skedarë mund të rezultojnë të jenë një zgjidhje krejtësisht e pasigurt dhe përmbajnë paterica të jashtëzakonshme. Sigurisht, nëse keni ndonjë kornizë në drejtorinë e serverit tuaj të internetit, nuk ka kuptim të kërkoni për ditë zero në të si pjesë e një pentesti, por rekomandohet të gjeni dhe studioni modifikime, shtojca dhe përbërës të personalizuar.

Për të rritur sigurinë, është më mirë të shmangni përdorimin e kredencialeve në skriptet e shkruar vetë, si dhe funksionalitetin potencialisht të rrezikshëm, si leximi /etc/shadow ose manipulimi i id_rsa, nëse është e mundur.

Ngritja e privilegjeve nëpërmjet shfrytëzimit të dobësive

Përpara se të përpiqeni të ngrini privilegjet përmes shfrytëzimit, është e rëndësishme të kuptoni transferimi i skedarëve në hostin e synuar. Përveç mjeteve të zakonshme si ssh, ftp, http (wget, curl), ekziston një e tërë "kopsht zoologjik" i mundësive.

Për të përmirësuar sigurinë e sistemit tuaj, përditësoni atë rregullisht në të fundit të qëndrueshme versionet, dhe gjithashtu përpiquni të përdorni shpërndarje të krijuara për Enterprise. Përndryshe, rrallë, por ka situata kur përmirësimi i përshtatshëm e bën sistemin të papërdorshëm.

Shfrytëzimi i shërbimeve që funksionojnë në kontekstin e përdoruesit rrënjë

Disa shërbime Linux funksionojnë si rrënjë e privilegjuar e përdoruesit. Ato mund të gjenden duke përdorur ps aux | rrënjë grep. Në këtë rast, shërbimi mund të mos shpallet në ueb dhe të jetë i disponueshëm në nivel lokal. Nëse ka shfrytëzime publike, ato mund të përdoren në mënyrë të sigurt: një përplasje shërbimi në rast dështimi është shumë më pak kritike sesa një përplasje OS.

ps -aux | grep root # Linux

Rasti më i suksesshëm mund të konsiderohet funksionimi i një shërbimi të hakuar në kontekstin e përdoruesit rrënjë. Përdorimi i shërbimit SMB i jep SYSTEM-it akses të privilegjuar në sistemet Windows (p.sh. nëpërmjet ms17-010). Sidoqoftë, kjo nuk është e zakonshme në sistemet Linux, kështu që mund të shpenzoni shumë kohë në përshkallëzimin e privilegjeve.

Duke shfrytëzuar dobësitë e kernelit Linux

Kjo është rruga e fundit që duhet marrë. Funksionimi i pasuksesshëm mund të çojë në një përplasje të sistemit dhe në rast të një rindezjeje, disa shërbime (përfshirë ato përmes të cilave ishte e mundur të merrej guaska origjinale) mund të mos ngrihen. Ndodh që administratori thjesht ka harruar të përdorë komandën systemctl enable. Plus, do të shkaktojë shumë pakënaqësi me punën tuaj nëse shfrytëzimi nuk është rënë dakord.
Nëse vendosni të përdorni burimet nga exploitdb, sigurohuni që të lexoni komentet në fillim të skenarit. Ndër të tjera, zakonisht thotë se si të përpilohet saktë ky shfrytëzim. Nëse keni qenë shumë dembel ose keni nevojë për "dje" për shkak të afateve, mund të kërkoni depo me shfrytëzime tashmë të përpiluara, për shembull. Sidoqoftë, duhet të kuptohet se në këtë rast do të merrni një derr në një thes. Nga ana tjetër, nëse një programues do ta kuptonte deri në bajt se si funksionon një kompjuter dhe softuerin që ai përdor, ai nuk do të kishte shkruar një linjë kodi gjatë gjithë jetës së tij.

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

metasploit

Për të kapur dhe trajtuar një lidhje, është gjithmonë më mirë të përdorni modulin exploit/multi/handler. Gjëja kryesore është të vendosni ngarkesën e saktë, për shembull, generic/shell/reverce_tcp ose generic/shell/bind_tcp. Predha e marrë në Metasploit mund të përmirësohet në Meterpreter duke përdorur modulin post/multi/manage/shell_to_meterpreter. Me Meterpreter, ju mund të automatizoni procesin e pas shfrytëzimit. Për shembull, moduli post/multi/recon/local_exploit_suggester kontrollon platformën, arkitekturën dhe entitetet e shfrytëzueshme dhe sugjeron modulet Metasploit për përshkallëzimin e privilegjeve në sistemin e synuar. Falë Meterpreter, përshkallëzimi i privilegjit ndonjëherë zbret në drejtimin e modulit të duhur, por hakimi pa kuptuar se çfarë po ndodh nën kapuç nuk është i vërtetë (ju duhet të shkruani ende një raport).

Tools

Mjetet për të automatizuar mbledhjen lokale të informacionit do t'ju kursejnë shumë përpjekje dhe kohë, por në vetvete nuk janë në gjendje të identifikojnë plotësisht rrugën e përshkallëzimit të privilegjit, veçanërisht në rastin e shfrytëzimit të dobësive të kernelit. Mjetet e automatizimit do të kryejnë të gjitha komandat e nevojshme që ju të mblidhni informacione rreth sistemit, por është gjithashtu e rëndësishme të jeni në gjendje të për të analizuar të dhëna të marra. Shpresoj se artikulli im do të jetë i dobishëm për ju në këtë. Sigurisht, ka shumë më tepër mjete sesa do të rendis më poshtë, por të gjithë bëjnë të njëjtën gjë - është më shumë çështje shije.

Bizele

Një mjet mjaft i freskët, kryerja e parë daton në janar 2019. Aktualisht instrumenti im i preferuar. Në fund të fundit është se ai nxjerr në pah vektorët më interesantë të përshkallëzimit të privilegjeve. Pajtohem, është më e përshtatshme të marrësh një vlerësim ekspert në këtë nivel sesa të analizosh të dhënat e papërpunuara monolitike.

LinEnum

Mjeti im i dytë i preferuar, ai gjithashtu mbledh dhe organizon të dhënat e marra si rezultat i numërimit lokal.

linux-exploit-suggester (1,2)

Ky shfrytëzim do të analizojë sistemin për kushte të përshtatshme për shfrytëzime. Në fakt, ai do të bëjë një punë identike me modulin Metasploit local_exploit_suggester, por do të ofrojë lidhje me kodet burimore exploit-db dhe jo modulet Metasploit.

Linuxprivchecker

Ky skenar do të mbledhë dhe organizojë sipas seksioneve një sasi të madhe informacioni që mund të jetë i dobishëm për formimin e një vektori të përshkallëzimit të privilegjit.

Një herë tjetër do të shtjelloj Përshkallëzimi i privilegjeve të Linux përmes suid/sgid.

Burimi: www.habr.com

Shto një koment