Blootgestelde Docker-daemon
A Docker daemon answering on the network without TLS is remote root on the host. Take a machine through the exposed API, then lock it down with TLS, client certificates, and a scoped socket proxy.
Wat is Blootgestelde Docker-daemon?
De Docker API is root-equivalent en wordt standaard zonder authenticatie geleverd. Een daemon die aan een netwerkpoort is gebonden zonder TLS, laat iedereen die deze kan bereiken containers starten, de host mounten en alles op de machine lezen. Het mounten van de daemonsocket in een container geeft die container diezelfde macht. Deze oefening behandelt beide: bekijk hoe een aanvaller via een blootgestelde daemon een host overneemt, en beveilig deze vervolgens met TLS, clientcertificaten en een scoped socket proxy.
Wat je leert in Blootgestelde Docker-daemon
- Iedereen die de API kan bereiken, kan een container starten die het bestandssysteem van de host mount, wat volledige lees- en schrijftoegang tot de machine geeft.
- Nee. De socket is dezelfde root-equivalente API, dus elke compromittering van die container wordt een compromittering van de host.
- TLS met wederzijdse client-certificaatauthenticatie, of een scoped proxy die alleen de specifieke API-aanroepen toestaat die de aanroeper nodig heeft.
- Die aanval vereist eerst code execution binnen een container. Deze is extern en ongeauthenticeerd, dus de aanvaller heeft helemaal geen foothold nodig.
Blootgestelde Docker-daemon — Trainingsstappen
-
De publieke statuspagina lezen
Bob bevindt zich nergens binnenin. Hij zit op zijn eigen laptop en leest de publieke operations-pagina van Palliston. Die is bedoeld om klanten gerust te stellen dat het platform gezond is, en noemt daarbij de productienodes, hun publieke IP-adressen en de Docker-engine die elk ervan draait. Bekijk wat deze prijsgeeft voordat Bob het gebruikt.
-
De regel die te veel zegt
Er is maar één regel voor nodig. Het publieke IP-adres van een productienode en het feit dat deze Docker draait, zijn alles wat Bob nodig heeft om de goedkoopste aanval die er is te proberen.
-
Aankloppen bij de daemon
De Docker-daemon kan worden geconfigureerd om te luisteren op een netwerkpoort in plaats van alleen de lokale socket. Als dat zo is, en TLS staat uit, antwoordt hij iedereen. Bob richt zijn eigen Docker CLI op poort 2375 van die node en stelt de meest onschuldige vraag die er is: welke versie ben je. Als hij antwoordt, is het spel al voorbij.
-
De productievloot uitlezen
De Docker API is niet iets beperkts. Ze somt containers op, start, stopt en bouwt ze, en doet dat allemaal als root. Bobs eerste zet is simpelweg kijken: wat draait deze host eigenlijk.
-
De host mounten, de secrets meenemen
Bob hoeft niet in te breken op de draaiende containers. De daemon start voor hem een gloednieuwe, en mount alles wat hij vraagt. Hij vraagt om het complete root-bestandssysteem van de host op /host, en leest vervolgens het productie-environmentbestand rechtstreeks via de mount. De container is van hem. De host ligt eronder. Er is nooit een muur tussen beide geweest.
-
Wat dit mogelijk maakte
Eén moment stilstaan bij het mechanisme voordat de respons begint.
-
De daemon logt een vreemde
Palliston stuurt zijn Docker-daemonlogs naar een centrale collector. Er is geen intrusion-detectieproduct nodig om te merken wat er opdook: API-aanroepen naar de daemon op ops-node-01, vanaf een IP-adres dat aan niemand bij Palliston toebehoort.
-
Bevestig dat de deur openstaat
Voordat ze iets wijzigt, reproduceert Alice wat de logs beschrijven. Als een ongeauthenticeerde version probe vanaf haar eigen machine antwoord krijgt, is de daemon precies zo blootgesteld als Priya vreesde.
-
Open de daemonconfiguratie
Het gedrag van de daemon wordt bepaald in één bestand, /etc/docker/daemon.json. Wat hem ook heeft opgedragen om zonder TLS op het netwerk te luisteren, staat als regel hierin.
-
Vind wat de poort heeft geopend
Twee instellingen, naast elkaar, vormen de volledige blootstelling. De ene zet de API op het netwerk; de andere zegt dat hij niet moet controleren wie er belt.