Banner 1

Mostrando entradas con la etiqueta spoofing. Mostrar todas las entradas
Mostrando entradas con la etiqueta spoofing. Mostrar todas las entradas

TCP Timestamp y detección de Spoofing

0 comentarios
Antes que nada en este caso entenderemos que se habla de spoofeo de origen (IP Spoofing en la capa IP o mac spoofing en la capa ethernet o ambas...)

Disección de un paquete capturado.

En este caso no nos complicaremos mucho de las demás capas (que no sean la TCP) y nos centraremos principalmente en el campo Options.

Puerto origen (2 bytes) | Puerto destino (2 bytes) | SeqNum (4 bytes) | Acknowledgement (4 bytes) | Tamaño total header (1 byte) | Flags (1 byte) | Window size (2 bytes) | Checksum (2 bytes) | Nulls (2 bytes) | Options (12 bytes) |

De esta forma se estructura un header tcp, pero en este caso únicamente nos centraremos en el campo Options.

Estructura del campo Options:

NOP (1 byte = 0x01) | NOP (1 byte = 0x01) | TimeStamp (8 bytes)|

Dentro del campo de Options de un paquete TCP se puede encontrar un sub-campo (TimeStamp) el cual esta constituido de la siguiente forma:

8 (1 byte)| 10 (1 byte) | TS Value (TSval) (4 bytes) |TS Echo Reply (TSecr) (4 bytes) |

Esto es, el primer valor siempre sera un 8 (8 en hex) y el siguiente 10 (A en hex), y de ahí tenemos dos campos mas: TS Value y TS Echo Reply, el primero se entiende como el valor actual del reloj TCP del servidor que envía dicho paquete, el siguiente (TS Echo Reply) seria el valor del reloj TCP del destino, para esto el paquete tiene que estar respondiendo a otro paquete (ACK) en el cual se especifico dicho valor como TS Value, en caso de que este valor sea invalido se debe enviar como 0.

Bien y ahora que tiene que ver este campo con detección de spoofing?

Pasa que el valor que es enviado cambia de forma constante, puede incluso calcularse en nanosegundos, pero la forma en que este valor cambia varia según el sistema operativo, pero teniendo 2 paquetes del mismo origen se puede medir el retraso y calcular el aumento de este valor (aproximadamente y en la mayoría de los casos), ahora suponiendo que sabemos el valor aproximado que tiene el reloj TCP de una maquina, aunque se cambien campos como son el origen (IP o MAC) si dicho valor no cambia es posible determinar por aproximación de que PC salio dicho paquete únicamente capturando los paquetes.


Ahora vamos a recurrir al sniffer en xs (C++ y perl) que había publicado, pero mejorado para este caso:



view plaincopy to clipboardprint?
#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#ifdef __cplusplus
}
#endif


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
class MyClass {
int raw;
char * interfaz;
int proto;
int buffer;
char * packet_buffer;

public:
MyClass(char * i, int p, int b) {
interfaz = i;
proto = p;
buffer = b;
Makeraw();
BindRaw();
packet_buffer = new char[buffer];
}

~MyClass() {}
void closesocket() {
close(raw);
}

void Makeraw()
{
if((raw = socket(PF_PACKET, SOCK_RAW, htons(proto)))== -1)
{
perror("Imposible crear socket: ");
}
}

int BindRaw()
{

struct sockaddr_ll esqueleto;
struct ifreq ifr;
bzero(&esqueleto, sizeof(esqueleto));
bzero(&ifr, sizeof(ifr));
strncpy((char *)ifr.ifr_name, interfaz, IFNAMSIZ);
if((ioctl(raw, SIOCGIFINDEX, &ifr)) == -1)
{
printf("No se encontro esta interfaz!\n");
return 0;
}
esqueleto.sll_family = AF_PACKET;
esqueleto.sll_ifindex = ifr.ifr_ifindex;
esqueleto.sll_protocol = htons(proto);
if((bind(raw, (struct sockaddr *)&esqueleto, sizeof(esqueleto)))== -1)
{
perror("Imposible poner a la escucha esta interfaz!\n");
return 0;
}
return 1;

}

char * ascii2hex(char * packet,int len)
{
if(!packet)
return 0;
char * buffer = new char[(10 * len)];
if(!buffer)
{
return 0;
}
for (int i = 0; i < len; i++)
{
sprintf(buffer + 9 * i, ",%08x", packet[i]);
}
return buffer;
}

char *leer()
{
/* proto = ETH_P_ALL */
int len;
struct sockaddr_ll packet_info;
int packet_info_size = sizeof(packet_info_size);
if((len = recvfrom(raw, packet_buffer, buffer, 0, (struct sockaddr*)&packet_info, (socklen_t*)&packet_info_size)) == -1)
{
perror("No se pudo leer (-1)!");
return 0;
}
else
{
return ascii2hex(packet_buffer,len);
}
return 0;
}
};

