Mi estas radiko. Kompreni Linuksan OS Privilege Escalation

Mi pasigis la unuan trimonaton de 2020 preparante por la OSCP-ekzameno. Serĉi informojn ĉe Guglo kaj multaj "blindaj" provoj okupis mian tutan liberan tempon. Montriĝis precipe malfacile kompreni la mekanismojn por eskalado de privilegioj. La PWK-kurso multe atentas ĉi tiun temon, sed metodikaj materialoj ĉiam ne sufiĉas. Estas multaj manlibroj en la Interreto kun utilaj komandoj, sed mi ne subtenas blinde sekvi la rekomendojn sen kompreni kien tio kondukos.

Mi ŝatus kunhavigi kun vi tion, kion mi sukcesis lerni dum la preparado kaj sukcesa trapaso de la ekzameno (inkluzive de periodaj atakoj ĉe Hack The Box). Mi sentis profundan dankemon pro ĉiu informo, kiu helpis min iri la vojon Try Harder pli konscie, nun estas mia tempo por redoni al la komunumo.

Mi volas doni al vi gvidilon pri privilegia eskalado en OS Linukso, kiu inkluzivas analizon de la plej oftaj vektoroj kaj rilataj funkcioj, kiujn vi certe bezonos. Ofte, la privilegiaj eskalado-mekanismoj mem estas sufiĉe simplaj, malfacilaĵoj aperas dum strukturado kaj analizado de informoj. Tial mi decidis komenci per "turnvojaĝo" kaj poste konsideri ĉiun vektoron en aparta artikolo. Mi esperas, ke mi ŝparos al vi tempon por studi la temon.

Mi estas radiko. Kompreni Linuksan OS Privilege Escalation

Do, kial privilegia eskalado eĉ eblas en 2020, se la metodoj estas konataj de tre longa tempo? Fakte, se la uzanto ĝuste manipulas la sistemon, vere ne eblos pliigi privilegiojn en ĝi. La ĉefa tutmonda problemo, kiu estigas tiajn ŝancojn, estas nesekura agordo. La ĉeesto de malnoviĝintaj programversioj enhavantaj vundeblecojn en la sistemo ankaŭ estas speciala kazo de nesekura agordo.

Pliiĝo de privilegioj per nesekura agordo

Antaŭ ĉio, ni traktu la nesekuran agordon. Ni komencu per IT-profesiuloj ofte uzas manlibrojn kaj rimedojn kiel stackoverflow, multaj el kiuj enhavas nesekurajn komandojn kaj agordojn. Frapa ekzemplo estas la novaĵoj ke la kodo plej kopiita de stackoverflow enhavis eraron. Sperta administranto vidos la jambon, sed ĉi tio estas en ideala mondo. Eĉ kompetentaj profesiuloj pliigita laborŝarĝo kapabla fari erarojn. Imagu, ke la administranto preparas kaj aprobas dokumentaron por la venonta oferto, samtempe enprofundiĝas en la novan teknologion, kiu estos enkondukata en la venonta trimonato, dum periode solvas uzantsubtenajn taskojn. Kaj tiam li ricevas la taskon rapide kreskigi kelkajn virtualajn maŝinojn kaj lanĉi servojn sur ili. Kion vi pensas, kia estas la probablo ke la administranto simple ne rimarkas la jambon? Tiam la specialistoj ŝanĝiĝas, sed la lambastonoj restas, dum kompanioj ĉiam klopodas por minimumigi kostojn, inkluzive de tiuj por IT-specialistoj.

Pseŭdoŝelo kaj jailbreak

La sistema ŝelo akirita dum la produktadfazo ofte estas limigita, precipe se vi akiris ĝin per hakado de retservila uzanto. Ekzemple, ŝellimigoj povas malhelpi vin uzi la sudo-komandon kun eraro:

sudo: no tty present and no askpass program specified

Post akiri ŝelon, mi rekomendas krei plentaŭgan terminalon, ekzemple per Python.

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

Vi demandas: "Kial mi bezonas mil ordonojn, se mi povas uzi unu, ekzemple, por transdoni dosierojn?" La fakto estas, ke sistemoj estas agorditaj malsame, sur la sekva gastiganto eble ne estas instalita Python, sed Perl eble disponeblas. La kapablo estas povi fari konatajn aferojn en la sistemo sen konataj iloj. Kompleta listo de funkcioj troveblas tie.

Malalta privilegia ŝelo povas esti akirita uzante teamoj 1 и teamoj 2 (surprize eĉ GIMP).

Rigardu komandhistorion

