Sysmon ile Process, DNS, TCP Conns ve Port Özet Bilgileri

Bir sunucunun günlük, haftalık veya aylık oluşturduğu logların benzer şekilde üretiliyor olması ihtimal dahilindeyken, kurumsal ortamda bulunan istemcilerin farklı gereksinimlerine göre kullanılması nedeniyle belli bir kullanıcı analiz verisi elde etmek oldukça güç (User and Entity Behaviour Analytics’in kapsamına giren bu konu ilginizi çektiyse, şu bağlantıdan daha detaylı bilgilere erişebilirsiniz).

Bir istemcide hızlıca Sysmon loglarına bakarak, istemcinin yaşam döngüsü hakkında fikir sahibi olabilir miyim düşüncesiyle Sysmon Triage adında oldukça basit bir araç oluşturdum. Aracın detaylarına girmeden önce Powershell ile .evtx uzantılı logların parse edilmesi ile, Sysmon loglarının parse edilmesi arasındaki farklılıklara değinmek istiyorum. Öncelikle, bahse konu logların parse edilmesi noktasında aşağıdaki komutla Sysmon’un kaydettiği DNS sorgularını çekelim.

Get-WinEvent -FilterHashtable @{logname="Microsoft-Windows-Sysmon/Operational" ; Id=22} | fl

Örnek log kaydını incelediğimizde “Message” bloğundaki propertyleri Powershell ile tek tek parçalayıp seçmek ihtimal dahilinde görünmüyor.

Bu sorunu aşabilmek ve parçalama işlemini gerçekleştirmek için Reddit‘te karşılaştığım ve işleri oldukça kolaylaştıran kod parçacığını kullanarak message bloğunu parçalamaya çalışalım. Yukarıdaki ekran alıntısındaki bloktan “QueryName” alanını çekelim.

Write-Host "[+] Retrieving Sysmon Dns Queries"
Write-Host
$account = @()
$events = Get-WinEvent -FilterHashtable @{logname="Microsoft-Windows-Sysmon/Operational"; Id=22}  
ForEach ($event in $events) 
{
    if ($event.Message.Contains("QueryName"))
    {
     
        # Create hashtable
        $Dictionary = @{}
        # Convert event message to string
        $string = $event.Message.ToString()
        # Split lines in event message based off newline, and remove any null values
        $string.Split([environment]::NewLine,[System.StringSplitOptions]::RemoveEmptyEntries) | ForEach-Object {
            #Split each pair into key and value based off ':' delimiter
            $key,$value = $_.Split(':')
            #Write-Host "Key: " $key
            #Write-Host "Value: " $value
            #Populate $Dictionary
            $Dictionary[$key] = $value
            } 
        }
  $Dictionary.Item("QueryName") >>  C:\SysmonTriage\dnsQueries.csv

    }
#https://www.reddit.com/r/PowerShell/comments/7ttggn/how_would_you_use_powershell_to_parse_sysmon_logs/
Parçalama işlemi gerçekleşti.

Yukarıdaki kod bloğunu değiştirerek ihtiyacınıza göre dilediğiniz logları çekebilir ve özet bilgiler elde edebilirsiniz. Şimdi gelelim Sysmon Triage ile neler yapabileceğimize… Kod bloğunu bu bağlantıdan indirerek veya aşağıdaki kod bloğunu kullanarak çalıştıralım.

$HTTP_Request = [System.Net.WebRequest]::Create('https://raw.githubusercontent.com/kaptankojiro/sysmontriage/main/sysmontriage.ps1')
$HTTP_Response = $HTTP_Request.GetResponse()
$HTTP_Status = [int]$HTTP_Response.StatusCode

If ($HTTP_Status -eq 200) {
   Write-Host "Downloading SysmonTriage ... (https://raw.githubusercontent.com/kaptankojiro/sysmontriage/main/sysmontriage.ps1)" -ForegroundColor red -BackgroundColor white
        $WebClient = New-Object System.Net.WebClient
        $WebClient.DownloadFile("https://raw.githubusercontent.com/kaptankojiro/sysmontriage/main/sysmontriage.ps1","C:\Temp\sysmontriage.ps1")
         Write-Host "Sysmon Triage is downloaded." -ForegroundColor red -BackgroundColor white
}
Else {
    Write-Host "The Site may be down, please check your internet connection!"  -ErrorAction Stop  -ForegroundColor red -BackgroundColor white
   
}

$HTTP_Response.Close()
 Write-Host "Sysmon Triage is starting..." -ForegroundColor red -BackgroundColor white

powershell.exe -executionpolicy bypass -f C:\Temp\sysmontriage.ps1
Script temelde dört aşamadan oluşup aşağıdaki Sysmon loglarını topladıktan sonra, logların toplamını hesaplıyor. DNS sorgularını, istek gönderilen Destination IP'leri, en çok kullanılan command line komutlarını ve Destination Port'ları listememiz mümkün.

Script çalıştıktan sonra C:\SysmonTriage klasöründen .csv dosyalarını inceleyebilirsiniz.

Powershell’in Out-GridView fonksiyonunu kullanarak özet bilgileri de incelemek mümkün.

En çok sorgu gönderilen DNS isteklerinin özeti…

En çok istek gönderilen TCP connection istekleri…

İstek gönderilen Portların özet bilgileri…

Processlerin en çok kullandıkları komut girdileri…

Faydalı olması dileğiyle…

Yorum bırakın

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.