MODULE = Xianur0 PACKAGE = Xianur0

MyClass *
MyClass::new(char * i, int p, int b)

char*
MyClass::leer()

void
MyClass::closesocket()

void
MyClass::DESTROY()




como verán sigue siendo un desastre pero de momento sirve... xD el único cambio que se le hizo es en la función ascii2hex, tenia el problema de que como solo retornaba 2 caracteres del hexadecimal y en caso de que se hiciera acarreo retornaba 0xFF en lugar del valor real del carácter.

en este caso como ya retorna el valor completo toca en perl "corregir" ese valor para hacerlo útil.

Ahora va el núcleo que se encarga de monitorizar los TimeStamps, en este caso lleva registros temporales de los paquetes, pero muchos de esos valores no se utilizan, igualmente lo deje por si lo quieren usar para alguna de sus aplicaciones:


view plaincopy to clipboardprint?
use Xianur0;
use Time::HiRes;
require Exporter;
require DynaLoader;
@ISA = qw(Exporter DynaLoader);
@EXPORT = qw(rpcb_gettime getnetconfigent);
bootstrap Xianur0;
my %promedio = ();
my $start_time = [Time::HiRes::gettimeofday()];
my @packets = ();
my $totalpacks = 0;
my $router = 'xxxxxxxxxxxx';
sub ascii2hex
{
my $str = $_[0];
print $str;
$str =~ s/(.)/sprintf("%02lx", ord $1)/egsm;
return $str;
}

sub iphex_ip {
my $iphex = $_[0];
$iphex =~ s/([a-fA-F0-9]{2})/hex($1)."."/eg;
$iphex =~ s/\.$//g;
return $iphex;
}

sub ethernet {
my $paquete = $_[0];
my $ethernet;
($ethernet,$paquete) = ($paquete =~ /^([\w\d]{28})(.+)/);
return (($ethernet =~ /^([\w\d]{12})([\w\d]{12})([\w\d]{4})/),$paquete);
}

sub ip {
my $paquete = $_[0];
my $ip;
($ip,$paquete) = ($paquete =~ /^([\w\d]{40})(.+)/);
return (($ip =~ /^([\w\d]{2})([\w\d]{2})([\w\d]{4})([\w\d]{4})([\w\d]{4})([\w\d]{2})([\w\d]{2})([\w\d]{4})([\w\d]{8})([\w\d]{8})/),$paquete);
}

