====== Útok pomocí přetečení zásobníku ====== ===== Domácí příprava ===== Většina informací potřebných pro řešení této úlohy zazněla na přednášce. Dále se vám může hodit vědět následující: * Jak funguje protokol [[https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_message|HTTP 1.1]] ([[https://tools.ietf.org/html/rfc7230#section-3|specifikace]]) * K čemu slouží příkaz ''nm''. * [[https://sourceware.org/gdb/current/onlinedocs/gdb/Command-and-Variable-Index.html#Command-and-Variable-Index|Základní příkazy debuggeru gdb]]: run, break, print, next, step, nexti, stepi, layout asm, layout regs. Kromě gdb můžete použít i jiné debuggery, či grafické nadstavby. * Pokud budete potřebovat přeložit assembler, můžete použít příkaz ''as --32'', či ''gcc -m32 source.s'' (gcc automaticky kompiluje přípony .s a .S pouze assemblerem). * Příkazem ''objcopy'' můžete vykopírovat "holé" strojové instrukce z programu. Např. příkaz ''objcopy -O binary --only-section=.text --only-section=.rodata prog prog.bin'' vykopíruje z programu ''prog'' kód (.text) a read-only data (globální proměnné deklarované jako ''const''). * Disassemblovat "holou" binárku (např. soubor prog.bin vytvořený výše uvedeným příkazem ''objcopy'') můžete příkazem ''objdump -D -b binary -m i386 prog.bin'' nebo ''ndisasm -b 32 prog.bin''. * Ke komunikaci s webovým serverem nemusíte používat jen webový prohlížeč, ale třeba i nástroje ''nc'', ''wget'' nebo ''curl''. ===== Zadání ===== Tato úloha není povinná. Vytvořte útok na [[http://rtime.felk.cvut.cz:8080/|tento webový server]]. Můžete si vybrat z několika různě složitých variant útoku: - Způsobte, že server vypíše na svůj standardní výstup řádku "pwned!" (bez uvozovek) – 4 body. - Zjistěte, co je na serveru v souboru ''/tmp/secret.txt'' – 5 bodů. - Změňte obrázek na [[http://rtime.felk.cvut.cz:8080/|produkčním serveru]] – více jak 5 bodů (záleží na domluvě se cvičícím). Do odevzdávacího systému nahrávejte archiv, který bude obsahovat všechny vaše zdrojové soubory a spustitelný soubor ''exploit''. Ten bude spuštěn a jako parametr mu bude předáno URL webového serveru, na který má zaútočit. Např. ''./exploit http://localhost:8080''. V případě 1. varianty zadání nebude na stdout vypsáno nic, u 2. varianty se tam vypíše obsah souboru ''/tmp/secret.txt''. 3. variantu odevzdávací systém netestuje, počítá se pouze změna obrázku na produkčním serveru. ===== Nápověda ===== * Doporučujeme obstarat si binárku serveru a vyvíjet útok lokálně. Když uspějete lokálně, vyzkoušejte to na [[http://rtime.felk.cvut.cz:8080/|našem serveru]] (smysl má pouze varianta 2) a pak svůj útok nahrajte do upload systému. * Budete potřebovat znát alespoň [[https://cs.wikipedia.org/wiki/Hypertext_Transfer_Protocol|základy HTTP protokolu]]. * Server je 32bitový program, ale to byste určitě zjistili i sami. * Abychom vám hackování trochu ulehčili, podstatné části kódu serveru, zpracovávající HTTP požadavky, nepracují s nulou ukončenými řetězci. * Může se vám hodit nástroj [[http://www.radare.org/r/|radare]], který používá mnoho profesionálů. Základní informace o použití radare jako debuggeru najdete [[https://github.com/radare/radare2/blob/master/doc/intro.md#debugger|zde]] či [[https://radare.gitbooks.io/radare2book/first_steps/basic_debugger_session.html|zde]]. * Další nápovědu můžete získat na [[https://cw.felk.cvut.cz/forum/thread-4120.html|fóru]].