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 nur auf einen Prüfmechanismus zu verlassen.
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.
./libexec/check_emotet
#!/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 - $infected of disk space used."; exit(3); }
}
@echo off
.\emocheck_x64 /quiet /json /output \\icinga\emocheck
checkcommands.cfg
define command {
command_name check_emotet
command_line $USER1$/check_emotet
}
advanced_services.cfg
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
}
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"