2375, 2376 Pentesting Docker
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Το Docker είναι η πρωτοποριακή πλατφόρμα στη βιομηχανία κοντέινερ, η οποία ηγείται της συνεχούς καινοτομίας. Διευκολύνει τη χωρίς κόπο δημιουργία και διανομή εφαρμογών, που κυμαίνονται από παραδοσιακές έως μελλοντικές, και διασφαλίζει την ασφαλή ανάπτυξή τους σε διάφορα περιβάλλοντα.
containerd: Αυτή είναι μια βασική εκτέλεση για κοντέινερ, υπεύθυνη για τη συνολική διαχείριση του κύκλου ζωής ενός κοντέινερ. Αυτό περιλαμβάνει τη διαχείριση της μεταφοράς και αποθήκευσης εικόνας, καθώς και την επίβλεψη της εκτέλεσης, παρακολούθησης και δικτύωσης των κοντέινερ. Περισσότερες λεπτομέρειες σχετικά με το containerd εξετάζονται περαιτέρω.
Ο container-shim παίζει κρίσιμο ρόλο ως μεσάζων στη διαχείριση των headless κοντέινερ, αναλαμβάνοντας ομαλά από το runc μετά την αρχικοποίηση των κοντέινερ.
runc: Εκτιμάται για τις ελαφριές και καθολικές δυνατότητες εκτέλεσης κοντέινερ, το runc είναι ευθυγραμμισμένο με το πρότυπο OCI. Χρησιμοποιείται από το containerd για να ξεκινά και να διαχειρίζεται κοντέινερ σύμφωνα με τις κατευθυντήριες γραμμές OCI, έχοντας εξελιχθεί από το αρχικό libcontainer.
grpc είναι απαραίτητο για να διευκολύνει την επικοινωνία μεταξύ του containerd και του docker-engine, διασφαλίζοντας αποτελεσματική αλληλεπίδραση.
Ο OCI είναι καθοριστικός για τη διατήρηση των προδιαγραφών OCI για εκτέλεση και εικόνες, με τις τελευταίες εκδόσεις του Docker να είναι συμβατές με τα πρότυπα εικόνας και εκτέλεσης OCI.
Containerd αναπτύχθηκε ειδικά για να εξυπηρετήσει τις ανάγκες πλατφορμών κοντέινερ όπως Docker και Kubernetes, μεταξύ άλλων. Σκοπός του είναι να απλοποιήσει την εκτέλεση κοντέινερ σε διάφορα λειτουργικά συστήματα, συμπεριλαμβανομένων των Linux, Windows, Solaris και άλλων, απομονώνοντας τη λειτουργικότητα και τις κλήσεις συστήματος που σχετίζονται με το λειτουργικό σύστημα. Ο στόχος του Containerd είναι να περιλαμβάνει μόνο τα απαραίτητα χαρακτηριστικά που απαιτούν οι χρήστες του, προσπαθώντας να παραλείψει περιττά στοιχεία. Ωστόσο, η πλήρης επίτευξη αυτού του στόχου αναγνωρίζεται ως προκλητική.
Μια βασική απόφαση σχεδίασης είναι ότι το Containerd δεν διαχειρίζεται το δίκτυο. Το δίκτυο θεωρείται κρίσιμο στοιχείο σε κατανεμημένα συστήματα, με πολυπλοκότητες όπως το Software Defined Networking (SDN) και την ανακάλυψη υπηρεσιών που διαφέρουν σημαντικά από πλατφόρμα σε πλατφόρμα. Επομένως, το Containerd αφήνει τις πτυχές του δικτύου να διαχειρίζονται από τις πλατφόρμες που υποστηρίζει.
Ενώ το Docker χρησιμοποιεί το Containerd για να εκτελεί κοντέινερ, είναι σημαντικό να σημειωθεί ότι το Containerd υποστηρίζει μόνο ένα υποσύνολο των λειτουργιών του Docker. Συγκεκριμένα, το Containerd δεν διαθέτει τις δυνατότητες διαχείρισης δικτύου που υπάρχουν στο Docker και δεν υποστηρίζει τη δημιουργία Docker swarms άμεσα. Αυτή η διάκριση αναδεικνύει το επικεντρωμένο ρόλο του Containerd ως περιβάλλον εκτέλεσης κοντέινερ, αναθέτοντας πιο εξειδικευμένες λειτουργίες στις πλατφόρμες με τις οποίες ενσωματώνεται.
Podman είναι μια ανοιχτού κώδικα μηχανή κοντέινερ που συμμορφώνεται με τα πρότυπα Open Container Initiative (OCI), αναπτυγμένη και συντηρούμενη από την Red Hat. Ξεχωρίζει από το Docker με αρκετά χαρακτηριστικά, κυρίως την αρχιτεκτονική χωρίς daemon και την υποστήριξη για rootless containers, επιτρέποντας στους χρήστες να εκτελούν κοντέινερ χωρίς δικαιώματα root.
Το Podman έχει σχεδιαστεί για να είναι συμβατό με το API του Docker, επιτρέποντας τη χρήση εντολών CLI του Docker. Αυτή η συμβατότητα επεκτείνεται στο οικοσύστημα του, το οποίο περιλαμβάνει εργαλεία όπως το Buildah για την κατασκευή εικόνων κοντέινερ και το Skopeo για λειτουργίες εικόνας όπως push, pull και inspect. Περισσότερες λεπτομέρειες για αυτά τα εργαλεία μπορείτε να βρείτε στη σελίδα GitHub τους.
Κύριες Διαφορές
Αρχιτεκτονική: Σε αντίθεση με το μοντέλο client-server του Docker με ένα background daemon, το Podman λειτουργεί χωρίς daemon. Αυτός ο σχεδιασμός σημαίνει ότι τα κοντέινερ εκτελούνται με τα δικαιώματα του χρήστη που τα ξεκινά, ενισχύοντας την ασφάλεια με την εξάλειψη της ανάγκης για πρόσβαση root.
Ενσωμάτωση με Systemd: Το Podman ενσωματώνεται με το systemd για τη διαχείριση κοντέινερ, επιτρέποντας τη διαχείριση κοντέινερ μέσω μονάδων systemd. Αυτό αντιτίθεται στη χρήση του systemd από το Docker κυρίως για τη διαχείριση της διαδικασίας daemon του Docker.
Rootless Containers: Ένα κρίσιμο χαρακτηριστικό του Podman είναι η ικανότητά του να εκτελεί κοντέινερ υπό τα δικαιώματα του χρήστη που τα ξεκινά. Αυτή η προσέγγιση ελαχιστοποιεί τους κινδύνους που σχετίζονται με παραβιάσεις κοντέινερ, διασφαλίζοντας ότι οι επιτιθέμενοι αποκτούν μόνο τα δικαιώματα του παραβιασμένου χρήστη, όχι πρόσβαση root.
Η προσέγγιση του Podman προσφέρει μια ασφαλή και ευέλικτη εναλλακτική λύση στο Docker, τονίζοντας τη διαχείριση δικαιωμάτων χρηστών και τη συμβατότητα με τις υπάρχουσες ροές εργασίας του Docker.
Σημειώστε ότι καθώς το podman στοχεύει να υποστηρίξει το ίδιο API με το docker, μπορείτε να χρησιμοποιήσετε τις ίδιες εντολές με το podman όπως με το docker, όπως:
Η Remote API εκτελείται από προεπιλογή στην θύρα 2375 όταν είναι ενεργοποιημένη. Η υπηρεσία από προεπιλογή δεν θα απαιτεί αυθεντικοποίηση, επιτρέποντας σε έναν επιτιθέμενο να ξεκινήσει ένα προνομιακό docker container. Χρησιμοποιώντας την Remote API, μπορεί κανείς να συνδέσει hosts / (ριζικός κατάλογος) στο container και να διαβάσει/γράψει αρχεία του περιβάλλοντος του host.
Προεπιλεγμένη θύρα: 2375
Σημειώστε ότι για να καταμετρήσετε το docker API μπορείτε να χρησιμοποιήσετε την εντολή docker
ή curl
όπως στο παρακάτω παράδειγμα:
Αν μπορείτε να επικοινωνήσετε με το απομακρυσμένο docker API με την εντολή docker
μπορείτε να εκτελέσετε οποιαδήποτε από τις docker εντολές που έχουν σχολιαστεί προηγουμένως για να αλληλεπιδράσετε με την υπηρεσία.
Μπορείτε να export DOCKER_HOST="tcp://localhost:2375"
και να αποφύγετε τη χρήση της παραμέτρου -H
με την εντολή docker
Γρήγορη κλιμάκωση προνομίων
Curl
Μερικές φορές θα δείτε το 2376 ενεργό για το TLS endpoint. Δεν μπόρεσα να συνδεθώ σε αυτό με τον πελάτη docker, αλλά είναι δυνατόν να το κάνετε με το curl.
Αν θέλετε περισσότερες πληροφορίες σχετικά με αυτό, περισσότερες πληροφορίες είναι διαθέσιμες από όπου αντέγραψα τις εντολές: https://securityboulevard.com/2019/02/abusing-docker-api-socket/
Στην επόμενη σελίδα μπορείτε να βρείτε τρόπους για να ξεφύγετε από ένα docker container:
Docker SecurityΚαταχρώντας αυτό είναι δυνατόν να ξεφύγετε από ένα container, μπορείτε να εκτελέσετε ένα αδύναμο container στη απομακρυσμένη μηχανή, να ξεφύγετε από αυτό και να συμβιβάσετε τη μηχανή:
Αν βρίσκεστε μέσα σε έναν υπολογιστή που χρησιμοποιεί docker, μπορείτε να διαβάσετε αυτές τις πληροφορίες για να προσπαθήσετε να κλιμακώσετε τα δικαιώματα.
Ελέγξτε env (ενότητα μεταβλητών περιβάλλοντος) για μυστικά και μπορεί να βρείτε:
Κωδικούς πρόσβασης.
Διευθύνσεις IP.
Θύρες.
Διαδρομές.
Άλλα… .
Αν θέλετε να εξαγάγετε ένα αρχείο:
Μπορείτε να χρησιμοποιήσετε το εργαλείο https://github.com/docker/docker-bench-security για να ελέγξετε την τρέχουσα εγκατάσταση docker σας.
./docker-bench-security.sh
Μπορείτε να χρησιμοποιήσετε το εργαλείο https://github.com/kost/dockscan για να ελέγξετε την τρέχουσα εγκατάσταση docker σας.
dockscan -v unix:///var/run/docker.sock
Μπορείτε να χρησιμοποιήσετε το εργαλείο https://github.com/genuinetools/amicontained για να δείτε τα δικαιώματα που θα έχει ένα κοντέινερ όταν εκτελείται με διαφορετικές επιλογές ασφαλείας. Αυτό είναι χρήσιμο για να γνωρίζετε τις επιπτώσεις της χρήσης ορισμένων επιλογών ασφαλείας για την εκτέλεση ενός κοντέινερ:
docker run --rm -it r.j3ss.co/amicontained
docker run --rm -it --pid host r.j3ss.co/amicontained
docker run --rm -it --security-opt "apparmor=unconfined" r.j3ss.co/amicontained
Μπορείτε να χρησιμοποιήσετε μια εικόνα docker από https://github.com/quay/clair για να σαρώσετε τις άλλες εικόνες docker σας και να βρείτε ευπάθειες.
docker run --rm -v /root/clair_config/:/config -p 6060-6061:6060-6061 -d clair -config="/config/config.yaml"
clair-scanner -c http://172.17.0.3:6060 --ip 172.17.0.1 ubuntu-image
Μπορείτε να χρησιμοποιήσετε το εργαλείο https://github.com/buddy-works/dockerfile-linter για να ελέγξετε το Dockerfile σας και να βρείτε κάθε είδους κακή διαμόρφωση. Κάθε κακή διαμόρφωση θα λάβει ένα ID, μπορείτε να βρείτε εδώ https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md πώς να διορθώσετε καθεμία από αυτές.
dockerfilelinter -f Dockerfile
Μπορείτε να χρησιμοποιήσετε το εργαλείο https://github.com/replicatedhq/dockerfilelint για να ελέγξετε το Dockerfile σας και να βρείτε κάθε είδους κακή διαμόρφωση.
dockerfilelint Dockerfile
Μπορείτε να χρησιμοποιήσετε το εργαλείο https://github.com/RedCoolBeans/dockerlint για να ελέγξετε το Dockerfile σας και να βρείτε κάθε είδους κακή διαμόρφωση.
dockerlint Dockerfile
Μπορείτε να χρησιμοποιήσετε το εργαλείο https://github.com/hadolint/hadolint για να ελέγξετε το Dockerfile σας και να βρείτε κάθε είδους κακή διαμόρφωση.
hadolint Dockerfile
Μπορείτε να χρησιμοποιήσετε το εργαλείο https://github.com/falcosecurity/falco για να ανιχνεύσετε ύποπτη συμπεριφορά σε εκτελούμενα κοντέινερ.
Σημειώστε στο παρακάτω κομμάτι πώς ο Falco συντάσσει ένα module πυρήνα και το εισάγει. Μετά από αυτό, φορτώνει τους κανόνες και ξεκινά να καταγράφει ύποπτες δραστηριότητες. Σε αυτή την περίπτωση, έχει ανιχνεύσει 2 προνομιούχα κοντέινερ που ξεκίνησαν, 1 από αυτά με μια ευαίσθητη τοποθέτηση, και μετά από μερικά δευτερόλεπτα ανίχνευσε πώς άνοιξε ένα shell μέσα σε ένα από τα κοντέινερ.
Μπορείτε να χρησιμοποιήσετε το auditd για να παρακολουθήσετε το docker.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)