¿Cómo ejecutar el comando "ls" en el chroot?

8

Tengo la correa de shell del navegador y estoy ejecutando comandos de shell en php y volviéndolos al navegador y acabo de descubrir el comando chroot y quiero ejecutar, por ejemplo, lsen el directorio raíz en la raíz modificada, de hecho, necesito ejecutarlo bash -c "ls /". He intentado esto (lo he intentado sin sudo pero no funcionaba):

sudo chroot ~/projects/jcubic/leash ls

pero tengo error:

chroot: failed to run command ‘ls’: No such file or directory

¿uso este comando correctamente? ¿Es posible ejecutar ls en un directorio raíz diferente?

cuando trato de ejecutar chroot sin sudo, aparece este error:

chroot: cannot change root directory to '/home/kuba/projects/jcubic/leash': Operation not permitted
jcubic
fuente
3
¿Entiendes lo que chrootse supone que debe hacer?
Satō Katsura
1
@SatoKatsura Si entiendo correctamente, cambio el /directorio a otro diferente. ¿Necesito tener binen ese directorio para ejecutar comandos?
jcubic
8
Sí: debe completar la chrootcárcel de antemano con todos los archivos binarios que desea ejecutar, todas las bibliotecas que necesitan y el cargador dinámico (si su sistema operativo usa uno). Además, solo se puede ejecutar root chroot, como descubrió.
Satō Katsura

Respuestas:

12
chroot: failed to run command ‘ls’: No such file or directory

Para ejecutar cualquier comando dentro del chroot, debe tener este programa disponible en el chroot (ya que no puede usar el programa instalado en el /sistema de archivos).

La forma más simple es copiar el /usr/bin/lsdesde a /home/kuba/projects/jcubic/leash/usr/bin/(también necesitará las bibliotecas compartidas dependientes:) ldd /usr/bin/ls.

Jakuje
fuente
Encontré este artículo en help.ubuntu.com, ¿cómo debo ejecutar chroot, porque no puedo encontrar esa información? ¿Debo correr chroot lucid /bin/bash -c "ls /"ochroot /var/chroot /bin/bash -c "ls /"
Jcubic
@jcubic depende mucho de lo que quieras lograr. La página del manual chrootes un buen lugar para comenzar cuando tenga dudas sobre la sintaxis. Lo mismo para otros comandos ( bash).
Jakuje
5

Es posible ejecutar lsen una raíz diferente, pero el lscomando y todos los archivos de los que depende deben estar presentes dentro de esa raíz. No hay forma de iniciar el lscomando, y luego dentro de ese proceso cambiar la raíz: lsno tiene esta característica.

El objetivo de un chroot es limitar la visibilidad de los archivos a los de un determinado directorio. Cuando ejecuta chroot ~/projects/jcubic/leash ls, el chrootcomando cambia la raíz de su propio proceso (cambiar el directorio raíz solo afecta el proceso que lo hace y cualquier proceso que ejecute posteriormente), luego intenta ejecutar un archivo ejecutable llamado lsen un directorio en la ruta de búsqueda. Como la raíz está ahora ~/projects/jcubic/leash, el ejecutable debe estar presente en un directorio como ~/projects/jcubic/leash/bin.

Si desea tener un sistema normal con los comandos habituales en el chroot, debe instalar uno. Pueden ayudar herramientas como debootstrap (para instalar un sistema Debian) o herramientas de aprovisionamiento como Docker (que configura un entorno que está fragmentado y confinado de otras maneras).

Si solo desea el lscomando, aún tendrá que copiar más de ls. Para ejecutar ls, deberá copiar el lscomando y todos los archivos de los que depende. Dado que lses un programa vinculado dinámicamente, necesita su cargador dinámico, así como todas las bibliotecas dinámicas de las que depende. Ejecute ldd /bin/lspara enumerar las bibliotecas dinámicas necesarias. Por ejemplo:

mkdir -p bin lib/x86_64-linux-gnu
rsync -a /bin/ls bin/
rsync -a /lib/x86_64-linux-gnu/ lib/x86_64-linux-gnu/
chroot . ls

Alternativamente, una forma más sencilla de explorar es obtener un binario estáticamente vinculado, por ejemplo, BusyBox (disponible en Debian y derivados como busybox-staticpaquete).

cp /bin/busybox .
chroot . ./busybox ls
Gilles 'SO- deja de ser malvado'
fuente