Estoy intentando programarme una herramienta que esnife el tráfico HTTP de mi navegador, para después trabajar con lo que intercepte. Por ahora estoy intentando probar algún método que me permita sacar únicamente las cabeceras HTTP (y el contenido POST si hubiera mandado alguno) y que no me muestre el documento HTML o el contenido en general que viene en la respuesta del servidor. He intentado hacerlo de mil formas, pero no he conseguido ningún resultado satisfactorio. Lo más cerca que he estado ha sido haciendo una chapuza (porque no tiene otro nombre, es una chapuza) que a veces funciona, y a veces no. Aquí dejo lo que he estado intentado hacer:
Using perl Syntax Highlighting
- #!/usr/bin/perl -w
- use strict;
- use Net::PcapUtils;
- use NetPacket::Ethernet;
- use NetPacket::IP;
- use NetPacket::TCP;
- use Data::HexDump; # Recordar: soltar volcado en Hex para otras herramientas
- use Term::ANSIColor;
- unless ( $ARGV[0] ) { &error_param; }
- my $option = $ARGV[0];
- if ( $option eq "-h" ) { &help; }
- # Recordar: meter filtros al gusto mediante argumentos
- # Recordar: optimizar la selección de opciones, y añadir las que había pensado
- my %filter = (
- "-d" => "dst port 80", # Cabeceras que envía el navegador
- "-s" => "src port 80", # Cabeceras que envía el servidor
- "-b" => "port 80" # Ambas cabeceras
- );
- ETIQUETA: # Esto es una guarrada, pero no consigo hacerlo de otra forma
- print "\n\n";
- Net::PcapUtils::loop( \&process_pkt, SNAPLEN => 1000, FILTER => $filter{$option} );
- # Aquí metemos la subrutina para leer los paquetes y limpiarlos
- sub process_pkt {
- my ( $arg, $hdr, $pkt ) = @_;
- my $eth_obj = NetPacket::Ethernet->decode($pkt);
- if ( $eth_obj->{type} == 0x0800 ) {
- my $ip_obj = NetPacket::IP->decode( $eth_obj->{data} );
- if ( $ip_obj->{proto} == 6 ) {
- my $tcp_obj = NetPacket::TCP->decode( $ip_obj->{data} );
- if ( $tcp_obj->{data} ) {
- $tcp_obj->{data} =~ s/\r\n\r\n/\nxxxx/g;
- my @todo = split( /\r\n/, $tcp_obj->{data} );
- foreach my $line (@todo) {
- if ( $line =~ "xxxx" ) { goto ETIQUETA; }
- print "\n$line";
- # Esto es otra guarrada, pero es que no consigo hacerlo de ninguna
- # otra manera. Y aun así a veces falla
- }
- }
- }
- }
- }
- sub error_param {
- use Term::ANSIColor qw(:constants);
- local $Term::ANSIColor::AUTORESET = 1;
- print RED "\n[+]";
- print "Necesitas añadir una opción\nUso: perl 0verSniff.pl <opción>\n\n";
- exit;
- }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
¿Alguien conoce alguna forma para poder extraer únicamente las cabeceras (tanto enviadas por el cliente como por el servidor -y el contenido en POST si lo hubiera-)?