Anatomía de un ataque de inyección de comandos: CVE-2021-25296(7,8) con el módulo Metasploit y la plantilla Nuclei
Las versiones 5.5.6 a 5.7.5 de NagiosXI son vulnerables a tres casos distintos de inyección de comandos. Aunque esta vulnerabilidad se detectó en la versión 5.7.5 y fs0c-sh publicó una prueba de concepto a principios de 2021</u>, nos dimos cuenta de que las versiones afectadas se remontan a la 5.5.6, que no se mencionaba en el aviso inicial. Además, esta vulnerabilidad sigue apareciendo en la lista de software vulnerable de la CISA</u>. Dado que esta amenaza sigue activa, los usuarios de las versiones 5.5.6 a 5.7.5 de NagiosXI deberían actualizar el software lo antes posible.
Nota: se necesita un nombre de usuario y una contraseña válidos para aprovecharse de estas vulnerabilidades, ya que solo se accede a ellas tras haberse autenticado en NagiosXI.
Inyección de comandos en NagiosXI 5.5.6 a 5.7.5
La vulnerabilidad de inyección de comandos surge cuando se usa una entrada no saneada controlada por el usuario en una función que ejecuta comandos del sistema operativo. Hay varias formas de que esto suceda; por ejemplo, a través de la función exec()
de PHP, que es lo que ocurre en NagiosXI 5.5.6 a 5.7.5. Cada CVE se asocia a un archivo distinto en el que se produce la inyección de comandos. En los siguientes apartados se detalla cada uno de los puntos de inyección.
Nota: los bloques de código se han extraído de la versión 5.7.5 y es posible que en versiones anteriores tengan un aspecto distinto.
CVE-2021-25296
Ubicación del código: /usr/local/nagiosxi/html/includes/configwizards/windowswmi/windowswmi.inc.php
En CVE-2021-25296, la variable plugin_output_len
, que controla el usuario a través de un parámetro URL, se pasa al siguiente código cuando se usa el asistente de configuración de windowswmi:
if (!empty($plugin_output_len)) {
$disk_wmi_command .= " --forcetruncateoutput " . $plugin_output_len;
$service_wmi_command .= " --forcetruncateoutput " . $plugin_output_len;
$process_wmi_command .= " --forcetruncateoutput " . $plugin_output_len;
}
echo $disk_wmi_command;
// Run the WMI plugin to get realtime info
exec($disk_wmi_command, $disk_output, $disk_return_var);
exec($service_wmi_command, $service_output, $service_return_var);
exec($process_wmi_command, $process_output, $process_return_var);
En primer lugar, se añade plugin_output_len a los comandos de WMI preconfigurados sin sanear el argumento. A continuación, se pasan a la función exec de PHP. Si se utiliza un operador del shell para finalizar el comando que se está ejecutando, también puede ejecutarse un segundo comando. Mediante el operador para finalizar el comando (;), se puede añadir otro comando de ejecución para ejecutar código arbitrario. Al enviar la siguiente carga útil en el parámetro plugin_output_len, se crea un archivo en el directorio /dev/shm, tal y como se muestra en la figura 1:
9999; echo 'command Injection is dangerous' > /dev/shm/fastly.txt;
Figura 1: archivo creado mediante inyección de comandos
CVE-2021-25297
Ubicación del código: /usr/local/nagiosxi/html/includes/configwizards/switch/switch.inc.php
En CVE-2021-25297, la variable address, que controla el usuario a través del parámetro URL ip_address, se pasa al siguiente código cuando se usa el asistente de configuración de switch:
function switch_configwizard_add_cfg_to_mrtg($address)
{
// get the data that we need
$mrtg_confd_dir = "/etc/mrtg/conf.d";
$mrtg_cfg_file = "{$address}.cfg";
$absolute_mrtg_cfg_file = "{$mrtg_confd_dir}/{$mrtg_cfg_file}";
$cfgmaker_file = switch_configwizard_get_walk_file($address);
// check if the file already exists for useful debugging
$mrtg_confd_contents = scandir($mrtg_confd_dir);
if (in_array($mrtg_cfg_file, $mrtg_confd_contents)) {
debug("{$mrtg_cfg_file} exists in {$mrtg_confd_dir}, overwriting");
} else {
debug("{$mrtg_cfg_file} does not exist in {$mrtg_confd_dir}, creating");
}
// copy the cfgmaker file to the mrtg cfg destination
if (!copy($cfgmaker_file, $absolute_mrtg_cfg_file)) {
debug("Unable to copy from {$cfgmaker_file} to {$absolute_mrtg_cfg_file}");
return false;
}
// add some meta info to the file
$infoline = "#### ADDED BY NAGIOSXI (User: ". get_user_attr(0, 'username') .", DATE: ". get_datetime_string(time()) .") ####\n";
exec("sed -i '1s|.*|{$infoline}&|' $absolute_mrtg_cfg_file");
return true;
}
El parámetro ip_address se añade en primer lugar a rutas de archivo adicionales sin haberse saneado, para luego pasarse a la función exec de PHP. En esta ocasión, debemos usar un código de escape de la cadena del shell y finalizar el comando mediante ';
antes de añadir nuestra propia carga útil para ejecutar código arbitrario.
CVE-2021-25298
Ubicación del código: /usr/local/nagiosxi/html/includes/configwizards/cloud-vm/cloud-vm.inc.php
En CVE-2021-25298, la variable address, que controla el usuario a través del parámetro URL ip_address, se pasa al siguiente código cuando se usa el asistente de configuración de digitalocean:
case CONFIGWIZARD_MODE_GETSTAGE2HTML:
// Get variables that were passed to us
$address = grab_array_var($inargs, "ip_address", "");
$port = grab_array_var($inargs, "port", "");
$token = grab_array_var($inargs, "token", "");
$no_ssl_verify = grab_array_var($inargs, "no_ssl_verify", 1);
$hostname = grab_array_var($inargs, 'hostname', gethostbyaddr($address));
$default_mem_units = grab_array_var($inargs, 'default_mem_units', 'Gi');
$tcp_check_port = grab_array_var($inargs, 'tcp_check_port', '5693');
$rp_address = nagiosccm_replace_user_macros($address);
$rp_port = nagiosccm_replace_user_macros($port);
$rp_token = nagiosccm_replace_user_macros($token);
$services_serial = grab_array_var($inargs, "services_serial", "");
if ($services_serial) {
$services = unserialize(base64_decode($services_serial));
}
$not_used = array();
$return_code = 0;
$alternative_host_check = false;
exec('ping -W 2 -c 1 ' . $rp_address, $not_used, $return_code);
Se pasa un parámetro ip_address, que se procesa ligeramente y luego se pasa a la función exec anexa a un comando ping. De forma similar a CVE-2021-25296, esto nos permite finalizar el primer comando con el operador ; y, a continuación, ejecutar código arbitrario.
Módulo Metasploit
Metasploit</u> es un marco de ataque de código abierto que suelen usar los expertos en seguridad para aprovecharse de vulnerabilidades cuando, por ejemplo, hacen pruebas de penetración. Hemos creado un módulo de aprovechamiento de las tres vulnerabilidades CVE, denominado nagios_xi_configwizards_authenticated_rce</u>. El módulo permite aprovechar las tres CVE a través de los asistentes de configuración de windowswmi, switch o digitalocean, y utiliza el mixin NagiosXI de Metasploit para autenticar y realizar una comprobación de versión antes del aprovechamiento. Durante el aprovechamiento, se ejecuta la carga útil proporcionada (en este caso, un shell inverso) y se accede al destino como el usuario apache, tal y como se muestra en la figura 2:
Figura 2: shell inverso en el que se usa inyección de comandos mediante el módulo Metasploit
Plantilla Nuclei
Nuclei</u> es un explorador de código abierto que simplifica la detección de vulnerabilidades y otros errores de configuración a través de plantillas. Hemos creado una plantilla Nuclei</u> exclusiva para cada una de las tres CVE de inyección de comandos para ayudar a los usuarios a detectar el software vulnerable. Al ejecutar las plantillas Nuclei en NagiosXI 5.7.5, se detectan las vulnerabilidades, tal y como se muestra en la figura 3:
Figura 3: detección de cada una de las CVE en Nuclei
Es importante destacar que en estas plantillas se envía una breve carga útil interactsh (; wget {{interact_sh_url}};)
, y no solo una comprobación de versión. Esto permite usar las plantillas en pruebas del WAF.
Recomendaciones
Fastly recomienda actualizar a la versión más reciente de NagiosXI y, en la medida de lo posible, evitar su acceso a internet. Se puede usar tanto el módulo Metasploit como la plantilla Nuclei para probar si existe la vulnerabilidad.
Nota: el WAF de última generación de Fastly detecta los intentos de aprovechamiento de las vulnerabilidades CVE-2021-25296, CVE-2021-25297 y CVE-2021-25298 de forma predeterminada.
Referencias
NVD:
Módulo Metasploit:
Documentación: https://www.rapid7.com/db/modules/exploit/linux/http/nagios_xi_configwizards_authenticated_rce
Solicitud de incorporación de cambios: https://github.com/rapid7/metasploit-framework/pull/17494
Plantillas Nuclei:
Solicitud de incorporación de cambios: https://github.com/projectdiscovery/nuclei-templates/pull/6615
Prueba de concepto original: