No puedo escribir en /etc/shadow con "echo" pero con "nano" puedo

No puedo escribir en /etc/shadow con "echo" pero con "nano" puedo

Mi objetivo es escribir en /etc/passwd para escalar privilegios a root.

Generé la contraseña "test1" para el nuevo usuario root: openssl passwd test1 y uso echo para agregar una nueva entrada en el archivo /etc/passwd:sudo echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd

Pero cuando hago este último comando me muestra que no tengo permiso para hacer esto:bash: /etc/passwd: Permission denied

pero cuando uso el comando sudo nano /etc/passwdy lo copio root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bashal final del archivo, ¡funciona!

¿Cuál es el problema con el echocomando?

Respuesta1

Ya respondido a través de los comentarios, pero para ampliar un poco:

sudo echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd

se traduce en lo siguiente:

  1. Indique a bash (que no está elevado) que abra el archivo /etc/passwd para escribir
  2. Indique a bash (aún no elevado) que ejecute el comando sudocon algunos argumentos y use el descriptor de archivo del paso 1 como salida estándar.
    1. Indique a sudo (que es setuid root) que ejecute el comando echocon algunos argumentos
      1. Instruya a echo (ejecutándose como root, y tenga en cuenta que es probable que sea algo así como /usr/bin/echo mientras que normalmente echoinvocará un shell incorporado) y heredando stdout de sudo) para enviar algo de texto a stdout
      2. Su trabajo está hecho, el eco sale.
    2. Su trabajo está hecho, sudo sale; no queda nada ejecutándose como root
  3. Bash (aún no elevado) cierra el descriptor de archivo en /etc/passwd (vaciando la cola de escritura)
  4. Bash espera el siguiente comando

¡Excepto, por supuesto, que el paso 1 falla! Bash, al no estar elevado, no puede abrir /etc/passwd para escribir. Por lo tanto, bash: /etc/passwd: Permission deniedno se realiza ninguna parte de los pasos 2 o 3, incluido ninguno de los subpasos del paso 2.

sudo nano /etc/passwdfunciona bien, porque el proceso elevado (nano, que hereda privilegios de root de sudo) es el que abre el archivo para escribir.

Si quisieras usar echo aquí, necesitarías que bash esté elevado. Esto se podría hacer invocando explícitamente bash (o cualquier otro shell) dentro de sudo y luego diciéndole qué hacer:
sudo bash -c 'echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd'
o de manera equivalente, como tres comandos separados (los dos últimos se dan a la instancia elevada de bash):
sudo bash echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd exit

información relacionada