Introducción

En la ponencia de la RootedCon DevSecOps y la caída de Babilonia, comente extrañado con Xavi que no saliera el tema de de la securización en Dockers. Y es que me he encontrado en diversos CTF donde las máquinas vulnerables tiene expuesto el puerto 2375, qué es el que se utiliza para gestionar remotamente el daemon de Docker.

Lo primero que hay que aclarar, es que por defecto Docker solo se encuentra escuchando por el socket de Linux, y si queremos que también escuche por el 2375 tenemos que seguir el siguiente KB oficial de docker .Si habilitamos dicho puerto, lo que es muy importante es asegurarnos que solo nuestra IP pueda acceder a el. Con esta regla de iptables denegamos el acceso a todas las IP excepto a la nuestra:

Proof of concept

Para seguir esta prueba, he utilizado la siguiente OVA de notsosecure.com

¿Y que pasaría si tenemos expuesto el puerto de docker? Primero lanzamos un nmap para saber si el puerto se encuentra abierto:

Con la opción -H del cliente de docker especificamos la IP remota:

Tenemos 3 containers ejecutándose, pero lo que vamos realizar nosotros es lo siguiente:

  • Mapear  la carpeta /root
  • Mapear el fichero passwd y shadow

Para ello, vamos a lanzar un container utilizando una imagen base alpine, y mapeando lo comentado anteriormente:

Verificamos que se ha levantado correctamente:

Y nos conectamos ejecutando una shell con /bin/sh:

Ya sabéis todo lo que podríamos hacer una vez hemos llegado aquí…

Vamos añadir nuestra key al authorized_keys del usuario root:

Y ahora ya tenemos acceso por ssh al servidor docker:

Conclusiones

Como he comentado al inicio de la entrada, por defecto el puerto 2375 no se encuentra configurado. Se necesita una intervención del usuario para configurarlo. Podríamos pensar, que esto pueda parecer una tontería, así yo también lo pensaba. Quien va abrir el puerto 2375 sin limitar el acceso? Pues si echamos un vistazo a shodan:

3816 servidores con el puerto 2375 abiertos al mundo, es decir estamos dejando abierto nuestro sistema con el usuario root y sin credenciales.

Si necesitamos interactuar con la API de docker remotamente, lo recomendable es utilizar el puerto 2376 que utiliza certificado SSL, podéis encontrar mas información en el siguiente enlace.