Ich habe eine Browser-Shell- Leine und führe Shell-Befehle in PHP aus und speichere sie im Browser. Ich habe gerade den Befehl chroot entdeckt und möchte ihn beispielsweise ls
im Stammverzeichnis auf dem geänderten Stamm ausführen bash -c "ls /"
. Tatsächlich muss ich ihn ausführen . Ich habe es versucht (ich habe es ohne sudo versucht, aber es hat nicht funktioniert):
sudo chroot ~/projects/jcubic/leash ls
habe aber Fehler bekommen:
chroot: failed to run command ‘ls’: No such file or directory
verwende ich diesen Befehl richtig? Ist es möglich, ls in einem anderen Stammverzeichnis auszuführen?
Wenn ich versuche, chroot ohne sudo auszuführen, wird folgender Fehler angezeigt:
chroot: cannot change root directory to '/home/kuba/projects/jcubic/leash': Operation not permitted
chroot
zu tun ist?/
Verzeichnis in ein anderes. Muss ich michbin
in diesem Verzeichnis befinden, um Befehle ausführen zu können?chroot
Gefängnis vorher mit allen Binärdateien füllen, die Sie ausführen möchten, allen benötigten Bibliotheken und dem dynamischen Loader (falls Ihr Betriebssystem eine verwendet).chroot
Wie Sie herausgefunden haben, kann auch nur root ausgeführt werden.Antworten:
Um einen Befehl innerhalb der Chroot ausführen zu können, muss dieses Programm in der Chroot verfügbar sein (da es das im
/
Dateisystem installierte Programm nicht verwenden kann .Am einfachsten ist es, das
/usr/bin/ls
von nach zu kopieren/home/kuba/projects/jcubic/leash/usr/bin/
(Sie benötigen auch die abhängigen gemeinsam genutzten Bibliotheken :)ldd /usr/bin/ls
.quelle
chroot lucid /bin/bash -c "ls /"
oderchroot /var/chroot /bin/bash -c "ls /"
chroot
ist ein guter Ausgangspunkt, wenn Sie Zweifel an der Syntax haben. Das gleiche gilt für andere Befehle (bash
).Es ist möglich,
ls
in einem anderen Stammverzeichnis auszuführen , aber derls
Befehl und alle Dateien, von denen er abhängt, müssen in diesem Stammverzeichnis vorhanden sein. Es gibt keine Möglichkeit, denls
Befehl zu starten und dann innerhalb dieses Prozesses den Stamm zu ändern:ls
hat diese Funktion nicht.Der springende Punkt bei einer Chroot ist, die Sichtbarkeit von Dateien auf diejenigen unter einem bestimmten Verzeichnis zu beschränken. Wenn Sie ausführen
chroot ~/projects/jcubic/leash ls
,chroot
ändert der Befehl das Stammverzeichnis seines eigenen Prozesses (das Ändern des Stammverzeichnisses wirkt sich nur auf den Prozess aus, der es ausführt, und auf alle Prozesse, die anschließend ausgeführt werden). Anschließend wird versucht, eine ausführbare Datei auszuführen, diels
in einem Verzeichnis im Suchpfad aufgerufen wird. Da sich das Stammverzeichnis jetzt befindet~/projects/jcubic/leash
, muss die ausführbare Datei in einem Verzeichnis wie z~/projects/jcubic/leash/bin
.Wenn Sie ein normales System mit den üblichen Befehlen in der Chroot haben möchten, müssen Sie eines installieren. Tools wie Debootstrap (zum Installieren eines Debian-Systems) oder Bereitstellungstools wie Docker (das eine Umgebung einrichtet, die chrootiert und auf andere Weise eingeschränkt ist) können helfen.
Wenn Sie nur den
ls
Befehl möchten , müssen Sie immer noch mehr als kopierenls
. Zum Ausführenls
müssen Sie denls
Befehl sowie alle Dateien kopieren, von denen er abhängt. Dals
es sich um ein dynamisch verknüpftes Programm handelt, benötigen Sie den dynamischen Loader sowie alle dynamischen Bibliotheken, von denen es abhängt. Ausführen,ldd /bin/ls
um die erforderlichen dynamischen Bibliotheken aufzulisten. Zum Beispiel:Alternativ können Sie einfacher eine statisch verknüpfte Binärdatei abrufen, z. B. BusyBox (verfügbar für Debian und Derivate als
busybox-static
Paket).quelle