SEG Lab 4 - Packet Sniffing and Spoofing Lab
Conteúdos
- Modelo Relatório
- SEG Lab 1 - Web SQL Injection
- SEG Lab 2 - Cross-Site Scripting (XSS) Attack Lab
- SEG Lab 3 - Cross-Site Request Forgery Attack Lab
- SEG Lab 4 - Packet Sniffing and Spoofing Lab
- SEG Lab 5 - ARP Cache Poisoning Attack Lab
- SEG Lab 6 - ICMP Redirect Attack Lab
- SEG Lab 7 - TCP Attacks
Nome da Atividade: SEG Lab 4 - Packet Sniffing and Spoofing Lab
Nome e Matrícula: Lucas Lima do Nascimento - 12111ECP024
3.1. Task 1.1a: Sniffing Packets
Ao executar sem a permissão de root, obtemos o seguinte erro:

Já ao executar com a permissão, o código funciona normalmente, precisando ser encerrado com CTRL+C

3.1. Task 1.1b: Sniffing Packets
Capture only the ICMP packet

Captura bem-sucedida de pacotes ICMP
Capture any TCP packet that comes from a particular IP and with a destination port number 23.

Captura bem-sucedida de pacotes TCP de um IP específico com um número de porta de destino 23
Capture packets comes from or to go to a particular subnet. You can pick any subnet, such as 128.230.0.0/16; you should not pick the subnet that your VM is attached to.

Captura de pacotes bem-sucedida em uma sub-rede específica
3.2. Task 1.2: Spoofing ICMP Packets


3.3. Task 1.3: Traceroute
No meu caso, usando TTL = 1, o pacote já chegou.


3.4. Task 1.4: Sniffing and-then Spoofing




4. Lab Task Set 2: Writing Programs to Sniff and Spoof Packets
4.1. Task 2.1: Writing Packet Sniffing Program
#include <pcap.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) {
struct iphdr *ip_header;
char src_ip[INET_ADDRSTRLEN];
char dst_ip[INET_ADDRSTRLEN];
ip_header = (struct iphdr*)(packet + sizeof(struct ethhdr));
inet_ntop(AF_INET, &(ip_header->saddr), src_ip, INET_ADDRSTRLEN);
inet_ntop(AF_INET, &(ip_header->daddr), dst_ip, INET_ADDRSTRLEN);
printf("IP da Fonte: %s\n", src_ip);
printf("IP do destino: %s\n", dst_ip);
}
int main() {
pcap_t *handle;
char errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program fp;
bpf_u_int32 net;
char filter_exp[] = "ip";
handle = pcap_open_live("eth0", BUFSIZ, 1, 1000, errbuf);
pcap_compile(handle, &fp, filter_exp, 0, net);
pcap_setfilter(handle, &fp);
pcap_loop(handle, -1, got_packet, NULL);
pcap_close(handle);
return 0;
}
Question 1)
A sequência de chamadas de biblioteca essenciais para programas de sniffer envolve a abertura de uma sessão pcap ao vivo em uma interface de rede específica, a compilação de um filtro BPF (Berkeley Packet Filter) para especificar os tipos de pacotes a serem capturados e a execução do loop pcap, que chama uma função de retorno de chamada especificada para processar cada pacote capturado.
Question 2)
Um programa de sniffer requer privilégios de root porque ele precisa acessar diretamente o hardware de rede e capturar todos os pacotes que passam pela interface de rede, incluindo os pacotes destinados a outras máquinas. Se o programa for executado sem privilégios de root, ele falhará ao tentar acessar a interface de rede.
Question 3)
O modo promíscuo permite que uma interface de rede capture todos os pacotes que passam por ela, incluindo os pacotes destinados a outras máquinas. Isso é útil em programas de sniffer, que precisam capturar todos os pacotes para análise. Podemos demonstrar a diferença entre o modo promíscuo ligado e desligado executando o sniffer em cada modo e observando os pacotes capturados. Com o modo promíscuo desligado, só veremos os pacotes destinados ao endereço MAC da interface de rede, enquanto com o modo promíscuo ligado, veremos todos os pacotes que passam pela interface de rede. Podemos usar o comando “ifconfig” para verificar se o modo promíscuo está ligado ou desligado em uma interface de rede específica, observando o valor de “promisc” na saída do comando.
Para capturar os pacotes ICMP entre dois hosts específicos, podemos usar a seguinte expressão de filtro:
char filter_exp[] = "icmp and host <ip_address_1> and host <ip_address_2>";
Substitua <ip_address_1> e <ip_address_2> pelos endereços IP dos hosts específicos que você deseja monitorar.
Para capturar os pacotes TCP com um número de porta de destino na faixa de 10 a 100, podemos usar a seguinte expressão de filtro:
char filter_exp[] = "tcp dst portrange 10-100"
Para capturar senhas sendo enviadas através do protocolo telnet, podemos usar a seguinte expressão de filtro e modificar nosso código para imprimir a parte de dados de cada pacote TCP capturado:
char filter_exp[] = "tcp port telnet";
Em seguida, dentro do loop principal do programa, podemos usar a função pcap_next() para obter o próximo pacote capturado e, em seguida, imprimir a seção de dados do pacote usando a função print_payload():
// Dentro do loop principal do programa
packet = pcap_next(handle, &header);
if (packet != NULL) {
printf("Capturado um pacote telnet:\n");
print_payload(packet, ntohs(tcp->th_dport), header->len);
}
4.2. Task 2.2: Spoofing
Question 4)
Sim, é possível definir o valor do campo de comprimento do pacote IP para qualquer valor arbitrário, independentemente do tamanho real do pacote.
Question 5)
Em geral, é necessário calcular o checksum do cabeçalho IP ao usar a programação de socket bruto, pois isso é exigido pelos protocolos de rede. No entanto, se a opção “IP_HDRINCL” estiver habilitada para o socket, o sistema não calculará o checksum automaticamente e o programador precisará fazê-lo manualmente.
Question 6)
É necessário ter privilégios de root para executar programas que usam sockets brutos porque o uso indevido desses recursos pode ter sérias consequências na rede e no sistema. Se executado sem privilégios de root, o programa falhará ao tentar abrir um socket bruto, pois isso é restrito a usuários privilegiados.