Olen juuri. Linux-käyttöjärjestelmän käyttöoikeuksien eskaloinnin ymmärtäminen

Vietin vuoden 2020 ensimmäisen neljänneksen valmistautuen OSCP-kokeeseen. Tietojen etsiminen Googlesta ja monet "sokeat" yritykset veivät kaiken vapaa-ajani. Erityisen vaikeaa oli ymmärtää mekanismeja etuoikeuksien lisäämiseksi. PWK-kurssilla kiinnitetään tähän aiheeseen paljon huomiota, mutta opetusmateriaalit eivät koskaan riitä. Internetissä on paljon käyttöoppaita, joissa on hyödyllisiä komentoja, mutta en pidä sokeasti suositusten seuraamisesta ymmärtämättä, mihin se johtaa.

Haluaisin jakaa kanssasi sen, mitä opin kokeen valmistelun ja onnistuneen läpäisyn aikana (mukaan lukien määräajoin Hack The Box -kokeet). Tunsin vahvan kiitollisuuden tunteen jokaisesta tiedosta, joka auttoi minua kulkemaan Try Harder -polkua tietoisemmin. Nyt on minun aikani antaa takaisin yhteisölle.

Haluan antaa sinulle oppaan oikeuksien laajentamisesta OS Linuxissa, joka sisältää analyysin yleisimmistä vektoreista ja niihin liittyvistä ominaisuuksista, joista on sinulle varmasti hyötyä. Usein itse etuoikeuksien lisäämismekanismit ovat melko yksinkertaisia, vaikeuksia syntyy tiedon jäsentelyssä ja analysoinnissa. Siksi päätin aloittaa "kiertoajelulla" ja tarkastella sitten jokaista vektoria erillisessä artikkelissa. Toivottavasti säästän aikaasi aiheen tutkimiseen.

Olen juuri. Linux-käyttöjärjestelmän käyttöoikeuksien eskaloinnin ymmärtäminen

Joten miksi etuoikeuksien eskaloituminen on edes mahdollista vuonna 2020, jos menetelmät ovat olleet tunnettuja hyvin kauan? Itse asiassa, jos käyttäjä käsittelee järjestelmää oikein, sen oikeuksia ei todellakaan voida lisätä. Suurin globaali ongelma, joka luo tällaisia ​​mahdollisuuksia, on epävarma kokoonpano. Haavoittuvuuksia sisältävien vanhentuneiden ohjelmistoversioiden esiintyminen järjestelmässä on myös vaarallisen kokoonpanon erikoistapaus.

Etuoikeuksien eskalointi epävarman määrityksen kautta

Ensin käsitellään epävarmaa kokoonpanoa. Aloitetaan IT-ammattilaiset käyttävät usein käsikirjoja ja resursseja, kuten stackoverflow, joista monet sisältävät vaarallisia komentoja ja määrityksiä. Näyttävä esimerkki - uutisia että stackoverflowsta eniten kopioitu koodi sisälsi virheen. Kokenut järjestelmänvalvoja näkee jamin, mutta tämä on ihanteellinen maailma. Jopa päteviä asiantuntijoita lisääntynyt työmäärä kykenevä tekemään virheitä. Kuvittele, että järjestelmänvalvoja valmistelee ja koordinoi dokumentaatiota seuraavaa tarjouskilpailua varten ja samalla syventyy seuraavalla vuosineljänneksellä käyttöön otettavaan uuteen tekniikkaan ja ratkaisee ajoittain käyttäjätukiongelmia. Ja sitten hänelle annetaan tehtäväksi nopeasti asentaa muutama virtuaalikone ja ottaa niille palveluita. Mikä on mielestäsi todennäköisyys, että järjestelmänvalvoja ei yksinkertaisesti huomaa jamia? Sitten asiantuntijat vaihtuvat, mutta kainalosauvat säilyvät, kun taas yritykset pyrkivät aina minimoimaan kustannukset, myös IT-henkilöstön.

Pseudo-shell ja jailbreak

