jueves, 20 de noviembre de 2008

Session Hijacking & Fixation Method


Por Vengador de las Sombras


Hace ya tiempo Lix me recomendó hacer algún tipo de publicación que hablara de Session Fixation hará como dos o tres semanas... La cosa es que he estado demasiado liado con la universidad y no he tenido tiempo apenas para ponerme a escribir unas líneas sobre el tema y documentarme más (como ya sabes Lix, mil gracias por esos maravillosos links que me expendes).


Bueno... tras esta pequeña introducción pasemos a aclarar conceptos, empezemos por "Session". Una sesión es una interrelación entre un cliente y un servidor basada en un conjunto de caracteres que identifican a dicho cliente, haciendo que se pueda asociar informacion a ese identificador. Por ejemplo, para no tener que estar logeandonos contínuamente, podemos usar un sistema de sesiones que realicen un logeo automático.


El servidor guarda un archivo temporal con la cadena identificadora, y cada vez que compruebe la sesion del cliente (ya sea porque se la dá por una variable de tipo GET, o bien porque se encuentra en una cookie) comprobará esos archivos... Ya comentemos hace tiempo sobre estos archivos temporales, cuando comenté la idea de infectar esos archivos para usarlos a modo de WebShell (idea recogida de una publicación de Hondamena en vZack Forum).


¿Y qué es Session Hijacking?, llamamos Session Hijacking a cualquier método o técnica que tenga como fin el conseguir la session de una víctima. Las formas de conseguir este objetivo son variadas, como por ejemplo sniffeando tráfico (si conseguimos interceptar las peticiones a un host, podremos obtener el identificador de sesion). Hablando de esta forma, que podríamos definirla como "Interceptación", hemos de decir que cuando las sesiones están en variables de tipo GET (es decir, se introducen a través de la ULR) están mucho más expuestas a este tipo de ataque. Otro método menos conocido, probablemente por su dificultad o escasez, es el de "Predicción", basado en realizar un ataque por fuerza bruta hasta obtener una sesión válida... Puede parecer un ataque poco efectivo... pero si se convina con cualquier otra vulnerabilidad obtenemos un ataque plausible. Es el caso del bug que hubo en los foros SMF 1.1.5, en el cual por culpa de los servidores Win32 y de la función rand() se podría "predecir" (tras realizar una fuerza bruta) la sessión del admin y así resetear el password...


Los XSS suelen ir asociados también al robo de sesiones, aunque no son un método en sí, juegan un papel importante tanto en la interceptación (por la posibilidad de, por ejemplo, robar una cookie) como en Session Hijacking, cosa que ya veremos.



Y ahora es cuando viene el método sobre el que vamos a centrar: Session Fixation. En los anteriores métodos siempre se ha desconocido el identificador del cliente y lo que se ha buscado es tratar de averiguar cuál es. En esta ocasión, se cambia la mentalidad y lo que se busca es hacer que el cliente se logee con una sesión que ya conocemos. La ventaja de este método, es que cambiamos el identificador del cliente por uno que conocemos, por lo que cuando nosotros entremos a esa sesión, tendríamos sus mismos privilegios...

Un pequeño PoC para sintetizar brevemente el concepto en sí, puede ser el que aparece en el Blog de Chrish Shiflett, en el cual se muestra el siguiente código fuente:


<?php
session_start();

if (!isset($_SESSION['count']))
{
$_SESSION['count'] = 0;
}
else
{
$_SESSION['count']++;
}

echo $_SESSION['count'];
?>


Si guardan este ejemplo como /session.php y acceden a él a través de /session.php?PHPSESSID=1234, la primera vez veremos un "0", pero si volvemos entrar más veces, podemos observar cómo el número va aumentando. Ahora bien, si tras hacer esto, probamos a entrar a esa misma URL desde otro ordenador... podremos observar que no aparece "0". De esta forma se puede demostrar que esa sessión existe, y que hemos entrado en ella.


Ahora hablemos de como explotar este tipo de fallos. Si la identificación se establece a través de una variable tipo GET, podemos usar ingeniaría social + un iframe oculto, o bien realizar una redirección, ya sea por Meta Refresh o directamente de protocolo (en PHP con un
header('Location: http://host/index.php?PHPSESSID=caracteres');). Si en cambio se trabaja con Cookies... la cosa se complica, pero no demasiado.


Si encontramos un XSS en el host vulnerable, podríamos intentar colar un JavaScript que cree una cookie con la session que nosotros queramos... Pero el problema es que muchos filtros (dificiles de bypassear) no permiten introducir los tags de script, así que podemos recurrir al Meta Tag set-Cookie [1].



Bueno hasta aqui esta pequeña publicación... decir que no he querido extenderme mucho porque Lix tenía pensado publicar algo al respecto de este tema, y no quiero chafarle su paper.



Referencias:

[1]Aceca del Meta Tag Set-cookie
Session Hijacking
Session Fixation
5 0verl0ad Labs: Session Hijacking & Fixation Method Por Vengador de las Sombras Hace ya tiempo Lix me recomendó hacer algún tipo de publicación que hablara de Session Fixation hará como d...
< >