Linukso kolektas historion de ĉiuj ekzekutitaj komandoj en dosiero ~ / .bash_historio. Se la servilo estas en aktiva uzo kaj ĝia historio ne estas forigita, estas bona ŝanco ke la akreditaĵoj troviĝas en ĉi tiu dosiero. Purigi la historion estas banale maloportuna. Se la administranto estas devigita elekti dek-nivelajn komandojn per , kompreneble, estos pli oportune por li voki ĉi tiun komandon el la historio ol enigi ĝin denove. Krome, multaj ne scias pri ĉi tiu "hako". Se estas alternativaj konkoj kiel Zsh aŭ Fish en la sistemo, ili havas sian propran historion. Por montri la historion de komandoj en iu ajn ŝelo, simple tajpu la komandhistorion.

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

Estas komuna gastigado, en kiu la servilo estas uzata por gastigi plurajn retejojn. Tipe, kun ĉi tiu agordo, ĉiu rimedo havas sian propran uzanton kun aparta hejma dosierujo kaj virtuala gastiganto. Do, se agordita malĝuste, vi povas trovi la dosieron .bash_history en la radika dosierujo de la retejo-rimedo.

Trovi pasvortojn en la dosiersistemo kaj atakoj sur apudaj sistemoj

Agordaj dosieroj por diversaj servoj povas esti legeblaj de via nuna uzanto. En ili, vi povas trovi akreditaĵojn en klara teksto - pasvortoj por aliri la datumbazon aŭ rilatajn servojn. La sama pasvorto povas esti uzata kaj por aliri la datumbazon kaj por rajtigi la radikan uzanton (personado de akreditaĵoj).
Okazas, ke la trovitaj akreditaĵoj apartenas al servoj sur aliaj gastigantoj. La disvolviĝo de atako al la infrastrukturo per kompromitita gastiganto ne estas pli malbona ol la ekspluatado de aliaj gastigantoj. Apudsistemoj ankaŭ troveblas serĉante IP-adresojn en la dosiersistemo.

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

Se la kompromitita gastiganto havas TTT-aplikaĵon alirebla de la Interreto, estas pli bone ekskludi ĝiajn protokolojn de la serĉo de IP-adresoj. La adresoj de rimeduzantoj de la Interreto verŝajne ne estos utilaj al ni, sed la adresoj de la interna reto (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) kaj kien ili iras, se juĝante laŭ la ŝtipoj, povas esti interesaj.

Sudo

La sudo-komando permesas al la uzanto ekzekuti komandon en la kunteksto de radiko kun sia propra pasvorto aŭ tute sen uzi ĝin. Multaj operacioj en Linukso postulas radikajn privilegiojn, sed funkcii kiel radiko estas konsiderata tre malbona praktiko. Anstataŭe, estas pli bone apliki selekteman permeson por ekzekuti komandojn en la radika kunteksto. Tamen, multaj Linuksaj iloj, inkluzive de la normaj kiel vi, povas esti uzataj por pligrandigi privilegiojn laŭleĝaj manieroj. Por trovi la ĝustan vojon, mi rekomendas rigardi tie.

La unua afero farenda post akiri aliron al la sistemo estas ruli la komandon sudo -l. Ĝi montros permeson uzi la sudo-komandon. Se uzanto sen pasvorto estas akirita (kiel ekzemple apache aŭ www-datumoj), sudo-privilegia eskalada vektoro estas neverŝajna. Kiam vi uzas sudo, la sistemo petos pasvorton. Uzado de la passwd komando por agordi pasvorton ankaŭ ne funkcios, ĝi petos la nunan uzantan pasvorton. Sed se sudo ankoraŭ disponeblas, tiam, fakte, vi devas serĉi:

  • iuj interpretistoj, iu ajn povas generi ŝelon (PHP, Python, Perl);
  • ajnaj tekstredaktiloj (vim, vi, nano);
  • iuj spektantoj (malpli, pli);
  • ajnaj eblecoj labori kun la dosiersistemo (cp, mv);
  • iloj kiuj havas eligon en bash, aŭ interage aŭ kiel plenumebla komando (awk, find, nmap, tcpdump, man, vi, vim, ansible).

Suid/Sgid

Estas multaj manlibroj en la Interreto, kiuj konsilas konstrui ĉiujn suid / sgid-komandojn, sed malofta artikolo donas detalojn pri tio, kion fari kun ĉi tiuj programoj. Privilegiaj eskalado-opcioj, kiuj ne konsideras la uzon de ekspluatoj, troviĝas tie. Ankaŭ, kelkaj ruleblaj dosieroj havas specifajn vundeblecojn por la OS-versio, ekzemple.

En ideala mondo, vi devus ruli ĉiujn instalitajn pakaĵojn per almenaŭ searchsploit. En praktiko, ĉi tio devus esti farita per la plej popularaj programoj kiel sudo. Ankaŭ ĉiam estas eblo uzi kaj subteni la disvolviĝon de aŭtomatigitaj iloj, kiuj elstarigos interesajn, de privilegia eskalado vidpunkto, ekzekuteblaj kun suid/sgid bitoj agordita. Mi donos liston de tiaj iloj en la responda sekcio de la artikolo.

Skribeblaj skriptoj rulitaj de Cron aŭ Init en Radika kunteksto

Cron-laboroj povas funkcii en la kunteksto de malsamaj uzantoj, inkluzive de radiko. Se estas tasko en cron kun ligilo al rulebla dosiero, kaj ĝi estas disponebla por vi verki, vi povas facile anstataŭigi ĝin per malica kaj fari privilegian eskaladon. Samtempe, defaŭlte, dosieroj kun cron-taskoj estas disponeblaj por legi al iu ajn uzanto.

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

Simila estas la kazo kun init. La diferenco estas, ke taskoj en cron estas ekzekutitaj periode, kaj en init - ĉe la starto de la sistemo. Por funkciado, vi devos rekomenci la sistemon, dum kelkaj el la servoj eble ne altiĝos (se ili ne estis registritaj en aŭtomata ŝarĝo).

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

Vi ankaŭ povas serĉi dosierojn skribeblajn de iu ajn uzanto.

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

La metodo estas sufiĉe konata, spertaj sistemaj administrantoj zorge uzas la komandon chmod. Tamen, en la Reto, la granda plimulto de manlibroj priskribas agordi maksimumajn rajtojn. La "nur faru ĝin funkcii" aliro de nespertaj sistemadministrantoj kreas ŝancojn por privilegia eskalado principe. Se eble, estas plej bone serĉi en la komanda historio por nesekuraj uzoj de chmod.

chmod +w /path 
chmod 777 /path

Akiri ŝelan aliron por aliaj uzantoj

Ni rigardas la liston de uzantoj en /etc/passwd. Ni atentas tiujn, kiuj havas ŝelon. Vi povas malpurigi tiujn uzantojn - eblas ke per la rezulta uzanto vi eventuale povos pliigi privilegiojn.

Por plibonigi sekurecon, mi rekomendas, ke vi ĉiam aliĝu al la principo de minimuma privilegio. Ankaŭ havas sencon preni tempon por kontroli nesekurajn agordojn, kiuj povus resti post problemoj - ĉi tio estas la "teknika devo" de la sistemadministranto.

Memskribita kodo

Indas rigardi detale la ekzekutaĵojn en la hejma dosierujo de la uzanto kaj retservilo (/var/www/ krom se alie specifita). Ĉi tiuj dosieroj povas rezulti esti tute nesekura solvo kaj enhavi nekredeblajn lambastonojn. Kompreneble, se vi havas iun kadron en via retservila dosierujo, ne havas sencon serĉi nul-tagon en ĝi kiel parto de pentesto, sed oni rekomendas trovi kaj studi kutimajn modifojn, kromaĵojn kaj komponantojn.

Por pliigi sekurecon, estas pli bone eviti uzi akreditaĵojn en memskribitaj skriptoj, same kiel eble danĝerajn funkciojn, kiel legi /etc/shadow aŭ manipuli id_rsa, se eble.

Altiĝo de privilegio per ekspluatado de vundeblecoj

Antaŭ ol provi altigi privilegiojn per ekspluatado, gravas kompreni la transdonante dosierojn al la cela gastiganto. Krom la kutimaj iloj kiel ssh, ftp, http (wget, curl), ekzistas tutaĵo "zoo" de eblecoj.

Por plibonigi la sekurecon de via sistemo, ĝisdatigu ĝin regule al la plej nova stabila versioj, kaj ankaŭ provu uzi distribuojn desegnitajn por Enterprise. Alie, malofte, sed estas situacioj kiam taŭga ĝisdatigo faras la sistemon neuzebla.

Ekspluatado de Servoj Kurantaj en la Kunteksto de la Radika Uzanto

Iuj Linukso-servoj funkcias kiel la privilegiita uzantradiko. Ili troveblas uzante la ps aux | grep radiko. En ĉi tiu kazo, la servo eble ne estas anoncita en la Reto kaj disponeblas loke. Se ĝi havas publikajn ekspluatojn, ili povas esti sekure uzataj: serva kraŝo en kazo de fiasko estas multe malpli kritika ol OS-kraŝo.