Hyödyntämisvaiheessa saatu järjestelmäkuori on usein rajoitettu, varsinkin jos se on hankittu hakkeroimalla verkkopalvelimen käyttäjä. Esimerkiksi komentotulkkirajoitukset voivat estää sinua suorittamasta sudo-komentoa, mikä aiheuttaa virheen:

sudo: no tty present and no askpass program specified

Kun sinulla on shell, suosittelen luomaan täysimittaisen terminaalin, esimerkiksi Pythonilla.

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

Saatat kysyä: "Miksi tarvitsen tuhat komentoa, jos voin käyttää yhtä esimerkiksi tiedostojen siirtämiseen?" Tosiasia on, että järjestelmät on määritetty eri tavalla; tietyllä isännällä ei ehkä ole asennettu Pythonia, mutta siinä voi olla Perl. Taito on kyky tehdä tuttuja asioita järjestelmässä ilman tuttuja työkaluja. Täydellinen luettelo ominaisuuksista löytyy täällä.

Heikko etuoikeutettu kuori voidaan saada käyttämällä joukkueet 1 и joukkueet 2 (yllättäen jopa GIMP).

Näytä komentohistoria

Linux kerää historian kaikista tiedostoon suoritetuista komennoista ~ / .bash_history. Jos palvelinta käytetään aktiivisesti ja sen historiaa ei tyhjennetä, on suuri todennäköisyys löytää tunnistetiedot tästä tiedostosta. Historian tyhjentäminen on yksinkertaisesti hankalaa. Jos järjestelmänvalvoja pakotetaan valitsemaan kymmenen tarinan komennot kautta, hänen on tietysti helpompi kutsua tämä komento historiasta kuin syöttää se uudelleen. Lisäksi monet ihmiset eivät tiedä tästä "hakkeroinnista". Jos järjestelmässä on vaihtoehtoisia kuoria, kuten Zsh tai Fish, niillä on oma historiansa. Jos haluat näyttää komentojen historian missä tahansa kuoressa, kirjoita komentohistoria.

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

On jaettu hosting, jossa palvelinta käytetään useiden verkkosivustojen isännöimiseen. Tyypillisesti tällä kokoonpanolla jokaisella resurssilla on oma käyttäjä, jolla on erillinen kotihakemisto ja virtuaalinen isäntä. Joten jos asetukset on määritetty väärin, voit löytää .bash_history-tiedoston verkkoresurssin juurihakemistosta.

Salasanojen etsiminen tiedostojärjestelmästä ja hyökkäykset viereisiin järjestelmiin

Nykyinen käyttäjäsi voivat lukea eri palveluiden määritystiedostoja. Niistä löydät kirjautumistiedot selkeänä tekstinä - salasanat tietokantaan tai siihen liittyviin palveluihin pääsyä varten. Samaa salasanaa voidaan käyttää sekä pääsyyn tietokantaan että pääkäyttäjän valtuuttamiseen (valtuutettu henkilöstö).
Sattuu niin, että löydetyt tunnistetiedot kuuluvat muiden isäntien palveluihin. Infrastruktuurihyökkäyksen kehittäminen vaarantuneen isännän kautta ei ole huonompi kuin muiden isäntien hyväksikäyttö. Viereiset järjestelmät löytyvät myös etsimällä IP-osoitteita tiedostojärjestelmästä.

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

Jos vaarantuneella isännällä on verkkosovellus, johon pääsee Internetistä, on parempi jättää sen lokit pois IP-osoitteiden hausta. Internetin resurssien käyttäjien osoitteet eivät todennäköisesti ole meille hyödyllisiä, mutta sisäisen verkon osoitteet (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) ja minne he menevät, lokien perusteella päätellen , saattaa kiinnostaa.

sudo

Sudo-komento antaa käyttäjälle mahdollisuuden suorittaa komento juurikontekstissa omalla salasanallaan tai ilman salasanaa. Monet toiminnot Linuxissa vaativat pääkäyttäjän oikeuksia, mutta pääkäyttäjänä suorittamista pidetään erittäin huonona käytäntönä. Sen sijaan on parempi käyttää valikoivaa lupaa komentojen suorittamiseen juurikontekstissa. Kuitenkin monia Linux-työkaluja, mukaan lukien vakiotyökalut, kuten vi, voidaan käyttää oikeuksien laajentamiseen laillisilla tavoilla. Sopivan menetelmän löytämiseksi suosittelen etsimistä täällä.

