10 votes

Comment envoyer des données binaires dans netcat à une connexion déjà établie?

Je peux faire ce qui suit pour envoyer des données binaires en netcat :

echo -e '\x80' | nc host port

Mais je ne veux pas faire cela, ce que je veux c'est me connecter à un serveur :

nc 192.168.1.115 12345

Et ensuite envoyer du texte :

aaaaaaaaaabbbbbbbbbbccccccccccc

Et ensuite envoyer des données binaires :

0x80 0xF4 0x12

Comment puis-je faire cela ?

8voto

Kamil Maciorowski Points 57004

Note : en suivant cette solution, tapez les commandes dans une seule session shell (ou utilisez un seul script) sauf indication contraire. Cela est dû à l'utilisation de variables et de descripteurs de fichiers, qui ne sont pas directement disponibles en dehors de leur session d'origine.

Créez un fifo temporaire. La bonne manière de créer un fichier temporaire est avec mktemp. Malheureusement, il ne peut pas créer des fifos. Il peut cependant créer un répertoire temporaire :

tmpd=`mktemp -d`
tmpf="$tmpd"/fifo
mkfifo "$tmpf"
printf "%s\n" "$tmpf"  # juste pour connaître le chemin du fifo, cela peut être utile plus tard

Alternativement, vous pouvez créer un fifo nommé manuellement dans un emplacement fixe ou ad-hoc. C'est à vous de décider.

Créez un processus en arrière-plan qui lira le fifo et enverra des données à un serveur :

nc 192.168.1.115 12345 < "$tmpf" &
ncpid=$!  # Le PID peut être utile plus tard

Faites attention si nc se termine prématurément. En supposant qu'il n'y ait pas de problème avec la connexion elle-même ni le serveur, la commande d'arrière-plan ci-dessus restera connectée jusqu'à ce que vous finissiez d'envoyer le premier tas de données via le fifo. Mais vous voulez qu'il reste ouvert et accepte plusieurs écritures, donc ouvrez le fifo et ne le fermez pas (encore) :

exec 3> "$tmpf"

Maintenant, vous pouvez envoyer ce que vous voulez à travers le fifo et la connexion de fond persiste :

echo abcd      >&3  # envoie du texte
echo -e '\x80' >&3  # envoie du "binaire"
cat /etc/issue >&3  # envoie de fichier
cat            >&3  # tapez ce que vous voulez, terminez avec Ctrl+D

N'importe laquelle de ces commandes peut être invoquée avec le chemin du fifo au lieu de &3, si seulement vous connaissez le chemin. Sachant le chemin, vous pouvez écrire dans le fifo à partir de la même ou d'une autre session shell :

cat > /chemin/vers/le/fifo  # tapez ce que vous voulez, terminez avec Ctrl+D

Ou vous pouvez ouvrir un descripteur dans une autre session de manière similaire comme dans la session originale. Peu importe la façon dont vous écrivez dans le fifo, le nc le transmettra au serveur distant dans une seule connexion.

Mais attention aux conditions de concurrence. Utiliser un seul descripteur dans une seule session shell est une bonne manière de les éviter.

Après avoir transmis toutes les données nécessaires, terminez le nc et fermez le descripteur dans la session shell d'origine :

kill $ncpid
exec 3>&-

Remarquez que dans certaines circonstances, la seule dernière commande suffit à faire sortir le nc de fond ; cela dépend de ce que vous avez fait et de ce que vous faites encore avec le fifo. Pour cette raison, j'ai choisi de tuer le nc explicitement.

Supprimez le répertoire temporaire et son contenu (c'est-à-dire le fifo) :

rm -r "$tmpd"

Note finale :

Il n'est pas nécessaire de mettre nc en arrière-plan dès le début. Vous pouvez l'exécuter dans un terminal, écrire dans le fifo (en connaissant son chemin) depuis un autre. De cette manière, vous pouvez facilement surveiller son état. Adaptez cette solution à vos besoins.

3voto

AFH Points 16642

Le suivant semble fonctionner:

while read -r; do echo -en "$REPLY" | nc ...; done

Cela vous permet d'inclure des séquences d'échappement \xNN avec vos données normales, comme ceci :

aaaaaaaaaabbbbbbbbbbccccccccccc\x80\xF4\x12

N'oubliez pas de doubler tous les caractères \ littéraux dans votre entrée textuelle. Notez que l'utilisation de read -r et de $REPLY au lieu d'une variable empêche la suppression des espaces en début et en fin de ligne.

Cela n'ajoute pas de nouvelle ligne à la fin du tampon, donc vous devez soit omettre l'option n de la commande echo, soit taper \x0a là où vous voulez une nouvelle ligne.

Je ne peux pas configurer nc pour le moment, mais j'ai testé avec :

while read -r; do echo -en "$REPLY" | cat | xxd; done

Pour les tests, vous pouvez utiliser od -ct x1 si vous n'avez pas xxd; ou utilisez od -c si vous êtes prêt à voir des caractères binaires en octal. Vous pouvez omettre cat | du pipe : je l'ai inclus comme étant peut-être une meilleure simulation de l'utilisation de nc.

2voto

A.B Points 3913

Vous pouvez obtenir de l'aide d'un tube nommé pour le faire, avec un petit truc:

remote$ nc -v -n -l -p 8888 > /tmp/data
Écoute sur [0.0.0.0] (famille 0, port 8888)
Connexion depuis 10.0.3.1 47108 reçue!

local:1$ mkfifo /tmp/fifo
local:1$ nc -v -n <>/tmp/fifo 10.0.3.66 8888
Connexion à 10.0.3.66 8888 port [tcp/*] réussie!

Il est important d'ouvrir le tube en lecture-écriture (ou d'avoir un autre processus neutre comme sleep 9999 >/tmp/fifo le gardant ouvert pour l'écriture) sinon le premier écrit (terminé) mettra fin à la boucle de lecture de netcat. D'où le <>.

local:2$ echo aaaaaaaaaabbbbbbbbbbccccccccccc > /tmp/fifo
local:2$ cat /bin/ls > /tmp/fifo # envoie le contenu binaire du fichier /bin/ls, ce qui pourrait probablement fausser l'entrée ou la sortie
local:2$ cat > /tmp/fifo
Un peu plus de texte interactif

(local:1$ )
^C

remote$ od -c /tmp/data|head -4
0000000   a   a   a   a   a   a   a   a   a   a   b   b   b   b   b   b
0000020   b   b   b   b   c   c   c   c   c   c   c   c   c   c   c  \n
0000040 177   E   L   F 002 001 001  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000060 003  \0   >  \0 001  \0  \0  \0   0   T  \0  \0  \0  \0  \0  \0

0voto

Attie Points 18031

Si vous connaissez les deux morceaux de données à l'avance, essayez ceci :

$ ( echo "aaabbbccc"; echo -en "\x80\xf4\x12" ) | hexdump -Cv
00000000  61 61 61 62 62 62 63 63  63 0a 80 f4 12           |aaabbbccc....|
0000000d

Si vous voulez avoir plus de contrôle (utiliser le clavier, etc...), essayez ceci :

$ ( cat; cat | xxd -r -p ) | hexdump -Cv
aaabbbccc
80f412
00000000  61 61 61 62 62 62 63 63  63 0a 80 f4 12           |aaabbbccc....|
0000000d

Remarque : vous devez appuyer sur Ctrl + D pour terminer chaque cat... donc ici j'ai tapé (y compris les retours - EOT doit apparaître au début de la ligne) :

aaabbbccc
^D
80f412
^D

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X