G2 P8 PacketSniffingandSpoofing
G2 P8 PacketSniffingandSpoofing
G2 P8 PacketSniffingandSpoofing
Facultad de Ingenierı́a
Ingenierı́a en Telecomunicaciones
Seguridad en Redes
1. Marco teórico
1.1. Spoofing, Qué es y cómo evitarlo
La suplantación de identidad no es algo nuevo; el intento de hacerse pasar por otra persona
para sacar provecho de alguna manera es algo que siempre ha estado presente. En la era de la
comunicación, como no podı́a ser de otra manera, también existe y se conoce con el nombre
de spoofing, un anglicismo que podrı́amos traducir como burla o pantomima.
El spoofing consiste en una serie de técnicas hacking, por lo general, con intenciones
maliciosas, creadas para suplantar la identidad de entidades o personas en la red, con el
objetivo de obtener información privada o para conseguir acceder a páginas con una credencial
falsa.
1.1.1. Tipos de spoofing
Son múltiples las formas en las que se puede realizar un ataque spoofing, cualquiera de
las tecnologı́as de red actual es susceptible de ser utilizada para tal fin. Por tanto, podemos
hacer una clasificación según la fuente del ataque.
1
• E-mail spoofing El atacante utilizará la dirección de correo de una persona o una en-
tidad confiable, ya sea para solicitar información confidencial, para hacer spam o enviar
de forma masiva cadenas de hoax o bulos. De la misma manera, una cuenta de correos
puede ser robada y utilizada para enviar cualquiera de sus correos malintencionados.
Esta suplantación se denomina phishing y se usa sobre todo para hacerse pasar por
entidades bancarias y solicitar de alguna manera las claves de acceso a la cuenta corriente
• Suplantación web
A diferencia del phishing, con este tipo de spoofing no se pretende imitar exactamente
una web. En este caso, los atacantes hacen una intermediación entre el atacado y las
páginas web que pretende visitar. De esta forma podrán monitorear su actividad, tener
un registro de sus visitas, acceder a sus contraseñas y sus datos personales.
2
2. Configuración y comandos del contenedor
En este laboratorio, usaremos dos máquinas conectadas a la misma LAN. Podemos usar
dos máquinas Virtuales o dos Contenedores. La Figura 1 describe la configuración del entorno
de laboratorio utilizando Contenedores. Realizaremos todos los ataques desde el Contenedor
del atacante, mientras que el otro contenedor sera la máquina del usuario.
3
Figura 2: Entorno levantado
Dado que todos los contenedores estarán corriendo en un segundo plano. Necesitamos
correr comandos para interactuar con los mismos, una de las operaciones fundamentales es
obtener una shell en el contenedor. Para este propósito usaremos docker pspara encontrar el
ID del contenedor deseado y ingresaremos docker exec para correr una shell en ese contene-
dor. Hemos creado un alias para ello dentro del archivo .bashrc.
Ahora se procede a realizar la conexión con la máquina atacante a través del comando docksh,
ver figura 3.
• Host mode: El modo host permite que el contenedor del atacante vea el trafico de
toda la red. La siguiente entrada es usada para el contenedor del atacante:
4
\$ network_mode: host
Cuando un contenedor esta en modo host, este puede ver todas las interfaces de red de
los hosts que la componen, inclusive tiene la misma dirección IP como si fuera el host
principal. Básicamente es ponerlo en el mismo espacio de red como si fuera la máquina
Virtual de Host. Sin embargo, el contenedor sigue siendo una máquina diferente.
5
3. Lab Task Set 1: Using Scapy to Sniff and Spoof Packets
Para realizar esta tarea se utilizara Scapy el cual es una herramienta que nos permite
integrar funcionalidad de sniffing y spoofing. Para usar Scapy, podemos escribir un programa
en Python y ejecutarlo usando este interprete, ver figura 6.
Código:
1 #!/bin/bin/python
2
5 a = IP()
6
7 a.show()
Código 1: Init.py
Explicación:
En el código 1, el método IP crea y retorna una nueva IP por defecto y paquete vacı́o. Si
ejecutamos el comando show este nos mostrara el contenido del paquete.
Es necesario utilizar sudo ya que requiere de privilegios de root para la manipulación de
paquetes, ver figura 7.
6
Figura 7: Ejecución: init.py
1 #!/usr/bin/env python3
2 from scapy.all import *
3
4 def print_pkt(pkt):
5 pkt.show()
6
Código 2: Sniffer.py
Tarea 1.1A: En el programa anterior, por cada paquete capturado, la función print pkt()
sera invocada como un callback; esta función mostrara información detallada del paquete.
Ejecute el programa con privilegios de root y demuestre como captura los paquetes. Después
de eso corra el programa sin privilegios de root; Describa y explique sus observaciones.
Resolución:
Código: Para esta parte se utilizara el código 3.
7
1 #!/usr/bin/python
2
5 def print_pkt(pkt):
6 pkt.show()
7
8 interfaces = ['br-661ffaad862a','enp0s3','lo']
9 pkt = sniff(iface=interfaces, filter='icmp', prn=print_pkt)
Código 3: Sniffer.py
Explicación:
1. Acerca del código: Se escoge las interfaces a auditar usando el comando ifconfig en
la terminal y se los menciona en una lista de las interfases de las que se desea hacer el
sniffing de los paquetes. Usando el filtro, Scapy nos mostrará sólo los paquetes ICMP.
2. Acerca de la pregunta: El orden para correr el programa debe ser con altos privilegios
es decir con root, se utiliza el comando sudo chmod a+x sniffer.py, con este comando
se otorga privilegios de ejecución a todos los usuarios. Para comprobar el funcionamiento
del programa se utiliza el comando ping direccionado a 8.8.8.8 el cual corresponde al
DNS de google, ver figura 8a. Y a través del programa sniffer.py se puede observar
que los paquetes ICMP son capturados, ver figura 8b.
Se vuelve a ejecutar el programa, pero esta vez, sin usar el privilegio de root. Como se
sabe, el método sudo (hacer de superusuario) requiere que el usuario esté configurado
con el poder de ejecutar çomo root”. Ası́ que esta vez, ejecutaremos el programa sin
sudo, ver figura 9.
8
Figura 9: Error de Sniffing
Esto ocurre porque para correr los programas de sniffing de paquetes, para ver y capturar el
trafico debe ser con privilegios altos.
Tarea 1.1B:
1 #!/usr/bin/python
2
5 def print_pkt(pkt):
6
13 if pkt[ICMP].type == 0:
14 print(f"\tICMP type: echo-reply")
15
16 if pkt[ICMP].type == 8:
17 print(f"\tICMP type: echo-request")
18
19
20
21 interfaces = ['br-e12cb9117793','enp0s3','lo']
22 pkt = sniff(iface=interfaces, filter='icmp', prn=print_pkt)
Explicación:
9
1. Acerca del código: Se esta utilizando el mismo filtro que el código sniffer.py
el cual acepta la sintaxis de Filtro de paquetes Berkeley.
2. Acerca de la pregunta: Igual que lo antes realizado se envı́a un ping a tra-
ves del comando ping -c 2 8.8.8.8, los cuales estos dos paquetes están siendo
capturados, ver figura 10.
1 #!/usr/bin/python
2
5 def print_pkt(pkt):
6 if pkt[TCP] is not None:
7 print("TCP Packet=====")
8 print(f"\tSource: {pkt[IP].src}")
9 print(f"\tDestination: {pkt[IP].dst}")
10 print(f"\tTCP Source port: {pkt[TCP].sport}")
11 print(f"\tTCP Destination port: {pkt[TCP].dport}")
12
13
14 interfaces = ['br-e12cb9117793','enp0s3','lo']
15 pkt = sniff(iface=interfaces, filter='tcp port 23 and src host 10.9.0.1', prn=print_pkt)
Explicación:
10
1. Acerca del código: Esta vez he filtrado con tcpport 23 and src 10.9.0.1.
La sintaxis que se utilizo para este filtro es de la página web de sintaxis BPF. Y
de nuevo como el código anterior, se imprime sólo los datos relevantes para esta
pregunta. Por eso no se ocupo show.
• Capturar paquetes que vienen o se dirigen hacia una subnet en particular. Puede elegir
cualquier subnet como 128.230.0.0/16; no deberıa de elegir la subnet a la cual su
Maquina Virtual esta adjunta.
Código: Los códigos ha utilizar para este punto sera los códigos 6 y 7.
1 #!/usr/bin/python
2
5 def print_pkt(pkt):
6 pkt.show()
7
8 interfaces = ['br-661ffaad862a','enp0s3','lo']
9 pkt = sniff(iface=interfaces, filter='dst net 128.230.0.0/16', prn=print_pkt)
Código 6: subnet_sniffer.py
11
1 from scapy.all import *
2
3 ip=IP()
4 ip.dst='128.230.0.0/16'
5 send(ip,4)
Código 7: send_subnet_packet.py
Explicación:
12
Figura 13: Ejecución: send_subnet_packet.py
3 a = IP()
4 a.src = '1.2.3.4'
5 a.dst = '10.9.0.5'
6 send(a/ICMP())
7 ls(a)
Código 8: icmp_spoofing.py
Explicación:
1. Acerca del código: Se va ocupar otra VM la IP destino en este caso sera la 10.9.0.5 y
se enviara un paquete ICMP utilizando una dirección IP aleatoria en este caso 1.2.3.4.
13
Figura 14: Ejecución: icmp_spoofing.py
14
1 from scapy.all import *
2
3 inRoute = True
4 i = 1
5 while inRoute:
6 a = IP(dst='216.58.210.36', ttl=i)
7 response = sr1(a/ICMP(),timeout=7,verbose=0)
8
9 if response is None:
10 print(f"{i} Request timed out.")
11 elif response.type == 0:
12 print(f"{i} {response.src}")
13 inRoute = False
14 else:
15 print(f"{i} {response.src}")
16
17 i = i + 1
Código 9: traceroute.py
Explicación:
15
Figura 16: Ejecución: traceroute.py
Código:
Explicación:
1. Acerca del código: El bloque if comprueba si un ICMP es una petición. Si es cierto,
el paquete de respuesta se basará en los detalles derivados del paquete original, pero
16
invertirá el dst y el src para que cada vez que vea una petición de eco ICMP, independien-
temente de cuál sea la dirección IP de destino, el programa envı́e inmediatamente una
respuesta de eco utilizando esta técnica de suplantación de paquetes. El pkt[Raw].load
se utiliza para almacenar la carga de datos del paquete original de esta manera volverá
correctamente al remitente.
Primer escenario: VM2 envı́a un ping a 1.2.3.4 que es un host inexistente en Internet.
Sin el programa obtendremos una pérdida de paquetes del 100 % porque nunca va a volver
a la fuente. Podemos ver en la captura de pantalla del wireshark que el protocolo ARP está
preguntando por 1.2.3.4 y preguntando en la red ¿quién tiene ese destino IP? Ası́ que el
atacante (mi programa en VM1) devuelve con una respuesta a la misma y el paquete ICMP
vuelve a la VM2.
17
Figura 18: Envió trazas ICMP
18
Figura 20: Escenario 2
Tercer escenario: VM2 envı́a un ping a 8.8.8.8 que es un host existente en Internet.
Este escenario es diferente de los otros porque realmente existe en la red. Ası́ que en este caso
estamos recibiendo respuestas duplicadas, eso es porque el destino real está respondiendo
a la fuente, pero el programa también está respondiendo a la fuente. Lo podemos ver muy
claramente en las capturas de pantalla y en la grabación de wireshark.
19
Figura 22: Envió trazas ICMP
20
4. Lab Task Set 2: Escribiendo programas para hacer sniffing
y spoofing
Para este conjunto de Tareas, debe compilar codigo en C en la Máquina Virtual Host y
correrlo dentro del contenedor.
Los Sniffers pueden ser escritos usando la librerı́a pcap. Usar pcap facilita la tarea del
desarrollo de un sniffer ya que implica invocar una serie de funcione nativas de la librerı́a. Al
final de cada secuencia y a medida que vayan siendo capturados, los paquetes serán colocados
en un buffer para un procesamiento posterior.
21
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <pcap.h>
4 #include <arpa/inet.h>
5
6
7 /* Ethernet header */
8 struct ethheader {
9 u_char ether_dhost[6]; /* destination host address */
10 u_char ether_shost[6]; /* source host address */
11 u_short ether_type; /* protocol type (IP, ARP, RARP, etc) */
12 };
13
14 /* IP Header */
15 struct ipheader {
16 unsigned char iph_ihl:4, //IP header length
17 iph_ver:4; //IP version
18 unsigned char iph_tos; //Type of service
19 unsigned short int iph_len; //IP Packet length (data + header)
20 unsigned short int iph_ident; //Identification
21 unsigned short int iph_flag:3, //Fragmentation flags
22 iph_offset:13; //Flags offset
23 unsigned char iph_ttl; //Time to Live
24 unsigned char iph_protocol; //Protocol type
25 unsigned short int iph_chksum; //IP datagram checksum
26 struct in_addr iph_sourceip; //Source IP address
27 struct in_addr iph_destip; //Destination IP address
28 };
29
30 void got_packet(u_char *args, const struct pcap_pkthdr *header,
31 const u_char *packet)
32 {
33 printf("Paquete capturado\n");
34 struct ethheader *eth = (struct ethheader *)packet;
35
36 if (ntohs(eth->ether_type) == 0x0800) { // 0x0800 is IP type
37 struct ipheader * ip = (struct ipheader *)
38 (packet + sizeof(struct ethheader));
39
40 printf(" IP origen: %s\n", inet_ntoa(ip->iph_sourceip));
41 printf(" IP destino: %s\n", inet_ntoa(ip->iph_destip));
42
43 }
44 }
45
46 int main()
47 {
48 pcap_t *handle;
49 char errbuf[PCAP_ERRBUF_SIZE];
50 struct bpf_program fp;
51 char filter_exp[] = "icmp";
52 bpf_u_int32 net;
53
54 // Step 1: Open live pcap session on NIC with name enp0s3
55 handle = pcap_open_live("enp0s3", BUFSIZ, 1, 1000, errbuf);
56
57 // Step 2: Compile filter_exp into BPF psuedo-code
58 pcap_compile(handle, &fp, filter_exp, 0, net);
59 if (pcap_setfilter(handle, &fp) !=0) {
60 pcap_perror(handle, "Error:");
61 exit(EXIT_FAILURE);
62 }
63
64 // Step 3: Capture packets
65 pcap_loop(handle, -1, got_packet, NULL);
66
67 pcap_close(handle); //Close the handle
68 return 0;
69 }
70
22
Código 11: sniff.c
En el código 11 se modifico la interfaz de red de ’enp0s3’ a ’br-3ba397d38a2c’. Esta interfaz
pertenece a la red de contenedores creada con docker.
23
Figura 25: Ping realizado del Host A al Hos B
• Pregunta 1 Por favor explique con sus propias palabras la secuencia de llamados que
realiza la librerı́a y que son esenciales para el sniffer. Esta explicación no debe ser tan
detallada como la del libro o el tutorial.
◦ Primer paso,se abre una sesión de pcap en vivo en NIC con el nombre ’br-3ba397d38a2c’,
que corresponde a la interfaz del los contenedores, esta operación la realiza ’pcap open live’
(una función de la biblioteca pcap). Esta función permite ver todo el tráfico de red
en la interfaz y enlaza el socket.
◦ Segundo paso, configuración del filtro usando los siguientes métodos: pcap compile()
se usa para compilar la cadena ’str’ en un programa de filtro pcap setfilter() que
se usa para especificar un programa de filtro.
◦ Tercer paso, se capturan los paquetes en un bucle y se procesan los paquetes cap-
turados usando la función ’pcap loop’, el -1 significa un bucle infinito.
• Pregunta 2 ¿Por qué se necesitan privilegios de root para correr el sniffer? ¿En dónde
falla el programa si es ejecutado sin privilegios de root?
◦ El modo promiscuo es una parte del chip la tarjeta NIC (tarjeta de red), que está
dentro de la computadora, se activa al usar la función ’pcap open live’. Si se cambia
el tercer parámetro de la función ’pcap open live’ a 0 = OFF y todo lo que no sea
0 estará ENCENDIDO.
◦ Si se desactiva el modo promiscuo, el host rastreará solo el tráfico que está directa-
mente relacionado con él. Por lo tanto, el sniffer solo captará el tráfico hacia, desde
o enrutado a través del host.
24
◦ Por otro lado, si se activa el modo promiscuo, rastrea todo el tráfico en la red y
obtendrá todos los paquetes que ve su dispositivo, ya sea que estén destinados o
no al host.
Task 2.1B: Filtros de escritura Por favor escriba filtros en su sniffer. Puede usar los
manuales que están en la red para obtener más información sobre los filtros en pcap. Incluir
screenshots que muestren los resultados después de aplicar cada uno de los filtros que se piden
a continuación.
◦ Partiendo del código 11, se agregó algunas funciones. El filtro pcap que se basa
en la sintaxis BPF ahora es: ı̈p proto icmp”. La direccion IP actual es 10.9.0.5. El
programa comprueba si el paquete capturado es de tipo IPv4 y si es cierto, también
comprueba si el protocolo es ICMP. Adicionalmente se mostrará en pantalla a que
tipo de protocolo pertenece el paquete capturado.
◦ En las figuras 26 y 27 se muestran el sniffer para capturar datos del protocolo
ICMP y la petición ’ping’ realizada hacia 8.8.8.8.
Figura 26: Captura del ping realizado del Host A al DNS de Google
25
◦ Para capturar los paquetes TCP se uso telnet para conectarnos con el contenedor
Host B con dirección IP 10.9.0.6. El programa captura el paquete y lo muestra.
Para ello se implemento un filtro que solo lea paquetes que pertenezcan al protocolo
TCP.
◦ En las figuras 28 y 29 se muestran la capturas de los paquetes, la dirección IP de
origen y destino y adicionalmente el protocolo del paquete capturado
Task 2.1C: Sniffing passwords Por favor muestre como puede usar su sniffer para
capturar passwords cuando alguien use telnet en la red que esta monitorizando. Es posible
que necesite modificar el código de su sniffer para mostrar la parte de los datos que son
capturados en el paquete TCP (telnet usa TCP). Puede imprimir toda la parte de los datos
y marcar manualmente donde se encuentra el password (o parte de este)
• El programa se configuró para rastrear los paquetes tcp de telnet. Para ello se realizó
una conexión telnet desde la máquina 10.9.0.5 a la 10.9.0.6; se capturaron los datos que
en los cuales se incluye contraseña.
• El programa ’sniffPAssw.c’ al ser ejecutadp escucha los paquetes TCP. Como telnet
establece conexión mediante el protocolo TCP, los paquetes se capturan y la carga útil
se muestra como caracteres de texto plano.
26
• En las Figuras 30 y 31 se muestra la captura del password de la conexión Telnet
27
Figura 31: Conexión mediante Telnet desde el host A al Host B
28
1 #include <pcap.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <arpa/inet.h>
5 #include <ctype.h>
6
7
8 #define ETHER_ADDR_LEN 6
9 #define SIZE_ETHERNET 14
10
11 /* Ethernet header */
12 struct ethheader {
13 u_char ether_dhost[6]; /* destination host address */
14 u_char ether_shost[6]; /* source host address */
15 u_short ether_type; /* IP? ARP? RARP? etc */
16 };
17
18 /* IP Header */
19 struct ipheader {
20 unsigned char iph_ihl:4, //IP header length
21 iph_ver:4; //IP version
22 unsigned char iph_tos; //Type of service
23 unsigned short int iph_len; //IP Packet length (data + header)
24 unsigned short int iph_ident; //Identification
25 unsigned short int iph_flag:3, //Fragmentation flags
26 iph_offset:13; //Flags offset
27 unsigned char iph_ttl; //Time to Live
28 unsigned char iph_protocol; //Protocol type
29 unsigned short int iph_chksum; //IP datagram checksum
30 struct in_addr iph_sourceip; //Source IP address
31 struct in_addr iph_destip; //Destination IP address
32 };
33 #define IP_HL(ip) (((ip)->iph_ihl) & 0x0f)
34
35 /* TCP header */
36 typedef unsigned int tcp_seq;
37
38 struct sniff_tcp {
39 unsigned short th_sport; /* source port */
40 unsigned short th_dport; /* destination port */
41 tcp_seq th_seq; /* sequence number */
42 tcp_seq th_ack; /* acknowledgement number */
43 unsigned char th_offx2; /* data offset, rsvd */
44 #define TH_OFF(th) (((th)->th_offx2 & 0xf0) >> 4)
45 unsigned char th_flags;
46 #define TH_FIN 0x01
47 #define TH_SYN 0x02
48 #define TH_RST 0x04
49 #define TH_PUSH 0x08
50 #define TH_ACK 0x10
51 #define TH_URG 0x20
52 #define TH_ECE 0x40
53 #define TH_CWR 0x80
54 #define TH_FLAGS (TH_FIN | TH_SYN | TH_RST | TH_ACK | TH_URG | TH_ECE | TH_CWR)
55 unsigned short th_win; /* window */
56 unsigned short th_sum; /* checksum */
57 unsigned short th_urp; /* urgent pointer */
58 };
59
60 void print_payload(const u_char * payload, int len) {
61 const u_char * ch;
62 ch = payload;
63 printf("Payload: \n\t\t");
64
65 for(int i=0; i < len; i++){
66 if(isprint(*ch)){
67 if(len == 1) {
68 printf("\t%c", *ch);
69 }
70 else {
71 printf("%c", *ch);
72 } 29
73 }
74 ch++;
75 }
76 printf("\n____________________________________________\n");
4.2. Task 2.2: Spoofing
Task 2.2A: Escribir un programa de Spoofing Por favor escriba su propio programa
de spoofing en C. Para demostrar que su programa funciona y realiza el spoofing de paquetes
IP, deberá de proveer evidencias (Por ejemplo, un packet trace usando Wireshark).
30
Figura 33: Captura de paquetes mediante Wireshark al ejecutar el script de spoofing.
31
1 #include <unistd.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <sys/socket.h>
5 #include <netinet/ip.h>
6 #include <arpa/inet.h>
7
8 /* Ethernet header */
9 struct ethheader {
10 u_char ether_dhost[6]; /* destination host address */
11 u_char ether_shost[6]; /* source host address */
12 u_short ether_type; /* IP? ARP? RARP? etc */
13 };
14
15 /* IP Header */
16 struct ipheader {
17 unsigned char iph_ihl:4, //IP header length
18 iph_ver:4; //IP version
19 unsigned char iph_tos; //Type of service
20 unsigned short int iph_len; //IP Packet length (data + header)
21 unsigned short int iph_ident; //Identification
22 unsigned short int iph_flag:3, //Fragmentation flags
23 iph_offset:13; //Flags offset
24 unsigned char iph_ttl; //Time to Live
25 unsigned char iph_protocol; //Protocol type
26 unsigned short int iph_chksum; //IP datagram checksum
27 struct in_addr iph_sourceip; //Source IP address
28 struct in_addr iph_destip; //Destination IP address
29 };
30
31 /* ICMP Header */
32 struct icmpheader {
33 unsigned char icmp_type; // ICMP message type
34 unsigned char icmp_code; // Error code
35 unsigned short int icmp_chksum; //Checksum for ICMP Header and data
36 unsigned short int icmp_id; //Used for identifying request
37 unsigned short int icmp_seq; //Sequence number
38 };
39
40 /* UDP Header */
41 struct udpheader
42 {
43 u_int16_t udp_sport; /* source port */
44 u_int16_t udp_dport; /* destination port */
45 u_int16_t udp_ulen; /* udp length */
46 u_int16_t udp_sum; /* udp checksum */
47 };
48
49 /* TCP Header */
50 struct tcpheader {
51 u_short tcp_sport; /* source port */
52 u_short tcp_dport; /* destination port */
53 u_int tcp_seq; /* sequence number */
54 u_int tcp_ack; /* acknowledgement number */
55 u_char tcp_offx2; /* data offset, rsvd */
56 #define TH_OFF(th) (((th)->tcp_offx2 & 0xf0) >> 4)
57 u_char tcp_flags;
58 #define TH_FIN 0x01
59 #define TH_SYN 0x02
60 #define TH_RST 0x04
61 #define TH_PUSH 0x08
62 #define TH_ACK 0x10
63 #define TH_URG 0x20
64 #define TH_ECE 0x40
65 #define TH_CWR 0x80
66 #define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)
67 u_short tcp_win; /* window */
68 u_short tcp_sum; /* checksum */
69 u_short tcp_urp; /* urgent pointer */
70 };
71
72 /* Psuedo TCP header */ 32
73 struct pseudo_tcp
74 {
75 unsigned saddr, daddr;
76 unsigned char mbz;
Task 2.2B: Suplantar una solicitud ICMP
Haga spoof de un paquete ICMP echo request en nombre de otra maquina (es decir, use
la dirección IP de otra máquina que no sea la suya como dirección IP origen). Este paquete
deberı́a ser enviado a una maquina remota en Internet (debe estar online). Abra el Wireshark
y si su spoofing es exitoso deberı́a de recibir un paquete ICMP echo reply como respuesta de
la maquina remota.
Aunque la solicitud ICMP se originó en 10.0.2.15, la VM atacante creó el paquete con una
IP falsificada (la de la vı́ctima). Entonces, una vez que el servidor remoto recibió el paquete
ICMP, respondió a la IP de origen que está presente en el paquete en lugar de enviarlo al
atacante. Por lo tanto, el atacante falsificó una solicitud ICMP Echo.
Para esta parte de la practica se usaron 2 maquina virtuales, el atacante y la vı́ctima. En
la figura 34 se muestra la captura de paquete ICMP con la cual se hizo spoofin a la VM con
IP 10.0.2.5 a 4.3.2.1 mediante la implementación del script ’sppof2.c’
33
◦ Los privilegios de root son necesarios para ejecutar programas que implementan
sockets sin procesar. Los usuarios sin privilegios no tienen los permisos para cam-
biar todos los campos en los encabezados de protocolo. Los usuarios con privilegios
de root pueden establecer cualquier campo en los encabezados de los paquetes y ac-
ceder a los sockets y poner la tarjeta de interfaz en modo promiscuo. Si ejecutamos
el programa sin el privilegio de root, fallará en la configuración del socket
Figura 35: Captura de paquetes mediante Wireshark al ejecutar el script implementada pora
hacer Sniffing y spoofing.
34
1 #include <pcap.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <arpa/inet.h>
5 #include <fcntl.h> // for open
6 #include <unistd.h> // for close
7
8 /* Ethernet header */
9 struct ethheader {
10 u_char ether_dhost[6]; /* destination host address */
11 u_char ether_shost[6]; /* source host address */
12 u_short ether_type; /* IP? ARP? RARP? etc */
13 };
14
15 /* IP Header */
16 struct ipheader {
17 unsigned char iph_ihl:4, //IP header length
18 iph_ver:4; //IP version
19 unsigned char iph_tos; //Type of service
20 unsigned short int iph_len; //IP Packet length (data + header)
21 unsigned short int iph_ident; //Identification
22 unsigned short int iph_flag:3, //Fragmentation flags
23 iph_offset:13; //Flags offset
24 unsigned char iph_ttl; //Time to Live
25 unsigned char iph_protocol; //Protocol type
26 unsigned short int iph_chksum; //IP datagram checksum
27 struct in_addr iph_sourceip; //Source IP address
28 struct in_addr iph_destip; //Destination IP address
29 };
30
31 /* ICMP Header */
32 struct icmpheader {
33 unsigned char icmp_type; // ICMP message type
34 unsigned char icmp_code; // Error code
35 unsigned short int icmp_chksum; //Checksum for ICMP Header and data
36 unsigned short int icmp_id; //Used for identifying request
37 unsigned short int icmp_seq; //Sequence number
38 };
39
40 /* UDP Header */
41 struct udpheader
42 {
43 u_int16_t udp_sport; /* source port */
44 u_int16_t udp_dport; /* destination port */
45 u_int16_t udp_ulen; /* udp length */
46 u_int16_t udp_sum; /* udp checksum */
47 };
48
49 /* TCP Header */
50 struct tcpheader {
51 u_short tcp_sport; /* source port */
52 u_short tcp_dport; /* destination port */
53 u_int tcp_seq; /* sequence number */
54 u_int tcp_ack; /* acknowledgement number */
55 u_char tcp_offx2; /* data offset, rsvd */
56 #define TH_OFF(th) (((th)->tcp_offx2 & 0xf0) >> 4)
57 u_char tcp_flags;
58 #define TH_FIN 0x01
59 #define TH_SYN 0x02
60 #define TH_RST 0x04
61 #define TH_PUSH 0x08
62 #define TH_ACK 0x10
63 #define TH_URG 0x20
64 #define TH_ECE 0x40
65 #define TH_CWR 0x80
66 #define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)
67 u_short tcp_win; /* window */
68 u_short tcp_sum; /* checksum */
69 u_short tcp_urp; /* urgent pointer */
70 };
71
72 /* Psuedo TCP header */ 35
73 struct pseudo_tcp
74 {
75 unsigned saddr, daddr;
76 unsigned char mbz;
Referencias
[1] ,Spoofing, Qué es y cómo evitarlo,https://www.ambit-bst.com/blog/spoofing-
que-es-y-cómo-evitarlo, 10 de diciembre, 2019
36