Ensimmäinen asia, joka sinun on tehtävä, kun pääset järjestelmään, on suorittaa sudo -l -komento. Se näyttää luvan käyttää sudo-komentoa. Jos hankitaan käyttäjä ilman salasanaa (kuten apache tai www-data), etuoikeuksien eskalaatiovektori sudon kautta on epätodennäköistä. Sudoa käytettäessä järjestelmä kysyy salasanaa. Et voi myöskään asettaa salasanaa passwd-komennolla, vaan se kysyy käyttäjän nykyistä salasanaa. Mutta jos sudo on edelleen saatavilla, sinun on pohjimmiltaan etsittävä:

  • kaikki tulkit, kuka tahansa voi luoda kuoren (PHP, Python, Perl);
  • kaikki tekstieditorit (vim, vi, nano);
  • kaikki katsojat (vähemmän, enemmän);
  • mikä tahansa kyky työskennellä tiedostojärjestelmän kanssa (cp, mv);
  • Työkalut, joiden tulos on bash, interaktiivinen tai suoritettava komento (awk, find, nmap, tcpdump, man, vi, vim, ansible).

Suid/Sgid

Internetissä on monia oppaita, jotka neuvovat keräämään kaikki suid/sgid-komennot, mutta harvinainen artikkeli antaa tarkkoja tietoja siitä, mitä näille ohjelmille tehdään. Löytyy vaihtoehtoja oikeuksien laajentamiseen, jotka eivät ota huomioon hyväksikäyttöä täällä. Lisäksi useissa suoritettavissa tiedostoissa on erityisiä haavoittuvuuksia käyttöjärjestelmäversiolle, esimerkiksi.

Ihanteellisessa maailmassa ajaisit kaikki asennetut paketit ainakin searchsploitin kautta. Käytännössä tämä tulisi tehdä suosituimmilla ohjelmilla, kuten sudo. Aina on myös mahdollisuus käyttää ja tukea sellaisten automatisoitujen työkalujen kehitystä, jotka korostavat etuoikeuksien eskaloinnin kannalta mielenkiintoisia suoritettavia tiedostoja, joissa suid/sgid-bitit on asetettu. Annan luettelon tällaisista työkaluista artikkelin vastaavassa osassa.

Cronin tai Initin suorittamat kirjoitettavat komentosarjat Rootin yhteydessä

Cron-töitä voidaan ajaa eri käyttäjäkonteksteissa, mukaan lukien root. Jos cron-tehtävä on määritetty linkillä suoritettavaan tiedostoon ja se on käytettävissäsi, se voidaan helposti korvata haitallisella ja oikeuksien eskalointi voidaan suorittaa. Oletusarvoisesti kaikki käyttäjät voivat lukea cron-tehtäviä sisältävät tiedostot.

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

Tilanne on samanlainen initin kanssa. Erona on, että tehtävät cronissa suoritetaan säännöllisesti ja initissä - järjestelmän käynnistyksen yhteydessä. Toiminta vaatii järjestelmän uudelleenkäynnistyksen, ja jotkin palvelut eivät välttämättä käynnisty (jos niitä ei ole rekisteröity käynnistyksen yhteydessä).

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

Voit myös etsiä tiedostoja, joihin kuka tahansa käyttäjä voi kirjoittaa.

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

Menetelmä on melko tunnettu; kokeneet järjestelmänvalvojat käyttävät huolellisesti chmod-komentoa. Kuitenkin Internetissä suurin osa käsikirjoista kuvaa enimmäisoikeuksien asettamisen. Kokemattomien järjestelmänvalvojien "vain tee se toimimaan" -lähestymistapa luo periaatteessa mahdollisuuksia oikeuksien eskaloitumiseen. Jos mahdollista, on parempi etsiä komentohistoriasta chmodin vaarallista käyttöä.

