Crear maquina vulnerable docker, importar la misma y automontarla
Crear maquina vulnerable en un docker
Instalar docker
Primero instalaremos la herramienta docker.
sudoaptinstalldocker-ce
Con esto docker ya estaria instalado.
Preparar S.O. para docker
Lo que primero tendremos que hacer es descargarnos la imagen del sistema operativo que vamos a querer utilizar para esa maquina victima mediante la herramienta docker.
dockerpullubuntu:latest
Con latest lo que decimos es que nos lo descargue en la version mas nueva.
Info:
latest: Pulling from library/ubuntu
9c704ecd0c69: Pull complete
Digest: sha256:2e863c44b718727c860746568e1d54afd13b2fa71b160f5cd9058fc436217b30
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
Con esto ya tendriamos nuestra base preparada para empezar a configurarla desde ese sistema operativo.
Para comprobar que la imagen del sistema operativo ubuntu se instalo bien en docker haremos el siguiente comando.
dockerimages
Info:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 35a88802559d 2 months ago 78.1MB
Y veremos que se instalo bien.
Trabajar con la imagen docker en una shell
Ahora si queremos crearnos una instancia de esa imagen, tendremos que crearnos un contenedor con esa imagen para desplagar una shell sobre ella y poder trabajar.
dockerrun-it35a
Info:
root@e2764d29611d:/#
Pondremos las 3 primeras iniciales del ID Imagen del docker, por ejemplo mi imagen es 35a88802559d pues le coloco los 3 primeros numeros 35a.
Y con esto ya estariamos dentro de la imagen docker con una shell, en este punto podemos saber que IP tenemos haciendo...
hostname-I
Info:
172.17.0.2
Tambien podemos instalar cosas, actualizar los repositorios, etc...
Crear snapshot de un docker
Cada vez que vayamos avanzando en nuestro trabajo de la maquina vulnerable en un docker es recomendable ir haciendo backups de la misma por si la liaramos en algun punto, podremos hacerlo de la siguiente forma.
dockerps
Info:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2764d29611d 35a "/bin/bash" 5 minutes ago Up 5 minutes youthful_babbage
En mi caso el proceso ID seria e2764d29611d por lo que hariamso lo siguiente sabiendo esto.
dockercommite27snapshot1:latest
Y esto creara una imagen del contenedor actual llamada snapshot1 en docker por lo que si listamos las imagenes de los dockers tendremos 2, nuestro docker principal y despues el backup generado del principal.
Si por ejemplo quieres cargar la nueva informacion en la misma snapshot1 que creamos, lo haremos con el mismo comando indicando siempre la ultima version de nuestr docker.
dockercommite27snapshot1:latest
Maquina docker terminada importacion a un .tar
Si por ejemplo hemos creado snapshots las anteriores se quedaran "huerfanas" pero si nosotros lo importamos en un .tar los servicios no se van a quedar adheridos a la snapshot por lo que esto es un problema, pero para solucionarlo haremos lo siguiente.
nanoDockerfile#Dentro del nanoFROMsnapshot1:latestCMDservicesshstart&&serviceapache2start&&servicevsftpdstart&&tail-f/dev/null
Donde pone CMD tendremos que poner todos los servicios que queramos mantener activos, para que asi aparezcan a la hora de hacer un nmap o de intentar vulnerarla.
Tambien hacemos el comando tail -f /dev/null para manetener activos los servicios hasta que nosotros lo pausemos.
Ahora si crearemos la imagen docker por lo que tendremos que ejecutar el siguiente comando donde este el archivo Dockerfile.
dockerbuild--tagmimaquina.
Ahora si ejecutamos docker images veremos nuestra maquina docker con todos los servicios virtualizados, por lo que tendremos que ver mimaquina en las imagenes del docker, ahora lo que haremos sera comprimir esa imagen de mimaquina en un .tar.
dockersave-omimaquina.tarmimaquina:latest
Seleccionamos la imagen docker que vamos a pasar al archivo .tar en mi caso llamada mimaquina.
Y con esto ya estaria hecho, ahora vamos a utilizar un script en .sh que te automatiza todo este proceso de montar la imagen docker.tar a nuestro docker.
auto_mount.sh para montar el docker.tar
auto_mount.sh
#!/bin/bash# Colores ANSICRE='\033[31m'# RojoCYE='\033[33m'# AmarilloCGR='\033[32m'# VerdeCBL='\033[34m'# AzulCBLE='\033[36m'# CyanCBK='\033[37m'# BlancoCGY='\033[38m'# GrisBLD='\033[1m'# NegritaCNC='\033[0m'# Resetear coloresprintf "\n" printf "${CRE}___________________¶¶\n" printf "${CRE}____________________¶¶__¶_5¶¶\n" printf "${CRE}____________5¶5__¶5__¶¶_5¶__¶¶¶5\n" printf "${CRE}__________5¶¶¶__¶¶5¶¶¶¶¶5¶¶__5¶¶¶5\n" printf "${CRE}_________¶¶¶¶__¶5¶¶¶¶¶¶¶¶¶¶¶__5¶¶¶¶5\n" printf "${CRE}_______5¶¶¶¶__¶¶¶¶¶¶¶¶¶¶¶_5¶¶__5¶¶¶¶¶5\n" printf "${CRE}______¶¶¶¶¶5_¶¶¶¶¶¶¶¶¶¶¶¶¶5¶¶¶__¶¶¶¶5¶5\n" printf "${CRE}_____¶¶¶¶¶¶_¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_¶¶¶¶¶¶¶5\n" printf "${CRE}____¶¶¶¶¶¶¶_¶¶¶5¶¶¶¶5_¶¶¶¶¶5_5¶_¶¶¶¶¶¶¶¶5\n" printf "${CRE}___¶¶¶¶¶¶¶¶__5¶¶¶¶¶¶5___5¶¶¶¶__5¶¶¶¶¶¶¶¶¶5\n" printf "${CRE}__¶¶¶¶¶¶¶¶¶¶5__5¶¶¶¶¶¶5__5¶¶5_5¶¶¶¶¶¶¶¶¶¶¶\n" printf "${CRE}_5¶¶¶¶¶¶¶¶¶¶¶¶_5¶¶¶¶¶¶¶¶¶5__5¶¶¶¶¶¶¶¶¶¶¶¶¶5\n" printf "${CRE}_¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_5¶¶¶¶\n" printf "${CRE}5¶¶¶¶¶¶¶¶¶¶¶¶5___5¶¶¶¶¶¶¶5__¶¶¶¶5_¶¶¶5_¶¶¶¶\n" printf "${CRE}¶¶¶¶¶¶¶¶_¶¶5_5¶5__¶¶¶¶¶¶¶¶¶5_5¶¶¶_5¶¶¶_5¶¶¶5\n" printf "${CRE}¶5¶¶¶¶¶5_¶¶_5¶¶¶¶¶_¶¶¶¶¶¶¶¶¶¶5_5¶¶_5¶¶¶_¶¶¶5\n" printf "${CRE}¶¶¶¶_¶¶__¶__¶¶¶¶¶¶5_5¶¶¶¶¶¶¶¶¶¶5_¶¶_5¶¶_5¶¶¶\n" printf "${CRE}¶¶¶5_5¶______5¶¶5¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶5_¶¶_5¶5_¶5¶\n" printf "${CRE}5¶¶____5¶¶¶¶5_____5¶¶¶¶¶¶¶5_¶¶¶¶¶5_¶__¶¶_5¶¶\n" printf "${CRE}_¶¶__5¶¶¶¶¶¶¶¶¶¶5____5¶¶¶¶¶¶_¶¶¶¶¶_____¶5_¶¶\n" printf "${CRE}_¶¶___5¶¶¶¶¶¶¶¶¶__________5¶5_¶¶¶¶¶____¶¶_¶¶\n" printf "${CRE}_¶¶_______5¶¶¶¶¶¶5____________¶¶¶¶¶_____¶_¶¶\n" printf "${CRE}_5¶5________5¶¶_¶¶¶¶5________5¶¶¶¶¶_______¶¶\n" printf "${CRE}__¶¶__________¶___¶¶¶¶¶5___5¶¶¶¶¶¶5_______¶5\n" printf "${CRE}__¶¶____________5¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶________¶\n" printf "${CRE}___¶________________5¶¶¶¶¶¶¶¶5_¶¶\n" printf "${CRE}___¶__________5¶¶¶¶¶¶¶¶5¶¶¶5__5¶5\n" printf "${CRE}_____________________5¶¶¶5____¶5\n" printf "${CNC}\n"
printf"${CBLE} \n"printf" ## ## ## #### ### ## ####### ###### #### ## ###### ##### \n"printf" ## ## #### ## ## ## ## ## # ## ## ## #### ## ## ## ## \n"printf" ## ## ## ## ## ## ## ## # ## ## ## ## ## ## ## # \n"printf" ####### ## ## ## #### #### ##### ## ## ## ##### ##### \n"printf" ## ## ###### ## ## ## ## # ## ## ## # ###### ## ## ## \n"printf" ## ## ## ## ## ## ## ## ## # ## ## ## ## ## ## ## ## ## ## \n"printf" ## ## ## ## #### ### ## ####### #### ## ####### ## ## ###### ##### \n"printf"${CNC} \n"# Verificar el número de argumentosif [ $# -ne1 ]; thenecho"Uso: $0 <archivo_tar>"exit1fi# Verificar si Docker está instaladoif!command-vdocker&> /dev/null; thenecho-e"\033[1;36m\nDocker no está instalado. Instalando Docker...\033[0m"sudoaptupdatesudoaptinstalldocker.io-yecho-e"\033[1;36m\nEstamos habilitando el servicio de docker. Espere un momento...\033[0m"sleep10systemctlrestartdocker&&systemctlenabledockerif [ $? -eq0 ]; thenecho"Docker ha sido instalado correctamente."elseecho"Error al instalar Docker. Por favor, verifique y vuelva a intentarlo."exit1fifiTAR_FILE="$1"# Función para detener y eliminar contenedoresdetener_y_eliminar_contenedor() { IMAGE_NAME="${TAR_FILE%.tar}" CONTAINER_NAME="${IMAGE_NAME}_container"if [ "$(dockerps-a-q-fname=$CONTAINER_NAME -fstatus=exited)" ]; thendockerrm $CONTAINER_NAME >/dev/nullfiif [ "$(dockerps-q-fname=$CONTAINER_NAME)" ]; thendockerstop $CONTAINER_NAME >/dev/nulldockerrm $CONTAINER_NAME >/dev/nullfiif [ "$(dockerimages-q $IMAGE_NAME)" ]; thendockerrmi $IMAGE_NAME >/dev/nullfi NETWORK_NAME="dockernetwork"ifdockernetworkinspect $NETWORK_NAME >/dev/null2>&1; thendockernetworkrm $NETWORK_NAME >/dev/nullfi}# Manejo de la señal INT (Ctrl+C)trapctrl_cINTfunctionctrl_c() {echo-e"\e[1mEliminando el laboratorio, espere un momento...\e[0m"detener_y_eliminar_contenedorecho-e"\nEl laboratorio ha sido eliminado por completo del sistema."exit0}echo-e"\e[1;93m\nEstamos desplegando la máquina vulnerable, espere un momento.\e[0m"detener_y_eliminar_contenedordockerload-i"$TAR_FILE">/dev/nullif [ $? -eq0 ]; then IMAGE_NAME=$(basename"$TAR_FILE".tar) CONTAINER_NAME="${IMAGE_NAME}_container" NETWORK_NAME="dockernetwork"ifdockernetworkinspect $NETWORK_NAME >/dev/null2>&1; thenecho-e"\e[38;5;230;1mLa red $NETWORK_NAME ya existe. Eliminándola y recreándola...\e[0m"dockernetworkrm $NETWORK_NAME >/dev/nullfidockernetworkcreate--internal $NETWORK_NAME >/dev/nullifuname-a|grep-qarm; thenaptinstall--assume-yesbinfmt-supportqemu-user-static-y>/dev/nulldockerrun--privileged--platformlinux/amd64-d--network=$NETWORK_NAME--name $CONTAINER_NAME $IMAGE_NAME >/dev/nullelsedockerrun--privileged-d--network=$NETWORK_NAME--name $CONTAINER_NAME $IMAGE_NAME >/dev/nullfi IP_ADDRESS=$(dockerinspect-f'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $CONTAINER_NAME)echo-e"\e[1;96m\nMáquina desplegada, su dirección IP es --> \e[0m\e[1;97m$IP_ADDRESS\e[0m"echo-e"\e[1;91m\nPresiona Ctrl+C cuando termines con la máquina para eliminarla\e[0m"elseecho-e"\e[91m\nHa ocurrido un error al cargar el laboratorio en Docker.\e[0m"exit1fi# Espera indefinida para que el script no terminewhiletrue; dosleep1done
Se ejecutara de la siguiente forma.
bashauto_mount.sh<FILE>.tar
Y esto montara la imagen en un docker de forma automatica y si queremos eliminarla o pararla y que no nos deje archivos basura, le daremos a Ctrl+C.