Por que o tcpdump não grava um arquivo pcap?

8

No processo de depuração de um python irc bot que parece não conseguir se conectar, pensei: "Eu sei, vou apenas despejá-lo e ver o que ele está fazendo". Então, eu executei o tcpdump como normalmente faço e ele diz que é pacotes capturados, mas na verdade não grava o arquivo cap.

akraut@lance ~/pcaps $ sudo tcpdump -w pyhole -s 0 "port 6667"
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C17 packets captured
17 packets received by filter
0 packets dropped by kernel
4294966881 packets dropped by interface
akraut@lance ~/pcaps $ ls -la
total 8
drwxr-xr-x 2 akraut akraut 4096 Feb  6 11:50 .
drwxr-xr-x 8 akraut akraut 4096 Feb  6 11:50 ..
akraut@lance ~/pcaps $ 
akraut
fonte
O que acontece se você der um caminho absoluto?
Massimo
O bot está se conectando eth0? Se estiver usando o loopback ou outra interface, não haverá tráfego para despejar no arquivo.
Chris S
1
@ Chris-s Se mostrar, 17 packets received by filterisso não significa que capturou algum tráfego?
akraut 6/02/12
@Massimo Tentei especificar ./blah e / blah e nenhum dos dois escreveu um arquivo.
Akraut 6/02/12

Respostas:

11

Você pode querer verificar o comportamento do tcpdump com strace, para ver se ele está fazendo algo estranho como chrooting, se está no gentoo ou em outra distribuição que pode ajudar os binários.

Justin Lynn
fonte
Ah sim. Olhando para o ebuild, ele parece soltar privs e chroot /var/lib/tcpdump. E eis que estão todos os meus arquivos cap.
akraut
10

Ok, eu resolvi o mistério. Siga-me enquanto desvendamos o TCPDump do Funtoo e o Mistério do arquivo pcap ausente .

Usei o strace para ver o que está acontecendo e as linhas relevantes são:

chroot("/var/lib/tcpdump")              = 0
chdir("/")                              = 0
--- SNIP ---
open("/tmp/lol.wat", O_WRONLY|O_CREAT|O_TRUNC, 0666) = -1 ENOENT (No such file or directory)

Assim...

lance ~ # ls /var/lib/tcpdump/
blah  blah.cap  irc.cap  pyhole

Ei, olha! Todos os arquivos cap que tentei criar!

Depois de dar uma olhada nas bandeiras de uso com as quais o tcpdump é construído, por padrão, vejo o seguinte:

lance ~ # grep tcpdump /usr/portage/profiles/use*desc
use.local.desc:net-analyzer/tcpdump:chroot - Enable chrooting when dropping privileges

Então, por que fazer dessa maneira? Minha teoria é mais ou menos assim:

  1. Muitos aplicativos que interagem com o tráfego bruto da rede precisam ser executados como raiz.
  2. O tráfego de rede bruto possui uma grande variedade de valores válidos e inválidos em estado selvagem.
  3. Existem muitas explorações para esses aplicativos. (Wireshark, Ethereal, tcpdump, et al)
  4. Portanto, o tcpdump obtém acesso à interface de rede enquanto root, se /var/lib/tcpdumpaprisiona e depois remove privilégios de root e inicia a captura.

Como resultado, quando eu especifiquei ./blahou blahfuncionou bem. Mas /tmp/blahnão porque /var/lib/tcpdump/tmpnão existe.

Um recurso interessante de tudo isso é: ao usar o sinalizador suid para instalar o tcpdump SetUID, você pode conceder aos usuários acesso ao tcpdumpgrupo sem fornecer a eles sudo ou acesso root. Os usos possíveis incluem uma caixa de captura para seus engenheiros ou pesquisadores de rede.

Eu só gostaria que o Gentoo / Funtoo tivesse uma mensagem na instalação dizendo tudo isso.

tl; dr: O Gentoo / Funtoo coloca seus arquivos pcap no /var/lib/tcpdump.

akraut
fonte
3

A sintaxe está correta: eu apenas tentei (ainda que na porta 80) e gerou um arquivo pcap no diretório de trabalho atual, considerando as mesmas opções que você está usando.

Poderia ter algo a ver com o seu diretório pessoal, que você está tentando gravar como root (por causa do sudo)? É possível que você esteja usando diretórios pessoais montados em NFS com esmagamento de raiz? sudo touch ~akraut/pcaps/foo?

Você pode tentar escrever o pcap para / tmp / ou algo assim?

cjc
fonte
Com sudo tcpdump -w /tmp/blah -s 0 "port 6667"isso, parece que está funcionando, mas se eu fizer sudo su -primeiro, em seguida, execute tcpdump -w /tmp/blah -s 0 "port 6667"como root e diz "Não existe esse arquivo ou diretório". Os aprofunda mistério ...
akraut
1
Parece que Justin ajudou você a encontrar a resposta. Posso perguntar qual a distribuição que você está usando e se essa é uma instalação padrão do tcpdump para essa distribuição?
22612 cjc
Estou executando o Funtoo, que é uma variante do Gentoo. Sim, por padrão, ele define o sinalizador chroot "use" (um método do Gentoo para ativar / desativar a funcionalidade opcional em tempo de compilação). Na verdade, preparei um artigo mais longo para publicar aqui em breve.
akraut