9. Přetečení zásobníku

Ú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 HTTP 1.1 (specifikace)

  • K čemu slouží příkaz nm.

  • 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.

  • Práce s assemblerem a strojovým kódem:

    • Pokud budete potřebovat přeložit assembler do 32bitového strojového kódu, můžete použít příkaz as -32, či gcc -m32 source.s (gcc automaticky kompiluje přípony .s a .S pouze assemblerem).

      Příklad:

      as -32 -o prog <<'EOF'
      mov $1,%eax
      add $2,%eax
      EOF
      

      Výsledek můžete zkontrolovat disassemblováním výsledné binárky:

      $ objdump -d prog
      00000000 <.text>:
         0:	b8 01 00 00 00       	mov    $0x1,%eax
         5:	83 c0 02             	add    $0x2,%eax
      

      Soubor prog obsahuje kromě binárních strojových instrukcí ještě další informace, které při útoku většinou nepotřebujeme – např. hlavičku ELF souboru.

    • 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í úlohy

Tato úloha není povinná.

Vytvořte útok na tento webový server. Můžete si vybrat z několika různě složitých variant útoku:

  1. Způsobte, že server vypíše na svůj standardní výstup řádku “pwned!” (bez uvozovek) – 4 body.
  2. Zjistěte, co je na serveru v souboru /tmp/secret.txt – 5 bodů.
  3. Změňte obrázek na 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 parametrem URL webového serveru, na který má zaútočit – např. ./exploit http://localhost:8080. Soubor exploit může být např. skript, který přeloží, co je potřeba, a spustí vlastní útok. Výstup se bude lišit podle výše uvedené varianty, kterou implementujete:

  1. První varianta nebude na stdout vypisovat nic. Hláška pwned! se vypíše na straně serveru a BRUTE to pozná.

  2. Druhá varianta varianta na stdout vypíše obsah souboru /tmp/secret.txt.

  3. Třetí variantu odevzdávací systém netestuje, počítá se pouze změna obrázku na produkčním serveru.

    Počítejte s tím, že server je přístupný celému internetu a proto je zabezpečen tak, aby šlo opravdu změnit jen obrázek a nebylo možné napáchat větší škodu. To znamená, že pokud máte hotový exploit, který funguje lokálně na vašem počítači, na serveru fungovat nemusí. Jak konkrétně funkční exploit udělat vám zde neprozradíme (zeptejte se na přednášce nebo na cvičení), ale hledejte způsob, který je co nejjednodušší a nezávisí na existenci různých programů či knihoven na cílovém systému.

Nápověda

Materiály pro úlohu na cvičení

  • exploitable.zip – k dispozici je jak dynamicky linkovaná exploitable (výrazně jednodušší čtení disassembly), tak staticky linkovaná exploitable-static (pro případ, že vám nejde spustit exploitable)
  • exploit-tools.zip – nástroje pro provedení exploitu, doporučuji stáhnout až po zjištění co samotná binárka exploitable dělá

Domácí příprava na další cvičení