Skip to content
ECP UFU
Voltar

SEG Lab 4 - Packet Sniffing and Spoofing Lab

SEG Lab 4 - Packet Sniffing and Spoofing Lab

Conteúdos

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:

Untitled

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

Untitled

3.1. Task 1.1b: Sniffing Packets

Capture only the ICMP packet

Captura bem-sucedida de pacotes ICMP

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

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

Captura de pacotes bem-sucedida em uma sub-rede específica

3.2. Task 1.2: Spoofing ICMP Packets

Untitled

Untitled

3.3. Task 1.3: Traceroute

No meu caso, usando TTL = 1, o pacote já chegou.

Untitled

Untitled

3.4. Task 1.4: Sniffing and-then Spoofing

Untitled

Untitled

Untitled

Untitled

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.


Share this post on:

Postagem Anterior
SEG Lab 3 - Cross-Site Request Forgery Attack Lab
Próxima Postagem
SEG Lab 5 - ARP Cache Poisoning Attack Lab