ps -aux | grep root # Linux

La plej sukcesa kazo povas esti konsiderata la funkciado de hakita servo en la kunteksto de la radika uzanto. Funkciigi la SMB-servon donas al SYSTEM privilegian aliron ĉe Vindozaj sistemoj (ekz. per ms17-010). Tamen, ĉi tio ne estas ofta en Linuksaj sistemoj, do vi povas pasigi multan tempon pri privilegia eskalado.

Ekspluatado de Linuksaj Kernaj Vundeblecoj

Ĉi tiu estas la lasta vojo por preni. Malsukcesa operacio povas konduki al sistema kraŝo, kaj en la okazo de rekomenco, iuj servoj (inkluzive de tiuj, per kiuj eblis akiri la originalan ŝelon) eble ne altiĝos. Okazas, ke la administranto simple forgesis uzi la komandon enable systemctl. Krome ĝi kaŭzos multe da malkontento pri via laboro, se la ekspluatado ne estas interkonsentita.
Se vi decidas uzi la fontojn de exploitdb, nepre legu la komentojn komence de la skripto. Interalie, ĝi kutime diras kiel kompili ĉi tiun ekspluaton ĝuste. Se vi estis tro maldiligenta aŭ bezonis "hieraŭ" pro templimoj, vi povas serĉi deponejojn kun jam kompilitaj ekspluataĵoj, ekzemple. Tamen oni devas kompreni, ke en ĉi tiu kazo vi ricevos porkon en poke. Aliflanke, se programisto komprenus ĝis la bajto kiel komputilo funkcias kaj la programaron kiun ĝi uzas, li ne skribus linion de kodo en sia tuta vivo.

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

Metasploit

Por kapti kaj trakti konekton, estas ĉiam pli bone uzi la ekspluat/multi/traktilon-modulon. La ĉefa afero estas agordi la ĝustan ŝarĝon, ekzemple generic/shell/reverce_tcp aŭ generic/shell/bind_tcp. La ŝelo akirita en Metasploit povas esti ĝisdatigita al Meterpreter per la modulo post/multi/manage/shell_to_meterpreter. Kun Meterpreter, vi povas aŭtomatigi la postekspluatan procezon. Ekzemple, la modulo post/multi/recon/local_exploit_suggester kontrolas la platformon, arkitekturon kaj ekspluateblajn entojn kaj sugestas Metasploit-modulojn pri privilegia eskalado sur la celsistemo. Danke al Meterpreter, privilegia eskalado foje signifas ruli la ĝustan modulon, sed hakado sen kompreni kio okazas sub la kapuĉo ne estas vera (vi ankoraŭ devas skribi raporton).

Iloj

Iloj por aŭtomatigi lokan kolekton de informoj ŝparos al vi multe da penado kaj tempo, sed per si mem ne kapablas plene identigi la privilegian eskaladan vojon, precipe en la kazo de ekspluatado de kernaj vundeblecoj. Aŭtomatigaj iloj plenumos ĉiujn necesajn komandojn por ke vi kolektu informojn pri la sistemo, sed ankaŭ gravas povi analizi ricevitaj datumoj. Mi esperas, ke mia artikolo estos utila al vi en ĉi tio. Kompreneble, estas multe pli da iloj ol mi listigos ĉi-sube, sed ili ĉiuj faras proksimume la saman aferon - temas pli pri gusto.

Linpeas

Sufiĉe freŝa ilo, la unua kompromiso datiĝas de januaro 2019. Nuntempe mia plej ŝatata instrumento. La fundo estas, ke ĝi elstarigas la plej interesajn privilegiajn eskaladajn vektorojn. Konsentu, estas pli oportune akiri spertan takson ĉe ĉi tiu nivelo ol analizi monolitajn krudajn datumojn.

LinEnum

Mia dua plej ŝatata ilo, ĝi ankaŭ kolektas kaj organizas la datumojn ricevitajn kiel rezulto de loka nombrado.

linux-exploit-suggester (1,2)

Ĉi tiu ekspluato analizos la sistemon por taŭgaj kondiĉoj por ekspluatoj. Fakte, ĝi faros identan laboron al la modulo Metasploit local_exploit_suggester, sed proponos ligilojn al exploit-db fontkodoj prefere ol Metasploit-moduloj.

Linuxprivchecker

Ĉi tiu skripto kolektos kaj organizos laŭ sekcioj grandan kvanton da informoj, kiuj povas esti utilaj por la formado de privilegia eskalado-vektoro.

Alian fojon mi pliprofundigos Linukso-privilegia eskalado per suid/sgid.

fonto: www.habr.com

Aldoni komenton