Jsem root. Zkoumáme zvýšení oprávnění v Linux OS.

První čtvrtletí roku 2020 jsem strávil přípravou na zkoušku OSCP. Hledání informací na Googlu a množství "slepených" pokusů mi bralo veškerý volný čas. Zejména bylo obtížné se orientovat v mechanismu zvyšování oprávnění. Kurz PWK se této problematice věnuje, ale metodických materiálů je vždy nedostatek. Na internetu existuje spousta manuálů s užitečnými příkazy, ale nejsem zastáncem slepého následování doporučení bez pochopení, kam to povede.

Chci se s vámi podělit o to, co jsem se dozvěděl během přípravy a úspěšného skládání zkoušky (včetně občasných nájezdů na Hack The Box). Prožíval jsem silný pocit vděčnosti za každou drobnost informací, které mi pomohly projít cestou Try Harder uvědoměleji, nyní je čas vyjádřit úctu komunitě.

Chci vám poskytnout manuál pro zvyšování oprávnění v OS Linux, který obsahuje analýzu nejběžnějších vektorů a souvisejících triků, které se vám určitě budou hodit. Mechanismy zvyšování oprávnění jsou často dost jednoduché, potíže vznikají při strukturování a analýze informací. Proto jsem se rozhodl začít "přehlednou exkurzí" a dále se věnovat každému vektoru v samostatném článku. Doufám, že vám ušetřím čas při studiu této problematiky.

Jsem root. Zkoumáme zvýšení oprávnění v Linux OS.

Takže proč je zvyšování oprávnění vůbec možné v roce 2020, když jsou metody dobře známy už dlouho? Ve skutečnosti, pokud uživatel správně manipuluje se systémem, zvýšit v něm oprávnění se skutečně nepodaří. Hlavní globální problém, který vytváří takové možnosti, spočívá v nebezpečné konfiguraci. Přítomnost zastaralých verzí softwaru v systému, které obsahují zranitelnosti, je také konkrétním případem nebezpečné konfigurace.

Zvyšování oprávnění skrze nebezpečnou konfiguraci

Nejprve si objasněme, co je to nebezpečná konfigurace. Začněme tím, že IT specialisté často používají manuály a zdroje jako stackoverflow, z nichž mnohé obsahují nebezpečné příkazy a konfigurace. Výrazným příkladem je novinku to, že nejvíce kopírovaný kód ze stackoverflow obsahoval chybu. Zkušený administrátor by chybu viděl, ale to je ve ideálním světě. I kvalifikovaní specialisté při zvýšené pracovní zátěži mohou dělat chyby. Představte si, že administrátor se zabývá přípravou a schvalováním dokumentace na další tendr, zároveň se ponoří do nové technologie, kterou má implementovat v příštím čtvrtletí, a přitom občas řeší úkoly na podporu uživatelů. A pak mu rychle přidělí úkol rychle spustit několik virtuálních strojů a rozběhnout na nich služby. Jak si myslíte, jaká je pravděpodobnost, že si administrátor prostě nevšimne chyby? Poté se specialisté mění, ale lehké záplaty zůstávají, přičemž společnosti se vždy snaží minimalizovat náklady, také na IT odborníky.

Pseudo Shell a jailbreak

Systémový shell, který byl získán ve fázi provozu, bývá často omezený, zejména pokud jste ho získali pomocí hacku uživatele webového serveru. Například omezení shellu mohou bránit použití příkazu sudo a způsobit chybu:

sudo: no tty present and no askpass program specified

Po získání shellu doporučuji vytvořit plnohodnotný terminál, například pomocí Pythonu.

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

Zeptáte se: „Proč potřebuju tisíc příkazů, když mohu použít jeden, například pro přenos souborů?“ Faktem je, že systémy mohou být nakonfigurovány různě, na dalším hostu může být Python nenainstalovaný, ale může mít Perl. Umění spočívá v tom, mít schopnost vykonávat v systému běžné úkony bez obvyklých nástrojů. Kompletní seznam možností lze nalézt tady.

Nízko privilegovaný shell lze získat použitím příkazy 1 a příkazy 2 (je překvapivé, že i GIMP).

Prohlížení historie příkazů

Linux shromažďuje historii všech provedených příkazů v souboru ~/ .bash_history. Pokud je server aktivně používán a jeho historie není vymazána, existuje vysoká pravděpodobnost, že v tomto souboru naleznete přihlašovací údaje. Vymazání historie je prostě nepohodlné. Pokud administrátor musí projít desetiúrovňové příkazy prostřednictvím, samozřejmě, bude pro něj pohodlnější vyvolat tento příkaz z historie, než jej zadávat znovu. Navíc mnozí o tomto „hacku“ nevědí. Pokud v systému existují alternativní shelly jako Zsh nebo Fish, vedou si svou historii. K tomu, abyste vypsali historii příkazů v jakémkoliv shellu, stačí zadat příkaz history.

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

Existuje sdílený hosting, při kterém je server používán pro hostování několika webových stránek. Obvykle je při této konfiguraci pro každý zdroj vytvořen vlastní uživatel s odděleným domovským adresářem a virtuálním hostem. Při nesprávném nastavení se v kořenovém adresáři webového zdroje může objevit soubor .bash_history.

Vyhledávání hesel v souborovém systému a útoky na sousední systémy

Konfigurační soubory různých služeb mohou být pro váš aktuální účet dostupné ke čtení. Můžete v nich narazit na přihlašovací údaje v otevřeném formátu — hesla pro přístup do databáze nebo sousední služby. Tentýž přístupový kód může být použit jak pro přístup do databáze, tak pro autorizaci uživatele root (credential staffing).
Někdy se stane, že nalezené přihlašovací údaje patří službám na jiných hostech. Rozvoj útoku na infrastrukturu prostřednictvím kompromitovaného hosta není horší než využití jiných hostů. Sousední systémy je také možné nalézt pomocí vyhledávání IP adres v souborovém systému.

grep -lRi "password" /home /var/www /var/log 2>/dev/null | sort | uniq #Najít řetězec password (ne cs) v těchto adresářích
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 adresy v logách

Pokud na kompromitovaném hostu existuje webová aplikace dostupná z internetu, je lepší vyloučit její logy z vyhledávání IP adres. IP adresy uživatelů resursu z internetu nám pravděpodobně nebudou užitečné, ale adresy interní sítě (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) a to, kam se podle logů dostávají, mohou mít zájem.

Sudo

Příkaz sudo umožňuje uživateli provést příkaz v kontextu roota pomocí vlastního hesla nebo zcela bez jeho použití. Mnoho operací v Linuxu vyžaduje privilegium roota, přičemž práce jako root se považuje za velmi špatnou praxi. Raději je lepší aplikovat selektivní oprávnění pro provádění příkazů v kontextu roota. Mnohé nástroje Linuxu, včetně standardních jako vi, však mohou být použity k zvýšení privilegovanosti zcela legitimními způsoby. Pro nalezení vhodného způsobu doporučuji podívat se zde.

První věc, kterou je třeba udělat po získání přístupu do systému, je provést příkaz sudo -l. Ten zobrazí oprávnění pro použití příkazu sudo. Pokud byl uživatel bez hesla (například apache nebo www-data), vektor pro zvýšení oprávnění přes sudo je nepravděpodobný. Při použití sudo systém vyžádá heslo. Příkaz passwd pro nastavení hesla také nebude fungovat, protože požaduje aktuální heslo uživatele. Ale pokud je sudo k dispozici, je nutné hledat:

  • jakékoliv interpretery, každý může spustit shell (PHP, Python, Perl);
  • jakékoliv textové editory (vim, vi, nano);
  • jakékoliv prohlížeče (less, more);
  • jakékoliv možnosti práce se souborovým systémem (cp, mv);
  • nástroje, které mají přístup k bash, interaktivní nebo jako spustitelný příkaz (awk, find, nmap, tcpdump, man, vi, vim, ansible).

Suid/Sgid

Na internetu je spousta manuálů, které doporučují shromáždit všechny suid/sgid příkazy, nicméně málo článků poskytuje konkrétní informace o tom, co s těmito programy dělat. Možnosti zvýšení oprávnění, které nezohledňují využití exploitů, lze najít tady. Několik spustitelných souborů navíc má specifické zranitelnosti pro verzi OS, například.

V ideálním světě byste měli projít všechny nainstalované balíčky alespoň přes searchsploit. V praxi byste měli provést podobné vyhledávání u nejpopulárnějších programů jako sudo. Vždy existuje možnost používat a udržovat vývoj automatizovaných nástrojů, které zvýrazní zajímavé spustitelné soubory z hlediska zvýšení oprávnění se zadanými bity suid/sgid. Seznam těchto nástrojů uvedu v příslušné části článku.

Skripty dostupné pro zápis, spouštěné Cron nebo Init, v kontextu Root

Úkoly cron mohou být prováděny v kontextu různých uživatelů, včetně root. Pokud je v cron nastavena úloha odkazující na spustitelný soubor a ten je pro vás dostupný pro zápis, lze jej snadno nahradit škodlivým a provést zvýšení oprávnění. Přitom mají soubory s úlohami cron podle výchozího nastavení přístup pro čtení kterémukoliv uživateli.

ls -la /etc/cron.d  # zobrazit úlohy cron 

Podobně jsou na tom i init. Rozdíl je v tom, že úkoly v cron se provádějí pravidelně, zatímco v init — při startu systému. Pro exploataci bude třeba restart systému, přičemž některé služby nemusí být spuštěny (pokud nebyly zapsány do automatického spuštění).

ls -la /etc/init.d/  # zobrazí inicializační skripty 

Můžete také vyhledat soubory, které jsou zapisovatelné pro jakéhokoli uživatele.

find / -perm -2 -type f 2>/dev/null # najdi soubory zapisovatelné pro všechny

Tato metoda je docela známá, zkušení systémoví administrátoři pečlivě používají příkaz chmod. Nicméně většina manuálů na internetu popisuje nastavení maximálních práv. Přístup nezkušených systémových administrátorů "hlavně ať to funguje" vytváří příležitosti pro zvýšení privilegií. Pokud je to možné, je lepší prozkoumat historické příkazy pro bezpečné použití chmod.

chmod +w /path 
chmod 777 /path

Získání přístupu do shellu jiných uživatelů

Podívejte se na seznam uživatelů v /etc/passwd. Věnujte pozornost těm, kdo mají shell. Můžete tyto uživatele bruteforce - je možné, že prostřednictvím nich se vám nakonec podaří zvýšit privilegium.

Pro zvýšení bezpečnosti doporučuji vždy dodržovat princip minimálních privilegií. Také má smysl věnovat čas kontrole nezabezpečených konfigurací, které mohly zůstat po odstraňování problémů — to je "technický dluh" systémového administrátora.

Vlastní kód

Je třeba pečlivě prozkoumat spustitelné soubory v domovské složce uživatele a webového serveru (/var/www/, pokud není zadána jiná). Tyto soubory mohou být úplně nezabezpečeným řešením a obsahovat neuvěřitelné zkraty. Samozřejmě, pokud máte nějaký rámec v adresáři webového serveru, nemá smysl ho hledat v rámci pentestu, nicméně doporučuje se najít a prozkoumat vlastní úpravy, pluginy a komponenty.

Pro zvýšení bezpečnosti je lepší co nejvíce se vyhnout používání přihlašovacích údajů ve vlastních skriptech, jakož i potenciálně nebezpečné funkčnosti, například čtení /etc/shadow nebo manipulace s id_rsa.

Zvyšování privilegií prostřednictvím exploitace zranitelností

Než se pokusíte zvýšit privilegium prostřednictvím exploitace, je důležité pochopit přenášení souborů na cílový hostitel. Kromě běžných prostředků jako ssh, ftp, http (wget, curl) existuje celá řada "zoologického parku" možností.

Pro zvýšení bezpečnosti systému pravidelně aktualizujte na aktuální stabilní verze versí, a snažte se používat distribuce určené pro Enterprise. Jinak se občas stává, že apt upgrade způsobí nefunkčnost systému.

Exploatace služeb spuštěných v kontextu uživatele root

Některé služby Linuxu běží pod privilegovaným uživatelským účtem root. Lze je nalézt pomocí příkazu ps aux | grep root. Služba přitom nemusí být inzerována na síti a může být dostupná pouze lokálně. Pokud má veřejné exploitace, lze je snadno aplikovat: pád služby při neúspěchu je daleko méně kritický než pád OS.

ps -aux | grep root # Linux

Nejlepším případem by bylo provozování kompromitované služby v kontextu uživatele root. Exploitace služby SMB poskytuje privilegovaný přístup SYSTEM v systémech Windows (například prostřednictvím ms17-010). Avšak v systémech Linux se to vyskytuje zřídka, a proto můžete strávit spoustu času zvyšováním privilegií.

Exploatace zranitelností jádra Linuxu

To je cesta, kterou byste měli jít na posledním místě. Neúspěšná exploatace může vést k pádu systému, a po restartu některé služby (včetně těch, přes které jste získali původní shell) se nemusí spustit. Někdy si správcové jednoduše zapomenou použít příkaz systemctl enable. Navíc to způsobí spoustu nespokojenosti s vaší prací, pokud exploatace nebyla schválena.
Pokud se rozhodnete použít zdrojové kódy z exploitdb, nezapomeňte si přečíst komentáře na začátku skriptu. Mimo jiné tam obvykle píše, jak správně kompilovat daný exploit. Pokud se vám nechce, nebo jste byli tlačeni termíny, můžete hledat repozitáře s již zkompilovanými exploity, například. Je však třeba mít na paměti, že v takovém případě dostanete kočku v pytli. Na druhou stranu, kdyby programátor rozuměl na úrovni bajtu, jak je počítač a ním používaný software postaven, ne napsal by za celý život ani řádku kódu.

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

Metasploit

Aby zachwycić a zpracować připojení, je vždy lepší použít modul exploit/multi/handler. Hlavní je nastavit správný payload, například generic/shell/reverse_tcp nebo generic/shell/bind_tcp. Shell získaný v Metasploit lze vylepšit na Meterpreter pomocí modulu post/multi/manage/shell_to_meterpreter. S Meterpreterem můžete automatizovat proces post-exploatace. Například modul post/multi/recon/local_exploit_suggester zkontroluje platformu, architekturu a potřebné entity pro exploataci a navrhne moduly Metasploit pro eskalaci oprávnění na cílovém systému. Díky Meterpreteru se eskalace oprávnění občas omezí na spuštění potřebného modulu, ale hackování bez porozumění tomu, co se děje pod kapotou, není „opravdové“ (musíte také napsat zprávu).

Nástroje

Nástroje pro automatizaci místního shromažďování informací vám ušetří spoustu námahy a času, ale samy o sobě nejsou schopny plně odhalit cestu k eskalaci oprávnění, zejména v případě exploatace zranitelnosti jádra. Nástroje automatizace provedou všechny nutné příkazy pro shromáždění informací o systému, ale je také důležité umět analyzovat získaná data. Doufám, že vám můj článek bude v tomto užitečný. Samozřejmě existuje mnohem více nástrojů, než zde uvedu, ale všechny dělají v podstatě to samé — spíše záleží na vkusu.

Linpeas

Relativně nový nástroj, první commit je datován na leden 2019. V současnosti je to můj oblíbený nástroj. Spočívá v tom, že zvýrazňuje nejzajímavější vektory eskalace oprávnění. Přiznejte, je pohodlnější získat odborné posouzení na této úrovni, než analyzovat monolitní syrová data.

LinEnum

Můj druhý oblíbený nástroj, který také shromažďuje a systematizuje data získaná z lokálního enumerování.

Linux-exploit-suggester (1,2)

Tento exploiter analyzuje systém na přítomnost vhodných podmínek pro exploity. V podstatě udělá práci, která je identická s modulem Metasploit local_exploit_suggester, ale nabídne ne moduly Metasploit, ale odkazy na zdrojové kódy exploit-db.

Linuxprivchecker

Tento skript shromáždí a systematizuje množství informací podle sekcí, které mohou být užitečné pro vytvoření vektoru eskalace oprávnění.

Jindy podrobněji proberu eskalaci oprávnění v OS Linux přes suid/sgid.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster