Un sitio web puede tener más de una cookie en el ordenador del usuario que navega, pero las cookies críticas son las que nos permiten la identificación del usuario en la página web. De esta manera, mediante técnicas como los conocidos XSS o los MITM seriamos capaces de obtener cookies críticas que nos permitan falsificar y hacer creer al sistema que nosotros somos el usuario objetivo.

El problema viene cuando el objetivo de un esnifado de red es únicamente saber las cookies críticas del que navega. Con todos los paquetes de datos que recibimos, incluso filtrándolos por HTTP en Wireshark, tendriamos mucho trabajo por delante.

De este problema me surgió la necesidad de crear un script en PHP, el cual quiero compartir en el blog, que nos permite, no solo ordenar y obtener las cookies de manera agradable para la vista, sino que, incluyo una función en la que a partir de un array cuyo índice sea el domino y el valor sea el nombre de la cookie crítica de ese sitio, nos lo colorea de rojo, permitiéndonos así localizarlas más fácilmente. De la misma manera, nos quita las cookies de los hosts repetidos.

El código está completamente comentado y dividio en dos funciones que nos hacen el entendimiento más fácil. El archivo que tenemos que pasarle al script, ha de ser el fichero pcap guardado del wireshark una vez esté filtrado usando el siguiente filtro:
http contains "Cookie: "
Esto nos permite obtener los paquetes que contenga “Cookie:” que son los que nos interesan.

Este es un ejemplo del resultado. Sabemos que la cookie crítica de twitter es auth_token:

Script:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Documento sin título</title>
<style>
#host {
	font-weight:bold;
	font-size:17px;
	font-family:Verdana;
}
#valores {
	font-size:12px;
	font-family:Verdana;
	margin-left:3%;
}
</style>
</head>
 
<body>
 
<?
 
//http contains "Cookie: "
$fichero = "asd.pcap";
 
//Leemos el archivo
$f=fopen($fichero,"r") or die("Error al abrir el fichero");
 
while(!feof($f))
 $contenido.=fgets($f);	
//Cerramos el fichero
fclose($f);
 
 
preg_match_all("/(Host:).*(\r\n).*(\r\n).*(\r\n).*(\r\n).*(\r\n).*(\r\n).*(\r\n).*(\r\n).*(\r\n).*/",$contenido,$resultados);
//Con esto, obtenemos una matriz con los resultados de los paquetes en los que aparece el Host y la Cookie justo en esa posición
 
 
//Usamos el substr_count para saber si tiene la palabra "Cookie".
//En este caso, la añadimos a nuestra matriz final
foreach($resultados[0] as $valor) {
  if(substr_count($valor,"Cookie")>0)
    $final[] = $valor;
}
 
//La matriz "final" contiene por cada valor, un paquete con host y cookie
//"resultado" es una matriz vacia en la que se almacenará el resultado devuelto
parsear_matriz($final,$resultado);
 
 
//Printeamos el resultado
foreach($resultado as $clave => $valor){
 
  echo $clave;
  unset($final);
		$nuevo = explode(";",$valor);
		foreach($nuevo as $valor2)
			$final .= "<span id=valores>" . $valor2 . "</span><br>";
 
  echo $final . "<hr>";
}
 
 
 
//FUNCIONES
function parsear_matriz($matriz,&$resultado) {
 
	foreach($matriz as $valor) {
	  $host = explode("Host: ",$valor);
	  $host = explode("\r\nUser",$host[1]);
	  //Host[0] tiene cada host
	  $cookie = explode("Cookie: ",$valor);
	  //Cookie[1] tiene el valor de la cookie en cada host
 
	  detectar_cookies_criticas($host[0],$cookie[1]);
 
	  $host[0] = "<span id=host>" . $host[0] . ":</span><br>";
	  $resultado[$host[0]] = $cookie[1];
	  //Devolvemos el resultado
	}
 
}
 
function detectar_cookies_criticas($host,&$cookie){
 
	$buscar	= array("twitter.com" => "auth_token");
	//Esta matriz contiene el host y la cookie crítica que destacará en el caso de que la encuentre
 
	if(array_key_exists($host,$buscar)){
 
		$nuevo = explode($buscar[$host],$cookie);
		$cookie = $nuevo[0] . "<font color=red><b>" . $buscar[$host];
		$nuevo = explode(";",$nuevo[1]);
		$cookie .= $nuevo[0] . "</b></font>;" . $nuevo[1];
 
	}
 
}
 
 
 
?>
 
</body>
</html>