Obsah 1 Úvod... 4 1.1 Lockdown a hackerlab...4 1.2 Vaše ochrana... 4 2 Exploit... 5 2.1 Typy exploitů...5 3 Zranitelnost FTP serveru Cesar...5 3.1 Fuzzer ftp-fuzzer.py...5 3.1.1 Spuštění fuzzeru...7 4 Immunity Debugger...8 4.1 Otevření a připojení programu...8 4.1.1 Kódový segment...9 4.1.2 Registry... 10 4.1.3 Paměť programu...11 4.2 Užitečné příkazy a zkratky...11 4.2.1 Bod přerušení (Brakepoint)...11 4.3 Analýza působení fuzzeru...12 4.3.1 Skript pro debugování...13 4.3.2 Reprezentace znaků v paměti (ASCII tabulka)...13 4.3.3 Kostra exploitu (Skeleton exploit)...15 5 Zásobník (Stack)... 19 5.1 Organizace zásobníku v paměti...19 5.2 Zarovnání zásobníku...20 5.3 Práce se zásobníkem...20 5.3.1 Instrukce pop a push...20 5.3.2 Instrukce call a návratová adresa...20 5.3.3 Instrukce ret...21 5.4 Prolog funkce a zásobníkový rámec...22 5.5 Epilog funkce... 23 6 Přívěšek (Payload)...24 6.1 Jak na shellcode...24 6.2 Nástrahy a omezení přívěšků...24 6.2.1 Kódování... 24 6.2.2 Špatné znaky...25 6.2.3 Odhalujeme špatné znaky...25 6.2.4 Zbylé místo pro přívěšek...26 6.2.5 Skok na přívěšek...27 Petr Juhaňák, lockdown 2013 - Všechna práva vyhrazena, určeno pouze pro osobní potřebu. 2
7 Generujeme shellcode...30 7.1 Metasploit framework...30 7.2 Nejmenší shellcode...30 7.2.1 Integrace shellkódu do skriptu...32 8 Zranitelná funkce (Buffer overflow)...33 8.1 Program v jazyce C...33 8.1.1 Překlad programu (Dev-C++)...34 8.1.2 Spuštění programu...35 8.1.3 Trasování v debugeru...36 9 Závěr... 38 10 Příloha A rozložení paměti procesu...38 Petr Juhaňák, lockdown 2013 - Všechna práva vyhrazena, určeno pouze pro osobní potřebu. 3
1 Úvod Vítejte v hackerlabu. Tento výukový materiál slouží studentům jako pracovní sešit, který využijete během kurzu jako referenční příručku. 1.1 Lockdown a hackerlab Na trhu působíme od roku 2013 se zaměřením na penetrační testování a bezpečnost dat. Dále provozujeme školící a konzultační činnost. Více informací naleznete na našem webu www.lockdown.cz. Pro školící aktivity máme projekt hackerlab. Přehled aktuálních hacking kurzů naleznete na stránkách www.hackerlab.cz. 1.2 Vaše ochrana Získané znalosti z kurzu etického hackingu můžete aplikovat jen na systémech, které přímo vlastníte (případně s písemným souhlasem jejich vlastníka). V opačném případě Vás i dobrý úmysl může přivést do nepříjemné situace. Úmyslné překonání i velmi triviální obrany může být posuzováno za trestný čin. Každá interakce na síti také zanechává v systému nějakou stopu. Petr Juhaňák, lockdown 2013 - Všechna práva vyhrazena, určeno pouze pro osobní potřebu. 4
2 Exploit Exploit je krátký program, který využívá specifickou zranitelnost jiného programu, aby získal kontrolu nad programem nebo práva uživatele, pod kterým byl program spuštěn. Zranitelnosti se objevují analýzou zdrojového kódu (zdrojový kód je k dispozici) reverzujeme binární kód a analyzujeme instrukce testování vstupů aplikace (fuzzing) 2.1 Typy exploitů Exploity dělíme z hlediska použití na vzdálené (remote) exploitujeme vzdáleně po síti (nebo přes lokální IP adresu), lokální (local) exploitujeme přímo na stroji (vyžaduje OS účet), zpravidla se jedná o exploity, které eskalují práva na systémového administrátora. 3 Zranitelnost FTP serveru Cesar Pokusíme se exploitovat zranitelnost CVE-2006-2961 FTP serveru Cesar ve verzi 0.99. Zranitelnost přetečení zásobníku (buffer overflow) se nachází ve FTP příkazu MKD. http://www.securityfocus.com/bid/18586/discuss 3.1 Fuzzer ftp-fuzzer.py Fuzzer je nástroj pro fuzzy testování, kdy posíláme na vstupu programu záměrně špatná nebo částečně správná data. Napíšeme si svůj první fuzzer v jazyce Python a otestujeme, zda je skutečně FTP server zranitelný. Petr Juhaňák, lockdown 2013 - Všechna práva vyhrazena, určeno pouze pro osobní potřebu. 5
8.1.3 Trasování v debugeru Prohlédneme si stav zásobníku v Immunity Debugeru. Otevřeme program buff.exe a v poli arguments zadáme parametr AAAA. Podle informačních tisků v našem programu nalezneme funkci main() a naší zranitelnou funkci tiskni_zpravu(). Nyní vytvoříme bod přerušení klávesou (F2) ve funkci tiskni_zpravu a to na adrese, kde se nachází volání funkce strcpy(). V našem případě je to adresa 0x004012F9. Petr Juhaňák, lockdown 2013 - Všechna práva vyhrazena, určeno pouze pro osobní potřebu. 36
Spustíme program klávesou (F9), který se znovu zastaví na bodu přerušení, poznamenáme si stav zásobníku před voláním funkce strcpy (obrázek vlevo), provedeme volání funkce klávesou (F8) a srovnáme znovu zásobník (obrázek vpravo). Vidíme, že část paměti zásobníku byla přepsána znaky 'A' (41 hex) a to od adresy 0x0022FF54 až do adresy 0x0022FF8C. Podíváme se nyní na stav registrů, registr EBP ukazuje na adresu 0x0022FF58, která je také přepsána znaky 'A'. Z předešlého výkladu o struktuře zásobníku víme, že na adrese EBP+4 (0x0022FF5C) bude program očekávat návratovou adresu, kterou nahraje do registru EIP po ukončení volání funkce pomocí instrukce RET. K čemuž také dojde, pokud budeme pokračovat v programu stiskem klávesy F9. Petr Juhaňák, lockdown 2013 - Všechna práva vyhrazena, určeno pouze pro osobní potřebu. 37
9 Závěr Seznámili jsme se s Immunity Debugerem a se základy exploitace zranitelnosti typu přetečení zásobníku na platformě Windows (bez překonání pokročilých ochran). Pokud jste objevili další otázky nebo souvislosti, nezapomeňte se o ně podělit a navštivte naše diskusní fórum http://forum.hackerlab.cz. Věříme, že se vám kurz líbil, a budeme se těšit na další setkání. 10 Příloha A rozložení paměti procesu Petr Juhaňák, lockdown 2013 - Všechna práva vyhrazena, určeno pouze pro osobní potřebu. 38