Website-Icon Frankys Web

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.

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:

Für die Syntax habe ich entsprechende Beispiele mitgeliefert:

Get-Help Get-HttpRequestFilteringLogs -Examples

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:

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:

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

Die mobile Version verlassen