Come posso creare un pacchetto UDP?


15

Quando eseguo il seguente comando Netcat e visualizzo i pacchetti con Wireshark , si dice che il pacchetto UDP non è corretto.

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

Allo stesso modo, l'uso di comandi come $ echo "this is a test" > /dev/udp/127.0.0.1/53produrre errori "pacchetto non valido" in Wireshark.

Inserisci qui la descrizione dell'immagine

Il comando echo viene inviato / recapitato al server Netcat senza errori. Ma questo mi ha fatto meravigliare: è possibile costruire manualmente un pacchetto UDP adeguato con echo o altri strumenti Unix nativi?

Sto usando Debian e macOS.


10
Secondo il tuo screenshot non è il pacchetto udp stesso che è malformato ma il suo contenuto, poiché la porta 53 è usata per il DNS e il tuo pacchetto non contiene una richiesta DNS valida.
tkausl

@tkausl hai assolutamente ragione. Non ci sono errori "malformati" quando si usano porte diverse da 53. Grazie per averlo sottolineato.
user322500

1
Se non si utilizzano protocolli standard, si suppone che si utilizzino le porte nell'intervallo da 49152 a 65535. Dal momento che Linux usa di default l'intervallo da 32768 a 60999 come porte temporanee, si consiglia di non scegliere quelle per protocolli non standard. Tuttavia da 61000 a 65535 sono un gioco equo per protocolli non standard. Di solito uso echo $[61002+RANDOM%4532]per selezionare un numero di porta casuale in quell'intervallo.
Kasperd,

1
Non accedere come root. Dovresti svolgere la maggior parte delle tue attività come utente non root. Se fai cose come root, tornerai qui chiedendo come riparare il tuo computer e non saremo in grado di aiutarti (se non per raccomandare una reinstallazione).
ctrl-alt-delor

1
@tkausl Guarda cosa hai perso per non aver pubblicato il tuo commento come risposta ....
George Vasiliou,

Risposte:


41

Il pacchetto è completamente valido, dal punto di vista IP e UDP. Se espandi i dettagli del protocollo per Ethernet / IP / UDP nel riquadro inferiore di Wireshark, vedrai che il pacchetto è stato analizzato correttamente.

Tuttavia, poiché è destinato alla porta 53, Wireshark tenta di analizzarlo come pacchetto DNS, cosa che non può fare (poiché la stringa "questo è un test" non è una richiesta DNS valida secondo le specifiche RFC 1035 ).

Se segui le specifiche su quel link, sarai in grado di costruire un pacchetto valido quando analizzato come richiesta DNS. Se invii il pacchetto a un'altra porta, noterai che Wireshark non lo analizzerà più come richiesta DNS e quindi non mostrerà tale avviso.


15

Puoi inviarli agli alias speciali di Bash con il reindirizzamento.

Dalle manpage di Bash:

/ dev / tcp / host / port Se host è un nome host o indirizzo Internet valido e port è un numero di porta intero o un nome di servizio, bash tenta di aprire il socket TCP corrispondente.

/ dev / udp / host / port Se host è un nome host o un indirizzo Internet valido e port è un numero di porta intero o un nome di servizio, bash tenta di aprire il socket UDP corrispondente.

Questo invierà un pacchetto UDP a 192.168.2.11 alla porta 8080:

echo "This is a test" > /dev/udp/192.168.2.11/8080

Grazie per questa risposta Ho aggiornato la mia domanda. L'utilizzo del metodo produce purtroppo anche un messaggio di errore "pacchetto non valido".
user322500

-1

Ci sono più domande qui; l'affermazione di un "pacchetto non valido" potrebbe essere dovuta allo scarico del checksum e, in tal caso, si tratta di un falso errore poiché riflette che l'acquisizione del pacchetto non ha una visione completa - parte del lavoro è stato invece svolto sull'hardware di rete. WireShark dovrebbe avere documentazione su questo.

Altrimenti, vari strumenti (come socat, nco netcat, o tramite funzionalità estremamente simili in shell come ksh93o bash) possono prendere byte dall'input standard e scaricarli in quello che diventa un pacchetto UDP. Se questo è "corretto" dipende dal protocollo; in teoria si potrebbe costruire e inviare un pacchetto DNS o DHCP in questo modo, anche se più spesso le persone usano una libreria o un software dedicato che (si spera) implementa correttamente il protocollo in questione, poiché di solito c'è molto di più che impostare alcuni bit in il corpo di un pacchetto e l'invio tramite cavo, in particolare la gestione delle risposte, riprovare dopo timeout o errore, campi di intestazione del pacchetto, ecc. I protocolli sono di solito molto ben documentati in RFC o vedere la serie di libri "TCP / IP Illustrated" di Stevens per ancora più documentazione.

Strumenti specifici come nmapfare cose molto personalizzate con la costruzione di pacchetti. Altrimenti per la costruzione manuale di pacchetti viene generalmente utilizzato un linguaggio di programmazione, anche se la maggior parte dei software utilizzerà librerie o servizi di sistema esistenti per inviare DNS o DHCP o altri pacchetti UDP, poiché questi sono molto meno lavoro e molto meno soggetti a errori rispetto alla creazione manuale di un raw pacchetto da zero.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.