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.
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.