badger
Goto Top

EmoCheck: start per Powershell und Eventlog

Seit kurzem kann man mit dem Tool EmoCheck nach spezifischen Prozessen von Emotet Ausschau halten.
Mehr Details dazu auf heise.

Leider ist das Programm so nicht geeignet, um es per Aufgabenplanung korrekt auszuführen.
Auch müssen die Log Files manuell gelesen werden.

Um diese "Probleme" zu umgehen habe ich mir ein kleines Powershell-Script geschrieben, welches das Programm startet, wieder beendet und das Ergebnis des Scans in den EventLog schreibt:
###### EDIT THESE VARIABLES ######
$path = "C:\scripts\emocheck" # without ending \  
$file = "emocheck_x64.exe" # emocheck_x64.exe or emocheck_x86.exe  
##################################

$fileExt = $file.Replace(".exe","")  
$time = Get-Date

#check if Eventlog exists
if ([system.diagnostics.eventlog]::SourceExists("EmoCheck") -eq $False) {  
	New-EventLog -LogName "Application" -Source "EmoCheck"  
}

#start scan
Start-Process -Filepath $path"\"$file -WorkingDirectory $path  

#check if emocheck is running. Otherwhise exit script
if ((Get-Process -name $fileExt) -eq $null){
    Write-EventLog -LogName "Application" -Source "EmoCheck" -EventID "1003" -EntryType "Error" -Message "Couldn't start emocheck. Please check your script." -Category 0  
    exit
}
#wait one seconds, until cmd is open
Start-Sleep -s 1
$cmd = Get-Process cmd | Where StartTime -gt $time | ForEach-Object {$_.ID} | Out-String

#wait few seconds, until the logs are written
Start-Sleep -s 30

#kill process because it waiting for a key input
Stop-Process -Name $fileExt
Stop-Process -Id $cmd

#get latest log file
$logfile = Get-ChildItem -Path $path"\*_emocheck.txt" | Sort-Object LastWriteTime -Descending | Select-Object -First 1  
$logfilePath = Join-Path -Path $path -Childpath $logfile.name
$content = Get-Content -Path $logfilePath
$contentEvent = $content | Out-String

#check if log file is available
if ($content -eq $null){
    Write-EventLog -LogName "Application" -Source "EmoCheck" -EventID "1003" -EntryType "Error" -Message "Couldn't read the log files. Please check your script."  
    exit
}

#check log
if ($content -like "No detection."){  
    Write-EventLog -LogName "Application" -Source "EmoCheck" -EventID "1000" -EntryType "Information" -Message $contentEvent -Category 0  
}
elseif ($content -like "Detected Emotet process."){  
    Write-EventLog -LogName "Application" -Source "EmoCheck" -EventID "1001" -EntryType "Critical" -Message $contentEvent -Category 0  
}
else
{
    $message = "Couldn't interpret the log files. Please check it manually: " + $logfilePath  
    Write-EventLog -LogName "Application" -Source "EmoCheck" -EventID "1002" -EntryType "Warning" -Message $message -Category 0  
}

#delete log files that are older than 30 days
Get-Childitem $path -include "*_emocheck.txt" -recurse | where {$_.lastwritetime -lt (get-date).adddays("-30") -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -whatif}  

Nachdem ich nicht der große Powershell-Scripter bin, sind Verbesserungsvorschläge gerne willkommen face-smile
Auch habe ich das Script prinzipiell nur für mich geschrieben. Sprich all zu große Fehlerüberprüfungen gibt es nicht.
Daher auch: Die Anwendung des Skriptes geschieht auf eigene Gefahr. Ich übernehme keine Haftung für eventuelle Schäden!

Grüße
Patrick

Content-ID: 543927

Url: https://administrator.de/contentid/543927

Ausgedruckt am: 21.11.2024 um 15:11 Uhr

Badger
Badger 11.02.2020, aktualisiert am 31.03.2020 um 21:44:25 Uhr
Goto Top
Update für die Version 0.0.2 von EmoCheck:
###### EDIT THESE VARIABLES ######
$path = "C:\scripts\emocheck" # without ending \  
$file = "emocheck_x64.exe" # emocheck_x64.exe or emocheck_x86.exe  
##################################

$fileExt = $file.Replace(".exe","")  

#check if Eventlog exists
if ([system.diagnostics.eventlog]::SourceExists("EmoCheck") -eq $False) {  
	New-EventLog -LogName "Application" -Source "EmoCheck"  
}

#start scan
Start-Process -WindowStyle hidden -Filepath $path"\"$file -WorkingDirectory $path -ArgumentList "/quiet /json"  

