gyökér vagyok. A Linux OS privilégiumok eszkalációjának megértése

2020 első negyedévét az OSCP vizsgára való felkészüléssel töltöttem. A Google-on való információkeresés és a sok "vak" próbálkozás minden szabadidőmet elfoglalta. Különösen nehéznek bizonyult megérteni a privilégiumok fokozásának mechanizmusait. A PWK tanfolyam nagy figyelmet fordít erre a témára, de a módszertani anyagok mindig nem elegendőek. Az interneten sok kézikönyv található hasznos parancsokkal, de nem vagyok híve annak, hogy vakon kövessem az ajánlásokat anélkül, hogy megértenék, hová vezet ez.

Szeretném megosztani veletek, hogy mit sikerült megtanulnom a felkészülés és a sikeres vizsga letétele során (beleértve a Hack The Box rendszeres razziáját is). Mélységes hálát éreztem minden olyan információért, amely hozzásegített ahhoz, hogy tudatosabban járjam a „Try Harder” utat, most itt az ideje, hogy visszaadjam a közösségnek.

Útmutatót szeretnék adni az OS Linux privilégiumok kiterjesztéséhez, amely tartalmazza a leggyakoribb vektorok és kapcsolódó szolgáltatások elemzését, amelyekre feltétlenül szüksége lesz. Gyakran maguk a privilégium-eszkalációs mechanizmusok meglehetősen egyszerűek, nehézségek merülnek fel az információk strukturálása és elemzése során. Ezért úgy döntöttem, hogy egy "városnéző körúttal" kezdek, majd minden egyes vektort külön cikkben veszek figyelembe. Remélem időt takarítok meg a téma tanulmányozásával.

gyökér vagyok. A Linux OS privilégiumok eszkalációjának megértése

Tehát miért lehetséges még 2020-ban a kiváltságok eszkalációja, ha a módszerek már nagyon régóta ismertek? Valójában, ha a felhasználó helyesen kezeli a rendszert, akkor valóban nem lehet benne jogosultságokat növelni. Az ilyen lehetőségeket előidéző ​​fő globális probléma az nem biztonságos konfiguráció. A sebezhetőséget tartalmazó elavult szoftververziók jelenléte a rendszerben szintén a nem biztonságos konfiguráció speciális esete.

A jogosultságok kiterjesztése a nem biztonságos konfiguráció miatt

Először is foglalkozzunk a nem biztonságos konfigurációval. Kezdjük azzal Az informatikai szakemberek gyakran használnak kézikönyveket és erőforrásokat, például a stackoverflow-t, amelyek közül sok nem biztonságos parancsokat és konfigurációkat tartalmaz. Feltűnő példa az a hírek hogy a stackoverflow-ból legtöbbször másolt kód hibát tartalmazott. Egy tapasztalt admin látni fogja a jambot, de ez egy ideális világban van. Még hozzáértő szakemberek is megnövekedett munkaterhelés képes hibázni. Képzeljük el, hogy az adminisztrátor a következő pályázat dokumentációját készíti el és hagyja jóvá, egyúttal elmélyül a következő negyedévben bevezetendő új technológiában, miközben időszakosan megoldja a felhasználói támogatási feladatokat. Aztán azt a feladatot kapja, hogy gyorsan felállítson néhány virtuális gépet, és szolgáltatásokat nyújtson rajtuk. Mit gondolsz, mennyi a valószínűsége annak, hogy az admin egyszerűen nem veszi észre a jambot? Aztán változnak a szakemberek, de a mankók maradnak, miközben a cégek mindig a költségek minimalizálására törekednek, beleértve az informatikusokat is.

Pseudo shell és jailbreak

A gyártási fázisban megszerzett rendszerhéj gyakran korlátozott, különösen akkor, ha egy webszerver-felhasználó feltörésével szerezte meg. Például a shell-korlátozások megakadályozhatják a sudo parancs hibával történő használatát:

sudo: no tty present and no askpass program specified

A shell beszerzése után azt javaslom, hogy hozzon létre egy teljes értékű terminált, például Pythonnal.

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

Azt kérdezed: "Miért van szükségem ezer parancsra, ha egyet használhatok például fájlok átvitelére?" A helyzet az, hogy a rendszerek másképpen vannak konfigurálva, a következő gazdagépen előfordulhat, hogy a Python nincs telepítve, de a Perl elérhető. A készség abban rejlik, hogy a rendszerben ismerős dolgokat tudjon elvégezni ismert eszközök nélkül. A funkciók teljes listája megtalálható itt.

Alacsony jogosultságú shell a használatával szerezhető be csapatok 1 и csapatok 2 (meglepő módon még a GIMP is).

Parancselőzmények megtekintése

A Linux összegyűjti az összes végrehajtott parancs előzményét egy fájlban ~ / .bash_history. Ha a kiszolgáló aktív használatban van, és az előzmények nem törlődnek, jó eséllyel a hitelesítő adatok megtalálhatók ebben a fájlban. Az előzmények törlése banálisan kényelmetlen. Ha az adminisztrátor kénytelen tízszintű parancsokat kiválasztani a -n keresztül, akkor természetesen kényelmesebb lesz ezt a parancsot az előzményekből meghívni, mint újra megadni. Ráadásul sokan nem tudnak erről a "hackről". Ha vannak alternatív shell-ek, mint a Zsh vagy Fish a rendszerben, azoknak megvan a saját történetük. A parancsok előzményeinek megjelenítéséhez bármely parancsértelmezőben csak írja be a parancsok előzményeit.

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

Létezik megosztott tárhely, amelyben a szervert több webhely fogadására használják. Ezzel a konfigurációval általában minden erőforrásnak saját felhasználója van, külön kezdőkönyvtárral és virtuális gazdagéppel. Tehát, ha helytelenül van beállítva, a .bash_history fájl a webes erőforrás gyökérkönyvtárában található.

Jelszavak keresése a fájlrendszerben és támadások a szomszédos rendszerek ellen

A különféle szolgáltatások konfigurációs fájljait az aktuális felhasználó olvashatja. Ezekben szöveges hitelesítési adatokat találhat - jelszavakat az adatbázis vagy a kapcsolódó szolgáltatások eléréséhez. Ugyanaz a jelszó használható mind az adatbázis eléréséhez, mind a root felhasználó felhatalmazásához (hitelesítési adatok).
Előfordul, hogy a talált hitelesítő adatok más gazdagépeken lévő szolgáltatásokhoz tartoznak. Az infrastruktúra ellen egy kompromittált gazdagépen keresztül történő támadás nem rosszabb, mint más gazdagépek kihasználása. A szomszédos rendszereket úgy is megtalálhatja, hogy megkeresi az IP-címeket a fájlrendszerben.

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

Ha a feltört gazdagépnek van egy internetről elérhető webalkalmazása, jobb, ha kizárja annak naplóit az IP-címek kereséséből. Az internetről származó erőforrás-felhasználók címei valószínűleg nem lesznek hasznosak számunkra, de a belső hálózat címei (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) és hova mennek, a naplók, érdekesek lehetnek.

sudo

A sudo parancs lehetővé teszi a felhasználó számára, hogy parancsot hajtson végre a root kontextusában saját jelszavával vagy anélkül, hogy azt egyáltalán használná. Linuxban sok művelet root jogosultságot igényel, de a root-ként való futtatás nagyon rossz gyakorlatnak számít. Ehelyett jobb szelektív engedélyt alkalmazni a parancsok gyökérkörnyezetben történő végrehajtására. Azonban számos Linux-eszköz, beleértve a szabványosakat is, mint például a vi, felhasználható a jogosultságok törvényes módon történő kiterjesztésére. A helyes út megtalálásához azt javaslom, hogy nézze meg itt.

A rendszerhez való hozzáférés után az első teendő a sudo -l parancs futtatása. Megjeleníti a sudo parancs használatára vonatkozó engedélyt. Ha jelszó nélküli felhasználót kapunk (például apache vagy www-data), nem valószínű, hogy a sudo privilégium eszkalációs vektora jelenne meg. A sudo használatakor a rendszer jelszót kér. A passwd paranccsal jelszó beállítása szintén nem működik, az aktuális felhasználói jelszót fogja kérni. De ha a sudo továbbra is elérhető, akkor valójában meg kell keresnie:

  • bármilyen interpreter, bárki létrehozhat shell-t (PHP, Python, Perl);
  • bármilyen szövegszerkesztő (vim, vi, nano);
  • bármely néző (kevesebb, több);
  • bármilyen lehetőség a fájlrendszerrel való munkavégzésre (cp, mv);
  • olyan eszközök, amelyek kimenettel rendelkeznek a bash-ban, akár interaktívan, akár végrehajtható parancsként (awk, find, nmap, tcpdump, man, vi, vim, ansible).

Suid/Sgid

Az interneten számos kézikönyv található, amelyek tanácsot adnak az összes suid / sgid parancs létrehozásáról, de egy ritka cikk konkrét információkat tartalmaz arról, hogy mit kell tenni ezekkel a programokkal. Olyan privilégium-kiterjesztési lehetőségek találhatók, amelyek nem veszik figyelembe az exploitok használatát itt. Ezenkívül számos futtatható fájl rendelkezik speciális biztonsági réssel az operációs rendszer verziójához, például.

Egy ideális világban minden telepített csomagot legalább a searchsploiton keresztül kell futtatnia. A gyakorlatban ezt a legnépszerűbb programokkal, például a sudo-val kell megtenni. Mindig lehetőség van olyan automatizált eszközök használatára és fejlesztésére, amelyek kiemelik a privilégium-kiterjesztés szempontjából érdekes futtatható fájlokat suid/sgid bitekkel. Az ilyen eszközök listáját a cikk megfelelő részében adok.

Írható szkriptek, amelyeket a Cron vagy az Init futtat root környezetben

A Cron-jobok különböző felhasználóknál futhatnak, beleértve a root felhasználót is. Ha van olyan feladat a cronban, amely egy végrehajtható fájlra mutató hivatkozást tartalmaz, és az írható, akkor könnyen lecserélheti egy rosszindulatúra, és végrehajthatja a jogosultság eszkalációját. Ugyanakkor alapértelmezés szerint a cron feladatokat tartalmazó fájlok bármely felhasználó számára elérhetők.

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

Hasonló a helyzet az init esetében is. A különbség az, hogy a cron-beli feladatok periodikusan, az init-ben pedig a rendszer indításakor kerülnek végrehajtásra. A működéshez újra kell indítania a rendszert, miközben előfordulhat, hogy egyes szolgáltatások nem emelkednek (ha nem voltak regisztrálva az automatikus betöltésben).

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

Bármely felhasználó által írható fájlok között is kereshet.

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

A módszer meglehetősen jól ismert, a tapasztalt rendszergazdák óvatosan használják a chmod parancsot. Az interneten azonban a kézikönyvek túlnyomó többsége a maximális jogok beállítását írja le. A tapasztalatlan rendszergazdák „csak működjön” megközelítése elvileg lehetőséget teremt a jogosultságok kiszélesítésére. Ha lehetséges, a legjobb, ha a parancselőzményekben keresi a chmod nem biztonságos használatát.

chmod +w /path 
chmod 777 /path

Shell-hozzáférés megszerzése más felhasználók számára

Megnézzük a felhasználók listáját az /etc/passwd fájlban. Azokra figyelünk, akiknek héja van. Megronthatja ezeket a felhasználókat - lehetséges, hogy a kapott felhasználó révén végül növelheti a jogosultságokat.

A biztonság javítása érdekében azt javaslom, hogy mindig tartsa be a legkisebb kiváltság elvét. Érdemes időt szánni a nem biztonságos konfigurációk ellenőrzésére is, amelyek a hibaelhárítás után is megmaradhatnak – ez a rendszergazda „technikai kötelessége”.

Saját írású kód

Érdemes alaposan szemügyre venni a felhasználó és a webszerver saját könyvtárában (/var/www/, hacsak nincs másképp megadva) a végrehajtható fájlokat. Ezek a fájlok teljesen bizonytalan megoldásnak bizonyulhatnak, és hihetetlen mankókat tartalmaznak. Természetesen, ha van valamilyen keretrendszer a webszerver címtárában, akkor nincs értelme pentest részeként keresgélni benne a nulladik napot, de ajánlatos egyedi módosításokat, bővítményeket, komponenseket keresni és tanulmányozni.

A biztonság növelése érdekében, ha lehetséges, kerülje a hitelesítő adatok használatát a saját maga által írt szkriptekben, valamint a potenciálisan veszélyes funkciókat, például az /etc/shadow olvasását vagy az id_rsa manipulálását.

Jogok növelése a sebezhetőségek kihasználásával

Mielőtt megpróbálná a privilégiumokat kizsákmányolással növelni, fontos megérteni a fájlok átvitele a célállomásra. A szokásos eszközökön kívül, mint az ssh, ftp, http (wget, curl), van egy egész lehetőségek „állatkertje”..

Rendszere biztonságának javítása érdekében rendszeresen frissítse a legújabbra stabil verziókat, és próbáljon meg Enterprise-ra tervezett disztribúciókat is használni. Egyébként ritkán, de vannak olyan helyzetek, amikor az apt frissítés használhatatlanná teszi a rendszert.

A root felhasználó kontextusában futó szolgáltatások kihasználása

Egyes Linux-szolgáltatások privilegizált felhasználói rootként futnak. Megtalálhatók a ps aux | segítségével grep gyökér. Ebben az esetben előfordulhat, hogy a szolgáltatást nem jelentik be az interneten, és helyben elérhető. Ha nyilvános exploitokkal rendelkezik, biztonságosan használhatók: a szolgáltatás-összeomlás meghibásodás esetén sokkal kevésbé kritikus, mint az operációs rendszer összeomlása.