sub tcp {
my $paquete = $_[0];
return (($paquete =~ /^([\w\d]{4})([\w\d]{4})([\w\d]{8})([\w\d]{8})([\w\d]{2})([\w\d]{2})([\w\d]{4})([\w\d]{4})([\w\d]{4})([\w\d]{24})(.*)/));
}
while(true) {
my $x = new Xianur0("wlan0",3,20480);
my $contador = 5;
while(($contador--) != 0) {
$paquete = $x->leer();
$paquete =~ s/,[0f]{6}//g;
$paquete =~ s/^,//;
my ($destinomac,$origenmac,$tipo,$paquete) = ethernet($paquete);
if($tipo ne "0800" || $origenmac =~ /$router/i) {$contador++; next;}
my ($versionip,$diffserv,$totallength,$identification,$fragment,$ttl,$protocol,$checksum,$iporg,$ipdst,$paquete) = ip($paquete);
if($protocol ne '06') {$contador++; next;}
my ($srcport,$dstport,$seqnum,$acknowledgement,$hlength,$flags,$window,$checksum,$nulls,$options,$paquete) = tcp($paquete);
my ($nop,$nop,$kind,$dies,$TSval,$TSecr) = ($options =~ /^([\w\d]{2})([\w\d]{2})([\w\d]{2})([\w\d]{2})([\w\d]{8})([\w\d]{8})/);
if($TSval eq "" || $TSecr eq "") {$contador++; next;}
$origenmac =~ s/([\w\d]{2})/$1:/g;
$origenmac =~ s/:$//g;
$destinomac =~ s/([\w\d]{2})/$1:/g;
$destinomac =~ s/:$//g;
my $iporigen = iphex_ip($iporg);
my $ipdestino = iphex_ip($ipdst);
my $time = Time::HiRes::tv_interval($start_time);
my $ts = hex($TSval);
my $difft = $time - $promedio{$iporigen}{'time'};
$packets[$totalpacks]{'time'} = $time;
$packets[$totalpacks]{'ts'} = $ts;
$packets[$totalpacks]{'ip'} = $iporigen;
$packets[$totalpacks]{'mac'} = $origenmac;
$totalpacks++;
if($promedio{$origenmac}{'time'} eq '') {
$promedio{$origenmac}{'time'} = $time;
$promedio{$origenmac}{'ts'} = $ts;
print "\n";
} else {
# print "Diff Time: ".$difft." (aprox.)\n";
my $diffts = $ts - $promedio{$origenmac}{'ts'};
# print "Diff TimeStamp: ".$diffts." (aprox.)\n";
my $clock = $diffts/$difft;
# print "Clock: ".$clock." (aprox.)\n\n";
$promedio{$origenmac}{'clock'} = $clock;
for($z=0; $totalpacks > $z; $z++) {
my $timetmp = $packets[$z]{'time'};
next if($timetmp > $ts || ($packets[$z]{'mac'} eq $origenmac && $packets[$z]{'ip'} eq $iporigen));
# $clock =~ s/\..+//g;
my $tmpts = $packets[$z]{'ts'} + (($time-$temptmp) * $clock);
my $diferencia = $tmpts - $ts;
$diferencia =~ s/^-//;
if(7000 > $diferencia) {
print "[!] Spoofing detectado!\n\tMAC Original: ".$packets[$z]{'mac'}."\n\tMAC Actual: ".$origenmac."\n\tIP Original: ".$packets[$z]{'ip'}."\n\tIP Actual: ".$iporigen."\n";
print "\tOrigen (mac): ".$origenmac."\n\tDestino (mac): ".$destinomac."\n";
print "\tOrigen (ip): ".$iporigen.":".hex($srcport)."\n\tDestino (ip): ".$ipdestino.":".hex($dstport)."\n\tTSval: ".$ts.
"(".$TSval.")\n\tTSecr: ".hex($TSecr)."(".$TSecr.")\n\tTime: ".$time."\n\tClock: ".$clock."\n\n";

}
}
}
}
}
print "Terminamos!\n";


Como podrán apreciar se puede utilizar para un sin fin de cosas...

Fuente: http://hackingtelevision.blogspot.com/2010/12/tcp-timestamp-y-deteccion-de-spoofing.html

Defiéndete de ataques arp-spoofing / MITM (Man In The Middle) con ArpON

0 comentarios
Es un documento excelente :D para que lo tengan en cuenta

----------------------------------------------------------------------------------------------------


ArpON (Arp handler inspectiON) es una herramienta que permite manipular algunos aspectos del protocolo ARP. Una de sus cualidades destacadas es la de hacer el protocolo ARP más seguro. Implementa dos técnicas de defensa contra ataques de envenenamiento ARP (ARP spoofing):

  • SARPI "Static Arp Inspection"
  • DARPI "Dynamic Arp Inspection"
En este caso vamos a estudiar la segunda.

DARPI
Una vez entra en funcionamiento, lo primero que hace es limpiar la caché ARP eliminando todas las entradas evitando así posibles envenamientos previos.
Después obedece a las siguientes políticas de gestión de paquetes ARP utilizando una caché propia llamada caché DARPI:
  • Para los paquetes ARP request:

Seguir Leyendo...

- Salientes: Los generamos nosotros, por tanto ArpON los deja pasar y añade una entrada con la dirección destino a la caché DARPI (para posteriormente ser consultada cuando lleguen paquetes ARP reply)

- Entrantes: ArpON rechaza el paquete y borra la entrada correspondiente a la dirección origen de la caché ARP (ya que este paquete puede estar envenenado); el kernel enviará un paquete ARP request a esa dirección origen, y este paquete se gestionará siguiendo la política de paquetes salientes DARPI.
De esta forma, ArpON nos defiende de ataques de envenenamiento ARP mediente paquetes ARP request.
  • Para los paquetes ARP reply

- Salientes
: Estos paquetes los generamos nosotros y ArpON les da paso.

