20.08.2021

Server üzerinde bir süreç sonlanınca eposta göndersin

Temel olarak Windows olay günlüğüne belli bir yeni olay düştüğünde eposta göndermek veya başka bir komut çalıştırmak mümkün. Ben de bir sürecin sonlanması durumunda eposta göndereceğim. Sürecin sonlanmasını da Sysinternals arası Sysmon ile denetleyeceğim. İstenmesi durumunda:

  • Bir sürecin başlaması veya sonlanması
  • Bir dosyanın oluşturulması veya silinmesi
  • Kayıt defterinde bir değer oluşturulması veya silinmesi
  • Belirli bir IP adresine/porta ağ bağlantısı yapılması

gibi durumlarda istenen hareket yapılabilir.

Öncelikle sysmon'u istenen sürecin sonlanması durumu için bir yapılandıralım. İlk iş, sistemde var olan bir sysmon yapılandırması bulunuyor mu, bakalım:

> sysmon64 -c

Bu satırdan sonra "Sysmon is not installed on this computer" yazdıysa sistemde var olan bir yapılandırma yoktur ve sıfırdan başlayabiliriz. Eğer bir yapılandırma varsa onu bozmadan üzerine yapılandırma yapmak gerek. -c anahtarıyla gösterilen xml dosyasını bulup yapılandırmamızı bunun üzerine yapmamız gerekecek. Bu konumuz dışında. Eğer varolan bir yapılandırma varsa ve sıfırlamak istiyorsak

> sysmon64 -c --

ile sıfırlayabiliriz.

Tekrar başa dönelim; "Sysmon is not installed on this computer" yazdıysa sistemde hiç sysmon hizmet sürücüsü kurulmamış demektir. Bu durumda sysmon'u -i anahtarıyla çalıştırarak hizmet sürücüsünü kurabiliriz. Ben 64-bitlik sürümünü kullanacağım. Ayrıca ilk çalıştırmada son kullanıcı lisans anlaşmasını (EULA) da kabul etmem gerek (-accepteula).

> sysmon64 -accepteula -i process_end.xml

Terminalimiz Powershell ise dosyaları belirtirken önlerine tam adlarını (aynı klasördeysek de .\process_end.xml şeklinde) yazmamız gerek. Tab tamamlaması bu durumda çok işe yarar.

process_end.xml dosyası oluşturmadan sadece -i anahtarını kullanarak başlarsak varsayılan ayarlar geçerli olur ve takibini yapmak istediğimiz olay sadece bizim ilgilendiğimiz uygulama için değil, sistemdeki tüm uygulamalar için yaratılır, ve çok fazla eposta almaya başlarız. Bunun için böyle bir xml dosyası ile hedefimizi daraltmamız gerekecek.

Gelelim xml dosyasının oluşturulmasına. Şu anda bende sürüm 13.22 yüklü. Bu sürümde şema sürümü de 4.70. Bunu da xml dosyamızda belirtmemiz gerekecek. 13.22 ile birlikte 4.70 veya öncesi şema sürümleri de kullanılabilir ama sürümler arası fark bazen beklenmeyen sonuçlar verdiği için (RuleGrup'ların mantıksal operatörleri varsayılan işleme biçimi gibi) ne yaptığımızı bildiğimizden emin olmamız gerek. XML dosyasındaki ilk satır şema versiyonu:

<Sysmon schemaversion="4.7">

Bu satırdan sonra hash algoritmamızı belirtelim. Olay günlüğüne çalıştırılan her uygulamanın hash'i de hesaplanıp yazılacak.

<HashAlgorithms>sha256</HashAlgorithms>

Sadece 1 ölçütüm (süreç sonlanma) olduğu için daha fazla karıştırmadan bununla ilgili process terminate tag'ını girelim

<EventFiltering>

<ProcessTerminate onmatch="include">

Takip ettiğimiz sürecin hangi özelliği ile ilgileniyoruz? Örnek olarak sistemdeki process explorer'ı takip edelim (procexp64.exe)

<Image condition="end with">procexp64.exe</Image>

Nihai olarak açık taglarımızı kapatlım:

</ProcessTerminate>

</EventFiltering>

</Sysmon>

Her process explorer'ın sonlanmasında "Microsoft-Windows-Sysmon/Operational" EWT olay günlüğüne 5 numaralı olay kayıtları düşer. Görmek için olay günlüğünde Uygulama ve Hizmet Logları (Applications and Services Logs)>Microsoft>Windows>Sysmon>Operational altına bakmak gerek. Gelelim bu olay kayıtları için bir hareket oluşturmaya. Olay günlüğüne bir tane 5 numaralı olay düştükten sonra olay görüntüleyicisi penceresinin sağ kısmında "Bu olaya göreve ekle (Attach Task to this Event)"e tıklayarak işleme devam edebiliriz. Uygulama çalıştırmanın dışındaki diğer seçenekler (eposta göndermek ve bir mesaj görüntülemek) artık terk edilmiş hareketler. Biz eposta gönderebilmek için bir powershell script'i kullanacağız. Şöyle bir script işimizi görür:

$EmailFrom = "gonderen@mailadresi.com"
$EmailTo = "alici@alantaraf.com"
$Subject ="procexp sonlandı"
$Body = "Bekledigimiz Process Explorer'ın sonlanması şu an gerçekleşti."
$SMTPServer = "smtpsunucu.mailadresi.com"
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

Bu dosyanın ilk 5 satırı sırasıyla gönderenin eposta adresi, alıcının eposta adresi, eposta mesajının konusu, mesajın içeriği ve eposta sunucumuz şeklinde. Bunları uygun şekilde değiştirmek gerek.

Ya da Send-MailMessage cmdlet'ini kullanarak gönderebiliriz:

$smtpParams= @{
  From = "gonderen@mailadresi.com"
  To = "alici@alantaraf.com"
  Subject ="procexp sonlandı"
  Body = "Bekledigimiz Process Explorer'ın sonlanması şu an gerçekleşti."
  SMTPServer = "smtpsunucu.mailadresi.com"
}

Send-MailMessage @smtpParams

Bu scriptin C:\Users\metin\Belgeler\eposta_gonder.ps1 gibi bir konumuna kaydedildiğini varsayalım.

En son olaya görev ekleme aşamasında kalmıştık. Bu pencerede3 kutu var. Birincisi çalıştırılacak program. Buraya powershell.exe'nin konumunu yazmamız gerek. Bu çoğu durumda 

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

şeklindedir. Argumanlar için yapmamız gereken birinci iş geçici olarak Execution Policy'yi devre dışı bırakmamız ve scriptimizi bir -File anahtarı ile göstermemiz. Hepsi birlikte şöyle olabilir:

-ExecutionPolicy Bypass -File C:\Users\metin\Belgeler\eposta_gonder.ps1

Üçüncü kutu sadece çalışacak script bulunduğu klasörle ilgili bir dosya işlemi yapacaksa gerekli. Bizimki gerekmeyeceği için boş bırakabiliriz. Boş kalmasın diyenler C:\Users\metin\Belgeler\ gibi birşey yazabilir.

Hiç yorum yok: