16.03.2021

Get-WinEvent ve Logon Type

Uzak masaüstü bağlantılarını eventlog'dan süzmek için garip filtereler kullandım durdum. Ta ki şunu bulana kadar:

PS> Get-WinEvent -FilterHashTable @{LogName="Security";Id=4624} | Where-Object {$_.properties[8].value -eq 10}

Buradaki properties olarak geçen 27 öğelik EventProperty nesnesi, her olay için ayrıntılar sekmesinde çıkan parametrize edilmiş olay özellikleri. Bunu aslında log parser zamanlarından biliyordum, ama nedense bu alanların powershell'den de erişebileceğini hiç düşünmemiştim.

Her durumda Logon Type=10 kaydı düşülmüyor. Sunucunun ekranı kilitlenmişse sadece Logon Type=7 (muhtemelen bir Logon Type=3 sonrasında) kaydı olabiliyor.

2023-04-11 ek: Uygulama ve Hizmet Günlükleri (Application and Service Logs) altında Microsoft>Windows>TerminalServices-RemoteConnectionManager/Operational günlüğü daha net bilgiler sunuyor. Bunun için logon audit policy'si etkinleştirilmiş olmalı.

PS> Get-WinEvent -FilterHashTable @{LogName="Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational";Id=1149} | Select-Object TimeCreated, @{N="User";E={$_.properties[0].Value}},@{N="Domain";E={$_.properties[1].Value}},@{N="IP";E={$_.properties[2].Value}}

2023-11-20 ek: Ayrıca "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" altında hem uzakmasaüstü oturum açma hem de kapama olayları sırasıyla 21 ve 23 olayları ile kaydedilir.

PS> Get-WinEvent -FilterHashtable @{Logname="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational";Id=21,23} -Max 4 | select TimeCreated, Id, @{N="UserName";E={$_.Properties[0].Value}},@{N="SessionID";E={$_.Properties[1].Value}},@{N="IPAddress";E={$_.Properties[2].Value}} | ft *

15.03.2021

Sysmon

Sysinternals araçlarının fanatiğiyim. Hepsi güzel, ama özellikle Process Monitor, Process Explorer, Autoruns gibi araçların hayranıyım. Bir süredir Sysmon'un varlığından ve işlevlerinden haberdardım ama çok yakınlaşma fırsatım olmamıştı. Aslında yakınlaşınca anladım ki Sysmon hakkında hiçbir şey bilmiyormuşum. Channel9'daki Defrag Tools programındaki konuşmalar falan konuya sadece giriş seviyesinde değinmiş.

İşin özünde Sysmon da Process Monitor benzeri bir araç. Ama bir grafik arayüzü yok. Grafik arayüz olmayınca da onun yerine geçecek filtreleme işlerini başka bir şekilde yapmamız gerekiyor. Bu şekil de burada XML oluyor.

Şu anda web sayfalarında 13.01 sürümü var. Yani ilk çıktığından bu yana çok yol almış. Yolun çoğu XML yapısı ile ilgili alınmış. Sanıyorum ilk çıktığında bugüne kıyasla çok ilkel bir XML yapısı varmış. Zamanla çok değişmiş. Şu anda XML schemaversion 4.5. Bu neleri değiştirmiş, varsayılan olarak VEYA olan filtre 4.22 ile VE olmuş, yeni XML elemanları eklenmiş vs.

Çalıştırıp yakalamaya başlaması için

sysmon -i

komutunu vermek gerekiyor. Bu şekilde varsayılan ayarlarla çalışmaya başlıyor. Yakaladığı olayları Event Viewer'da Application and Service Logs altında Microsoft-Windows-Sysmon/Operational'a yazıyor. -i anahtarı ile çalıştırıldığı anda kendini %SystemRoot% klasörünün altına kopyalayıp bir servis olarak çalışmaya başlıyor. Bu şekilde bilgisayarı tekrar başlattığımızda da çalışmaya devam ediyor. Faaliyetlerini durdurmak için kaldırmak gerekiyor ki bu da

sysmon -u

ile oluyor. Bir kez kurulduktan sonra varsayılan ayarlarla olayları yakalamaya başlıyor demiştik. Yapılandırmayı değiştirmek için bir XML dosyası oluşturarak -c anahtarı ile bu dosyanın yerini göstermek gerekiyor.

sysmon -c ornek.xml

Buraya kadarki konular zaten her yerde yazılan kısım. Bir örnek üzerinden gidelim. Bir sunucumuz var; bu sunucunun üzerinde IIS çalışıyor. C:\inetpub\wwroot\aspnet_client klasörü altında oluşturulan .aspx dosyalarının hangi süreç tarafından oluşturulduğunu bilmek ve bundan haberdar olmak istiyoruz. Aynı zamanda %ProgramData% ve %SystemRoot%\Temp klasörlerinin altında oluşturulabilecek *.7z, *.zip ve *.rar dosyalarına ait olayları takip etmek istioruz. Aslında bunun mantığını kurala dökmek kolay. Bir pseudo code ile:

(Path = C:\inetpub\wwwroot\aspnet_client VE Extension=*.aspx) VEYA ((PATH=%PROGRAMDATA% VEYA PATH=%SystemRoot%\temp) VE (Extension=.7z VEYA Extension=.zip VEYA Extension=.rar))

