Docker Daemon Esposto
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.
Cos’è Docker Daemon Esposto?
L'API Docker è equivalente a root e non include alcuna autenticazione. Un daemon associato a una porta di rete senza TLS permette a chiunque possa raggiungerlo di avviare container, montare l'host e leggere qualsiasi cosa sulla macchina. Montare il socket del daemon in un container conferisce a quel container lo stesso potere. Questo esercizio copre entrambi i casi: osserva un attaccante prendere il controllo di un host tramite un daemon esposto, poi blindalo con TLS, certificati client e un proxy del socket con ambito limitato.
Cosa imparerai in Docker Daemon Esposto
- Chiunque possa raggiungere l'API può avviare un container che monta il filesystem dell'host, il che garantisce accesso completo in lettura e scrittura alla macchina.
- No. Il socket è la stessa API equivalente a root, quindi qualsiasi compromissione di quel container diventa compromissione dell'host.
- TLS con autenticazione reciproca tramite certificato client, oppure un proxy con ambito limitato che permetta solo le specifiche chiamate API di cui chi chiama ha bisogno.
- Quell'attacco richiede prima l'esecuzione di codice dentro un container. Questo è remoto e non autenticato, quindi l'attaccante non ha bisogno di alcun foothold.
Docker Daemon Esposto — Fasi della formazione
-
Lettura della pagina di stato pubblica
Bob non è dentro a nulla. È sul proprio laptop, a leggere la pagina operativa pubblica di Palliston. Ha lo scopo di rassicurare i clienti che la piattaforma è funzionante e, nel farlo, indica i nodi di produzione, i loro IP pubblici e il motore Docker eseguito da ciascuno. Dai un'occhiata a cosa espone prima che Bob la sfrutti.
-
La riga che dice troppo
Basta una sola riga. L'IP pubblico di un nodo di produzione e il fatto che esegua Docker sono tutto ciò di cui Bob ha bisogno per tentare l'attacco più economico che esista.
-
Bussa al daemon
Al daemon Docker si può dire di ascoltare su una porta di rete invece che solo sul socket locale. Quando è così, e il TLS è disattivato, risponde a chiunque. Bob punta la propria CLI Docker verso la porta 2375 di quel nodo e le pone la domanda più innocua che esista: che versione sei. Se risponde, la partita è già finita.
-
Leggi la flotta di produzione
L'API Docker non è una cosa limitata. Elenca, avvia, ferma e costruisce container, e lo fa tutto come root. La prima mossa di Bob con essa è semplicemente guardare: cosa sta effettivamente eseguendo questo host.
-
Monta l'host, prendi i segreti
Bob non ha bisogno di irrompere nei container in esecuzione. Il daemon ne avvierà uno completamente nuovo per lui, e monterà qualsiasi cosa gli venga chiesto. Chiede l'intero filesystem root dell'host su /host, poi legge il file di ambiente di produzione direttamente attraverso il mount. Il container è suo. L'host è sotto di esso. Non c'è mai stato un muro tra i due.
-
Cosa ha reso possibile tutto questo
Un momento di riflessione sul meccanismo prima che inizi la risposta.
-
Il daemon registra uno sconosciuto
Palliston invia i log del proprio daemon Docker a un collector centrale. Non serve un prodotto di intrusion-detection per notare cosa è emerso: chiamate API al daemon su ops-node-01, provenienti da un IP che non appartiene a nessuno in Palliston.
-
Conferma che la porta è aperta
Prima di cambiare qualsiasi cosa, Alice riproduce ciò che descrivono i log. Se una richiesta di versione non autenticata dalla propria macchina ottiene risposta, il daemon è esposto esattamente come temeva Priya.
-
Apri la configurazione del daemon
Il comportamento del daemon è impostato in un unico file, /etc/docker/daemon.json. Qualunque cosa gli abbia detto di ascoltare sulla rete senza TLS è una riga qui dentro.
-
Trova cosa ha aperto la porta
Due impostazioni, una accanto all'altra, costituiscono l'intera esposizione. Una mette l'API sulla rete; l'altra le dice di non controllare chi sta chiamando.