chmod +w /path 
chmod 777 /path

Shellin käyttöoikeuden saaminen muille käyttäjille

Tarkastelemme käyttäjäluetteloa tiedostossa /etc/passwd. Kiinnitämme huomiota niihin, joilla on kuori. Voit murskata nämä käyttäjät - on mahdollista, että tuloksena olevan käyttäjän kautta on lopulta mahdollista lisätä oikeuksia.

Turvallisuuden parantamiseksi suosittelen, että noudatat aina vähiten etuoikeuksien periaatetta. On myös järkevää käyttää aikaa sellaisten vaarallisten kokoonpanojen tarkistamiseen, jotka voivat jäädä vianmäärityksen jälkeen - tämä on järjestelmänvalvojan "tekninen velvollisuus".

Itse kirjoitettu koodi

Käyttäjän kotihakemiston ja web-palvelimen (/var/www/, ellei toisin mainita) suoritettavat tiedostot kannattaa katsoa tarkasti. Nämä tiedostot voivat osoittautua täysin vaaralliseksi ratkaisuksi ja sisältävät uskomattomia kainalosauvoja. Tietysti, jos sinulla on jonkinlainen kehys verkkopalvelimen hakemistossa, ei ole mitään järkeä etsiä siitä nollapäivää osana pentestiä, mutta on suositeltavaa etsiä ja tutkia mukautettuja muutoksia, laajennuksia ja komponentteja.

Turvallisuuden lisäämiseksi on parempi, jos mahdollista, välttää valtuustietojen käyttöä itse kirjoitetuissa skripteissä sekä mahdollisesti vaarallisia toimintoja, kuten /etc/shadow-tiedoston lukemista tai id_rsa:n manipulointia.

Etuoikeuksien korottaminen haavoittuvuuksia hyödyntämällä

Ennen kuin yrität laajentaa etuoikeuksia hyväksikäytön avulla, on tärkeää ymmärtää tiedostojen siirtäminen kohdeisäntään. Tavallisten työkalujen, kuten ssh, ftp, http (wget, curl) lisäksi on olemassa kokonaisuus mahdollisuuksien "eläintarha"..

Paranna järjestelmän turvallisuutta päivittämällä se säännöllisesti uusimpaan versioon vakaa versioita ja yritä myös käyttää Enterpriselle suunniteltuja jakeluja. Muuten se on harvinaista, mutta on tilanteita, joissa apt päivitys tekee järjestelmän toimintakyvyttömäksi.

Pääkäyttäjäkontekstin alla toimivien palveluiden hyödyntäminen

Jotkut Linux-palvelut toimivat pääkäyttäjänä. Ne löytyvät komennolla ps aux | grep-juuri. Tässä tapauksessa palvelua ei saa mainostaa Internetissä ja se on saatavilla paikallisesti. Jos siinä on julkisia hyväksikäyttöjä, niitä voidaan käyttää turvallisesti: palvelun kaatuminen epäonnistumisen yhteydessä on paljon vähemmän kriittinen kuin käyttöjärjestelmän kaatuminen.

ps -aux | grep root # Linux

Menestyneimpänä tapauksena voidaan pitää hakkeroidun palvelun toimintaa juurikäyttäjän yhteydessä. SMB-palvelun käyttö antaa etuoikeutetun JÄRJESTELMÄ-käyttöoikeuden Windows-järjestelmissä (esimerkiksi ms17-010:n kautta). Tämä ei kuitenkaan ole yleistä Linux-järjestelmissä, joten voit viettää paljon aikaa oikeuksien laajentamiseen.

Linux-ytimen haavoittuvuuksien hyödyntäminen

