Emotet Erkennung mit Icinga / Nagios und EmoCheck

In diesem Artikel beschreibe ich, wie man das Monitoringsystem Icinga bzw. Nagios in Verbindung mit EmoCheck nutzen kann um in einem Unternehmensnetz Emotet-Infektionen frühzeitig erkennen zu können und sich gegebenenfalls aktiv warnen zu lassen.

Neulich wurde bei Heise (https://heise.de/-4652554) über ein interessantes Tool berichtet, mit dem geprüft werden kann, ob ein PC bereits mit der Schadsoftware „Emotet“ infiziert ist. Dies erledigt das Tool „EmoCheck“ (https://github.com/JPCERTCC/EmoCheck/releases) indem es den Rechner auf Prozesse untersucht, die typisch für eine Emotet-Infektion sind. In dem Artikel wird darauf hingewiesen, dass sich ein mit Emotet infizierter Rechner nicht zwangsläufig sofort auffällig verhält. In dem genannten Artikel heißt es: „[…] typischerweise vergehen zwischen der ersten Emotet-Infektion in einem Firmennetz und dem Verteilen des Erpressungs-Trojaners Ryuk ein bis zwei Wochen.

Es gibt einige Diskussionen über die Funktionsweise dieses Tools. So regt sich einiges an Kritik am Umstand, dass EmoCheck nach statischen Prozessnamen sucht. Ich teile diese Bedenken dahingehend, dass Emotet seinen Prozessen jederzeit anderslautende Namen geben könnte. Allerdings bin ich der Meinung, dass dieses Werkzeug einen installierten Virenschutz sicherlich sinnvoll ergänzen kann und es in Anbetracht des doch erheblichen Schadenpotentials von Emotet sicherlich nicht schlecht ist, sich nicht nur auf einen Prüfmechanismus zu verlassen.

Voraussetzungen und Anmerkungen

In diesem Beispiel gehe ich von folgendem Setup aus. Mir ist bewusst, dass das Windows 7- End-of-life erreicht ist und auch Icinga 1 nicht mehr auf dem Stand der Dinge ist. Allerdings ist dieses Setup (Stand 02/2020) wohl nicht sehr realitätsfern. Die Domäne wird zur Zeit umgestellt, das Upgrade der Clients auf Windows 10 Enterprise ist ebenfalls in Arbeit. Es muss eben alles sorgfältig getestet werden, das braucht seine Zeit. Und gewisse Sachzwänge (Lizenzfragen, inkompatible Randsysteme, etc.) waren und sind eben auch gegeben.

Icinga 1 funktioniert einwandfrei und führt ca. 400 unterschiedliche Checks durch. Hier sehe ich keinerlei Veranlassung, auf Version 2 zu gehen.

Das Setup

  • Windows Domäne
  • ca. 100 Windows 7 Professional Clients
  • Icinga 1 auf einem Ubuntu 18.04.03 Host

Auf dem Ubuntu 18.04-Host läuft Samba mit einer Share „emocheck“, mit schreibendem Zugriff für alle („guest ok“). Der Pfad dieser Share ist „/opt/emocheck

Ablauf

Auf den Windows Clients wird im Verzeichnis C:\program files\emocheck das Programm emocheck_x64.exe (zu beziehen unter https://github.com/JPCERTCC/EmoCheck/releases) abgelegt.


Überprüfung beim Rechnerstart

Mithilfe eines Registry-Eintrags unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run sorgen wir dafür, dass das Emocheck-Tool bei jedem Rechnerstart automatisch ausgeführt wird. Indem wir einige Parameter mitgeben sorgen wir dafür, dass das Tool sein Testergebnis im Json-Format in die Samba-Share auf dem Icinga-Host schreibt.
Untenstehender Code kann genutzt werden, um den Eintrag zu erzeugen. Einfach in eine Datei schreiben und per Doppelklick ausführen.

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"emocheck"="C:\Program Files\Emocheck\emocheck_x64.exe /quiet /json /output \\icinga\emocheck"

Das Icinga/Nagios Check Command

Für Icinga definieren wir ein Check Command, welches das Perl-Skript „check_emotet“ ausführt. Dies ist, abhängig von der Anzahl der von Icinga/Nagios ausgeführten Checks, alle paar Minuten der Fall.
Untenstehender Code sollte in die Icinga/Nagios-Config (z.B. „checkcommands.cfg“) eingefügt werden um das Check Command zu definieren.

define command {
                command_name                          check_emotet
                command_line                          $USER1$/check_emotet
}

Der Check „check_emotet“

Das Perl-Skript check_emotet ließt alle von den Windows-Clients zurückgelieferten Ergebnisdateien, die seit dem letzten Icinga-Lauf im Verzeichnis „/opt/emocheck“ gesammelt wurden, und überprüft den Wert von „is_infected„. Ist dieser Wert „no“, gibt das Skript den Returncode „0“  (OK) an Icinga zurück. Falls eine Infektion in einer der Dateien vermerkt wurde, gibt das Skript den Returncode „2“ (CRITICAL) zurück. Nach der Verarbeitung durch das Skript werden die Ergebnisdateien in das Verzeichnis „/opt/emocheck/processed“ verschoben.
Untenstehendes Skript in die Datei „/libexec/check_emotet“ schreiben und mit chmod +x ausführbar machen.

#!/usr/bin/perl
use strict;
use warnings;
use File::Copy;
binmode STDOUT, ":utf8";
use utf8;
use JSON;
use experimental qw( switch );
use feature qw(switch say);
# Declare infection pointer
my $infected = 0;
my $infected_host = "";
my $dir = '/opt/emocheck';
foreach my $fp (glob("$dir/*.json")){
        my $json;
        {
                local $/; # This enables 'slurp' mode
                open my $fh, "<", $fp;
                $json = <$fh>;
                close $fh;
        }
        my $data = decode_json($json);
        if ($data->{'is_infected'} eq 'yes'){
                # Infection found! Set $infected to 1 and set/concatenate affected hostnames delimited by '/'
                $infected = 1;
                if ($infected_host eq ""){
                        $infected_host = $data->{'hostname'};
                }else{
                        $infected_host .= "/" . $data->{'hostname'};
                }
        }
        move($fp, $dir. "/processed");
}
given ($infected) {
    chomp($infected);
    when ($infected lt '1') { print "OK - No infection found."; exit(0);      }
    when ($infected eq '1') { print "CRITICAL - One or more infections suspected. ($infected_host)"; exit(2); }
    default { print "UNKNOWN - UNCERTAIN STATE"; exit(3); }
}

Definition des Advanced Service

Als nächstes benötigen wir in Icinga/Nagios einen Advanced Service, dem das oben definierte Check Command zugeordnet wird und der außerdem die Konfiguration für Benachrichtigung und andere wichtige Aspekte enthält. Dieser Advanced Service wird dann unserem Icinga-Host zugeordnet womit der Check nun letztendlich eingebunden wird.
Untenstehender Code muss der Icinga-/Nagios-Konfiguration hinzugefügt werden (z.B. „advanced_services.cfg“).
Kurze Beschreibung der Konfiguration, sofern nicht selbsterklärend:

SchalterWertBeschreibung
max_check_attempts1Sollte auf '1' stehen, damit sofort nach der ersten
Rückmeldung eines "CRITICAL"-Wertes die Benachrichtigung
durchgeführt wird.
notification_optionsc,rNur bei 'critical' und 'recovery' benachrichtigen.
notification_enabled1Nur wenn dieser Wert auf '1' steht werden Benachrichtigungen
durchgeführt.
host_namez.B. icinga.mein.netzHostname der Maschine, auf der Icinga läuft.
contact_groupsz.B. adminsKontaktgruppen, die die Email-Adressen der gewünschten
Benachrichtigungsempfänger enthalten. Hier werden keine Email-
Adressen eingetragen!
define service {
                service_description                   Check Emotet Infection
                max_check_attempts                    1
                first_notification_delay              0
                notification_interval                 0
                notification_options                  c,r
                notifications_enabled                 1
                event_handler_enabled                 1
                check_command                         check_emotet!
                check_period                          24x7
                notification_period                   24x7
                host_name                             icinga.mein.netz
                contact_groups                        +admins,ProductionAdmins
                use                                   generic-service
}

Wichtige Hinweise zum Schluss

  1. Das vorgestellte Verfahren ist nicht perfekt und der Einsatz per „copy/paste“ ist nicht unbedingt sinnvoll. Es soll eher als Anregung zur Erarbeitung eines eigenen Konzeptes dienen.
  2. Ich übernehme keinerlei Gewährleistung, Haftung oder Sonstiges für Schäden, die aus dem Einsatz meiner Beispiele resultieren.
  3. Es muss bedacht werden, dass Icinga im Erkennungsfall den Status auf „CRITICAL“ setzt und dann die Ergebnisdateien verschiebt. Beim nächsten Lauf wird die ursächliche Datei nicht mehr geprüft, der Status wechselt dann also in Icinga/Nagios wieder auf „OK“ zurück. Man darf sich also keinesfalls nur auf den augenblicklichen Zustand im Icinga/Nagios-Dashboard verlassen. Die durch den Check versandten Benachrichtigungen per Email sind hier zu beachten!

Schreibe einen Kommentar