Ú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
, čigcc -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říkazobjcopy -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é jakoconst
). -
Disassemblovat “holou” binárku (např. soubor
prog.bin
vytvořený výše uvedeným příkazemobjcopy
) můžete příkazemobjdump -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
nebocurl
.
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:
- 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 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:
-
První varianta nebude na stdout vypisovat nic. Hláška
pwned!
se vypíše na straně serveru a BRUTE to pozná. -
Druhá varianta varianta na stdout vypíše obsah souboru
/tmp/secret.txt
. -
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
- Doporučujeme obstarat si binárku serveru (neprozradíme vám jak a kde, ale určitě na to přijdete :-) a vyvíjet útok lokálně. Když uspějete lokálně, vyzkoušejte to na našem serveru (smysl má pouze varianta 2) a pak svůj útok nahrajte do upload systému.
- Budete potřebovat znát alespoň 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 radare, který používá mnoho profesionálů. Základní informace o použití radare jako debuggeru najdete zde či zde. Další alternativou je nástroj IDA Free.
- Zajímavé odkazy:
- Další nápovědu můžete získat na gitlabu.
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 spustitexploitable
) - 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í
- Projděte si zdrojové kódy OS Nova (stáhněte zde: https://gitlab.fel.cvut.cz/osy/osy.pages.fel.cvut.cz/-/archive/master/nova.zip?path=nova)
- Zopakujte si co dělá syscall brk v Linuxu
- Zopakujte si jak CPU překládá virtuální adresy na fyzické
- Zopakujte si jak fungují systémová volání sysenter a sysexit
- detailně viz https://osy.pages.fel.cvut.cz/docs/cviceni/lab10/