Tämä on polku, joka sinun tulee kulkea viimeisenä. Epäonnistunut toiminta voi johtaa järjestelmän kaatumiseen, ja uudelleenkäynnistyksen yhteydessä jotkin palvelut (mukaan lukien ne, joiden kautta alkuperäinen kuori hankittiin) eivät välttämättä käynnisty. Sattuu niin, että järjestelmänvalvoja yksinkertaisesti unohti käyttää systemctl enable -komentoa. Lisäksi se aiheuttaa paljon tyytymättömyyttä työhösi, jos operaatiosta ei sovittu.
Jos päätät käyttää exploitdb:n lähdekoodeja, muista lukea komentosarjan alussa olevat kommentit. Se kertoo yleensä muun muassa kuinka tietty hyödyntäminen käännetään oikein. Jos olet liian laiska tai jouduit tekemään sen "eilen" määräaikojen vuoksi, voit etsiä arkistoja, joissa on jo käännettyjä hyväksikäyttöjä, esimerkiksi. Sinun tulisi kuitenkin ymmärtää, että tässä tapauksessa saat sian säkissä. Toisaalta, jos ohjelmoija ymmärtäisi tavua myöten kuinka tietokone toimii ja sen käyttämät ohjelmistot, hän ei kirjoittaisi ainuttakaan koodiriviä koko elämänsä aikana.

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

Metasploit

Yhteyden kiinnittämiseksi ja käsittelemiseksi on aina parempi käyttää exploit/multi/handler-moduulia. Tärkeintä on asettaa oikea hyötykuorma, esimerkiksi generic/shell/reverse_tcp tai generic/shell/bind_tcp. Metasploitin tuottama kuori voidaan päivittää Meterpreteriin post/multi/manage/shell_to_meterpreter-moduulin avulla. Meterpreterin avulla voit automatisoida jälkikäyttöprosessin. Esimerkiksi post/multi/recon/local_exploit_suggester-moduuli tarkistaa hyödyntämiseen tarvittavan alustan, arkkitehtuurin ja entiteetit ja ehdottaa Metasploit-moduuleja kohdejärjestelmän oikeuksien eskaloimiseksi. Meterpreterin ansiosta oikeuksien lisääntyminen johtaa joskus vaaditun moduulin käynnistämiseen, mutta hakkerointi ymmärtämättä, mitä konepellin alla tapahtuu, ei ole "totta" (sinun on silti kirjoitettava raportti).

Työkalut

Paikallisen tiedonkeruun automatisointityökalut säästävät paljon vaivaa ja aikaa, mutta ne eivät yksinään pysty täysin tunnistamaan polkua oikeuksien eskaloitumiseen, etenkään ytimen haavoittuvuuksien hyväksikäytön tapauksessa. Automaatiotyökalut suorittavat kaikki tarvittavat komennot, jotta voit kerätä tietoja järjestelmästä, mutta on myös tärkeää pystyä analysoida vastaanotettu data. Toivon, että artikkelini on hyödyllinen sinulle tässä suhteessa. Tietenkin työkaluja on paljon enemmän kuin luettelen alla, mutta ne kaikki tekevät suunnilleen saman asian - tämä on pikemminkin makuasia.

Linherneet

Melko tuore Tula, ensimmäinen sitoumus on tammikuussa 2019. Suosikkityökaluni tällä hetkellä. Pointti on, että se korostaa etuoikeuksien lisääntymisen mielenkiintoisimmat vektorit. Samaa mieltä, on kätevämpää saada asiantuntija-arvio tällä tasolla kuin jäsentää monoliittisia raakatietoja.

LinEnum

Toinen suosikkityökaluni, se myös kerää ja järjestää paikallisen luetteloinnin tuloksena saatuja tietoja.

Linux-exploit-suggester (1,2)

Tämä hyödyntäminen analysoi järjestelmän sopivien hyödyntämisolosuhteiden varalta. Itse asiassa se tekee työn identtisesti Metasploit-moduulin local_exploit_suggester kanssa, mutta tarjoaa linkkejä exploit-db-lähdekoodeihin Metasploit-moduulien sijaan.

Linuxprivchecker

Tämä skripti kerää ja järjestää osiin suuren määrän tietoa, josta voi olla hyötyä oikeuksien lisäämisen vektorin muodostamisessa.

Toisella kerralla menen yksityiskohtiin käyttöoikeuksien korotus Linux-käyttöjärjestelmässä suid/sgid:n kautta.

Lähde: will.com

Lisää kommentti