Arranqué en Twitch hace ya algunos meses y desde mis primeros y «accidentados» directos tenía claro que quería hacer resoluciones de retos tipo CTF, máquinas y alguna que otra revisión de herramientas. Plataformas como HackTheBox, Web Security Academy y TryHackMe fueron mis primeras elecciones, es esta última con la que hubo una buena temporada que me enganché fielmente y es que lo cercano que resulta la plataforma y la abundancia de material gratuito disponible lo hacen atractivo y estoy convencido que es parte del éxito que tiene a día de hoy. Recuerdo que esta plataforma la conocí gracias a un viejo colega del curro (un abrazo BigMike allí donde estés) y desde luego que ha sido una excelente recomendación.
Otros de los puntos ventajosos de esta plataforma es que permite que cualquier usuario de la comunidad que tenga la gentileza o el interés de prepararse un reto o contenido para compartir lo suba a esta plataforma y lo deje accesible para todo el mundo (siempre que se marque como público). No os puedo comentar muchos más detalles de este proceso ya que todavía no me ha dado por subir una máquina (por ganas no ha sido eh!), pero pinta simple según este esquema:

En definitiva que por ahora no tengo más que elogios para esta plataforma. Que por cierto, aquí a los retos y máquinas se les llama room.
Pues bueno (disculpad la chapa), el día de hoy les traigo aquí la primera room en el blog de THM (parece mentira lo que he tardado), en este caso se trata de Empline, una room la mar de entretenida que nos ha enseñado bastante y nos ha exprimido ciertamente la creatividad. Espero os mole. Por cierto al final del post os dejaré un video del directo que hicimos en Twitch de cuando resolvimos la máquina.

OSRELEASEDIFFICULTYAUTHOR
LINUX19/JUL/21MEDIUMzyeinn

Resumen:

  • Enumeración de puertos y servicios
  • Análisis de la aplicación web
  • Subida de fichero irrestricta
  • Identificación usuarios y localización de credenciales
  • Obtención de usuario / Captura del fichero user.txt
  • Escalada de privilegios / Captura de fichero root.txt

Enumeración:

Iniciamos identificando puertos y servicios con Nmap:

nmap -sS -sV 10.10.192.83

Rápidamente me decido arrancar la revisión por el servicio HTTP en el puerto habitual.

Aplicaciones web:

Al visitar la aplicación web mediante un navegador, observamos la siguiente presentación:

Esto empieza a parecer divertido.
Continuamos con la revisión de las secciones de la página web (el menú):

Observamos que la sección Employment se antoja interesante de echar un vistazo. Aunque en este caso, antes será necesario definir este VirtualHost en nuestro fichero hosts.

nano /etc/hosts

Volviendo al navegador, actualizamos y observamos el resultado:

Bien, esto parece el portal de empleo de la compañía. Revisemos los «puestos vacantes actuales».

Ahora revisemos de que se trata la posición de «Mobile Dev».

Bien, pues llegados a este punto vamos a simular aplicar a esta posición.

Aquí se nos presenta una subida de ficheros, vamos a intentar explotarla.

Al seleccionar nuestro fichero de subida, en este caso un fichero txt llamado file1 y pulsar sobre el botón Upload, conseguiremos que nuestro fichero se adjunte y muestre el contenido del fichero en el campo de texto siguiente.

Bien, ahora la gran pregunta que nos surge es: ¿Donde se sube nuestro fichero? y adicionalmente: ¿Se enviará por correo al destinatario o se almacena en el servidor que estamos auditando? Para resolver estas dudas vamos a fuzzear un poco el objetivo.

wfuzz -w /usr/share/dirb/wordlists/common.txt -u http://job.empline.thm/FUZZ --hc=404

Como resultado observamos un directorio llamado upload que puede ser interesante de revisar. Para ello lo veremos desde el navegador:

Aquí finalmente evidenciamos que dentro del directorio careerportaladd se encuentra almacenado nuestro fichero de prueba (file1.txt):

Subida de fichero irrestricta:

Bien, ahora que ya hemos identificado todo esto anterior, es momento de validar si la subida de fichero es sin restricciones. Para ello generaremos una petición de subida de un fichero php con la función phpinfo().

Verificamos la subida a través del navegador y verificamos que la función se ejecuta en el objetivo:

Aprovechando la ejecución de phpinfo() verificamos que no tenemos deshabilitado funciones que nos permitan ejecutar comando en el sistema como exec(), system(), passthru() o shell_exec(). En este caso emplearemos system() para establecer una reverse shell.

Una vez realizada la subida, es momento de ponernos a la escucha con NetCat y posteriormente llamar a nuestro fichero rshell.php:

nc -lvnp 443

El tratamiento de la TTY no nos vendrá nada mal.

python3 -c 'import pty; pty.spawn("/bin/bash")'
export TERM=screen-256color
[Ctrl + z]
echo $TERM
stty raw -echo
fg
[INTRO]

Identificación usuarios y credenciales:

Ya con el primer acceso al objetivo conseguido, es hora de hacer un poco de reconocimiento del entorno. Una de las primeras, es la identificación de usuarios del sistema:

cat /etc/passwd | grep sh$

Ahora revisaremos los ficheros internos de la aplicación opencats. Entre ello identificamos un fichero de configuración con información más que relevante:

Podríamos validar previamente si estas credenciales son empleadas por alguno de los usuarios identificados. Esto no arrojará resultado.

Tomando en cuenta el primer escaneo de puertos y servicios, recordemos que contamos con el puerto 3306 (mysql) abierto, por tanto, probaremos el acceso con estas credenciales:

mysql -h 10.10.192.83 -u james -p'ng6pUFvsGNtw'

Después del acceso exitoso, es hora de revisar la base de datos en donde localizamos una tabla de usuarios y contraseñas. A continuación la secuencia de comando ejecutada y el posterior resultados:

show databases;
use opencats;
show tables;
describe user;
SELECT user_id, user_name, password FROM user;

3 de las contraseñas de usuarios identificadas están representadas mediante su MD5, procederemos a su descifrado mediante la utilidad online CrackStation:

Obtención de usuario:

Validaremos previamente la credencial descubierta mediante Hydra:

Y con esto ya contrastado, es hora de conectarse mediante SSH:

Con esto ya tendremos acceso a la primera flag:

Escalada de privilegios:

En esta escalada de privilegios vamos a aprovecharnos de las capabilities:

getcap -r / 2>/dev/null

Observamos que el binario de ruby tiene la posibilidad de cambiar las propiedades de cualquier fichero del sistema. Por tanto nos preparamos un pequeño script para editar el propietario y grupo de un fichero tan sensible como el /etc/passwd:

nano privesc.rb

El 1002 corresponde con el id del usuario y grupo. Observemos el cambio que se produce sobre el fichero:

Con esto ya podremos editar desde nuestra posición este fichero y añadir un nuevo registro con un usuario privilegiado. Para ello primeramente generaremos el hash de nuestra contraseña:

mkpasswd -m sha-512 pass123

nano /etc/passwd

Ahora tan solo debemos autenticarnos con el usuario registrado en el fichero /etc/passwd y ya somos root!

Para finalizar leemos la flag y todo se habrá acabado.

Como comentaba al inicio, esta room ya la resolvimos hace unos meses en Twitch, pero para los que no hayáis podido asistir al directo aquel y queráis tener el material videográfico, os dejo por aquí en enlace del canal de YouTube:

Referencias: