AMSI Logfiles mit der PowerShell lesen

In einem vorherigen Artikel hatte ich beschrieben, an welcher Stelle sich die AMSI Logfiles des Exchange Servers finden. Da die Logs lokal auf dem Exchange Server gespeichert werden, helfen die Logs im wenig, wenn Sie niemand liest und Angriffe erst festgestellt werden, wenn es zu spät ist.

AMSI Logfiles
Am besten wäre es natürlich die Logs von einem SIEM System erfassen zu lassen und sich entsprechend alarmieren zu lassen, wenn vermehrt Einträge in den Logs auftauchen.

Die Logs lassen sich aber auch auf einfache Art mit der PowerShell lesen und somit auch beliebig weiter verarbeiten. Zur Auswertung der AMSI bzw. HttpRequestFiltering Logs habe ich eine kleine PowerShell Funktion erstellt:

function Get-HttpRequestFilteringLogs {
    <#
    .SYNOPSIS
        Identifies and reports malicious events detected by AMSI from Exchange Server HttpRequestFiltering Logs.
    .DESCRIPTION
        Get-HttpRequestFilteringLogs is an advanced PowerShell function that parses Exchange Server HttpRequestFiltering
        logs to determine what Outlook client versions are being used to access the Exchange Server.
    .PARAMETER LogFile
        The path to the Exchange HttpRequestFilteringLogs log files.
    .EXAMPLE
         Get-HttpRequestFilteringLogs -LogFile 'C:\Program Files\Microsoft\Exchange Server\V15\Logging\HttpRequestFiltering\HttpRequestFiltering_2021072318-1.LOG'
    .EXAMPLE
         $AMSILogs = Get-ChildItem -Path '\\servername\c$\Program Files\Microsoft\Exchange Server\V15\Logging\HttpRequestFiltering\*.log'
         $AMSILogs | Get-HttpRequestFilteringLogs | Out-GridView -Title 'AMSI Events'
    .INPUTS
        String
    .OUTPUTS
        PSCustomObject
    .NOTES
		Author:  Frank Zoechling
		Website: https://www.frankysweb.de
		Twitter: @FrankysWeb
    #>
    [CmdletBinding()]
        param (
            [Parameter(Mandatory,
                       ValueFromPipeline)]
            [ValidateScript({
                Test-Path -Path $_ -PathType Leaf -Include '*.log'
            })]
            [string[]]$LogFile
        )
        PROCESS {
            foreach ($file in $LogFile) {
                $Headers = (Get-Content -Path $file -TotalCount 6 | Where-Object {$_ -like '#Fields*'}) -replace '#Fields: ' -split ','
                Import-Csv -Header $Headers -Path $file |
                Where-Object {$_.ScanResult -eq 'Detected'}
            }
        }
}

Die Funktion lässt sich einfach in die PowerShell einfügen und danach nutzen:

AMSI Logfiles mit der PowerShell lesen

Für die Syntax habe ich entsprechende Beispiele mitgeliefert:

Get-Help Get-HttpRequestFilteringLogs -Examples
Beispiele der PowerShell Funktion

Es lassen sich mit der Funktion einzelne Logfiles oder auch mehrere Logfiles einlesen, Beispiel 1 zeigt ein einzelnes Logfile, das zweite Beispiel zeigt das Lesen mehrerer Logfiles. Hier mal ein Beispiel:

Get-HttpRequestFilteringLogs

Auf die Art und weise lassen sich auf Logs innerhalb eines bestimmten Zeitraums filtern und einlesen und die Ausgabe in einer GridView darstellen. Hier beispielsweise die Logs der letzten 7 Tage:

Get-ChildItem *.log | where {$_.LastWriteTime -gt ((get-date).AddDays(-7))} | Get-HttpRequestFilteringLogs | Out-GridView

Das Ergebnis sieht dann beispielsweise so aus:

Get-HttpRequestFilteringLogs | out-Gridview

Auf diese Art und weise lassen sich die AMSI Logs also auch andere Systeme senden und weiterverarbeiten.

3 Gedanken zu „AMSI Logfiles mit der PowerShell lesen“

  1. bei uns ist das Verzeichnis leer. Test PS erzeugt eine Datei also muss AMSI aktiv sein. Wir haben Defender am Server. Kann es sein, dass nur positive Treffer geloggt werden.

    Antworten

Schreibe einen Kommentar