První domácí úloha z předmětu X36API


Řešitelé: Jan Skalický <mail>, Filip Šimek <mail>
  1. Zadání
  2. Hledání chyby
  3. Útok na Windowsovou verzi
    1. Nalezení vhodné instrukce skoku
    2. Shellcode
    3. Důležité trasovací adresy procesu zjištěné v průběhu debugování
    4. Závěr
    5. Použité nástroje
  4. Útok na Linuxovou verzi
    1. Nalezení vhodné instrukce skoku
    2. Shellcode
    3. Nahrání shellcode přes POP3 protokol
    4. Závěr
    5. Použité nástroje
  1. Zadání:

    Najděte chybu v programu POP3 serveru (jenž je v binární podobě stažitelný ze stránek předmětu) a využijte této chyby ke vzdálenému spuštění svého kódu (shellcode).


  2. Hledání chyby:

    1. Budeme hledat chybu typu buffer overflow, která by mohla vést na stack overflow. Pokud docílíme stack overflow, bude za určitých podmínek možné spustit náš kód nahraný na zásobníku.
    2. Podle RFC 1939 (Post Office Protocol 3) vyzkoušíme všechny povolené příkazy POP3 protokolu, na řádku za každým příkazem pošleme ještě větší počet nějakých přebytečných znaků (např. 200). Pokud se nám podaří těmito znaky přepsat část stackframe, server pravděpodobně s chybou "spadne". Poznáme to podle toho, že se nám bez jakékoliv zprávy uzavře spojení.
    3. Zjistili jsme, že slabým místem je příkaz TOP. Potřebujeme zjistit, kterým bytem naší zprávy jsme způsobili přepsání návratové adresy uložené na zásobníku a dozvědět se tak něco víc o stackframe. K tomu použijeme ladicí program, např. OllyDbg pro Windows. Debugger nám umožní prohlédnout zásobník laděného programu (pop3 serveru) nebo také hodnotu registrů ESP, EIP v době pádu programu. Vhodnou volbou řetězce, který způsobil přetečení, zjistíme, který znak přepisuje návratovou adresu, uloženou na zásobník při volání podprogramu. Tuhle adresu budeme moci vhodně změnit a docílit tak skoku na náš kód.
    4. Zjistili jsme, že návratová adresa podprogramu začíná na 125. znaku od začátku příkazu TOP. Dále jsme přišli na to, že instrukce RET, která uzavírá námi napadnutou proceduru, odklízí ze zásobníku ještě 4 bajty, patrně jeden čtyřbajtový argument. Náš řetězec, kterým nabouráme pop3 server bude tedy vypadat nějak takto:
      TOP <výplň 120B><EIP 4B><4B><místo kam ukazuje ESP po návratu z procedury>
      V celém řetězci se nesmí nacházet nulový byte. Na místo, kam bude ukazovat ESP po návratu z procedury, umístíme náš shellcode. Celý řetězec musí končit bajty 13 a 10 (a to jak ve verzi pop3 serveru pro Windows i pro Linux).
    5. Jsme schopni podvrhnout na zásobníku návratovou adresu procedury, musíme ale zjistit, jakou hodnotu máme nastavit. Inkriminovaná část zásobníku se může při každém spuštění programu nacházet na jiné adrese, takže absolutní adresu našeho shellcode nemůžeme znát. Dokážeme ale nahrát kód tam, kam bude ukazovat ESP až instrukce RET uklidí argument ze zásobníku. Potřebujeme najít někde v paměti instrukci JMP ESP (její operační znak je FF E4) nebo CALL ESP (FF D4). Nalezení některé z těchto instrukcí závisí na operačním systému, na kterém pop3 server provozujeme.

  3. Windows:

    Útok na Windowsovou verzi programu pop3d

  4. Linux:

    Útok na Linuxovou verzi programu pop3d