Skip to content

DNS tcpdump hacks

O tcpdump é o verdadeiro canivete suíço de todo o administrador de sistemas e operadores de rede.  A partir dos filtros de pacotes Berkley (Berkeley Packet Filter – BPF) podemos estender as funcionalidades do tcpdump.

Cabeçalho UDP / UDP Header
Por exemplo, o cabeçalho do UDP definido na RFC.

Filtros UDP para cada campo do cabeçalho UDP.

udp[0:2] = source port
udp[2:2] = destination port
udp[4:2] = datagram length
udp[6:2] = UDP checksum

Digamos que deseja-se obter apenas consultas UDP menores que 36 bytes. Para entender o exemplo, faça o download do arquivo dns.pcap do site do wireshark.

Podemos observar a imagem abaixo referente a seleção de um pacote. Expandindo o User Datagram Protocol (UDP), podemos observar os campos do cabeçalho UDP.

É importante notar em “Length” que 36 (decimal) bytes equivale a 0024 em hexadecimal, portanto para filtrarmos pacotes com esta característica, o filtro do tcpdumpo ficaria:

tcpdump -n -l -r dns.cap udp[4:2] = 0x0024

Se desejarmos filtrar apenas consultas UDP maiores que 36 bytes e menores que 50 bytes, o filtro tcpdump ficaria:

 tcpdump -n -l -r dns.cap ‘udp[4:2] >= 0x0024 and udp[4:2] <= 0x0032’

Cabeçalho DNS / DNS Header

Agora que ficou claro como funciona o filtro para o UDP, vamos fazer algumas consultas DNS mais rebuscadas.

Praticamente todas as consultas DNS trafegam em cima do protocolo UDP, a não ser aquelas utilizadas para transferência de zona de domínio. Esta característica permite acessar os campos do cabeçalho DNS utilizando o mesmo filtro UDP. Por exemplo, como o último campo do UDP equivale a ‘upd[6:2]’, então, o próximo campo do DNS, query ID, poderia ser acessado com o filtro  ‘udp[8:2]’. Já o campo “Flags and Codes” equivale a ‘udp[10:2]’. Vejamos mais exemplos abaixo.

A figura a seguir apresenta o cabeçalho DNS que permitirá o entendimento dos próximos exemplos.

No cabeçalho ilustrado, estamos apenas interessados no campo:  “Flags and Codes”. Este campo permite identificar se uma consulta DNS é uma solicitação ou uma resposta, se a resposta foi enviada por um servidor autoritário pelo domínio, mensagens truncadas, etc. Sugiro a leitura dos parâmetros do DNS no site da IANA e a RFC 1035 do DNS

A imagem a seguir apresenta alguns parâmetros habilitados no campo estudado.

O campo QR (query-response flag) quando estiver marcado com ‘0’ ilustrará uma pergunta DNS, no entanto, quando ‘1’ for habilitado, a mensagem DNS é uma resposta.

Vejamos o exemplo do filtro tcpdump abaixo apresentando apenas consultas/queries:

tcpdump -n -l -r dns.cap ‘udp[10:2] == 0x0100’

Porque o bit RD (Recursion Desired) está habilitado com ‘1’ ? Isto acontece nos casos onde a análise do tráfego DNS é realizada do lado do cliente que possui um servidor DNS recursivo disponível. Existem também outras situações em que esta situação pode ocorrer, mas no geral, é isso mesmo.

Atenção: Se você estiver monitorando tráfego de Servidores autoritativos, sem recursividade, o resultado do filtro pode ser:

tcpdump -n -l -r dns.cap ‘udp[10:2] == 0x0000’

Alguns filtros por resposta com RCODE (Response code) definido como:

No Error = 0x8180 ou 0x8580

Name Error = 0x8583

Para saber o que ‘0x8583’ está referenciando, vamos transformar esse número em base binária, 1000010110000011. Separando os bits por campo, temos:

1  | 0000 | 1 | 0 | 1 | 1 | 000 |0011
a     b    c  d e f    g     h

a) = QR
b) = OPCODE
c) = AA
d) = TC
e) = RD
f)  = RA
g) = Z (reservado/reserved)
h) = RCODE

É só isso. Você pode utilizar esse mapa para outras consultas mais detalhadas.

Boa sorte

Fonte:
http://trepullins.net/02-09-2008/fun-with-tcpdump-bpf-and-udp
http://www.iana.org/assignments/dns-parameters
http://www.tcpipguide.com/free/diagrams/dnsheaderformat.png
http://nmap.org/book/images/hdr/MJB-UDP-Header-800×264.png

Comments are closed.