¿Cómo enviar datos binarios en netcat a una conexión ya establecida?


2

Puedo hacer lo siguiente para enviar datos binarios en netcat:

echo -e '\x80' | nc host port

Pero no quiero hacerlo de esta manera, lo que quiero es conectarme a un servidor:

nc 192.168.1.115 12345

Y luego enviar algún texto:

aaaaaaaaaabbbbbbbbbbccccccccccc

Y luego enviar algunos datos binarios:

0x80 0xF4 0x12

¿Cómo puedo hacer eso?


1
Pensé que podrías usar echo -e '\x80\xF4\x12' | xclip -i en otra terminal, luego pegar en el nc terminal, pero la configuración de entrada del terminal se está interponiendo y no sé cómo nc establece esto, ni puedo encontrar configuraciones que funcionen con stty ... ; cat | xxd ; stty sane.
AFH

Sería útil saber más sobre lo que está intentando enviar y cómo: archivos / entrada de teclado / etc ... ¿Puede dar un ejemplo de lo que el control remoto espera recibir?
Attie

Respuestas:


5

Nota: mientras sigue esta solución, escriba los comandos en una sola sesión de shell (o use un solo script) a menos que se indique lo contrario. Esto se debe a que utiliza variables y descriptores de archivo, no están disponibles directamente fuera de su sesión original.

Crear un fifo temporal. La forma correcta de crear un archivo temporal es con mktemp. Desafortunadamente no se puede crear quince. Puede crear un directorio temporal aunque:

tmpd=`mktemp -d`
tmpf="$tmpd"/fifo
mkfifo "$tmpf"
printf "%s\n" "$tmpf"  # just to know the path to the fifo, it may be useful later

Alternativamente, puede crear un fifo nombrado a mano en alguna ubicación fija o ad-hoc. Tu decides.

Cree un proceso en segundo plano que lea el fifo y pase los datos a un servidor:

nc 192.168.1.115 12345 < "$tmpf" &
ncpid=$!  # PID may be useful later

Prestar atención si nc no sale prematuramente Suponiendo que no haya problemas con la conexión en sí misma ni con el servidor, el comando de fondo anterior permanecerá conectado hasta que termine de enviar el primer grupo de datos a través del fifo. Pero desea que permanezca abierto y acepte escrituras múltiples, así que abra el fifo y no lo cierre (todavía):

exec 3> "$tmpf"

Ahora puedes enviar lo que quieras a través del fifo y la conexión de fondo persiste:

echo abcd      >&3  # sends text
echo -e '\x80' >&3  # sends "binary"
cat /etc/issue >&3  # sends file
cat            >&3  # type whatever you want, terminate with Ctrl+D

Cualquiera de estos comandos puede invocarse con la ruta al fifo en lugar de &3, si tan solo conoces el camino. Conociendo el camino, puedes escribir al fifo desde el mismo o otro sesión de shell:

cat > /path/to/the/fifo  # type whatever you want, terminate with Ctrl+D

O puede abrir un descriptor en otra sesión de una manera similar a la original. De cualquier forma que escribas a la fifo, la nc Lo pasará al servidor remoto en una sola conexión.

Pero cuidado con las condiciones de la raza. Usar un solo descriptor dentro de una sola sesión de shell es una buena manera de evitarlos.

Después de pasar los datos que necesita, finalice la nc y cierre el descriptor en la sesión de shell original:

kill $ncpid
exec 3>&-

Tenga en cuenta en algunas circunstancias que el único último comando es suficiente para hacer el fondo nc salida; depende de lo que hiciste y lo que todavía estás haciendo con el fifo. Por esta razón elegí matar al nc explícitamente.

Elimine el directorio temporal y su contenido (es decir, el fifo):

rm -r "$tmpd"

Nota final:

No es necesario poner nc en el fondo en primer lugar. Puede ejecutarlo en un terminal, escribir en el fifo (conociendo su ruta) desde otro. De esta manera usted puede monitorear fácilmente su estado. Adapte esta solución a sus necesidades.


Busqué mucho por esto, gracias!
bitcell

1

Puedes obtener ayuda de una tubería con nombre para hacerlo, con un pequeño truco:

remote$ nc -v -n -l -p 8888 > /tmp/data
Listening on [0.0.0.0] (family 0, port 8888)
Connection from 10.0.3.1 47108 received!

local:1$ mkfifo /tmp/fifo
local:1$ nc -v -n <>/tmp/fifo 10.0.3.66 8888
Connection to 10.0.3.66 8888 port [tcp/*] succeeded!

Es importante abrir el fifo de lectura-escritura (o bien tener otro proceso neutral como sleep 9999 >/tmp/fifo manteniéndolo abierto para la escritura) de lo contrario, la primera (finalización) de la escritura terminará con el ciclo de lectura de netcat. Por lo tanto, la <>.

local:2$ echo aaaaaaaaaabbbbbbbbbbccccccccccc > /tmp/fifo
local:2$ cat /bin/ls > /tmp/fifo # sends the binary contents of the file /bin/ls, which would probably garble the input or output
local:2$ cat > /tmp/fifo
Some more interactive text

(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

Tu respuesta usa el mismo enfoque que el mío, apareció cuando estaba escribiendo (sí, escribir y probar una buena respuesta me toma tanto tiempo). Mi respuesta menciona algunos problemas que descuida (por ejemplo, el manejo adecuado de los archivos temporales, las condiciones de la carrera), así que lo dejo. Sin embargo +1 para ti.
Kamil Maciorowski

De hecho no me preocupé por la seguridad y la mejor usabilidad. Hiciste una respuesta lista para usar.
A.B

0

Lo siguiente parece funcionar:

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

Esto le permite incluir \xNN Escape las secuencias con sus datos normales, como en:

aaaaaaaaaabbbbbbbbbbccccccccccc\x80\xF4\x12

Recuerda doblar cualquier literal \ caracteres en su entrada de texto. Tenga en cuenta que el uso de read -r y $REPLY En lugar de una variable se detiene la eliminación de los espacios en blanco iniciales y finales.

Esto no agrega una nueva línea al final del búfer, por lo que debe omitir la n opción del echo comando o para escribir \x0a donde quieres una nueva linea

No puedo configurar nc en la actualidad, pero he probado con:

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

Para las pruebas, puede utilizar od -ct x1 si no tienes xxd; o usar od -c Si estás contento de ver caracteres binarios en octal. Puedes omitir cat | desde la tubería: lo incluí como posiblemente una mejor simulación del uso de nc.


0

Si conoce los dos datos de antemano, intente esto:

$ ( 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 desea poder tener más control (use el teclado, etc.), intente esto:

$ ( 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

Nota: necesitas presionar Ctrl + re para terminar cada cat... así que aquí escribí (incluyendo el Regreso s - EOT debe aparecer al principio de la línea):

aaabbbccc
^D
80f412
^D
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.