demek kolay. Ama bunu XML'e dökmek nispeten zor. Tüm süreci nasıl anlatırım bilemiyorum, ama nihayetinde şunları söyleyebilirim. Birden fazla mantık grupları için RuleGroup'lar oluşturmak gerek. Aynı olaya ait ikisi de include veya ikisi de exlude olan RuleGroup'lar geçerli değil. Ayrıca schemaversion 4.22'den sonra EventFiltering elemanı içindeki öğelerin varsayılan mantık operatörü VE. Bunu değiştirmek için groupRelation attribute'larını kullanıyoruz. İkisi de include olan RuleGroup'lardan kaçınmak için birini exclude yapmam gerekti. Bunu da path'ten yana kullandım. Hariç tutulabilecek path'leri toplayıp bir exlude RuleGroup'u oluşturdum. Sonuçta elimde şöyle bir XML dosyası oldu:

<Sysmon schemaversion="4.5">
  <HashAlgorithms>sha256</HashAlgorithms>
  <CheckRevocation/> <!-- Check loaded drivers, log if their code-signing certificate has been revoked, in case malware stole one to sign a kernel driver -->

  <EventFiltering>

    <RuleGroup name="Extension" groupRelation="or">
      <FileCreate onmatch="include">
        <TargetFilename condition="end with">.7z</TargetFilename>
        <TargetFilename condition="end with">.zip</TargetFilename>
        <TargetFilename condition="end with">.rar</TargetFilename>
        <TargetFilename condition="end with">.aspx</TargetFilename>
        <TargetFilename condition="end with">.asp</TargetFilename>
      </FileCreate>
    </RuleGroup>

    <RuleGroup name="Path" groupRelation="or">
      <FileCreate onmatch="exclude">
        <TargetFilename condition="begin with">C:\PerfLogs</TargetFilename>
        <TargetFilename condition="begin with">C:\Program Files (x86)</TargetFilename>
        <TargetFilename condition="begin with">C:\Program Files</TargetFilename>
        <TargetFilename condition="begin with">C:\Scripts</TargetFilename>
        <TargetFilename condition="begin with">C:\inetpub\temp</TargetFilename>
        <TargetFilename condition="begin with">C:\inetpub\logs</TargetFilename>
        <TargetFilename condition="begin with">C:\inetpub\history</TargetFilename>
        <TargetFilename condition="begin with">C:\inetpub\custerr</TargetFilename>
      </FileCreate>
    </RuleGroup>

    <RuleGroup name="ProcStart" groupRelation="or">
      <ProcessCreate onmatch="include">
        <Image condition="end with">cmd.exe</Image>
        <Image condition="end with">powershell.exe</Image>
        <Image condition="end with">iexplore.exe</Image>
      </ProcessCreate>
    </RuleGroup>

    <RuleGroup name="ProcStartExclude" groupRelation="or">
      <ProcessCreate onmatch="exclude">
        <CommandLine condition="contains">...</CommandLine>
      </ProcessCreate>
    </RuleGroup>

    <RuleGroup name="ProcEnd" groupRelation="or">
      <ProcessTerminate onmatch="include"/>
    </RuleGroup>

    <RuleGroup name="NetConnct" groupRelation="or">
      <NetworkConnect onmatch="include">
        <DestinationHostname condition="end with">github.com</DestinationHostname>
        <DestinationHostname condition="end with">githubusercontent.com</DestinationHostname>
      </NetworkConnect>
    </RuleGroup>

  </EventFiltering>

</Sysmon>

Arada başka öğeler de var. Örneğin cmd.exe, powershell.exe ve iexplore.exe süreçlerinin başlaması da takip ediliyor. Süreç başlaması işlemlerinin takibinde bazı hariç tutmalar için "..." ile olası bir durumu da ekledim. Ayrıca github.com ve githubusercontent.com'a girişleri de takip ettim. Bunun dışındaki süreç başlamalarını ve sonlanmalarını hariç tuttum.Şablon olarak şu kaynaktaki xml dosyası üzerinden gittim.

Yardım ve dökümanlarda gözükmeyen, webde de çok rastlanmayan bir komut satırı parametresi de -t ki bu hata ayıklamayı kolaylaştırıyor. Örneğin kalıcı olarak devreye alma öncesinde bir xml dosyasını denemek istiyorsak bunu aşağıdaki gibi deneme modunda başlatabilir, sonra da konsoldan gelen mesajlarla gidişatı izleyebiliriz:

sysmon -t -i testkonfig.xml

2023-12-27 Ek: Şu sayfada bir de sysmon hizmetinin yetkilerinin kısıtlanarak kullanıcılar tarafından durdurulamaması için yetkilerin yapılması anlatılmış:

Gizle:
sc sdset Sysmon D:(D;;DCLCWPDTSD;;;IU)(D;;DCLCWPDTSD;;;SU)(D;;DCLCWPDTSD;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
 

Eski haline döndür:
sc sdset Sysmon D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

Güzel.

---

[1] https://posts.specterops.io/putting-sysmon-v9-0-and-or-grouping-logic-to-the-test-c3ec27263df8

[2] https://www.hexacorn.com/blog/2018/06/29/sysmon-doing-lines-part-3/ 

[3] https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon 

[4] https://techcommunity.microsoft.com/t5/sysinternals-blog/sysmon-the-rules-about-rules/ba-p/733649