#check if emocheck is running. Otherwhise exit script
if ((Get-Process -name $fileExt) -eq $null){
    Write-EventLog -LogName "Application" -Source "EmoCheck" -EventID "1003" -EntryType "Warning" -Message "Couldn't start emocheck. Please check your script." -Category 0  
    exit
}

#wait few seconds, until the logs are written
Start-Sleep -s 15

#get latest log file
$logfile = Get-ChildItem -Path $path"\*_emocheck.json" | Sort-Object LastWriteTime -Descending | Select-Object -First 1  
$logfilePath = Join-Path -Path $path -Childpath $logfile.name
$content = Get-Content -Path $logfilePath | ConvertFrom-Json

#check if log file is available
if ($content.is_infected -eq $null){
    Write-EventLog -LogName "Application" -Source "EmoCheck" -EventID "1003" -EntryType "Warning" -Message "Couldn't read the log files. Please check your script."  
    exit
}

#check log
if ($content.is_infected -eq "no"){  
    Write-EventLog -LogName "Application" -Source "EmoCheck" -EventID "1000" -EntryType "Information" -Message $content -Category 0  
}
elseif ($content.is_infected -like "yes"){  
    Write-EventLog -LogName "Application" -Source "EmoCheck" -EventID "1001" -EntryType "Error" -Message $content -Category 0  
}
else
{
    $message = "Couldn't interpret the log files. Please check it manually: " + $logfilePath  
    Write-EventLog -LogName "Application" -Source "EmoCheck" -EventID "1002" -EntryType "Warning" -Message $message -Category 0  
}

#delete log files that are older than 30 days
Get-Childitem $path\* -include *_emocheck.json, *_emocheck.txt | where {$_.lastwritetime -lt (get-date).adddays("-30") -and -not $_.psiscontainer} |% {remove-item $_.fullname -force}  

EDIT 01 13.02.2020: -WindowStyle hidden hinzugefügt
EDIT 02 13.02.2020: EntryType angepasst, da Critical nicht erlaubt ist
EDIT 03 17.02.2020: Löschen der Logfiles geändert, da diese fehlerhaft war
EDIT 04 31.03.2020: Löschen der Logfiles geändert, da diese fehlerhaft war
saxe1234
saxe1234 13.02.2020 um 08:39:05 Uhr
Goto Top
Danke für deine Mühe.

Was mir auffällt dass sich trotzdem - zwar nur ganz kurz aber sichtbar - ein Fenster öffnet, gefühlt 25ms aber ist trotzdem unschön weil
es sichtbar ist.

mfg Sascha
Badger
Badger 13.02.2020 um 09:04:30 Uhr
Goto Top
Code oben ist angepasst (bei Start-Process hab ich ein -WindowStyle hidden hinzugefügt).

Grüße
Patrick
saxe1234
saxe1234 13.02.2020 um 09:41:00 Uhr
Goto Top
vielen Dank, läuft jetzt top und kann ich jetzt ausrollen.

Ich muss mich wohl mal mehr mit Powershell beschäftigen ...
Badger
Badger 13.02.2020 um 09:55:50 Uhr
Goto Top
Das "Problem" mit den geöffneten Fenster kann man prinzipiell auch direkt per Aufgabenplanung umgehen.
Aktion -> Programm starten
Programm: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Argumente: -WindowStyle hidden "C:\scripts\emocheck\emocheck.ps1"

Nachdem ich solche Scripts immer so starte, ist mit der "Fehler" gar nicht aufgefallen.

Grüße
Patrick
saxe1234
saxe1234 13.02.2020 um 10:14:51 Uhr
Goto Top
Ok, mein Ansatz ist es Skript und Programm per SCCM zu verteilen um dann im Falle eines Falles den 1001er Eventcode
zu senden.
saxe1234
saxe1234 13.02.2020 um 14:09:12 Uhr
Goto Top
zur Info:

Write-EventLog : Der Parameter "EntryType" kann nicht gebunden werden. Der Wert "Critical" kann nicht in den Typ "System.Diagnostics.EventLogEntryType" konvertiert werden. Fehler: "Der Bezeichner "Critical" kann keinem gültigen Enumeratornamen zugeordnet werden. Geben Sie einen der folgenden
Enumeratornamen an, und wiederholen Sie den Vorgang:
Error, Warning, Information, SuccessAudit, FailureAudit"

das Anwendungs-Eventlog mag wohl kein Critical.... nicht dass es bei einer wirklichen Infektion nicht nicht-benachrichtigen würde...
Badger
Badger 13.02.2020 um 14:24:50 Uhr
Goto Top
Danke für den Hinweis. Hab es angepasst!
saxe1234
saxe1234 13.02.2020 um 14:28:31 Uhr
Goto Top
Sehr gut. Danke für die fixen Reaktionen