[ Write Up ] Solución al Reto Hacker 2 para estudiantes
Hace un par de días os dejé publicado el Reto Hacker 2 para estudiantes que había hecho nuestro querido compañero, amigo, CSE de ElevenPaths, y autor del libro de "Hacking Web Technologies", y sobre todo buena persona, de Amador Aparicio. Desde años lleva en el mundo de la educación dedicando esfuerzos allí en su Palencia a formar a buenas personas y buenos profesionales en el mundo de la seguridad informática y la tecnología en general. Y una de las cosas que hace son estos retos que tan didácticos son y tanto divierten.
Hoy os traigo la resolución que ha hecho una de sus estudiantes, llamada Marta González, que lo ha dejado muy bien explicado paso a paso. Tenéis el enunciado del Reto Hacker 2 para estudiantes en el otro artículo, y si queréis contactar con Amador Aparicio para que os de algún consejo - tanto si eres alumno como profesor - lo puedes hacer a través de su buzón público en MyPublicInbox - que además ahora estamos en la campaña de #YoMeQuedoEnCasa y tenéis tanto su libro, como los Tempos para contactar con el con descuento -.
Y ahora sin más dilación, os dejo la resolución del reto hecha por una de las estudiantes. Paso a paso para que todos lo podáis probar en vuestra casa durante estos días de encierro. Vamos, que practicando se aprenden las cosas.
En el siguiente documento paso a describir cuál ha sido la metodología y los pasos realizados a la hora de resolver el reto hacker propuesto por mi profesor, Amador Aparicio.
FASE 1: IMPORTACIÓN DE LA MÁQUINA VIRTUAL
Empecemos importando la máquina virtual a través del fichero .OVA proporcionado en el enunciado. Abriremos nuestro programa de virtualización que prefiramos, en mi caso VirtualBox, y nos dirigiremos a “Archivo” > “Importar Servicio Virtualizado”.
Se abrirá la siguiente ventana en la que seleccionaremos la ruta local en nuestro equipo donde hemos guardado nuestro archivo .OVA. Seleccionamos “Next”.
En el siguiente paso podremos cambiar algunas de las propiedades de la máquina. En nuestro caso no modificaremos nada y seleccionaremos la opción “Importar”.
En esta pantalla de opciones que se ve en la Figura 5 puede ser interesante deshabilitar la opción “Controlador USB” por si durante el proceso nos da algún tipo de mensaje de error. Cuando finalice este proceso ya tendremos nuestra máquina virtual importada y podremos proceder a iniciarla seleccionando la opción “Iniciar”.
FASE 2: COMUNICACIÓN A NIVEL DE RED
Una vez instalada la máquina virtual, es importante conocer la dirección IP de la máquina virtual, dentro del rango de direcciones locales - el más común para una red de Tipo C - 192.168.0.254/24, y comprobar si existe comunicación a nivel de red realizando primero simples peticiones de tipo ICMP.
Para ello vamos a configurar un cliente dentro de la red 192.168.0.0/24 desde el que vamos a realizar todo el proceso de Ethical Hacking. Para nuestro trabajo vamos a utilizar el popular Kali Linux que tiene muchas de las herramientas de pentesting que necesitamos, así que le configuramos la dirección IP 192.168.0.19/24 - esperando que no esté ocupada por otro equipo en la red -.
Configurada la interfaz de red comprobamos que realmente existe comunicación a nivel de red con el servidor (192.168.0.254/24) haciendo un envío ICMP con el comando PING.
Ahora vamos a seguir haciendo el proceso paso a paso, y vamos a ver si tenemos servicios publicados en la red, haciendo un rastreo de la comunicación entre las máquinas a nivel TCP y UDP.
FASE 3: COMUNICACIÓN A NIVEL DE TRANSPORTE
El siguiente paso será realizar el descubrimiento de los puertos TCP y UDP que pudiera tener expuestos la máquina virtual. Para ello realizamos en escaneo de todos los puertos TCP/UDP utilizando la herramienta nmap y con parámetro –p (escaneo de todos los puertos) –r (escaneo de puertos secuencial, no aleatorio).
Se observa que el servidor tiene abiertos los puertos 22/TCP (servicio SSH) y el puerto 80/TCP (servicio HTTP). Realizando el mismo proceso para los puertos UDP (parámetro –sU de nmap) pero no obtenemos resultados relevantes.
FASE 4: COMUNICACIÓN A NIVEL DE SERVICIO
Dado que el servidor cuenta con el servicio HTTP (puerto 80/TCP) a la espera de recibir peticiones, cabe la posibilidad de que podamos acceder a través de un navegador. Desde Kali Linux abrimos un navegador e introducimos la dirección del servidor, 192.168.0.254. Nos devuelve las siguientes páginas que tiene relación con el script PHP proporcionado en el enunciado.
Analizando el código PHP proporcionado en el enunciado, se observa que el parámetro ‘file’ que pasa por GET y se carga directamente en el script PHP, lo que todo hace indicar que intentará explotar una vulnerabilidad de tipo LFI (Local File Inclusion):
Dado que es posible que el servidor devuelva cualquier fichero que le pasemos con la ruta absoluta utilizando el parámetro ‘file’, probamos a ver el contenido del fichero “/etc/passwd/”, para obtener el nombre de los usuarios locales del sistema. Modificaremos la URL de la siguiente forma:
Se observa la existencia de los usuarios “root” y “gabriel”. La contraseña de los usuarios no está porque se encuentran en el fichero “/etc/shadow”.
Dado que es una máquina preparada para un CTF, es posible que el sysadmin haya sido descuidado y haya habilitado los permisos de lectura para cualquier usuario sobre el recurso “/etc/shadow”. Ahora sí observamos los hashes de los usuarios ‘salteados’:
En los sistemas operativos modernos de GNU/Linux suelen cifrar en $6$ lo que quiere decir que se trata de un cifrado de SHA512 y por lo tanto posee 86 caracteres en formato hexadecimal. Además, posteriormente se añaden los bits de salt que son datos generados al azar que hace más difícil los ataques por diccionario al dotar de mayor fortaleza a las claves.
FASE 6: ATAQUE A LOS HASHES MEDIANTE JOHN THE RIPPER
Conocidos los usuarios y sus hashes, el siguiente paso será realizar un ataque de fuerza bruta basado en diccionario utilizando la herramienta John The Ripper. El diccionario de contraseñas en texto claro utilizado será 500-worst-passwords.txt:
Descargamos el fichero con los hashes de los usuarios, el diccionario de contraseñas y realizamos el ataque de fuerza bruta basado en diccionario con John The Ripper. Observamos que obtenemos la contraseña del root: ‘scorpion’
FASE 7: ACCESO AL SERVIDOR
Comprobamos que las credenciales obtenidas (root:scorpio) son correctas. Con acceso al servidor vamos a por el último objetivo de este reto: encontrar y saber el contenido del fichero flag.txt. Ejecutamos comando “ls -a /” para poder ver todos los archivos hasta los ocultos del directorio raíz.
También se podría haber realizado una búsqueda del tipo “find / -name flag.txt” empezando desde la raíz del sistema de ficheros. Vamos a ver el contenido del fichero “flag.txt” con el comando “cat /flag.txt”:
Su contenido, como preveíamos está codificado, por lo que tendremos que investigar con qué método se ha codificado. Hay una pista muy importante que es el carácter igual del final, este carácter nos reduce los métodos de codificación. Tras investigar podemos suponer que el método sea Base 64, por lo que nos vamos a ir a nuestro navegador y con la ayuda de “base64decode.org” introducimos el texto y seleccionamos la opción “Descodificar”:
Con esto podemos concluir que hemos finalizado el Reto Hacker 2 con éxito, ya que hemos conseguido la bandera en texto claro con ese RisaSocarrona.
Autora: Marta González Arnáiz (@maaartaa_g), estudiante de Administración de Sistemas Informáticos en Red en Salesianos Villamuriel (PALENCIA).
Figura 1: [Write Up ] Solución al Reto Hacker 2 para estudiantes |
Hoy os traigo la resolución que ha hecho una de sus estudiantes, llamada Marta González, que lo ha dejado muy bien explicado paso a paso. Tenéis el enunciado del Reto Hacker 2 para estudiantes en el otro artículo, y si queréis contactar con Amador Aparicio para que os de algún consejo - tanto si eres alumno como profesor - lo puedes hacer a través de su buzón público en MyPublicInbox - que además ahora estamos en la campaña de #YoMeQuedoEnCasa y tenéis tanto su libro, como los Tempos para contactar con el con descuento -.
Figura 2: Contactar con Amador Aparicio |
Y ahora sin más dilación, os dejo la resolución del reto hecha por una de las estudiantes. Paso a paso para que todos lo podáis probar en vuestra casa durante estos días de encierro. Vamos, que practicando se aprenden las cosas.
Solución al Reto Hacker 2 de Amador Aparicio para estudiantes
En el siguiente documento paso a describir cuál ha sido la metodología y los pasos realizados a la hora de resolver el reto hacker propuesto por mi profesor, Amador Aparicio.
FASE 1: IMPORTACIÓN DE LA MÁQUINA VIRTUAL
Empecemos importando la máquina virtual a través del fichero .OVA proporcionado en el enunciado. Abriremos nuestro programa de virtualización que prefiramos, en mi caso VirtualBox, y nos dirigiremos a “Archivo” > “Importar Servicio Virtualizado”.
Figura 3: Importar Servicio Virtualizado en VirtualBox. |
Se abrirá la siguiente ventana en la que seleccionaremos la ruta local en nuestro equipo donde hemos guardado nuestro archivo .OVA. Seleccionamos “Next”.
Figura 4: Selección del fichero .OVA a importar en VirtualBox |
En el siguiente paso podremos cambiar algunas de las propiedades de la máquina. En nuestro caso no modificaremos nada y seleccionaremos la opción “Importar”.
Figura 5: Importación final del a máquina virtual |
En esta pantalla de opciones que se ve en la Figura 5 puede ser interesante deshabilitar la opción “Controlador USB” por si durante el proceso nos da algún tipo de mensaje de error. Cuando finalice este proceso ya tendremos nuestra máquina virtual importada y podremos proceder a iniciarla seleccionando la opción “Iniciar”.
FASE 2: COMUNICACIÓN A NIVEL DE RED
Una vez instalada la máquina virtual, es importante conocer la dirección IP de la máquina virtual, dentro del rango de direcciones locales - el más común para una red de Tipo C - 192.168.0.254/24, y comprobar si existe comunicación a nivel de red realizando primero simples peticiones de tipo ICMP.
Figura 6: Pentesting con Kali Linux en 0xWord |
Para ello vamos a configurar un cliente dentro de la red 192.168.0.0/24 desde el que vamos a realizar todo el proceso de Ethical Hacking. Para nuestro trabajo vamos a utilizar el popular Kali Linux que tiene muchas de las herramientas de pentesting que necesitamos, así que le configuramos la dirección IP 192.168.0.19/24 - esperando que no esté ocupada por otro equipo en la red -.
Figura 7: Configuración de una dirección IP estática en nuestro Kali Linux |
Configurada la interfaz de red comprobamos que realmente existe comunicación a nivel de red con el servidor (192.168.0.254/24) haciendo un envío ICMP con el comando PING.
Figura 8: El servidor responde a los paquetes ICMP |
Ahora vamos a seguir haciendo el proceso paso a paso, y vamos a ver si tenemos servicios publicados en la red, haciendo un rastreo de la comunicación entre las máquinas a nivel TCP y UDP.
FASE 3: COMUNICACIÓN A NIVEL DE TRANSPORTE
El siguiente paso será realizar el descubrimiento de los puertos TCP y UDP que pudiera tener expuestos la máquina virtual. Para ello realizamos en escaneo de todos los puertos TCP/UDP utilizando la herramienta nmap y con parámetro –p (escaneo de todos los puertos) –r (escaneo de puertos secuencial, no aleatorio).
Figura 9: Escaneo de puertos del servidor con nmap desde Kali Linux |
Se observa que el servidor tiene abiertos los puertos 22/TCP (servicio SSH) y el puerto 80/TCP (servicio HTTP). Realizando el mismo proceso para los puertos UDP (parámetro –sU de nmap) pero no obtenemos resultados relevantes.
FASE 4: COMUNICACIÓN A NIVEL DE SERVICIO
Dado que el servidor cuenta con el servicio HTTP (puerto 80/TCP) a la espera de recibir peticiones, cabe la posibilidad de que podamos acceder a través de un navegador. Desde Kali Linux abrimos un navegador e introducimos la dirección del servidor, 192.168.0.254. Nos devuelve las siguientes páginas que tiene relación con el script PHP proporcionado en el enunciado.
Figura 10: Directory Listing en el servidor Apache con el fichero php propuesto en el enunciado. |
Analizando el código PHP proporcionado en el enunciado, se observa que el parámetro ‘file’ que pasa por GET y se carga directamente en el script PHP, lo que todo hace indicar que intentará explotar una vulnerabilidad de tipo LFI (Local File Inclusion):
<?php $file = $_GET['file']; if(isset($file)){ include("$file"); } else { include("index.php"); } ?>FASE 5: LEAKS EN EL SERVIDOR
Dado que es posible que el servidor devuelva cualquier fichero que le pasemos con la ruta absoluta utilizando el parámetro ‘file’, probamos a ver el contenido del fichero “/etc/passwd/”, para obtener el nombre de los usuarios locales del sistema. Modificaremos la URL de la siguiente forma:
“http://192.168.0.254/coronavirus/coronavirus.php?file=/etc/passwd”Obteniendo el contenido del fichero:
Figura 11: Contenido del fichero /etc/passwd |
Se observa la existencia de los usuarios “root” y “gabriel”. La contraseña de los usuarios no está porque se encuentran en el fichero “/etc/shadow”.
Figura 12: Contenido del fichero /etc/shadow |
Dado que es una máquina preparada para un CTF, es posible que el sysadmin haya sido descuidado y haya habilitado los permisos de lectura para cualquier usuario sobre el recurso “/etc/shadow”. Ahora sí observamos los hashes de los usuarios ‘salteados’:
root:$6$osodJ16H$oPEZdBzqhfhvYHpILxRrb0FOFJsWtnoz3Nk0dpQ.eGPVDFQPwtYEtQsLL9n82ImoZDAmEhpc2x1op9.ntyIIO1:18335:0:99999:7:::
gabriel:$6$RU5KiSzn$lsUe0X.Le6YRx6aIbfVP/unfRKxgTalb18yDTyGf/2lk0OGXa22JUugQyy9E/Dqdf3GETKrIVvTv80VErS1G8/:18335:0:99999:7:::
En los sistemas operativos modernos de GNU/Linux suelen cifrar en $6$ lo que quiere decir que se trata de un cifrado de SHA512 y por lo tanto posee 86 caracteres en formato hexadecimal. Además, posteriormente se añaden los bits de salt que son datos generados al azar que hace más difícil los ataques por diccionario al dotar de mayor fortaleza a las claves.
FASE 6: ATAQUE A LOS HASHES MEDIANTE JOHN THE RIPPER
Conocidos los usuarios y sus hashes, el siguiente paso será realizar un ataque de fuerza bruta basado en diccionario utilizando la herramienta John The Ripper. El diccionario de contraseñas en texto claro utilizado será 500-worst-passwords.txt:
Figura 13: Diccionario en GitHub de las 500 contraseñas más utilizadas |
Descargamos el fichero con los hashes de los usuarios, el diccionario de contraseñas y realizamos el ataque de fuerza bruta basado en diccionario con John The Ripper. Observamos que obtenemos la contraseña del root: ‘scorpion’
Figura 14: Obtención de la contraseña del usuario root |
FASE 7: ACCESO AL SERVIDOR
Comprobamos que las credenciales obtenidas (root:scorpio) son correctas. Con acceso al servidor vamos a por el último objetivo de este reto: encontrar y saber el contenido del fichero flag.txt. Ejecutamos comando “ls -a /” para poder ver todos los archivos hasta los ocultos del directorio raíz.
Figura 15: Buscando en el servidor con ls -a |
También se podría haber realizado una búsqueda del tipo “find / -name flag.txt” empezando desde la raíz del sistema de ficheros. Vamos a ver el contenido del fichero “flag.txt” con el comando “cat /flag.txt”:
Figura 16: Contenido del fichero flag.txt |
Su contenido, como preveíamos está codificado, por lo que tendremos que investigar con qué método se ha codificado. Hay una pista muy importante que es el carácter igual del final, este carácter nos reduce los métodos de codificación. Tras investigar podemos suponer que el método sea Base 64, por lo que nos vamos a ir a nuestro navegador y con la ayuda de “base64decode.org” introducimos el texto y seleccionamos la opción “Descodificar”:
Figura 17: Decodificación del string Base64 |
Con esto podemos concluir que hemos finalizado el Reto Hacker 2 con éxito, ya que hemos conseguido la bandera en texto claro con ese RisaSocarrona.
Autora: Marta González Arnáiz (@maaartaa_g), estudiante de Administración de Sistemas Informáticos en Red en Salesianos Villamuriel (PALENCIA).
3 comentarios:
Brillante, muchas felicidades Marta!
Compartiré otra solución alternativa ¡que para nada te quita el merito! Es para ver las cosas desde otra perspectiva.
Te felicitaré también en el video ;) ¡a ver si puedo subirlo hoy!
Be Good, Be Hackers!!!
Enhorabuena Marta!!
Yo lo hice de otra manera, capturé con Wireshark la direccion IpV6 que tenia la maquina en mi Virtualbox, pegándola en chrome:
http://[fe80::a00:27ff:fe0f:4fe7]
comprobé que era correcta, e inyectando código inseguro:
http://[fe80::a00:27ff:fe0f:4fe7]/coronavirus/coronavirus.php?file=/flag.txt
se obtiene el contenido del fichero:
UmlzYVNvY2Fycm9uYQo=
el resto ya lo sabemos!!
Un saludo
Muy buena esa solución Juan!!!
Tal es así, que me he visto obligado a hacer un video contemplando lo que comentas, pero amigo mío, ha tenido que ser bajo Windows, ya que desde una Kali Linux 2020.1 me fue imposible… ! Parece que muchos navegadores no aceptan el hospedaje mediante un lynk-local de IPv6 :/ Internet Explorer pudo con ello también. Aquí está el enlace de video de tu propuesta: https://youtu.be/jfWuYlMWyss
La mía se base en IPv4, en un “arp-scan” en todo su rango de clase C 192.168.0.0/16: https://youtu.be/1zRxTNQay9E
Un fuerte abrazo y, recuerda…
Be Good, Be Hackers!!!
Publicar un comentario