Usando TCPDUMP para disgnósticos do protocolo SIP


TCPdump
é um analisador de pacotes de linha de comando poderoso, que pode ser usado para sniffing/analyzing das mensagens SIP. O TCPdump está pré-instalado em muitas distribuições do Linux ou pode ser instalado diretamente do repositório Debian, Red Hat e seus forks:

# apt-get install tcpdump
ou 
# yum install tcpdump

TCPdump permite gravar o SNIFF em um arquivo ou exibi-lo em tempo real. Seu uso para análise de mensagens do protocolo SIP pode ser parecido com: 

1) Exibir em tempo real em um console
# tcpdump -nqt -s 0 -A -i eth0 port 5060
Onde:
-n não converte o endereço IP em nomes DNS;
-q seja tranquilo, imprime menos informações de saída; 
- não imprime carimbos de data/hora; 
-s captura o número de bytes de um pacote, 0 = opções padrão que é no máximo 65535, ou simplesmente um pacote inteiro; 
-A imprime cada pacote em ASCII; 
-vvv verbose bem alto; 
-i usar a interface para capturar a porta 5060, o tráfego da porta 5060 (origem e destino). 

Exemplo de saída de detecção usando as configurações descritas acima:
IP 158.193.139.51.5060 > 85.248.145.114.28444: UDP, length 252
E.......@......3U..r..o....uOPTIONS sip:85.248.145.114:28444 SIP/2.0
Via: SIP/2.0/UDP 158.193.139.51:5060;branch=0
From: sip:pinger@kamailio.org;tag=532c3365
To: sip:85.248.145.114:28444
Call-ID: 085dfe91-025420f2-2812823@158.193.139.51
CSeq: 1 OPTIONS
Content-Length: 0


IP 85.248.145.114.28444 > 158.193.139.51.5060: UDP, length 455
E.......u.!'U..r...3o.......SIP/2.0 200 OK
Via: SIP/2.0/UDP 158.193.139.51:5060;branch=0
Contact: <sip:192.168.1.103:28444>
To: <sip:85.248.145.114:28444>;tag=771cf100
From: <sip:pinger@kamailio.org>;tag=532c3365
Call-ID: 085dfe91-025420f2-2812823@158.193.139.51
CSeq: 1 OPTIONS
Accept: application/sdp
Accept-Language: en
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
User-Agent: eyeBeam release 1102q stamp 51814
Content-Length: 0
ou deve ser usado com extensões verbosas, que imprimem alguns detalhes do protocolo da camada, como somas de verificação, comprimentos de cabeçalho...
# tcpdump -nqt -s 0 -A -vvv -i eth0 port 5060
2) A segunda opção para usar o TCPdump é capturar os dados e gravá-los em um arquivo PCAP e, em seguida, fazer a pós-análise, usando o WIRESHARK por exemplo.
# tcpdump -nq -s 0 -i eth0 -w /tmp/dump.pcap port 5060
A página inicial da ferramenta tcpdump está localizada aqui:

URL: http://www.tcpdump.org/tcpdump_man.html

Bom tutorial disponível em:
URL: http://danielmiessler.com/study/tcpdump/
Algumas informações que julgo importante, extraída da pagina do manual do TCPdump:
Usage: tcpdump [-aAdDeflLnNOpqRStuUvxX] [-c count] [ -C file_size ]
               [ -E algo:secret ] [ -F file ] [ -i interface ] [ -M secret ]
               [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
               [ -W filecount ] [ -y datalinktype ] [ -Z user ]
               [ expression ]

OPÇÕES: 
-A => Imprima cada pacote (sem seu cabeçalho de nível de link) em ASCII. Útil para capturar páginas da web. 

-B => Defina o tamanho do buffer de captura do sistema operacional como buffer_size. 

-c => Saia após receber pacotes de contagem. 

-C => Antes de gravar um pacote bruto em um savefile, verifique se o arquivo é atualmente maior do que file_size e, se for, feche o savefile atual e abra um novo. Os arquivos salvos após o primeiro arquivo salvo terão o nome especificado com o sinalizador -w, com um número depois dele, começando em 1 e continuando para cima. As unidades de file_size são milhões de bytes (1.000.000 bytes, não 1.048.576 bytes). 

-d => Despeje o código de correspondência de pacote compilado em uma forma legível por humanos para a saída padrão e pare. 

-dd => Despeje o código de correspondência de pacote como um fragmento de programa C. 

-ddd => Despeje o código de correspondência de pacote como números decimais (precedidos por uma contagem). 

-D => Imprima a lista das interfaces de rede disponíveis no sistema e nas quais TCPdump pode capturar pacotes. Para cada interface de rede, um número e um nome de interface, possivelmente seguido por uma descrição de texto da interface, são impressos. O nome da interface ou o número pode ser fornecido ao sinalizador -i para especificar uma interface na qual capturar. Isso pode ser útil em sistemas que não possuem um comando para listá-los (por exemplo, sistemas Windows ou sistemas UNIX sem ifconfig -a ); o número pode ser útil no Windows 2000 e sistemas posteriores, onde o nome da interface é uma string um tanto complexa. O sinalizador -D não será suportado se tcpdump foi construído com uma versão mais antiga de libpcap que não possui a função pcap_findalldevs( ). 

-e => Imprima o cabeçalho de nível de link em cada linha de despejo. 

-E => Use spi @ ipaddr (algo:secret) para descriptografar pacotes IPsec ESP endereçados a addr e que contêm o valor spi do Índice de parâmetro de segurança . Esta combinação pode ser repetida com separação por vírgula ou nova linha. Observe que a configuração do segredo para pacotes IPv4 ESP é suportada no momento. Podem os algoritmos des-cbc, 3des-cbc, blowfish-cbc, rc3-cbc, cast128-cbc ou none (nenhum). O padrão é des-cbc . A capacidade de descriptografar pacotes está presente apenas se TCPdump foi compilado com criptografia habilitada. O segredo é o texto ASCII para a chave secreta ESP. Se precedido por 0x, então um valor hexadecimal será lido. A opção assume RFC2406 ESP, não RFC1827 ESP. A opção é apenas para fins de depuração, e o uso desta opção com uma verdadeira chave secreta é desencorajado. Ao apresentar a chave secreta IPsec na linha de comando, você a torna visível para outras pessoas, via ps(1) e outras ocasiões. Além da sintaxe acima, o nome do arquivo de sintaxe pode ser usado para que o TCPdump leia o arquivo fornecido. O arquivo é aberto ao receber o primeiro pacote ESP, portanto, quaisquer permissões especiais que o TCPdump possa ter recebido já deveriam ter sido desistidas. 

-f => Imprime endereços IPv4 FOREIGN (estrangeiros) numericamente ao invés de simbolicamente (esta opção tem como objetivo contornar sérios danos cerebrais no servidor NIS da Sun - normalmente ele trava para sempre traduzindo números não locais da Internet). O teste para endereços IPv4 FOREIGN (estrangeiros) é feito usando o endereço IPv4 e a máscara de rede da interface na qual a captura está sendo feita. Se esse endereço ou máscara de rede não estiverem disponíveis, ou disponível, seja porque a interface na qual a captura está sendo feita não possui endereço ou máscara de rede ou porque a captura está sendo feita na interface Linux qualquer, que pode capturar em mais de uma interface, Esta opção não irá funcionar corretamente. 

-F => Use o arquivo como entrada para a expressão do filtro. Uma expressão adicional fornecida na linha de comando é ignorada. 

-G => Se especificado, gira o arquivo de despejo especificado com a opção -w a cada rotate_seconds segundos. Os arquivos salvos terão o nome especificado por -w, que deve incluir um formato de hora conforme definido por STRFTIME(3). Se nenhum formato de hora for especificado, cada novo arquivo substituirá o anterior. Se usado em conjunto com a opção -C , os nomes dos arquivos terão a forma de "FILE<COUNT>". 

-i => Ouça na interface . Se não for especificado, o tcpdump procura na lista de interfaces do sistema a interface configurada com a numeração mais baixa (excluindo loopback). Os empates são quebrados ao escolher a primeira correspondência. Em sistemas Linux com kernels 2.2 ou posteriores, um argumento de interface “any” pode ser usado para capturar pacotes de todas as interfaces. Observe que as capturas no dispositivo “qualquer” não serão feitas no modo promíscuo. Se o sinalizador -D for suportado, um número de interface impresso por esse sinalizador pode ser usado como o argumento de interface. 

-I => Coloque a interface em “monitor mode”; isso é compatível apenas com interfaces IEEE 802.11 Wi-Fi e apenas com alguns sistemas operacionais. Observe que, no modo monitor (monitor mode), o adaptador pode se desassociar da rede à qual está associado, de forma que você não poderá usar nenhuma rede sem fio com esse adaptador. Isso pode impedir o acesso a arquivos em um servidor de rede ou a resolução de nomes de host ou endereços de rede, se você estiver capturando no modo monitor e não estiver conectado a outra rede com outro adaptador. Este sinalizador afetará a saída do sinalizador -L. Se -I não for especificado, apenas os tipos de camada de link disponíveis quando não estão no modo monitor serão mostrados; se -I for especificado, apenas os tipos de camada de link disponíveis no modo monitor serão mostrados. 

-K => Não tente verificar as somas de verificação IP, TCP ou UDP . Isso é útil para interfaces que executam alguns ou todos os cálculos de checksum no hardware; caso contrário, todas as somas de verificação TCP de saída serão marcadas como ruins. 

-l => Faça a linha stdout em buffer. Útil se você quiser ver os dados enquanto os captura. Por exemplo:  “tcpdump -l | tee dat "ou" tcpdump -l> dat & tail -f dat". 

-L => Liste os tipos de link de dados conhecidos para a interface, no modo especificado, e saia. A lista de tipos de link de dados conhecidos pode depender do modo especificado; por exemplo, em algumas plataformas, uma interface Wi-Fi pode suportar um conjunto de tipos de link de dados quando não estiver no modo monitor (por exemplo, pode suportar apenas cabeçalhos Ethernet falsos ou pode suportar cabeçalhos 802.11, mas não suportar cabeçalhos 802.11 com informações de rádio) e outro conjunto de tipos de link de dados quando no modo monitor (por exemplo, ele pode suportar cabeçalhos 802.11 ou cabeçalhos 802.11 com informações de rádio, apenas no modo monitor). 

-m => Carregue as definições do módulo SMI MIB do módulo de arquivo . Esta opção pode ser usada várias vezes para carregar vários módulos MIB no TCPdump. 

-M => Use o segredo como um segredo compartilhado para validar os resumos encontrados nos segmentos TCP com a opção TCP-MD5 (RFC 2385), se houver. 

-n => Não converta endereços (ou seja, endereços de host, números de porta, etc.) em nomes.

-N => Não imprima a qualificação de nome de domínio de nomes de host. Por exemplo, se você fornecer este sinalizador, o TCPdump imprimirá “nic” ​​em vez de “nic.ddn.mil”. 

-O => Não execute o otimizador de código de correspondência de pacote. Isso é útil apenas se você suspeitar de um bug no otimizador. 

-p => Não coloque a interface em modo promíscuo. Observe que a interface pode estar em modo promíscuo por algum outro motivo; portanto, "-p" não pode ser usado como uma abreviatura para "ether host {local-hw-addr} ou ether broadcast". 

-q => Saída rápida (silenciosa?). Imprima menos informações de protocolo para que as linhas de saída sejam mais curtas. 

-R => Suponha que os pacotes ESP/AH sejam baseados em especificações antigas (RFC1825 a RFC1829). Se especificado, TCPdump não imprimirá o campo de prevenção de repetição. Como não há campo de versão de protocolo na especificação ESP/AH, TCPdump não pode deduzir a versão do protocolo ESP/AH. 

-r => Lê os pacotes do arquivo (que foi criado com a opção -w). A entrada padrão é usada se o arquivo for “-”. 

-S => Imprime números de sequência TCP absolutos, em vez de relativos. 

-s => Snarf snaplen bytes de dados de cada pacote em vez do padrão de 65535 bytes. Os pacotes truncados devido a um instantâneo limitado são indicados na saída com “[|proto ]”, onde proto é o nome do nível de protocolo no qual o truncamento ocorreu. Observe que tirar instantâneos maiores aumenta a quantidade de tempo que leva para processar os pacotes e, efetivamente, diminui a quantidade de buffer de pacote. Isso pode causar a perda de pacotes. Você deve limitar o snaplen ao menor número que irá capturar as informações de protocolo de seu interesse. Definir snaplen como "0" define para o padrão de 65535, para compatibilidade com versões anteriores mais recentes do TCPdump . 

-T => Força os pacotes selecionados por “expressão” a serem interpretados do tipo especificado. Os tipos atualmente conhecidos são aodv (Ad-hoc On-demand Distance Vector protocol), cnfp (Cisco NetFlow protocol), rpc (Remote Procedure Call), rtp (Real-Time Applications protocol), rtcp (Real-Time Applications control protocol), snmp (Simple Network Management Protocol), tftp (Trivial File Transfer Protocol), vat (Visual Audio Tool) e wb (distributed White Board). 

-t => Não imprima um carimbo de data/hora (TIMESTAMP) em cada linha de despejo. 

-tt => Imprima um carimbo de data/hora (TIMESTAMP) não formatado em cada linha de despejo. 

-ttt => Imprima um delta (resolução de microssegundos) entre a linha atual e a anterior em cada linha de despejo. 

-tttt => Imprime um carimbo de data/hora (TIMESTAMP) no formato padrão seguido por data em cada linha de despejo. 

-ttttt => Imprima um delta (resolução de microssegundos) entre a linha atual e a primeira em cada linha de despejo. 

-u => Imprimir identificadores NFS não decodificados. 

-U => Faça a saída salva através da opção -w “buffer de pacote”; ou seja, à medida que cada pacote é salvo, ele será gravado no arquivo de saída, em vez de ser gravado apenas quando o buffer de saída for preenchido. O sinalizador -U não será suportado se TCPdump foi construído com uma versão mais antiga de libpcap que não possui a função pcap_dump_flush( ).

-v => Ao analisar e imprimir, produza uma saída detalhada (um pouco mais). Por exemplo, o tempo de vida, identificação, comprimento total e opções em um pacote IP são impressos. Também permite verificações de integridade de pacote adicionais, como verificar a soma de verificação do cabeçalho IP e ICMP. Ao gravar em um arquivo com a opção -w, relata, a cada 10 segundos, o número de pacotes capturados. 

-vv => Saída ainda mais detalhada. Por exemplo, campos adicionais são impressos a partir de pacotes de resposta NFS e os pacotes SMB são totalmente decodificados. 

-vvv => Saída ainda mais detalhada. Por exemplo, as opções telnet SB ... SE são impressas por completo. Com -X, as opções de Telnet também são impressas em hexadecimal. 

-w => Grave os pacotes brutos em um arquivo em vez de analisá-los e imprimi-los. Eles podem ser impressos posteriormente com a opção -r. A saída padrão é usada se o arquivo for “-”. Veja pcap-savefile(5) para uma descrição do formato do arquivo. 

-W => Usado em conjunto com a opção -C, isso limitará o número de arquivos criados ao número especificado e começará a sobrescrever os arquivos desde o início, criando assim um buffer 'giratório' (rotating). Além disso, ele nomeará os arquivos com "0s" iniciais suficientes para suportar o número máximo de arquivos, permitindo que sejam classificados corretamente. Usado em conjunto com a opção -G, isso limitará o número de arquivos de despejo girados que são criados, saindo com status 0 ao atingir o limite. Se usado com -C também, o comportamento resultará em arquivos cíclicos por timeslice. 

-x => Ao analisar e imprimir, além de imprimir os cabeçalhos de cada pacote, imprima os dados de cada pacote (menos seu cabeçalho de nível de link) em hexadecimal. O menor de todo o pacote ou bytes snaplen será impresso. Observe que este é o pacote de camada de link inteiro, portanto, para camadas de link que preenchem (por exemplo, Ethernet), os bytes de preenchimento também serão impressos quando o pacote da camada superior for menor do que o preenchimento necessário. 

-xx => Ao analisar e imprimir, além de imprimir os cabeçalhos de cada pacote, imprima os dados de cada pacote, incluindo seu cabeçalho de nível de link, em hexadecimal. 

-X => Ao analisar e imprimir, além de imprimir os cabeçalhos de cada pacote, imprima os dados de cada pacote (menos seu cabeçalho de nível de link) em hexadecimal e ASCII. Isso é muito útil para analisar novos protocolos. 

-XX => Ao analisar e imprimir, além de imprimir os cabeçalhos de cada pacote, imprima os dados de cada pacote, incluindo seu cabeçalho de nível de link, em hexadecimal e ASCII. 

-y => Defina o tipo de link de dados a ser usado durante a captura de pacotes para datalinktype. 

-z => Usado em conjunto com as opções -C ou -G, isso fará com que o TCPdump execute o ”arquivo de comando”, onde o arquivo é o savefile sendo fechado após cada rotação. Por exemplo, especificar -z gzip ou -z bzip2 compactará cada arquivo de salvamento usando gzip ou bzip2. Observe que o TCPdump executará o comando em paralelo à captura, usando a prioridade mais baixa para que isso não atrapalhe o processo de captura. E no caso de você desejar usar um comando que receba sinalizadores ou argumentos diferentes, você sempre pode escrever um script de shell que terá o nome do savefile como o único argumento, faça os arranjos de sinalizadores e argumentos e execute o comando que você deseja. 

-Z => Descarta privilégios (se root) e altera o ID do usuário para usuário e o ID do grupo para o grupo primário de usuários . Esse comportamento também pode ser habilitado por padrão em tempo de compilação. 

expression (expressão) => seleciona quais pacotes serão despejados. Se nenhuma expressão for fornecida, todos os pacotes na rede serão despejados. Caso contrário, apenas os pacotes para os quais a expressão é "verdadeira" serão despejados. Para a sintaxe da expressão , consulte pcap-filter(7). Os argumentos de expressão podem ser passados ​​para TCPdump como um único argumento ou como vários argumentos, o que for mais conveniente. Geralmente, se a expressão contiver metacaracteres Shell, é mais fácil passá-la como um argumento simples entre aspas. Vários argumentos são concatenados com espaços antes de serem analisados. 

Thats All FOLKS! (Isso é tudo, pessoal!)

Nenhum comentário

Tecnologia do Blogger.