martes, 26 de marzo de 2013

Ayuda con un proyecto (I need you)

Saludos,

***********************************
Editado: Gracias a      he encontrado un módulo llamado Sniffer::HTTP que hace lo que yo necesito. En concreto en la documentación oficial muestran un script llamado "Live-HTTP-Headers.pl" (se encuentra en CPAN, facil de localizar :P)  que hace EXACTAMENTE lo que yo no podía. Asi que me ha venido como anillo al dedo.  También doy gracias a toda la comunidad en general, por haberme bombardeado a ideas, se agradece un montón
*********************************

 
      Quiero codear una herramienta para auditorías que me permita torturar jugar con el protocolo HTTP. La cuestión es que estoy intentando implementar un sniffer para el puerto 80, cosa que debería de ser bastante sencilla. Pero no, me estoy topando con un problema que no consigo solventar de forma alguna. He preguntado en distintos foros especializados en PERL, he llamado por teléfono a un par de conocidos que suelen usar PERL para sus tareas, y nada. Nadie consigue darme una solución para un problema tan sencillo. ¿Y cual es mi problema?


      Mi problema es que cuando recibo las cabeceras procedentes del servidor también se me cuela el contenido HTML, o si se trata de una imagen, su source (que son caracteres rarunos, como es lógico). Y yo lo único que deseo son las cabeceras (y si hay contenido POST, pues lo que se envíe). Lo primero que pensé fue: "esto es fácil, si no mal recuerdo al final de las cabeceras viene el doble CRLF, asi que me hago un regexp que me lo localice borro el resto". Fácil mis cojones. Por algún oscuro motivo que no consigo descubrir, no chutaba. Asi que tiré del plan B: cojo todo lo que viene encapsulado por el puerto 80, y me hago un array con split(), usando como referencia el doble CRLF, de tal forma que me quedo con la primera parte (que en teoría correspondería a las cabeceras) y descarto el segundo elemento que en teoría contendría "la basura" que no quiero. Mis cojones.

      De forma aleatoria a veces funcionaba, a veces no. En este momento me planteé que quizás no siempre se usase el doble CRLF, sino que por algún retorcido motivo no se ajustasen a ese estándar, asi que lo que hice fue imprimime por pantalla todo y cuando encontrase un doble CRLF me lo susitutyera por un "xxxx". De esta forma podría ver en pantalla un "xxxx" por cada doble CRLF que me enviasen. Y... siempre aparecía. Incluso cuando me colaba "basura" (el documento HTML, el source de las imagenes....) aparecía el "xxxx". Asi que no sé porqué diablos no me funcionaba mi idea de hacer split().


     A continuación tiré de una idea más sucia: pasar todo lo que sacaba del paquete sniffado, trocearlo linea por línea, y si encontraba en una línea un "xxxx" (que estaba sutituyendo los dobles CRLF) rompiera el bucle con un GOTO.


   Esta idea parecía buena... y en la mayoría de los casos me funca, pero aun así hay veces que no. Adjunto aquí algunas capturas:


   En esta primera captura vemos que el método "sucio" de filtrado funciona perfectamente, y me saca las cabeceras (tanto del cliente como del servidor) perfectamente. Sin embargo si continúo navegando, me encuentro con cosas como esta:

  Ahí se pueden ver que se ha colado parte del source de una imagen, cuando no debería de aparecer. El código fuente del PoC para sniffear es este de aquí . Necesitais descargar libpcap (y libpcap-dev) para poder instalar los módulos de perl que os hacen falta. Y ejecutarlo como root para poder tener acceso a las interfaces de red.


  En fin, ya que absolutamente nadie me ha podido ayudar, espero que algún lector se le ilumine la bombilla y me eche una mano, porque estoy desesperado. Si se os ocurren ideas, posteadlas en los comentarios, o pedime mi skype por twitter y charlamos. Cualquier idea, por pequeña o estúpida que sea (joder, más estupida que usar GOTOs no puede haber x'D), es bien recibida, no tengais miedo.


Byt3z

5 0verl0ad Labs: Ayuda con un proyecto (I need you) Saludos, *********************************** Editado: Gracias a   @ mjimeneznet    he encontrado un módulo llamado Sniffer::HTTP que hace...

3 comentarios:

Anónimo dijo...

Podes probar pasar todo el contenido a código ascii donde falla para ver exactamente que caracteres ap aparecen.

Suerte
@matzub

The X-C3LL dijo...

@Matzub los caracteres que aparecen son los del source de una imagen. En su momento para asegurarme los pasé a hexa y vi que tenía las cabeceras de gif, por ejemplo.

La cosa está en que los caracteres que vienen detrás de las cabeceras, tanto raros como normales, no quiero que aparezcan.

Anónimo dijo...

Que bueno que encontraste un modulo hecho! Me lo apunto! Nunca se sabe cuando vienen bien.
Mas de una vez, esos caracteres raros te vuelven loco... a veces mejor tirar un regexp que limpie todo antes de analizar :)

Buenísimo tu búsqueda blog! Gracias por la info!

Saludos @matzub

< >