Este projeto visa construir uma ferramenta fácil de usar que irá analisar um arquivo pcap
para retornar qualquer ambiguidade encontrada nos pacotes TCP. Atualmente, também estamos trabalhando na implementação de análises UDP e ARP.
Contorno:
Contribuindo: qualquer comentário/ideia/contribuição é bem-vindo.
make
./p2a -v ./pcap_files/some_pcap_file.pcap -s results.json
$ ./p2a -h
Usage: ./p2a [OPTIONS] FILE
-h,--help: display this help message
-v,--verbose: verbose option
-d,--debug: debug option
-x,--exclude OPTIONS: exclude some possible ambiguities from analysis
--exclude ret,mac,ttl
ret: exclude retransmission analysis
mac: exclude MAC addresses analysis
ttl: exclude TTL analysis
-s,--save FILENAME: saves results to file FILENAME
JSON format - FILENAME should contain the JSON extension
Examples:
./p2a -v ./pcap_files/some_pcap_file.pcapng
./p2a --exclude mac,ttl --verbose my-pcap-file.pcap -s results.json
Acabei de adicionar a opção de salvar todos os resultados em um arquivo JSON. Para fazer isso, pode-se usar a opção --save file.json
. Ele salva todas as sessões neste arquivo, independentemente de terem sido encontradas ambiguidades nelas ou não. Atualmente, estou trabalhando em uma maneira de renderizar bem o arquivo JSON em um arquivo HTML (usando algum JavaScript).
SHA(IP, Port)
Disponibilizamos o script sha
para fins de depuração. Toma como argumento um endereço IP e um número de porta e retorna o hash SHA1 de (IP|Porta). Este valor é usado como identificador de sessão no script p2a
.
make sha
./sha -h
Usage:
./sha IP PORT
./sha 127.0.0.1 12345
IP: 127.0.0.1
Port: 12345
SHA1: 21bf549a8095063f49cff573e689b6b10365f4c8
Endereços IP e whois
Se uma sessão for suspeita, pode ser útil saber a que se refere. Para fazer isso, pode-se usar o Wireshark e aplicar um filtro de exibição para exibir apenas uma determinada sessão.
Uma abordagem mais simples pode ser usar whois
para saber quem é o proprietário do endereço IP.
Para usar whois
com todos os endereços IP do arquivo de captura:
for ip in $( tshark -r file.pcapng -T fields -e ip.dst -e ip.src | egrep -o " [0-9]+.[0-9]+.[0-9]+.[0-9]+ " | sort | uniq ) ; do whois $ip | egrep " ^[Oo]rgani[sz]ation " ; done
Se
tshark
não funcionar, aqui está um script C que fará a mesma coisa.
O campo Time To Live (TTL) para um pacote IP corresponde a quanto tempo esse pacote 'permite' viajar pela rede antes de ser descartado pelos roteadores. É um valor de 8 bits que geralmente é reduzido em um a cada salto.
De acordo com a página da Cisco sobre o ataque de expiração TTL:
"Quando um dispositivo IOS recebe um pacote com um valor TTL menor ou igual a um, uma mensagem ICMPv4 Tipo 11, Código 0 é enviada por um dispositivo IOS, resultando em um impacto correspondente na CPU . Esse impacto ocorre porque mais CPU o processamento é necessário para responder (usando pacotes com TTL excedido) a pacotes com valores de TTL menores que um do que simplesmente encaminhar um pacote com um valor de TTL maior que um."
"O comportamento de expiração do TTL cria um vetor de ataque de negação de serviço (DoS) contra equipamentos de rede. Os dispositivos de rede são desenvolvidos especificamente para encaminhar pacotes comuns o mais rápido possível. Quando pacotes de exceção são encontrados, como aqueles com valores TTL expirados, quantidades variáveis de esforço são despendidos por um roteador para responder adequadamente."
Análise/Código:
Em utils.c
, definimos um TTL_THRESHOLD
(=10 por enquanto). Se o TTL de um pacote for inferior a esse valor, um sinalizador será levantado para indicar que o TTL está baixo. Se muitos desses sinalizadores forem levantados, poderá ser um ataque de expiração de TTL.
O arquivo pcap de amostra (contendo um pacote com TTL baixo) foi capturado usando os scripts localizados no diretório ./attack_scripts/low_ttl
.
O envenenamento ARP consiste em enganar um host fazendo-o acreditar que somos o gateway padrão . A vítima pergunta regularmente ao gateway padrão seu endereço MAC (protocolo ARP). Mas um invasor pode enviar pacotes à vítima dizendo que o gateway padrão está em outro endereço MAC (o endereço MAC do ataque, por exemplo). O invasor só precisa enviar esses pacotes “com regularidade suficiente” para que a vítima “descarte” as mensagens reais do gateway padrão .
Isso pode permitir que o invasor prossiga e ataque a vítima de várias maneiras: man-in-the-midde, DoS, buraco negro, ...
Exemplo:
O endereço IP da vítima é 192.168.10.2
e o gateway padrão é 192.168.1.1
:
sudo arpspoofing -i wlan0 -t 192.168.10.2 192.169.1.1
O invasor continuará enviando pacotes ARP à vítima informando que 192.168.1.1
está no endereço MAC do invasor. Dessa forma a vítima enviará seus pacotes (visando a Internet) para o invasor, que não os redireciona (opção -r
para redirecioná-los).
Análise/Código:
Para análise, como estamos olhando apenas pacotes IP (por enquanto), p2a
salva em uma lista vinculada todos os pares (MAC address, IP address)
que encontra. Ao verificar um novo par, ele percorre a lista vinculada e retorna um erro se o endereço IP já estiver associado a outro endereço MAC.
Para o exemplo acima, nosso script detectaria que 192.168.1.1
( gateway padrão ) está associado a dois endereços MAC diferentes: o real, até que o invasor entre e diga à vítima que é o gateway padrão e que seu endereço MAC é obtido. associado ao gateway padrão (do ponto de vista da vítima).
Cada byte de dados enviado em uma conexão TCP possui um número de sequência associado. Isto é indicado no campo do número de sequência do cabeçalho TCP .
Quando o soquete receptor detecta um segmento de dados de entrada, ele usa o número de confirmação no cabeçalho TCP para indicar o recebimento. Após enviar um pacote de dados, o remetente iniciará um temporizador de retransmissão de comprimento variável. Se não receber uma confirmação antes que o temporizador expire, o remetente assumirá que o segmento foi perdido e o retransmitirá.
Podemos ver a retransmissão TCP quando outro pacote possui os mesmos números de confirmação e sequência do pacote atual.
As retransmissões TCP são bastante comuns e podem ser totalmente normais (se um pacote for retransmitido porque foi legitimamente perdido), mas também podem ser o sinal de um problema na rede ou na comunicação.
A exploração sobreposta de fragmento IP ocorre quando dois fragmentos contidos no mesmo pacote IP têm deslocamentos que indicam que eles se sobrepõem no posicionamento dentro do pacote. Isso pode significar que o fragmento A está sendo completamente substituído pelo fragmento B ou que o fragmento A está sendo parcialmente substituído pelo fragmento B. Alguns sistemas operacionais não lidam adequadamente com fragmentos que se sobrepõem dessa maneira e podem lançar exceções ou se comportar de outras maneiras indesejáveis após o recebimento de fragmentos sobrepostos. Esta é a base para o ataque em forma de lágrima . ( da Wikipédia )
Fragmentos sobrepostos também podem ser usados na tentativa de contornar os Sistemas de Detecção de Intrusão . Nesta exploração, parte de um ataque é enviada em fragmentos juntamente com dados aleatórios adicionais; fragmentos futuros podem substituir os dados aleatórios pelo restante do ataque. Se o pacote completo não for devidamente remontado no IDS, o ataque não será detectado.
Ataque Teardrop: envolve o envio de fragmentos IP mutilados com cargas superdimensionadas e sobrepostas para a máquina alvo.
AINDA NÃO IMPLEMENTADO
Se observarmos vários valores de TTL para uma determinada sessão, isso pode significar que a rota mudou, o que significa que os pacotes não seguem o mesmo caminho do final da conexão como faziam no início. Isso pode ser devido a alterações externas genuínas, mas também pode significar que um invasor altera a rota que os pacotes seguem (para fazer um ataque MiTM, por exemplo).
Porém, na maioria das vezes, uma sessão possui dois ou três valores TTL diferentes em toda a conexão: na maioria das vezes, o cliente e o servidor não usam os mesmos valores iniciais de TTL.
O script retornará um erro se houver mais de dois valores de TTL diferentes para uma determinada sessão.
Diretório | Descrição/conteúdo |
---|---|
./attack_scripts | Scripts simples para testar e registrar algumas ambigüidades de TCP (spoofing, TTL baixo) |
./pcap_files | Arquivos PCAP para testar p2a |
./tests_libpcap | Dois scripts para testar e começar a usar libpcap |
libpcap
pcap
pcap
no final da página da webtcpdump
libpcap
libpcap
em Cpcap.h