ps -aux | grep root # Linux

A legsikeresebb esetnek egy feltört szolgáltatás működtetése tekinthető a root felhasználó környezetében. Az SMB szolgáltatás működtetése a SYSTEM számára kiváltságos hozzáférést biztosít Windows rendszereken (pl. ms17-010-en keresztül). Ez azonban nem általános a Linux rendszereken, így sok időt tölthet a jogosultságok eszkalációjával.

A Linux kernel sebezhetőségeinek kihasználása

Ez az utolsó út. A sikertelen működés a rendszer összeomlásához vezethet, és újraindítás esetén egyes szolgáltatások (beleértve azokat is, amelyeken keresztül sikerült megszerezni az eredeti shellt) nem emelkedhetnek fel. Előfordul, hogy a rendszergazda egyszerűen elfelejtette használni a systemctl enable parancsot. Ráadásul sok elégedetlenséget okoz a munkájával kapcsolatban, ha a hasznosításról nem állapodtak meg.
Ha úgy dönt, hogy az exploitdb forrásait használja, feltétlenül olvassa el a szkript elején található megjegyzéseket. Többek között általában megmondja, hogyan kell helyesen fordítani ezt az exploitot. Ha túl lusta volt, vagy a határidők miatt „tegnap” volt szüksége, kereshet olyan adattárakat, amelyek már lefordított exploitokat tartalmaznak, például. Azonban meg kell érteni, hogy ebben az esetben egy disznót kapsz egy piszkában. Másrészt, ha egy programozó bájtig értené a számítógép működését és az általa használt szoftvereket, akkor egész életében nem írt volna egy kódsort sem.

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

metasploit

Egy kapcsolat felfogásához és kezeléséhez mindig jobb az exploit/multi/handler modul használata. A legfontosabb dolog a megfelelő hasznos terhelés beállítása, például generic/shell/reverce_tcp vagy generic/shell/bind_tcp. A Metasploitban kapott shell frissíthető Meterpreterre a post/multi/manage/shell_to_meterpreter modul segítségével. A Meterpreter segítségével automatizálhatja a kiaknázást követő folyamatokat. Például a post/multi/recon/local_exploit_suggester modul ellenőrzi a platformot, az architektúrát és a kihasználható entitásokat, és Metasploit modulokat javasol a jogosultságok eszkalációjához a célrendszeren. A Meterpreternek köszönhetően a jogosultságok kiszélesítése néha a megfelelő modul futtatásához vezet, de a hackelés anélkül, hogy megértené, mi történik a motorháztető alatt, nem igaz (még mindig jelentést kell írni).

Eszközök

A helyi információgyűjtés automatizálására szolgáló eszközök sok erőfeszítést és időt takarítanak meg, de önmagukban nem képesek teljesen azonosítani a jogosultság eszkalációs útvonalát, különösen a kernel sebezhetőségeinek kihasználása esetén. Az automatizálási eszközök végrehajtják az összes szükséges parancsot ahhoz, hogy információkat gyűjtsön a rendszerről, de az is fontos, hogy elemezni kapott adatokat. Remélem, hogy cikkem hasznos lesz számodra ebben. Természetesen sokkal több eszköz létezik, mint amennyit alább felsorolok, de mindegyik nagyjából ugyanazt csinálja – ez inkább ízlés dolga.

Linborsó

Egy meglehetősen friss eszköz, az első véglegesítés dátuma 2019 január. Jelenleg a kedvenc hangszerem. A lényeg az, hogy kiemeli a legérdekesebb privilégium-eszkalációs vektorokat. Egyetértek, kényelmesebb szakértői értékelést kérni ezen a szinten, mint a monolitikus nyers adatok elemzését.

LinEnum

A második kedvenc eszközöm, a helyi számlálás eredményeként kapott adatokat is összegyűjti és rendszerezi.

linux-exploit-suggester (1,2)

Ez az exploit elemzi a rendszert, hogy megtalálja a megfelelő feltételeket a kizsákmányolásokhoz. Valójában a Metasploit local_exploit_suggester moduljával megegyező munkát fog végezni, de a Metasploit modulok helyett az exploit-db forráskódokhoz kínál hivatkozásokat.

Linuxprivchecker

Ez a szkript összegyűjti és szakaszokba rendezi a nagy mennyiségű információt, amely hasznos lehet a jogosultság-eszkalációs vektor kialakításához.

Máskor részletezem Linux-jogok eszkalációja suid/sgid segítségével.

Forrás: will.com

Hozzászólás