Jdu hacknout váš server… díl 3

Naposledy jsem na cílovém serveru získal omezený přístup přes PHP shell. Pro připomenutí – jedná se o krátký skript, který přes exec/passthru pouští příkazy, které mu zadáme pomocí GET nebo POST požadavku. Na server jsem ho v tomto příkladu dostal přes SQL injection, další možností mohlo být třeba nesprávně ošetřené nahrávání souborů.

Seriál: Jdu hacknout váš server (3 díly)

  1. Jdu hacknout váš server… díl 1 6.2.2012
  2. Jdu hacknout váš server… díl 2 13.2.2012
  3. Jdu hacknout váš server… díl 3 20.2.2012

Postup

PHP shell je sice hezká věc, ale má své úskalí: neumožňuje interaktivní vstup jako využívá např. nano (editování souborů) a vypisuje pouze běžný výstup stdout. Oboje se dá většinou řešit, v prvním případě například stačí celý stáhnout a nahrát upravený, v druhém můžeme chybový výstup přesměrovat pomocí >&1. Nicméně hlavní zádrhel je omezené oprávnění.

Mám před sebou dva poslední kroky, přes které získám ssh přístup s root oprávněním. Exploit typu privilege escalation/local root využije chyby v nějaké konkrétní aplikaci na to, aby pod vyšším oprávněním spustil shell (bash). A tím narážíme na omezení PHP shellu: jakmile se mi podaří spustit tento exploit, otevře se prakticky další interaktivní vstup, do kterého už přes passthru z PHP nic zapsat nejde.

Teoreticky by stačilo exploit upravit tak, aby nepouštěl shell, ale například náš skript. Jako rychlejší se mi osvědčilo využít jiného typu expoitu: bindshell/bac­kdoor. Ten poslouchá na libovolném portu a dá se na něj přes telnet připojit. Příkazy spouští podle oprávnění, pod kterým byl spuštěn. Stále sice nezvládá interaktivní vstup, nicméně se nezavře po každém požadavku jako PHP shell. To znamená, že musím připravit local root exploit tak, aby spustil bindshell, připojím se přes telnet, upravím nastavení ssh a vložím do authorized_keys vlastní id_rsa  klíč.

Používáme exploit

Než se pustíme do zdlouhavého vymýšlení vlastního exploitu, je dobré prohledat místa internetu, na která mnozí shlížejí s despektem. Mám na mysli databáze různých bezpečnostních děr. Dalo by se říct, že to jsou takové bug reporty s přiloženým testem, který vždy projde. Nebo neprojde, záleží na úhlu pohledu. Označení skript-kiddie není na místě, nemá smysl objevovat znovu chyby, které už někdo jiný zpracoval. Kromě toho jsou nalezené skripty spíš takový sandbox a vyžadují ještě nějaké to upravování, obzvlášť když pracujeme s odlišnou verzí OS / cílové knihovny a podobně.

Asi nejobsáhlejší databáze je dnes exploit-db.com. Naprostá většina je psaná v C/ C++, minimum využívá jiné jazyky. Můj nejoblíbenější příklad je tento PHP skript, který na portu 4444 otevře backdoor: exploit-db.com/exploit­s/3525/. Využívá špatné správy paměti PHP knihovnou GD.

Řekněme, že chceme použít nějaký exploit napsaný v C. První postup je nahrát zdrojový kód na server (ideálně do /tmp) a zkompilovat ho úplně přes úplně základní gcc -o /tmp/code /tmp/code.c. Stane-li se, že uživatel, pod kterým běží PHP shell, nemá oprávnění gcc spouštět, je nutné zkompilovat si exploit jinde. Není problém stáhnout i hodně staré verze různých systémů a virtualizovat je u sebe. Složitějším se může zdát nahrání binárního souboru na cílový server; pochopitelně to nepůjde z prohlížeče přes GET, ale jde využít curl, případně je možností napsat si na to nějakou utilitu/skriptík.

Zkompilovaný backdoor spustíme z PHP shellu jako jakoukoli jinou aplikaci. Je prozíravé si do exploitu přidat nějaký výstup typu „všechno běží“, ať hned víme, jak si stojíme. Pokud se všechno tváří funkčně, můžeme se zkusit připojit: telnet 173.194.70.138 4444, samozřejmě na pravou IP a port, který jsme si napsali v exploitu. Často se stane, že vstup posílaný na server je o několik bajtů posunutý a tedy oříznutý. Určitě můžeme celý exploit opravit a překompilovat, někdy stačí doplňovat bílé znaky na konec každého příkazu. Vždy záleží na konkrétní situaci.

Stane-li se, že žádný použitelný exploit nenajdete, čeká vás dlouhá cesta. Nutný předpoklad je kniha Hacking — Umění exploitace (Jon Erickson, Zoner Press 2009), kde se autor dostává k teorii i k pokročilým metodikám. Mimo jiné vás naučí assembler, který je pro toto nízkoúrovňové programování nezbytností.

Local root

Oprostil jsem se od omezeného PHP shellu a pracuji se serverem přes telnet. Anabázi z posledního kroku si zopakuji ještě jednou, tentokrát s local root exploitem, nicméně všechno by mělo jít mnohem rychleji, protože vím, kde kompilovat, a mám připravené prostředí a skripty. Když máme oba dva exploity funkční, musíme pustit nejprve local root a z něj backdoor. Obráceně to nejde kvůli podstatě otevíraného připojení (pro připomenutí: nezvládá interaktivní vstup, což bash rozhodně je). Máme dvě možnosti: vytvořit skript, který příkaz na spuštění backdooru předá přes trio spawn/expect/send, nebo upravíme local root exploit tak, aby nespouštěl bash, ale rovnou otevíral port.

Přístup na ssh

Nyní mám neomezené (=root) možnosti a můžu se serverem dělat, co si zamanu. Bylo by milé se zbavit závislosti na otevřeném portu, který je pro administrátora jeden velký červený vykřičník. Najdu nastavení ssh (zpravidla /etc/ssh/sshd_config a ujistím se, že PermitRootLogin je nastavené na yes, případně změním. Ještě musím vědět, kde hledá soubor authorized_keys, což je uvedeno pod AuthorizedKeysFile. Většinou je v adresáři .ssh pod domovským adresářem uživatele. Na konec tohoto souboru vložím svůj vlastní veřejný klíč: echo "klíč==" >> /root/.ssh/authorized_keys a restartuji ssh daemona  /etc/init.d/ssh restart.

Závěr

Ještě než propadnu euforii a začnu si se serverem hrát, měl bych po sobě uklidit. Rozhodně nesmím zlikvidovat všechny logy, to dá rozum, ideální je promazat jenom záznamy o mně. Týká se to logů samotného webového serveru (apache, nginx nebo na čemkoliv jiném server běží), ale i PHP a nyní i ssh. Dále je dobré po sobě pročistit  .bash_history.

Mám přístup na ssh jako root. Můžu číst celou databázi a všechny procházející maily, upravovat libovolné soubory. A to celé jenom kvůli jednomu neošetřenému vstupu…

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 25

Přehled komentářů

Jenda id_rsa
Sten Re: id_rsa
Jenda Re: id_rsa
Rejpal Re: id_rsa
Sim Protiopatření
RPajik Re: Protiopatření
NN Re: Protiopatření
RPajik Re: Protiopatření
N Re: Protiopatření
maleprase Re: Protiopatření
martin-ux Re: Protiopatření
michal_sjx Re: Protiopatření
martin-ux Re: Protiopatření
michal_sjx Re: Protiopatření
Aha Cumim
flv Re: Cumim
Samot10 Re: Cumim
František Kučera Re: Cumim
wr wtf?
Jenda Re: wtf?
wr Re: wtf?
flv Re: wtf?
Jirka V. Re: wtf?
wr Re: wtf?
passpartout Me se clanek libil
Zdroj: https://www.zdrojak.cz/?p=3610