Como crio um pacote UDP?

15

Quando executo o seguinte comando Netcat e visualizo os pacotes com o 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/53produzir erros de "pacote malformado" no Wireshark.

Digite a descrição da imagem aqui

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

Estou usando o Debian e o macOS.

user322500
fonte
10
De acordo com a sua captura de tela, não é o próprio pacote udp que está malformado, mas seu conteúdo, pois a porta 53 é usada para DNS e seu pacote não contém uma solicitação DNS válida.
tkausl
@tkausl você está absolutamente certo. Não há erros "malformados" ao usar portas diferentes de 53. Obrigado por apontar isso.
user322500
1
Se você não estiver usando protocolos padrão, deverá usar portas no intervalo de 49152 a 65535. Como o Linux, por padrão, usa o intervalo 32768 a 60999 como portas efêmeras, eu recomendo não escolher essas portas para protocolos não padrão. No entanto, 61000 a 65535 são um jogo justo para protocolos não padrão. Eu costumo usar echo $[61002+RANDOM%4532]para escolher um número de porta aleatório nesse intervalo.
kasperd
1
Não faça logon como root. Você deve executar a maior parte de sua atividade como um usuário não root. Se você fizer coisas como root, voltará aqui perguntando como consertar sua máquina e não poderemos ajudar (exceto para recomendar uma reinstalação).
Ctrl-alt-delor
1
Olhe @tkausl o que você perdeu por não postar seu comentário como resposta ....
George Vasiliou

Respostas:

41

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

No entanto, como é destinado à porta 53, o Wireshark tenta analisá-lo como um pacote DNS, o que não é possível (uma vez que a cadeia "isto é um teste" não é uma solicitação DNS válida conforme a especificação RFC 1035 ).

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

Restabelecer Monica - ζ--
fonte
15

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

Nas páginas de manual do Bash:

/ dev / tcp / host / port Se host for um nome de host ou endereço da Internet válido e port for um número de porta inteiro ou nome de serviço, o bash tentará abrir o soquete TCP correspondente.

/ dev / udp / host / port Se host for um nome de host ou endereço da Internet válido e port for um número de porta inteiro ou nome de serviço, o bash tentará abrir o soquete UDP correspondente.

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
rAlen
fonte
Obrigado por esta resposta. Eu atualizei minha pergunta. O uso do método também produz uma mensagem de erro "pacote malformado", infelizmente.
user322500
-1

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

Caso contrário, várias ferramentas (como socat, ncou netcat, ou através de recursos extremamente semelhantes em shells como ksh93ou bash) podem pegar bytes da entrada padrão e despejá-los no que se torna um pacote UDP. Se isso é "adequado" depende do protocolo; em teoria, poderia-se construir e enviar um pacote DNS ou DHCP dessa maneira, embora mais frequentemente as pessoas usem uma biblioteca ou software dedicado que (espero) implemente corretamente o protocolo em questão, pois geralmente há muito mais envolvimento do que definir alguns bits no o corpo de um pacote e enviá-lo pela rede, notadamente manipulando respostas, tentando novamente após tempo limite ou erro, campos de cabeçalho de pacote etc. Os protocolos geralmente são 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 nmapfazer coisas muito personalizadas com a construção de pacotes. Caso contrário, para a construção manual de pacotes, normalmente é usada uma linguagem de programação, embora a maioria dos softwares use bibliotecas ou serviços de sistema existentes para enviar pacotes DNS ou DHCP ou outros pacotes UDP, pois esses são muito menos trabalhosos e menos propensos a erros do que a criação manual de uma matéria-prima. pacote a partir do zero.

agitar
fonte