Como eu crio um pacote UDP?

14

Quando executo o seguinte comando Netcat e vejo os pacotes com Wireshark , ele diz que o pacote UDP está malformado.

$ echo "this is a test" | nc -u 127.0.0.1 53

Da mesma forma, usar comandos como $ echo "this is a test" > /dev/udp/127.0.0.1/53 produz erros de "malformado de pacote" no Wireshark.

O comando echo é enviado / entregue ao servidor Netcat sem erros. Mas isso me fez pensar: é possível construir manualmente um pacote UDP adequado com echo ou alguma outra ferramenta Unix nativa?

Estou usando o Debian e o macOS.

    
por user322500 23.11.2018 / 17:01

3 respostas

41

Seu pacote é completamente válido, do ponto de vista de IP e UDP. Se você expandir os detalhes do protocolo para Ethernet / IP / UDP no painel inferior do Wireshark, verá que o pacote foi analisado com sucesso.

No entanto, como ele é destinado à porta 53, o Wireshark tenta analisá-lo como um pacote DNS, o que não é possível (já que a string "este é um teste" não é uma solicitação de DNS válida por RFC 1035 spec).

Se você seguir a especificação nesse link, poderá construir um pacote que seja válido quando analisado como uma solicitação de DNS. Se você enviar o pacote para outra porta, notará que o Wireshark não irá mais analisá-lo como uma solicitação de DNS e, portanto, não mostrará esse aviso.

    
por 23.11.2018 / 20:29
14

Você pode enviá-los para o Bash com aliases especiais com redirecionamento.

De manpages do Bash:

/dev/tcp/host/port If host is a valid hostname or Internet address, and port is an integer port number or service name, bash attempts to open the corresponding TCP socket.

/dev/udp/host/port If host is a valid hostname or Internet address, and port is an integer port number or service name, bash attempts to open the corresponding UDP socket.

Isso enviará um pacote UDP para 192.168.2.11 para a porta 8080:

echo "This is a test" > /dev/udp/192.168.2.11/8080
    
por 23.11.2018 / 17:13
-1

Existem várias perguntas aqui; a alegação de um "pacote malformado" pode ser devido ao descarregamento da soma de verificação e, se assim for, é um erro falso, pois reflete a captura de pacote não tendo uma visão completa - parte do trabalho foi feita no hardware da rede. WireShark deve ter documentação sobre isso.

Caso contrário, várias ferramentas (como socat , nc ou netcat ou através de recursos extremamente semelhantes em shells como ksh93 ou bash ) podem obter bytes da entrada padrão e despejá-las em que torna-se um pacote UDP. Se isso é "adequado" depende do protocolo; poderíamos, teoricamente, construir e enviar um pacote DNS ou DHCP dessa maneira, embora com mais frequência as pessoas usem uma biblioteca ou um software dedicado que (esperançosamente) implementa corretamente o protocolo em questão, pois geralmente há muito mais envolvido do que configurar alguns bits o corpo de um pacote e enviá-lo através do fio, notavelmente manipulando respostas, repetindo após o tempo limite ou erro, campos de cabeçalho de pacote, etc. Os protocolos são geralmente muito bem documentados em RFC, ou consulte a série de livros "TCP / IP Illustrated" por Stevens para ainda mais documentação.

Ferramentas específicas como nmap fazem coisas muito personalizadas com a construção de pacotes. Caso contrário, para a construção manual de pacotes, uma linguagem de programação é normalmente usada, embora a maioria dos softwares use bibliotecas existentes ou serviços do sistema para enviar DNS ou DHCP ou outros pacotes UDP, já que são menos trabalhosos e menos propensos a erros do que criar manualmente pacote do zero.

    
por 23.11.2018 / 18:47