- Entrantes: ArpON comprueba si la dirección origen se encuentra en la caché DARPI (la que fue añadida al enviar un ARP request saliente); en ese caso, lo deja pasar y añade una entrada en la cache ARP. Si la dirección origen no se encuentra en la caché DARPI, ArpON rechaza el paquete y elimina la entrada de la caché ARP.
De esta forma, ArpON nos defiende de ataques de envenenamiento ARP mediente paquetes ARP reply.

Desde la página principal nos informan de que el servicio ArpON no afecta al rendimiento del protocolo ARP.

- Vamos una demostración de cómo trabaja esta herramienta:

Para esta demostración se ha descargado, compilado e instalado las librerías que se propone desde la página principal de ArpON:
  • libpcap-0.9.8.tar.gz
  • libnet-1.1.2.1.tar.gz
  • libdnet-1.11.tar.gz

Escenario
:

1 Un pc con Debian instalado se defenderá de ataques arp-spoofing utilizando ArpON.

2 Otro pc con Debian instalado será el atacante y lanzará un ataque arp-spoofing (arp reply) utilizando ettercap entre la víctima y la puerta de enlace.

  • IP atacante: 192.168.6.137 dirección MAC uu:vv:ww:EC:D4:B9
  • IP víctima: 192.168.6.150 dirección MAC xx:yy:zz:55:38:C3
  • IP puerta de enlace: 192.168.6.1 dirección MAC rr:ss:tt:C0:00:08

Primero, veamos el desarrollo del ataque sin utilizar ArpON:

$ ettercap -T -M arp /192.168.6.150/ /192.168.6.1/

Una vez lanzado el ataque, podremos consultar la caché ARP de la víctima y comprobar que en dicha tabla, la dirección mac correspondiente a la puerta de enlace (192.168.6.1) es en realidad la dirección mac del atacante (:::EC:D4:B9). En la siguiente imagen podemos ver la salida de ettercap al lanzar el ataque:


Observamos el cambio en la caché ARP antes y después del lanzar el ataque.
Antes:
Después:

En este instante la víctima enviará al atacante, sin saberlo, todos los paquetes con destino a la puerta de enlace.

- Veamos qué sucede cuando se lanza el mismo ataque pero ArpON está en funcionamiento:

Ejecutamos ArpON en el pc que deseamos proteger en modo dinámico (DARPI):

$./arpon -i eth0 -y

Observamos que lo primero que hace es borrar todas las entradas de la caché ARP. En este caso, la tabla contenía entradas de las direcciones IP 192.168.6.1, 192.168.6.2 y 192.168.6.254:


Si en ese momento consultamos la caché ARP obtenemos que está vacía:



ArpON nos permite observar las acciones que va realizando en cada momento, si el atacante lanza el mismo ataque que antes, observamos lo siguiente:

Al recibir los paquetes ARP reply envenenados del atacante, observamos que al no encontrar la dirección origen en la caché DARPI, inmediatamente elimina esta entrada de la caché ARP. Este proceso lo repetirá para cada paquete ARP reply envenenado que reciba:


Veamos ahora qué sucede cuando se recibe una petición ARP válida y cómo comprueba que no está enveneada. En este caso será un host con IP 192.168.6.136 (xx:yy:zz:34:F4:F4) el que se comunicará con la víctima.
  1. 1. Recibe un paquete ARP request de la 192.168.6.136
  2. 2. Al no encontrar la dirección origen del paquete en la caché DARPI borra la entrada de la caché ARP
  3. 3. Añade la dirección origen a la caché DARPI y lanza un ARP request a esta dirección
  4. 4. Recibe la respuesta (un paquete ARP reply) y esta vez sí que se encuentra la dirección origen en la caché DARPI, por tanto borra esta entrada de la caché DARPI y la añade a la caché ARP


que es una direccion mac y mac spoofing

0 comentarios
Que es MAC (gracias a mi amigo ek)

En redes de computadoras la dirección MAC (Media Access Control address o dirección de control de acceso al medio) es un identificador hexadecimal de 48 bits que se corresponde de forma única con una tarjeta o interfaz de red. Es individual, cada dispositivo tiene su propia dirección MAC determinada y configurada por el IEEE (los últimos 24 bits) y el fabricante (los primeros 24 bits) utilizando el OUI. La mayoría de los protocolos que trabajan en la capa 2 del modelo OSI usan una de las tres numeraciones manejadas por el IEEE: MAC-48, EUI-48, y EUI-64 las cuales han sido diseñadas para ser identificadores globalmente únicos. No todos los protocolos de comunicación usan direcciones MAC, y no todos los protocolos requieren identificadores globalmente únicos.

