[TUTO] UDP/IP Spoofing con PERL

Iniciado por mr.blood, Mayo 13, 2013, 07:41:46 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Mayo 13, 2013, 07:41:46 PM Ultima modificación: Agosto 08, 2014, 10:01:16 PM por Expermicid
De mr.blood para No tienes permitido ver los links. Registrarse o Entrar a mi cuenta




Hoy tratamos el tema de IP Spoofing sobre el protocolo UDP, pues es mas facil (no tiene comprobaciones) y el concepto es el mismo.

Primero, que es Spoofear una IP:
Es enviar datos con una IP falsa. Problemas que plantea, no recibiremos la respuesta del servidor, por lo que no es valido para mantener una comunicacion, solo nos puede servir para enviar un paquete "anonimo".
Montaremos un pequeño servidor en Perl que solo nos muestre la IP y los datos.

Codigo servidor.
Código: perl
#!/usr/bin/perl

use IO::Socket::INET;

my ($socket, $datos);
$socket = new IO::Socket::INET(LocalPort=>5000, Proto=>"udp");
while(1)
{
        $socket->recv($datos, 1024);
        print $socket->peerhost()." $datos";
}
$socket->close();


Bien, lo que tenemos que hacer para Spoofear una IP es crear la cabecera IP (y la UDP) cambiando el campo que contiene nuestra IP por la que queramos. Es facil de entender pero programar el cliente me rompio la cabeza
Como no queremos liarnos mas de lo necesario dejamos los checksum a 0.

Codigo cliente.
Código: perl
#!/usr/bin/perl
use Socket;
use strict;

#~ Datos
my $data        =       "Hi!\n";
#~ UDP Header
my %udp         =       (sport=>(rand(3000)+5001), dport=>5000, len=>8+length($data), checksum=>0);
#~ IP Header
my %ip          =       (version=>4, IHL=>"45", ToS=>0, TL=>0, ID=>rand(20000), flags=>"010", FO=>"0"x13, TTL=>64,
                                Proto=>17, checksum=>0, saddr=>(gethostbyname("111.111.111.111"))[4],
                                daddr=>(gethostbyname("127.0.0.1"))[4]);

#~ Esto es cosa del protocolo IP, los flags y FO van "juntos"
my $ip_flags_FO=$ip{flags}.$ip{FO};

#~ Preparamos el paquete
my $paquete=pack("H2H2nnB16C2na4a4", $ip{IHL}, $ip{ToS}, $ip{TL}, $ip{ID},
                        $ip_flags_FO, $ip{TTL}, $ip{Proto},
                        $ip{checksum}, $ip{saddr},      $ip{daddr}).pack("nnnn",$udp{sport},
                        $udp{dport}, $udp{len}, $udp{checksum}).pack("a*", $data);

#~ Creamos el descriptor en SOCK del tipo SOCK_RAW
socket(SOCK, AF_INET, SOCK_RAW, 255);
#~ Para que la funcion send sepa donde enviarlo
my $destino = pack('Sna4x8', AF_INET, $udp{dport}, $ip{daddr});
send(SOCK,$paquete,0,$destino);


Fuentes:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (Me apoye para los pack)
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (Me apoye para los pack tambien)
Propia (Horas mirando con Wireshark)
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta