Jsem root. Pochopení eskalace oprávnění OS Linux

První čtvrtletí roku 2020 jsem strávil přípravou na zkoušku OSCP. Hledání informací na Googlu a spousta „slepých“ pokusů mi zabralo veškerý volný čas. Ukázalo se, že je obzvláště obtížné pochopit mechanismy eskalace privilegií. Kurz PWK věnuje tomuto tématu velkou pozornost, ale metodické materiály vždy nestačí. Na internetu je spousta návodů s užitečnými příkazy, ale nejsem zastáncem slepého dodržování doporučení bez pochopení, kam to povede.

Rád bych se s vámi podělil o to, co se mi podařilo naučit během přípravy a úspěšného složení zkoušky (včetně periodických nájezdů na Hack The Box). Cítil jsem hluboký pocit vděčnosti za každou informaci, která mi pomohla jít cestou Try Harder vědoměji, nyní je můj čas vrátit to komunitě.

Chci vám poskytnout průvodce eskalací oprávnění v OS Linux, který zahrnuje analýzu nejběžnějších vektorů a souvisejících funkcí, které budete určitě potřebovat. Samotné mechanismy eskalace privilegií jsou často poměrně jednoduché, potíže nastávají při strukturování a analýze informací. Proto jsem se rozhodl začít s "prohlídkou" a následně se každému vektoru věnovat v samostatném článku. Doufám, že vám ušetřím čas na studium tématu.

Jsem root. Pochopení eskalace oprávnění OS Linux

Proč je tedy eskalace privilegií v roce 2020 vůbec možná, pokud jsou metody dobře známé již velmi dlouhou dobu? Ve skutečnosti, pokud uživatel zachází se systémem správně, opravdu nebude možné zvýšit oprávnění v něm. Hlavním globálním problémem, který takové příležitosti vyvolává, je nezabezpečená konfigurace. Zvláštním případem nebezpečné konfigurace je také přítomnost zastaralých verzí softwaru obsahujících zranitelnosti v systému.

Eskalace oprávnění prostřednictvím nezabezpečené konfigurace

Nejprve se pojďme vypořádat s nezabezpečenou konfigurací. Začněme s IT profesionálové často používají příručky a zdroje, jako je stackoverflow, z nichž mnohé obsahují nebezpečné příkazy a konfigurace. Pozoruhodným příkladem je zprávy že kód nejvíce zkopírovaný ze stackoverflow obsahoval chybu. Zkušený admin uvidí zárubeň, ale to je v ideálním světě. Dokonce i kompetentní profesionálové zvýšené pracovní vytížení schopný dělat chyby. Představte si, že administrátor připravuje a schvaluje dokumentaci pro další výběrové řízení, zároveň se noří do nové technologie, která bude představena v příštím čtvrtletí, a přitom periodicky řeší úkoly uživatelské podpory. A pak dostane za úkol rychle pozvednout pár virtuálních strojů a nasadit na nich služby. Co myslíte, jaká je pravděpodobnost, že si admin záseku prostě nevšimne? Pak se specialisté mění, ale berličky zůstávají, přičemž firmy se vždy snaží minimalizovat náklady, včetně těch pro IT specialisty.

Pseudo shell a útěk z vězení

Systémový shell získaný během produkční fáze je často omezený, zvláště pokud jste jej získali hacknutím uživatele webového serveru. Například omezení prostředí vám mohou zabránit v použití příkazu sudo s chybou:

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")'

Ptáte se: "Proč potřebuji tisíc příkazů, když jeden mohu použít například k přenosu souborů?" Faktem je, že systémy jsou nakonfigurovány jinak, na dalším hostiteli nemusí být Python nainstalován, ale Perl může být dostupný. Dovedností je umět dělat známé věci v systému bez známých nástrojů. Kompletní seznam funkcí naleznete zde.

Shell s nízkými oprávněními lze získat pomocí týmy 1 и týmy 2 (překvapivě i GIMP).

Zobrazit historii příkazů

Linux shromažďuje historii všech provedených příkazů do souboru ~ / .bash_history. Pokud je server aktivně používán a jeho historie není vymazána, existuje velká šance, že pověření budou nalezena v tomto souboru. Vymazání historie je banálně nepohodlné. Pokud je administrátor nucen volit desetiúrovňové příkazy přes , bude pro něj samozřejmě pohodlnější tento příkaz volat z historie, než jej zadávat znovu. Navíc mnozí o tomto „hacku“ nevědí. Pokud jsou v systému alternativní mušle jako Zsh nebo Fish, mají svou vlastní historii. Chcete-li zobrazit historii příkazů v libovolném prostředí, stačí zadat historii příkazů.

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

Existuje sdílený hosting, ve kterém se server používá k hostování několika stránek. Obvykle má s touto konfigurací každý prostředek svého vlastního uživatele se samostatným domovským adresářem a virtuálním hostitelem. Takže pokud je nakonfigurován nesprávně, můžete najít soubor .bash_history v kořenovém adresáři webového zdroje.

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

Váš aktuální uživatel může číst konfigurační soubory pro různé služby. V nich lze nalézt přihlašovací údaje v čistém textu – hesla pro přístup do databáze nebo souvisejících služeb. Stejné heslo lze použít jak pro přístup k databázi, tak pro autorizaci uživatele root (obsazení pověření).
Stává se, že nalezené přihlašovací údaje patří službám na jiných hostitelích. Vývoj útoku na infrastrukturu prostřednictvím kompromitovaného hostitele není o nic horší než zneužívání jiných hostitelů. Sousední systémy lze také nalézt vyhledáním IP adres v souborovém systému.

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

Pokud má napadený hostitel webovou aplikaci přístupnou z internetu, je lepší vyloučit její logy z hledání IP adres. Adresy uživatelů zdrojů z internetu pro nás pravděpodobně nebudou užitečné, ale adresy vnitřní sítě (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) a kam jdou, soudě podle logy, mohou být zajímavé.

Sudo

Příkaz sudo umožňuje uživateli provést příkaz v kontextu root s vlastním heslem nebo bez jeho použití. Mnoho operací v Linuxu vyžaduje oprávnění root, ale spouštění jako root je považováno za velmi špatný postup. Místo toho je lepší použít selektivní oprávnění ke spouštění příkazů v kořenovém kontextu. Mnoho linuxových nástrojů, včetně standardních, jako je vi, však lze použít k eskalaci oprávnění legitimním způsobem. Pro nalezení správné cesty doporučuji hledat zde.

První věc, kterou musíte udělat po získání přístupu do systému, je spustit příkaz sudo -l. Zobrazí se oprávnění k použití příkazu sudo. Pokud je získán uživatel bez hesla (například apache nebo www-data), vektor eskalace práv sudo je nepravděpodobný. Při použití sudo se systém zeptá na heslo. Použití příkazu passwd k nastavení hesla také nebude fungovat, bude se ptát na aktuální heslo uživatele. Ale pokud je sudo stále k dispozici, pak ve skutečnosti musíte hledat:

  • jakékoli interprety, kdokoli může vytvořit shell (PHP, Python, Perl);
  • libovolné textové editory (vim, vi, nano);
  • libovolní diváci (méně, více);
  • jakékoli možnosti práce se souborovým systémem (cp, mv);
  • nástroje, které mají výstup v bash, buď interaktivně nebo jako spustitelný příkaz (awk, find, nmap, tcpdump, man, vi, vim, ansible).

Suid/Sgid

Na internetu je mnoho příruček, které radí sestavit všechny příkazy suid/sgid, ale ojedinělý článek uvádí podrobnosti o tom, co s těmito programy dělat. Lze nalézt možnosti eskalace oprávnění, které neberou v úvahu použití exploitů zde. Řada spustitelných souborů má také specifické chyby zabezpečení pro verzi operačního systému, například.

V ideálním světě byste měli všechny nainstalované balíčky spouštět alespoň přes searchsploit. V praxi by to mělo být provedeno pomocí nejoblíbenějších programů, jako je sudo. Vždy je také možností využít a podpořit vývoj automatizovaných nástrojů, které zdůrazní zajímavé spustitelné soubory z hlediska eskalace privilegií s nastavenými bity suid/sgid. Seznam takových nástrojů uvedu v odpovídající části článku.

Zapisovatelné skripty spouštěné programem Cron nebo Init v kořenovém kontextu

Cron úlohy mohou běžet v kontextu různých uživatelů, včetně root. Pokud je v cronu nějaká úloha s odkazem na spustitelný soubor a můžete ji napsat, můžete ji snadno nahradit škodlivou a provést eskalaci oprávnění. Zároveň jsou ve výchozím nastavení soubory s úlohami cron dostupné ke čtení každému uživateli.

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

Podobně je tomu u init. Rozdíl je v tom, že úlohy v cronu jsou prováděny pravidelně a v init - při spuštění systému. Pro provoz budete muset restartovat systém, přičemž některé služby se nemusí zvedat (pokud nebyly registrovány v autoload).

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

Můžete také vyhledávat soubory, do kterých může zapisovat kterýkoli uživatel.

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

Metoda je docela známá, zkušení správci systému pečlivě používají příkaz chmod. Na webu však naprostá většina příruček popisuje nastavení maximálních práv. Přístup nezkušených systémových administrátorů „jen aby to fungovalo“ v zásadě vytváří příležitosti pro eskalaci oprávnění. Pokud je to možné, je nejlepší podívat se v historii příkazů na nebezpečné použití chmod.

chmod +w /path 
chmod 777 /path

Získání přístupu k shellu pro ostatní uživatele

Podíváme se na seznam uživatelů v /etc/passwd. Věnujeme pozornost těm, kteří mají skořápku. Tyto uživatele můžete brutálně odstraňovat – je možné, že prostřednictvím výsledného uživatele budete nakonec moci zvýšit oprávnění.

Pro zlepšení zabezpečení doporučuji vždy dodržovat zásadu nejmenšího privilegia. Dává také smysl věnovat čas kontrole nebezpečných konfigurací, které by mohly po odstranění závady zůstat – to je „technická povinnost“ správce systému.

Vlastní kód

Stojí za to se blíže podívat na spustitelné soubory v domovském adresáři uživatele a webového serveru (/var/www/, pokud není uvedeno jinak). Tyto soubory se mohou ukázat jako zcela nejisté řešení a obsahují neuvěřitelné berličky. Samozřejmě, pokud máte nějaký framework v adresáři svého webového serveru, nemá smysl v něm v rámci pentestu hledat zero-day, ale doporučuje se najít a prostudovat vlastní úpravy, pluginy a komponenty.

Pro zvýšení bezpečnosti je lepší vyhnout se používání přihlašovacích údajů ve skriptech, které si sami napsali, a také potenciálně nebezpečným funkcím, jako je čtení /etc/shadow nebo manipulace s id_rsa, pokud je to možné.

Zvýšení oprávnění prostřednictvím zneužívání zranitelností

Než se pokusíte zvýšit privilegia prostřednictvím vykořisťování, je důležité porozumět přenos souborů do cílového hostitele. Kromě obvyklých nástrojů jako ssh, ftp, http (wget, curl) existuje celek "zoo" možností.

Chcete-li zlepšit zabezpečení svého systému, pravidelně jej aktualizujte na nejnovější stabilní verze a také zkuste použít distribuce určené pro Enterprise. Jinak zřídka, ale jsou situace, kdy apt upgrade způsobí, že systém bude nepoužitelný.

Využívání služeb spuštěných v kontextu uživatele root

Některé služby Linuxu běží jako privilegovaný uživatel root. Lze je najít pomocí ps aux | kořen grep. V tomto případě nemusí být služba oznámena na webu a bude dostupná lokálně. Pokud má veřejné exploity, lze je bezpečně používat: selhání služby v případě selhání je mnohem méně kritické než selhání operačního systému.

ps -aux | grep root # Linux

Za nejúspěšnější případ lze považovat provozování hacknuté služby v kontextu uživatele root. Provozování služby SMB poskytuje SYSTÉMU privilegovaný přístup v systémech Windows (např. přes ms17-010). To však není na systémech Linux běžné, takže můžete strávit spoustu času eskalací oprávnění.

Zneužití zranitelností jádra Linuxu

Toto je poslední cesta. Neúspěšná operace může vést k pádu systému a v případě restartu se nemusí zvedat některé služby (včetně těch, přes které bylo možné získat původní shell). Stává se, že administrátor jednoduše zapomněl použít příkaz systemctl enable. Navíc to způsobí velkou nespokojenost s vaší prací, pokud nebylo dohodnuto vykořisťování.
Pokud se rozhodnete použít zdroje z exploitdb, nezapomeňte si přečíst komentáře na začátku skriptu. Mimo jiné se tam většinou píše, jak tento exploit správně zkompilovat. Pokud jste byli příliš líní nebo jste potřebovali „včera“ kvůli termínům, můžete hledat úložiště s již zkompilovanými exploity, například. Je však třeba chápat, že v tomto případě dostanete prase v pytli. Na druhou stranu, kdyby programátor do bajtů pochopil, jak počítač funguje a jaký software používá, nenapsal by za celý život ani řádek kódu.

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

Metasploit

Aby bylo možné zachytit a zvládnout spojení, je vždy lepší použít modul exploit/multi/handler. Hlavní věc je nastavit správné užitečné zatížení, například generic/shell/reverce_tcp nebo generic/shell/bind_tcp. Shell získaný v Metasploitu lze upgradovat na Meterpreter pomocí modulu post/multi/manage/shell_to_meterpreter. S Meterpreter můžete automatizovat proces po exploataci. Například modul post/multi/recon/local_exploit_suggester kontroluje platformu, architekturu a zneužitelné entity a navrhuje modulům Metasploit pro eskalaci oprávnění v cílovém systému. Díky Meterpreteru se eskalace privilegií někdy sníží na spuštění správného modulu, ale hackování bez pochopení toho, co se děje pod kapotou, není pravda (stále musíte napsat zprávu).

Tools

Nástroje pro automatizaci místního sběru informací vám ušetří spoustu úsilí a času, ale samy o sobě nejsou schopny plně identifikovat cestu eskalace oprávnění, zejména v případě zneužití zranitelností jádra. Automatizační nástroje pro vás provedou všechny potřebné příkazy ke shromažďování informací o systému, ale je také důležité umět analyzovat přijatá data. Doufám, že můj článek vám v tom bude užitečný. Samozřejmě existuje mnohem více nástrojů, než uvedu níže, ale všechny dělají totéž – je to spíše věc vkusu.

Linpeas

Poměrně čerstvý nástroj, první závazek je z ledna 2019. Momentálně můj nejoblíbenější nástroj. Pointa je, že zdůrazňuje nejzajímavější vektory eskalace privilegií. Souhlasíte, že je pohodlnější získat odborné posouzení na této úrovni, než analyzovat monolitická nezpracovaná data.

LinEnum

Můj druhý oblíbený nástroj také shromažďuje a organizuje data získaná jako výsledek místního výčtu.

linux-exploit-suggester (1,2)

Tento exploit bude analyzovat systém pro vhodné podmínky pro exploity. Ve skutečnosti bude dělat stejnou práci jako modul Metasploit local_exploit_suggester, ale spíše než moduly Metasploit nabídne odkazy na zdrojové kódy exploit-db.

Linuxprivchecker

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

Jindy to upřesním Eskalace oprávnění Linuxu přes suid/sgid.

Zdroj: www.habr.com

Přidat komentář