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 ist die führende Plattform in der Containerisierungsbranche, die kontinuierliche Innovation vorantreibt. Es erleichtert die mühelose Erstellung und Verteilung von Anwendungen, die von traditionell bis futuristisch reichen, und gewährleistet deren sichere Bereitstellung in verschiedenen Umgebungen.
containerd: Dies ist eine Kernlaufzeit für Container, die mit der umfassenden Verwaltung des Lebenszyklus eines Containers betraut ist. Dies umfasst die Handhabung von Bildübertragung und -speicherung sowie die Überwachung der Ausführung, Überwachung und Vernetzung von Containern. Detailliertere Einblicke in containerd werden weiter untersucht.
Der container-shim spielt eine entscheidende Rolle als Vermittler bei der Handhabung von headless containers und übernimmt nahtlos von runc, nachdem die Container initialisiert wurden.
runc: Geschätzt für seine leichte und universelle Containerlaufzeit-Fähigkeiten, ist runc mit dem OCI-Standard in Einklang. Es wird von containerd verwendet, um Container zu starten und zu verwalten gemäß den OCI-Richtlinien, nachdem es sich aus dem ursprünglichen libcontainer entwickelt hat.
grpc ist entscheidend für die Erleichterung der Kommunikation zwischen containerd und der docker-engine, um eine effiziente Interaktion zu gewährleisten.
Die OCI ist entscheidend für die Aufrechterhaltung der OCI-Spezifikationen für Laufzeiten und Bilder, wobei die neuesten Docker-Versionen konform mit den OCI-Bild- und Laufzeitstandards sind.
Containerd wurde speziell entwickelt, um die Bedürfnisse von Container-Plattformen wie Docker und Kubernetes zu bedienen. Es zielt darauf ab, die Ausführung von Containern über verschiedene Betriebssysteme hinweg zu vereinfachen, einschließlich Linux, Windows, Solaris und mehr, indem es betriebssystemspezifische Funktionen und Systemaufrufe abstrahiert. Das Ziel von Containerd ist es, nur die wesentlichen Funktionen einzuschließen, die von seinen Benutzern benötigt werden, und unnötige Komponenten zu vermeiden. Es wird jedoch anerkannt, dass es eine Herausforderung ist, dieses Ziel vollständig zu erreichen.
Eine wichtige Designentscheidung ist, dass Containerd das Networking nicht behandelt. Networking wird als ein kritisches Element in verteilten Systemen betrachtet, mit Komplexitäten wie Software Defined Networking (SDN) und Service Discovery, die von einer Plattform zur anderen erheblich variieren. Daher überlässt Containerd die Netzwerkaspekte den Plattformen, die es unterstützt.
Während Docker Containerd nutzt, um Container auszuführen, ist es wichtig zu beachten, dass Containerd nur eine Teilmenge der Funktionen von Docker unterstützt. Insbesondere fehlen Containerd die Netzwerkmanagement-Funktionen, die in Docker vorhanden sind, und es unterstützt nicht die direkte Erstellung von Docker-Swarms. Diese Unterscheidung hebt die fokussierte Rolle von Containerd als Container-Laufzeitumgebung hervor, die spezialisiertere Funktionen an die Plattformen delegiert, mit denen es integriert ist.
Podman ist eine Open-Source-Container-Engine, die den Open Container Initiative (OCI) Standards entspricht und von Red Hat entwickelt und gepflegt wird. Es hebt sich von Docker durch mehrere distinct Merkmale ab, insbesondere durch seine daemonlose Architektur und die Unterstützung für rootlose Container, die es Benutzern ermöglicht, Container ohne Root-Rechte auszuführen.
Podman ist so konzipiert, dass es mit der Docker-API kompatibel ist, was die Verwendung von Docker-CLI-Befehlen ermöglicht. Diese Kompatibilität erstreckt sich auf sein Ökosystem, das Tools wie Buildah zum Erstellen von Container-Images und Skopeo für Bildoperationen wie Push, Pull und Inspect umfasst. Weitere Details zu diesen Tools finden Sie auf ihrer GitHub-Seite.
Wesentliche Unterschiede
Architektur: Im Gegensatz zum Client-Server-Modell von Docker mit einem Hintergrund-Daemon arbeitet Podman ohne Daemon. Dieses Design bedeutet, dass Container mit den Rechten des Benutzers ausgeführt werden, der sie startet, was die Sicherheit erhöht, da der Bedarf an Root-Zugriff entfällt.
Systemd-Integration: Podman integriert sich mit systemd, um Container zu verwalten, was die Containerverwaltung über systemd-Einheiten ermöglicht. Dies steht im Gegensatz zur Verwendung von systemd durch Docker, das hauptsächlich zur Verwaltung des Docker-Daemon-Prozesses dient.
Rootlose Container: Ein entscheidendes Merkmal von Podman ist die Fähigkeit, Container unter den Rechten des initiierenden Benutzers auszuführen. Dieser Ansatz minimiert die Risiken im Zusammenhang mit Containerverletzungen, indem sichergestellt wird, dass Angreifer nur die Rechte des kompromittierten Benutzers erlangen, nicht den Root-Zugriff.
Der Ansatz von Podman bietet eine sichere und flexible Alternative zu Docker, die das Management von Benutzerprivilegien und die Kompatibilität mit bestehenden Docker-Workflows betont.
Beachten Sie, dass Podman darauf abzielt, die gleiche API wie Docker zu unterstützen, sodass Sie die gleichen Befehle mit Podman wie mit Docker verwenden können, wie zum Beispiel:
Die Remote-API läuft standardmäßig auf dem Port 2375, wenn sie aktiviert ist. Der Dienst erfordert standardmäßig keine Authentifizierung, was es einem Angreifer ermöglicht, einen privilegierten Docker-Container zu starten. Durch die Verwendung der Remote-API kann man Hosts / (Wurzelverzeichnis) an den Container anhängen und Dateien der Umgebung des Hosts lesen/schreiben.
Standardport: 2375
Beachten Sie, dass Sie zur Aufzählung der Docker-API den Befehl docker
oder curl
verwenden können, wie im folgenden Beispiel:
Wenn Sie die entfernte Docker-API mit dem docker
-Befehl kontaktieren können, können Sie jede der Docker Befehle, die zuvor kommentiert wurden ausführen, um mit dem Dienst zu interagieren.
Sie können export DOCKER_HOST="tcp://localhost:2375"
verwenden und vermeiden, den -H
-Parameter mit dem Docker-Befehl zu verwenden.
Schnelle Privilegieneskalation
Curl
Manchmal sehen Sie 2376 für den TLS-Endpunkt. Ich konnte mich nicht mit dem Docker-Client damit verbinden, aber es ist möglich, dies mit curl zu tun.
Wenn Sie weitere Informationen dazu wünschen, sind weitere Informationen verfügbar, wo ich die Befehle kopiert habe: https://securityboulevard.com/2019/02/abusing-docker-api-socket/
Auf der folgenden Seite finden Sie Möglichkeiten, um aus einem Docker-Container zu entkommen:
Durch den Missbrauch davon ist es möglich, aus einem Container zu entkommen. Sie könnten einen schwachen Container auf der Remote-Maschine ausführen, von ihm entkommen und die Maschine kompromittieren:
Wenn Sie sich auf einem Host befinden, der Docker verwendet, können Sie diese Informationen lesen, um zu versuchen, die Privilegien zu erhöhen.
Überprüfen Sie env (Abschnitt der Umgebungsvariablen) auf Geheimnisse, und Sie könnten Folgendes finden:
Passwörter.
IPs.
Ports.
Pfade.
Andere… .
Wenn Sie eine Datei extrahieren möchten:
Sie können das Tool https://github.com/docker/docker-bench-security verwenden, um Ihre aktuelle Docker-Installation zu überprüfen.
./docker-bench-security.sh
Sie können das Tool https://github.com/kost/dockscan verwenden, um Ihre aktuelle Docker-Installation zu überprüfen.
dockscan -v unix:///var/run/docker.sock
Sie können das Tool https://github.com/genuinetools/amicontained verwenden, um die Berechtigungen zu überprüfen, die ein Container hat, wenn er mit verschiedenen Sicherheitsoptionen ausgeführt wird. Dies ist nützlich, um die Auswirkungen der Verwendung einiger Sicherheitsoptionen beim Ausführen eines Containers zu kennen:
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
Sie können ein Docker-Image von https://github.com/quay/clair verwenden, um Ihre anderen Docker-Images zu scannen und Schwachstellen zu finden.
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
Sie können das Tool https://github.com/buddy-works/dockerfile-linter verwenden, um Ihr Dockerfile zu inspizieren und alle Arten von Fehlkonfigurationen zu finden. Jede Fehlkonfiguration erhält eine ID, die Sie hier finden können https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md, um jede von ihnen zu beheben.
dockerfilelinter -f Dockerfile
Sie können das Tool https://github.com/replicatedhq/dockerfilelint verwenden, um Ihr Dockerfile zu inspizieren und alle Arten von Fehlkonfigurationen zu finden.
dockerfilelint Dockerfile
Sie können das Tool https://github.com/RedCoolBeans/dockerlint verwenden, um Ihr Dockerfile zu inspizieren und alle Arten von Fehlkonfigurationen zu finden.
dockerlint Dockerfile
Sie können das Tool https://github.com/hadolint/hadolint verwenden, um Ihr Dockerfile zu inspizieren und alle Arten von Fehlkonfigurationen zu finden.
hadolint Dockerfile
Sie können das Tool https://github.com/falcosecurity/falco verwenden, um verdächtiges Verhalten in laufenden Containern zu erkennen.
Beachten Sie im folgenden Abschnitt, wie Falco ein Kernel-Modul kompiliert und einfügt. Danach lädt es die Regeln und beginnt, verdächtige Aktivitäten zu protokollieren. In diesem Fall wurden 2 privilegierte Container gestartet, einer davon mit einer sensiblen Einbindung, und nach einigen Sekunden wurde erkannt, wie eine Shell innerhalb eines der Container geöffnet wurde.
Sie können auditd verwenden, um Docker zu überwachen.
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)