Die Nagios XI Versionen 5.5.6 bis 5.7.5 sind gegenüber drei verschiedenen Arten von Command Injection anfällig. Dieses Problem wurde erstmals in Version 5.7.5 festgestellt und fs0c-sh veröffentlichte Anfang 2021 einen Proof of Concept dazu</u>. Wir haben aber entdeckt, dass das Problem schon in Version 5.5.6 bestand, was in der ursprünglichen Mitteilung nicht erwähnt wurde. Außerdem steht diese Sicherheitslücke nach wie vor auf der CISA-Liste der bekannten gefährdeten Softwares</u>. Nutzer von Nagios XI Versionen 5.5.6 bis 5.7.5 sollten aufgrund der aktiven Exploits also nach Möglichkeit ein Upgrade durchführen.
Hinweis: Zur Ausnutzung dieser Schwachstellen ist ein gültiger Nutzername samt Passwort erforderlich, da sie nur dann auftreten, wenn man sich bei Nagios XI authentifiziert.
Command Injection in Nagios XI 5.5.6 bis 5.7.5
Eine Command-Injection-Schwachstelle liegt vor, wenn unsauberer nutzergesteuerter Input in einer Funktion verwendet wird, die Betriebssystembefehle ausführt. Zu einem solchen Zustand kann es auf verschiedene Arten kommen, klassischerweise jedoch infolge einer Funktion wie PHPs exec()
. So auch bei Nagios XI 5.5.6 bis 5.7.5. Der Command-Injection-Angriff findet in einer Datei statt, wobei jeder CVE eine andere Datei zugrunde liegt. Die folgenden Untergruppen geben Aufschluss über die einzelnen Angriffsstellen.
Hinweis: Die Codeausschnitte wurden Version 5.7.5 entnommen und sehen in früheren Versionen möglicherweise anders aus.
CVE-2021-25296
Speicherort des Code: /usr/local/nagiosxi/html/includes/configwizards/windowswmi/windowswmi.inc.php
Bei CVE-2021-25296 wird die Variable plugin_output_len
vom Nutzer über einen URL-Parameter gesteuert und bei Verwendung des Konfigurationsassistenten windowswmi anschließend an folgenden Code übergeben:
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);
Als Erstes wird der Parameter „plugin_output_len“ an die vorkonfigurierten WMI-Befehle angehängt, ohne das Argument zu bereinigen. Anschließend werden alle Befehle an die exec-Funktion von PHP übergeben. Wird der aktuell ausgeführte Befehl durch einen Shell-Operator beendet, kann noch ein zweiter Befehl ausgeführt werden. Durch die Nutzung eines End Command Operators „;“ lässt sich an dieser Stelle nun ein weiterer Ausführungsbefehl hinzufügen, der die Ausführung von beliebigem Code ermöglicht. Wird die folgende Payload im Parameter „plugin_output_len“ gesendet, wird im Verzeichnis „/dev/shm“ eine Datei erstellt, wie in Abbildung 1 dargestellt:
9999; echo 'command Injection is dangerous' > /dev/shm/fastly.txt;

Abbildung 1: Durch Command Injection erstellte Datei
CVE-2021-25297
Speicherort des Code: /usr/local/nagiosxi/html/includes/configwizards/switch/switch.inc.php
Bei CVE-2021-25297 wird die Variable „address“ vom Nutzer über den URL-Parameter „ip_address“ gesteuert und bei Verwendung des Konfigurationsassistenten Switch anschließend an folgenden Code übergeben:
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;
}
Als Erstes wird der Parameter „ip_address“ an zusätzliche Dateipfade angehängt, ohne diese zu bereinigen. Anschließend wird er an die exec-Funktion von PHP übergeben. Dieses Mal muss ein Shell-String entschlüsselt und der aktuelle Befehl mit ';
beendet werden, bevor die eigene Payload zur Ausführung von beliebigem Code hinzugefügt werden kann.
CVE-2021-25298
Speicherort des Code: /usr/local/nagiosxi/html/includes/configwizards/cloud-vm/cloud-vm.inc.php
Bei CVE-2021-25298 wird die Variable „address“ vom Anwender über den URL-Parameter „ip_address“ gesteuert und bei Verwendung des Konfigurationsassistenten digitalocean anschließend an folgenden Code übergeben:
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);
Der gesendete Parameter „ip_address“ wird kurz verarbeitet und dann an die exec-Funktion weitergegeben, die an einen Ping-Befehl angehängt ist. Ähnlich wie bei CVE-2021-25296 erlaubt dies, den ersten Befehl durch den Operator „;“ zu beenden und dann beliebigen Code auszuführen.
Metasploit Modul
Metasploit</u> ist ein Open-Source-Angriffs-Framework, das von Sicherheitsexperten verwendet wird, um Exploit-Angriffe auf Schwachstellen meist im Rahmen eines Testszenarios wie einem Penetrationstest durchzuführen. Wir haben für die drei CVEs ein Exploit-Modul namens nagios_xi_configwizards_authenticated_rce</u> erstellt. Dieses Modul begünstigt Exploits der einzelnen CVEs mithilfe der Konfigurationsassistenten windowswmi, switch oder digitalocean und nutzt das Nagios XI Mixin von Metasploit für die dem Exploit vorgeschaltete Authentifizierung und Versionsprüfung. Während des Angriffs wird die bereitgestellte Payload ausgeführt (in diesem Fall eine Reverse Shell) und Zugriff auf den Zielserver als apache Nutzer erlangt, wie in Abbildung 2 dargestellt:

Abbildung 2: Reverse Shell, bei der Command Injection über das Metasploit Modul ausgeführt wird
Nuclei Template
Nuclei</u> ist ein Open-Source-Scanner, der die Erkennung von Schwachstellen und anderen Fehlkonfigurationen mithilfe von Templates vereinfacht. Wir haben für jede der drei CVEs ein eigenes Nuclei Template</u> erstellt, um Nutzer bei der Aufdeckung der anfälligen Software zu unterstützen. Die Ausführung der Nuclei Template in Nagios XI 5.7.5 macht die Schwachstellen kenntlich, wie in Abbildung 3 dargestellt:

Abbildung 3: Aufdeckung der jeweiligen CVEs mithilfe des Nuclei Templates
Wichtig ist, dass in diesen Templates eine kurze „interactsh“ Payload (; wget {{interact_sh_url}};)
anstelle einer reinen Versionsprüfung gesendet wird, wodurch die Templates für WAF-Tests geeignet sind.
Empfehlungen
Fastly empfiehlt, auf die neueste Version von Nagios XI zu aktualisieren und nach Möglichkeit zu verhindern, dass diese im Internet veröffentlicht wird. Es kann entweder das Metasploit Modul oder das Nuclei Template verwendet werden, um auf das Vorhandensein der Schwachstelle zu testen.
Hinweis: Die NGWAF von Fastly erkennt die Exploit-Versuche CVE-2021-25296, CVE-2021-25297 und CVE-2021-25298 automatisch.
Quellenangaben
NVD:
Metasploit Modul:
Nuclei Templates:
Pressemitteilungen: https://github.com/projectdiscovery/nuclei-templates/pull/6615
Ursprünglicher Proof of Concept: