Docker Daemon Esposto

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

Docker Daemon Esposto — Fasi della formazione

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. Cosa ha reso possibile tutto questo

    Un momento di riflessione sul meccanismo prima che inizi la risposta.

  7. 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.

  8. 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.

  9. 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.

  10. 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.