Este laboratorio está catalogado con la dificultad "Fácil" y su autor es "beafn28".

ATENCIÓN

Las herramientas y técnicas utilizadas en la resolución de este laboratorio han sido ejecutadas en un entorno controlado. El autor de esta publicación no se hace responsable del mal uso que se haga de estas, ya que el objetivo final de esta publicación es transmitir conocimientos con fines éticos y educativos.

Reconocimiento inicial

Se inicia el reconocimiento mediante un ping a la máquina. Esto se hace por un lado para detectar que la máquina se encuentra accesible y por otro lado para poder detectar el sistema operativo mediante el TTL asignado.

ping -c 1 172.17.0.2
None

Se puede comprobar que el TTL asignado es 64, indicando que la máquina está accesible directamente sin ningún nodo intermediario y por otro lado que el sistema subyacente es GNU/Linux.

Una vez hecho esto, se realiza un reconocimiento de los servicios disponibles en dos fases. En la primera, se realiza un escaneo de todos los puertos TCP usando nmap para detectar en primera instancia cuales de ellos son accesibles (open), utilizando un escaneo TCP SYN.

sudo nmap -sS -p- --min-rate 1000 -n -Pn 172.17.0.2 -oN allPorts
None

En la segunda, se realiza un reconocimiento básico de los servicios subyacentes también mediante el uso de nmap. Esta vez, realizando dicha tarea de reconocimiento únicamente en los puertos detectados como abiertos.

nmap -sCV -p 22,80 -n -Pn 172.17.0.2 -oN services
None

En este caso, se omite el escaneo de puertos UDP, ya que para esta máquina en particular no tiene ningún servicio relevante para llevar a cabo el ejercicio.

Acceso inicial (a)

En este caso se detecta que hay dos puertos abiertos:

  • Puerto 22 (servicio SSH, OpenSSH)
  • Puerto 80 (servicio HTTP, Apache)

Además, gracias a la detección del servicio, se detecta que el sistema subyacente es Debian.

Tras investigar el puerto 80, se encuentra una pista haciendo referencia a una clave oculta.

URL -> http://172.17.0.2
None

Como el laboratorio se llama "Pequeñas-Mentirosas", es posible que esa "A" haga referencia a uno de los personajes de esta serie y que posiblemente exista un usuario dado de alta en el sistema con ese nombre.

Por ello, se realiza un ataque de diccionario sobre este usuario a través del puerto SSH para intentar descubrir su contraseña. No tarda mucho hasta que la encuentra.

hydra -l a -P /usr/share/wordlists/rockyou.txt ssh://172.17.0.2 -I -t 16
None

Una vez encontradas unas credenciales válidas, es posible acceder al sistema a través del servicio SSH como el usuario "a".

ssh a@172.17.0.2
yes (aceptar conexión sin comprobar autenticidad)
<introducir la contraseña encontrada>
whoami
id
hostname
None

Escalada de privilegios (a -> spencer)

Tras revisar diferentes recursos del sistema, se detecta un directorio reservado para un servicio FTP en el cual se puede encontrar varios archivos que pueden contener retos o recursos asociados a criptografía (claves privadas/públicas, hashes, instrucciones, etc).

cd /srv
ls -al
ls -al ftp
None

Probablemente el más relevante de todos los archivos presentes en este directorio es el denominado "hash_spencer.txt", ya que parece contener un hash MD5, posiblemente asociado a la contraseña de este usuario.

cd ftp
cat hash_spencer.txt
None

Dado que esto es un CTF, se muestra una página que solo debe utilizarse para ejercicios de práctica de este estilo y nunca en entornos reales por obvias razones. Se trata de CrackStation y sirve para comprobar directamente sobre una base de datos de hashes previamente extraídos si hay alguna coincidencia con el proporcionado y su contraseña asociada.

En este caso, se obtiene directamente la contraseña asociada a este hash.

None

Al probar, con la contraseña encontrada es posible acceder al usuario "spencer" directamente.

su - spencer
<introducir la contraseña encontrada>
whoami
id
hostname
None

Escalada de privilegios (spencer -> root)

Al listar los privilegios SUDO, se puede comprobar que el usuario "spencer" puede ejecutar el binario "/usr/bin/python3" como cualquier usuario sin proporcionar contraseña. Esto viene definido de la siguiente forma tras listar sus privilegios:

  • (ALL) NOPASSWD: /usr/bin/python3
sudo -l
None

Comprobando este binario en GTFObins, se puede comprobar que existe una manera probada de aprovechar este binario para realizar operaciones aprovechando los privilegios asignados.

Referencia: https://gtfobins.github.io/gtfobins/python/#sudo
None

En este caso, es posible abrir una consola interactiva como el usuario "root" directamente.

sudo -u root /usr/bin/python3 -c 'import os; os.system("/bin/sh")'
whoami
id
hostname
None

En este punto, al haber obtenido acceso a la cuenta "root", se ha conseguido obtener los máximos privilegios posibles sobre el sistema objetivo (este laboratorio).

Mitigaciones a aplicar

  • Evitar exponer información sensible a través de servicios web. Especialmente cuando cualquiera puede acceder.
  • Limitar el número de intentos de acceso erróneos para servicios de acceso remoto como SSH para disuadir posibles amenazas.
  • Almacenar o compartir la información sensible como contraseñas, hashes, notas, nombres de usuario o secretos similares de una forma segura (por ejemplo, usando algoritmos de hashing adecuados, usando gestores de contraseñas y manteniendo estos y su contraseña maestra a buen recaudo, etc).
  • Evitar que los usuarios del sistema tengan como contraseña una que se pueda encontrar en listas públicas o conocidas como rockyou. Recomendación: crear una política de contraseñas robusta para evitar que esto ocurra.
  • Ajustarse al principio de privilegio mínimo y conceder a los usuarios del sistema única y exclusivamente los privilegios que vayan a necesitar.

¿Te gustó esta publicación? Sígueme y descubre más en mi blog principal: https://pyth0nk1d.medium.com