La dirección MAC es utilizada en varias tecnologías entre las que se incluyen:

* Ethernet
* 802.5 o redes en anillo a 4 Mbps o 16 Mbps Token Ring
* 802.11 redes inalámbricas (WIFI).
* ATM

MAC opera en la capa 2 del modelo OSI, encargada de hacer fluir la información libre de errores entre dos máquinas conectadas directamente. Para ello se generan tramas, pequeños bloques de información que contienen en su cabecera las direcciones MAC correspondiente al emisor y receptor de la información.

En pocas palabras, es un codigo o mejor, numero o direccion que pone el fabricante de la tarjeta de red, que es unica en el mundo e identifica al computador que se conecta a una red por medio de una tarjeta de red ( sea local o wiereless ).


Mac spoofing

Puede haber razones muy diversas para decidir camuflar la MAC (es decir, la dirección Ethernet de los dispositivos de red, grabada "a fuego" en su hardware), pero la forma de lograrlo es muy diferente según el sistema operativo de que se trate...

Supongamos que 00:00:00:AA:AA:AA sea la MAC deseada y vayamos por partes, sin utilizar en ningún caso aplicaciones ajenas al propio sistema operativo:

Linux
Basta teclear estos tres comandos:

  1. ifconfig eth0 down
  2. ifconfig eth0 hw ether 00:00:00:AA:AA:AA
  3. ifconfig eth0 up

BSD
El proceso a seguir es muy similar al visto para Linux:

  1. ifconfig xl0 down
  2. ifconfig xl0 link 00:00:00:AA:AA:AA
  3. ifconfig xl0 up

Mac OS X
Ojo: si la versión es anterior a Tiger antes hay que aplicar un parche al kernel.

  1. sudo ifconfig en0 lladdr 00:00:00:AA:AA:AA

Windows 2000/XP (método A)

En Windows has de saber primero si tu dispositivo de red soporta o no la clonación de MAC. Si no es ése el caso, has de ir al método B.

  1. Inicio -> Configuración -> Panel de Control -> Redes
  2. Click derecho sobre el NIC cuyo MAC se quiere cambiar -> Propiedades.
  3. General -> Configuración -> Avanzada.
  4. Propiedad -> Dirección de Red (o Dirección administrada localmente).
  5. Valor -> Teclear la nueva MAC (sin los : de separación).
  6. Ventana de comandos -> teclear ipconfig /all (o net config rdr) para comprobar si se ha realizado o no el cambio.
  7. Si el cambio se ha realizado, rearrancar la máquina. Si no, probar el método B.

Windows 2000/XP (método B)

  1. Inicio -> Ejecutar -> Teclear regedt32.
  2. Ir a HKEY_LOCAL_MACHINE\SYSTEM\
    CurrentControlSet\Control\Class\
    {4D36E972-E325-11CE-BFC1-08002BE10318}
  3. Doble clic
  4. Buscar la clave DriverDesc del interfaz que se quiere modificar.
  5. Editar (o añadir) la clave de cadena (tipo REG_SZ) NetworkAddress para que contenga la nueva MAC.
  6. Deshabilitar y volver a habilitar el interfaz cambiado (o rearrancar el sistema).

Se trata de una operación nada habitual -cierto- pero que obliga a replantearse si Windows resulta siempre el sistema más amistoso con el usuario.

Fuentes e información complementaria:

  • Changing Your MAC Address In Window XP/Vista, Linux And Mac OS X [IronGeek]
  • MAC Address Spoofing [Mac Greekery]
  • http://www.klcconsulting.net/Change_MAC_w2k.htm
  • http://www.tuxapuntes.com/tux/content/view/68/143/
  • http://www.kriptopolis.org/MAC-spoofing --mejor fuente :D
  • http://www.online-tech-tips.com/computer-tips/how-to-change-mac-address/ --Sobre windows
  • http://www.irongeek.com/i.php?page=security/changemac
  • http://www.talvi.net/notes/mac-spoofing.html
  • http://www.perturb.org/display/entry/549/
  • http://foro.latinohack.com/showthread.php?t=8216 --segunda fuente

Saludos y espero le sirva , tratare de ir tocando estos temas mas dinamicamente :D
Powered by Bad Robot
Helped by Blackubay