[Script] Tratar cookies esnifadas con Wireshark en PHP

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:





Documento sin título





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 .= "" . $valor2 . "
"; echo $final . "
"; } //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] = "" . $host[0] . ":
"; $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] . "" . $buscar[$host]; $nuevo = explode(";",$nuevo[1]); $cookie .= $nuevo[0] . ";" . $nuevo[1]; } } ?>

Filtros de Wireshark más comunes e interesantes


Wireshark (antes conocido como Ethereal) es quizás el analizador de protocolos más conocido por todos, ya que no solo es posible instalarlo en cualquier máquina (Windows, Linux o Mac), sino que gracias a la cantidad de filtros que dispone (de entre otras muchas cosas, pero solo me centraré en esto) nos facilita enórmemente las cosas a la hora de filtrar y visualizar los paquetes capturados deseados.

En este post trataré de poner algunos filtros bastante interesantes que suelo usar, de esta manera, pueden servir de referencia a alguien más si los necesita. El objetivo de este post no es escribirlos todos repito, sino poner los que yo creo que son bastante interesantes. Si quereis que añada alguno más o quereis decir algo, comentad!

Concatenadores y Operadores

Concatenadores

  1. && —> AND lógico (y)
  2. || —> OR lógico (ó)
  3. Operadores

  4. contains —> Contener (se usa cuando no sabemos exáctamente todo. Más abajo hay un ejemplo).
  5. == —> Comparación (igual)
  6. != —> Comparación (desigual)

Nota: Cuando se trata de igualdades, siempre hay dos símbolos. Si la igualdad es un número, se pone este directamente. Si es una cadena de texto, se ha de poner con comillas.

Protocolos

  1. ssl —> Protocolo SSL (capa segura).
  2. telnet —> Telnet.
  3. dns —> DNS.
  4. msnms —> Mensajería Instantánea (Messenger).
  5. ftp —> Protocolo FTP (podriamos ver el nombre de usuario y contraseña).
  6. ftp-data —> Nos permite ver los datos del protocolo FTP.
  7. ip —> Protocolo IP.
  • ip.src==192.168.1.1 —> Dirección IP de Origen.
  • ip.dst==192.168.1.1 —> Dirección IP de Destino.
  1. tcp —> Protocolo TCP
  • tcp.port==80 —> Indicamos los paquetes con el puerto deseado.
  • tcp.srcport==80 —> Indicamos el puerto de origen.
  • tcp.dstport==80 —> Indicamos el puerto de destino.
  1. http —> Protocolo HTTP
  • http.host==”www.google.com” —> Queremos ver los paquetes que tengan a Google como host.
  • http.date==”Wed, 30 Mar 2011 22:40:55 GMT” —> Paquetes con respecto a una fecha
  • http.content_type==”application/json” —> Según el tipo. Hay más tipos, pondremos ejemplos
  • http.content_type==”image/png” —> Imágenes PNG
  • http.content_type==”image/gif” —> Imágenes GIF
  • http.content_type==”image/jpeg” —> Imágenes JPEG
  • http.content_type==”text/html” —> Archivos HTML
  • http.content_type==”text/css” —> Hojas de estilo CSS
  • http.content_type==”video/quicktime” —> Vídeos
  • http.content_type==”application/zip” —> Archivos ZIP
  • http.request.method==”GET” —> Tipo de Petición GET
  • http.request.method==”POST” —> Tipo de Petición POST
  • http.user_agent contains “Mozilla” —> Navegador Mozilla
  • http.request.uri!=*—> Con esto me libro de los paquetes “NOTIFY * HTTP…”
  • http.request.uri matches “[0-9]” —> Uso de expresiones regulares.