Graph Activity Logs ile Posta Kutusu İhlallerinin Araştırılması
Posta Kutusu İhlalleri
İlk makalemde, Microsoft Graph Etkinlik Günlüğü’nün temellerini açıklamaya çalıştım ve Microsoft 365 içindeki API odaklı etkinliklere görünürlük sağlamadaki kritik rolünü vurguladım. Şimdi teoriden pratiğe geçiyoruz. Serinin bu ikinci makalesi, bu güçlü veri kaynağının en yaygın ve zararlı güvenlik olaylarından biri olan posta kutusu ihlalini araştırmak için nasıl kullanılacağını gösteriyor olacağım.
Şu senaryoyu düşünün: Muhasebe departmanında telefon çalıyor. Bir müşteri, ödenmemiş bir fatura için yeni banka bilgileri içeren bir e-postanın onayını almak için telefonda bekliyor. Muhasebe ekibi şaşkın; ortak posta kutularının “Gönderilmiş Öğeler” bölümünü kontrol ediyorlar ve böyle bir e-posta kaydı bulamıyorlar. Kısa süre sonra, aynı sorguyla başka bir müşteri daha arıyor. Bu, hem kuruluşu hem de müşterilerini dolandırmak için tasarlanmış karmaşık bir posta kutusu ihlalinin incelikli ama endişe verici başlangıç noktası. Erişim sağlayan saldırgan, e-postalar gönderiyor ve ardından kanıtları siliyor.
Bu senaryo, bir kullanıcının posta kutusunda görünenin ötesine geçen derinlemesine bir araştırma yeteneğine olan acil ihtiyacı vurgulamaktadır. İşte tam da bu noktada Microsoft Graph Etkinlik Günlüğü vazgeçilmez hale gelir ve ne olduğunu, nasıl olduğunu ve saldırganın ne yaptığını anlamak için gereken ayrıntılı ve değiştirilemez denetim izini sağlar. Bu makale, posta kutusu güvenliğinin ihlal edildiğinin yaygın göstergelerini bulmak için Graph Etkinlik Günlüğü ve Kusto Sorgu Dili’ni (KQL) kullanma sürecinde size rehberlik edecektir . Şüpheli erişim kalıplarını nasıl belirleyeceğinizi, kötü amaçlı gelen kutusu kurallarını nasıl tespit edeceğinizi ve bir saldırının net bir resmini oluşturmak için kanıtları nasıl bir araya getireceğinizi birlikte ele alacağız.
Bu makale araştırmaya odaklansa da, en iyi savunmanın her zaman önlem almak olduğunu unutmamak önemlidir. Güvenlik ihlallerinin önemli bir yüzdesi, Çok Faktörlü Kimlik Doğrulama’nın (MFA) etkinleştirilmesiyle önlenebilir. Bu, saldırganların bir kullanıcının parolasına sahip olsalar bile erişim sağlamasını kat kat zorlaştıran kritik bir güvenlik katmanı sağlar. Kritik önlemlere geçmeden önce, kuruluşlar proaktif güvenliğe öncelik vermelidir. Adım adım bir kılavuz olarak, kullanıcılar için çok faktörlü kimlik doğrulamanın nasıl kurulacağına dair resmi Microsoft belgelerine bakmanızı öneririm.
Örnek Senaryo
Aşağıdaki içerik konuyu örneklendirebilmek için son derece önemlidir ve bunu gerçek hayattan bir örnekle ilişkilendirmek faydalı olacaktır. Örneğin, bu senaryo, bir alacaklar hesabı posta kutusunun ele geçirildiği ve şüpheli raporun, müşterilerin muhasebe ekibini arayıp neden yeni hesap bilgileriyle iletişime geçildiğini sorduğu bir senaryo olabilir; ancak ekip, ekip üyesinin posta kutusundan bu nitelikte giden hiçbir e-posta göremiyor olabilir. Bu, böyle bir ihlalin etkisini ve kuruluş üzerindeki olası etkisini açıklamak için bir başlangıç noktası olabilir.
Posta Kutusu İhlalinin Anatomisi: Nelere Dikkat Edilmeli?
Araştırma yapabilmek için sorgulara dalmadan önce, saldırganların bir posta kutusuna erişim sağladıktan sonraki tipik davranışlarını anlamak kritik önem taşır. Genellikle kimlik avı, kimlik bilgisi doldurma veya parola püskürtme saldırıları gibi taktiklerle başlar ve bir kullanıcının hesabına yetkisiz erişime olanak tanır. Ancak erişim sağlamak, daha geniş bir saldırı zincirinin yalnızca ilk adımıdır. Tehdit aktörleri genellikle posta kutusu içeriğini incelemek, veri toplamak, hassas iletileri yeniden yönlendirmek veya gizlemek için gelen kutusu kuralları oluşturmak ve çoğu durumda tespit edilmekten kaçınmak için kanıtları silmek gibi belirli bir akışı izler. Bu eylemler nadiren rastgeledir; dikkatlice incelendiğinde ihlalin hikayesini anlatabilecek bir dizi tanımlanabilir iz bırakırlar. Microsoft Graph Etkinlik Günlüğü işte bu noktada vazgeçilmez hale gelir. Bu günlükleri analiz ederek, saldırganın dijital ayak izlerini ortaya çıkarabilir, faaliyetlerini bir araya getirebilir ve bir tehlike zaman çizelgesi oluşturmaya başlayabiliriz. Bu anlayış, KQL kullanarak odaklanmış ve etkili bir soruşturma için zemin hazırlar.
Saldırıların temel göstergeleri (STG) şunları içerir:
- Anormal Erişim Modelleri: Bilinmeyen IP adreslerinden, ülkelerden veya Kullanıcı Aracılarından gelen oturum açmalar ve API çağrıları. Bir uygulamanın daha önce hiç erişmediği bir posta kutusuna aniden erişmesi büyük bir tehlike işaretidir.
- Yüksek Hacimli Etkinlik: Okunan, indirilen veya senkronize edilen e-posta sayısında ani bir artış. Bu durum genellikle posta kutusunun tüm içeriğini dışarı aktarma girişimini gösterir.
- Kötü Amaçlı Gelen Kutusu Kurallarının Oluşturulması: Saldırganlar, hassas e-postaları otomatik olarak harici bir adrese iletmek veya kullanıcıyı veya güvenlik ekiplerini uyarabilecek mesajları silmek için sıklıkla kurallar oluşturur.
- Şüpheli İzin Verme: Bir uygulamaya normal değişiklik penceresinin dışında Mail.ReadWrite.All veya Mail.ReadBasic.All gibi yüksek ayrıcalıklı devredilmiş veya uygulama izinleri verilmesi .
- Olağandışı Silme Etkinliği: Saldırganın izlerini örtmek için, özellikle ‘Gönderilmiş Öğeler’ veya ‘Silinen Öğeler’ klasörlerinden çok sayıda e-posta siliyor olması.
Temel KQL Sorguları
Aşağıdaki KQL sorguları, bir kullanıcının posta kutusuyla ilgili şüpheli etkinlikleri tespit etmek için tasarlanmıştır.
Belirli Bir Kullanıcı İçin Genel Etkinlik Denetimi
Bir kullanıcının son etkinliklerinin zaman çizelgesini oluşturmak, her türlü araştırmanın başlangıç noktasıdır. Belirli bir kullanıcıyla ilişkili Microsoft Graph API isteklerini inceleyerek, bilinmeyen uygulamalardan erişim, alışılmadık IP adresleri veya kullanıcının genellikle kullanmadığı cihazlar gibi anormallikleri tespit etmek mümkündür. Bu, etkinliğin beklenen davranışla uyumlu olup olmadığına veya yetkisiz erişime işaret edip etmediğine dair bağlamsal bir anlayış oluşturmaya yardımcı olur.
Aşağıdaki KQL sorgusu, son 24 saat içinde belirli bir kullanıcı adına yapılan tüm Graph API isteklerini alır. <UserPrincipalName> ifadesini gerçek kullanıcının e-posta adresi veya kimliğiyle değiştirmeniz gerekmektedir.
MicrosoftGraphActivityLogs
| where TimeGenerated > ago(1d)
| where UserId == "<UserPrincipalName>"
| project TimeGenerated, AppId, IPAddress, UserAgent, RequestMethod, RequestUri
| sort by TimeGenerated desc
Bu çıktıyı incelemek, şüpheli kullanım modellerini tespit etmeyi ve hangi uygulamaların veya IP’lerin kullanıcının posta kutusuyla etkileşim kurduğunu görmeyi kolaylaştırır.
Kötü Amaçlı Gelen Kutusu Kuralı Oluşturulmasını Algılama
Saldırganlar, kullanıcının haberi olmadan e-postaları sessizce yönlendirmek veya engellemek için sıklıkla yönlendirme veya silme kuralları oluşturur. Bu gelen kutusu kuralları, Graph API aracılığıyla ayarlanabilir ve genellikle veri sızdırmak veya güvenlik araçlarından ve son kullanıcılardan uyarı mesajlarını gizlemek için kullanılır. Bu tür kural oluşturma olaylarını, özellikle de bilinmeyen IP adreslerinden veya gizli kötü amaçlı eylemleri ortaya çıkarabilecek uygulamalardan tespit etmek önemlidir.
Aşağıdaki KQL sorgusu, son 30 gün içinde POST istekleri yoluyla gelen kutusu kuralları oluşturma girişimlerini tespit etmeye yarar.
MicrosoftGraphActivityLogs
| where TimeGenerated > ago(30d)
| where RequestUri has "mailFolders/inbox/rules" and RequestMethod == "POST"
| project TimeGenerated, AppId, UserId, IPAddress
Bu sorgu, yetkisiz yönlendirme mekanizmalarının tespit edilmesini sağlayarak analistlerin posta kutusuna şüpheli kuralların uygulanıp uygulanmadığını teyit etmelerine olanak tanır.
Yüksek Hacimli Posta Senkronizasyonunu Belirleme
Saldırganlar bir posta kutusuna erişim sağladıklarında, temel amaçlarından biri mümkün olduğunca fazla veriyi dışarı aktarmaktır. Bu genellikle mesaj okuma veya senkronizasyon isteklerinde ani artışa neden olur. Bu etkinliklerin izlenmesi, özellikle hacimler normal kullanıcı davranışının çok ötesinde olduğunda, bir uygulamanın posta kutusu verilerini büyük ölçekte toplamak için kullanıldığı durumların belirlenmesine yardımcı olur.
Aşağıdaki KQL sorgusu, mesaj okuma veya senkronizasyon etkinliğiyle ilgili yüksek yoğunluklu erişim işlemlerini özetlemektedir:
MicrosoftGraphActivityLogs
| where TimeGenerated > ago(7d)
| where RequestUri has "/messages" or RequestUri has "Sync"
| project TimeGenerated, AppId, UserId, IPAddress
| summarize RequestCount = count() by AppId, UserId, IPAddress, bin(TimeGenerated, 1h)
| where RequestCount > 500
| order by RequestCount desc
Bu toplu görünüm, anormal artışları vurgulayarak araştırmacıların olası toplu veri indirmelerine odaklanmalarına ve potansiyel olarak kötü amaçlı otomasyon araçlarını belirlemelerine yardımcı olur.
Şüpheli Silme İşlemlerinin Araştırılması
Tehdit aktörlerinin yaygın bir güvenlik ihlali sonrası taktiği, izlerini gizlemek için özellikle “Gönderilmiş Öğeler” veya “Gelen Kutusu” gibi klasörlerdeki e-posta kanıtlarını silmektir. Güvenlik ekipleri, aramayı bilinen şüpheli bir IP adresinden belirli bir kullanıcı tarafından yapılan SİLME istekleriyle sınırlandırarak, hassas e-postaların kasıtlı olarak silinip silinmediğini tespit edebilir. Aşağıdaki sorgudaki ” [email protected]” ve ” 123.45.67.89 ” yer tutucularını, araştırmak istediğiniz gerçek kullanıcı kimliği ve IP adresiyle değiştirin.
Aşağıdaki KQL sorgusu, son 7 gün içinde kullanıcı ve IP’ye göre filtrelenmiş mesaj nesneleriyle ilişkili silme işlemlerini belirler:
MicrosoftGraphActivityLogs
| where TimeGenerated > ago(7d)
| where UserId == "[email protected]" and IPAddress == "123.45.67.89"
| where RequestMethod == "DELETE" and RequestUri has "/messages/"
| project TimeGenerated, AppId, RequestUri
Bu yaklaşım, silme olaylarının kesin olarak doğrulanmasını sağlar ve bunların kullanıcı tarafından bildirilen zaman dilimi ve kaynakla ilişkilendirilmesine yardımcı olur.
Bu yaklaşım, silme olaylarının kesin olarak doğrulanmasını sağlar ve bunların kullanıcı tarafından bildirilen zaman dilimi ve kaynakla ilişkilendirilmesine yardımcı olur.
Soruşturmayı PowerShell ile Yürütme
KQL, Azure portalındaki verileri sorgulamak için güçlü ve esnek olsa da, incelemelerin genellikle tekrar tekrar yürütülmesi, diğer ekiplerle paylaşılması veya hatta daha geniş bir olay müdahale iş akışının parçası olarak otomatikleştirilmesi gerekir. Portal üzerinden sorguları manuel olarak çalıştırmak, özellikle birden fazla kullanıcı, IP adresi veya zaman dilimi incelenirken zaman alıcı olabilir.
PowerShell, Graph Activity Log ve KQL’nin vazgeçilmez bir tamamlayıcısı haline geliyor. Azure PowerShell kurulup yapılandırıldığında , güvenlik ekipleri KQL sorgularını betiklere yerleştirerek şunları yapabilir:
- Soruşturmaları standartlaştırın: Kritik ihlal göstergelerini sorgulamak için tekrarlanabilir ve tutarlı bir yöntem sağlayın.
- Otomatikleştirilmiş süreçler: Log Analytics’e bağlantıyı kolaylaştırarak, sorguları yürüterek ve sonuçları dışa aktararak zamandan tasarruf edin.
- Daha geniş erişime izin verin: KQL uzmanı olmayanların kullanıcı adı veya IP adresi gibi parametreleri girerek soruşturma yürütmesine izin verin.
- İş akışlarıyla bütünleştirin: Uyarı yanıtları, rapor oluşturma veya bilet sistemlerine bağlanarak uçtan uca olay yönetimini destekleyin.
Aşağıdaki PowerShell betiği, daha önce ele alınan dört ana araştırma sorgusunu yürütmek için kullanıcı dostu ve etkileşimli bir yol sunar. Kullanıcıdan hangi etkinlik türünü araştıracağını seçmesini ister, ilgili KQL sorgusunu dinamik olarak oluşturur, belirlenen Log Analytics çalışma alanında yürütür ve isteğe bağlı olarak sonuçları daha derinlemesine çevrimdışı analiz veya raporlama için bir CSV dosyasına aktarır.
Bu, analiz ile eylem arasındaki boşluğu kapatır ve savunucuların olaylara hızlı, tutarlı ve gerekli tüm kanıtlara sahip olarak yanıt verebilmelerini sağlar.
Bunun için şu betik dosyasını çalıştırmanız yeterli olacaktır.
Connect-AzAccount
# Define Workspace ID and output file path
$workspaceId = "<replace_this_with_your_work_place_id>"
$csvFilePath = ".\graph_activity_result.csv"
# Prompt for user input
Write-Host "`nSelect the query to run:"
Write-Host "1. User-specific activity in last 1 day"
Write-Host "2. Inbox rules creation (last 30 days)"
Write-Host "3. High-volume message/sync activity (all time)"
Write-Host "4. Message deletion from specific IP/user (last 7 days)"
$selection = Read-Host "Enter the query number (1-4)"
# Prompt for dynamic inputs if needed
switch ($selection) {
'1' {
$userId = Read-Host "Enter UserPrincipalName (e.g., [email protected])"
$query = @"
MicrosoftGraphActivityLogs
| where TimeGenerated > ago(1d)
| where UserId == '$userId'
| project TimeGenerated, AppId, IPAddress, UserAgent, RequestMethod, RequestUri
| sort by TimeGenerated desc
"@
}
'2' {
$query = @"
MicrosoftGraphActivityLogs
| where TimeGenerated > ago(30d)
| where RequestUri has "mailFolders/inbox/rules" and RequestMethod == "POST"
| project TimeGenerated, AppId, UserId, IPAddress
"@
}
'3' {
$query = @"
MicrosoftGraphActivityLogs
| where TimeGenerated > ago(7d)
| where RequestUri has "/messages" or RequestUri has "Sync"
| project TimeGenerated, AppId, UserId, IPAddress
| summarize RequestCount = count() by AppId, UserId, IPAddress, bin(TimeGenerated, 1h)
| where RequestCount > 500
| order by RequestCount desc
"@
}
'4' {
$userId = Read-Host "Enter UserPrincipalName (e.g., [email protected])"
$ip = Read-Host "Enter IP Address (e.g., 123.45.67.89)"
$query = @"
MicrosoftGraphActivityLogs
| where TimeGenerated > ago(7d)
| where UserId == '$userId' and IPAddress == '$ip'
| where RequestMethod == "DELETE" and RequestUri has "/messages/"
| project TimeGenerated, AppId, RequestUri
"@
}
default {
Write-Error "Invalid selection. Please run the script again and choose between 1–4."
exit
}
}
Write-Host "`nRunning selected Graph API activity query..."
try {
$result = Invoke-AzOperationalInsightsQuery -WorkspaceId $workspaceId -Query $query -ErrorAction Stop
if ($result.Results) {
Write-Host "`nQuery successful. Displaying results:"
$result.Results | Format-Table -AutoSize
Write-Host "`nSaving results to $csvFilePath"
$result.Results | Export-Csv -Path $csvFilePath -NoTypeInformation -Encoding UTF8
} else {
Write-Host "Query ran successfully but returned no results."
}
} catch {
Write-Error "Query failed: $($_.Exception.Message)"
}
Write-Host "`nInvestigation complete."
Bu betik, Microsoft Graph Etkinlik Günlüklerini sorgulamak için gereken bağlantıyı kurmak üzere yer tutucu $workspaceId değerini gerçek Log Analytics Çalışma Alanı Kimliği ile değiştirir. Microsoft Graph Etkinlik Günlüğü, ham API isteklerini net bir denetim izine dönüştürerek temel bir görünürlük katmanı sağlar. Güvenlik ekipleri, hedefli KQL sorguları kullanarak reaktif uyarıların ötesine geçebilir ve bir posta kutusu güvenliğinin ihlalinin ince göstergelerini proaktif olarak inceleyebilir. Bu özellik, bir olayın kapsamını anlamak ve hızlı, kanıta dayalı bir müdahale sağlamak için temel önem taşır.
Posta kutusu ihlalleri için soruşturma tekniklerinin uygulamaya konmasıyla birlikte, odak noktası bir diğer önemli veri sızdırma vektörü olan belge erişimine kayıyor. Bu serinin bir sonraki makalesi olan “Grafik Etkinlik Günlüğü ile Belge Sızdırmasının İncelenmesi”, aynı ilkelerin SharePoint Online ve OneDrive genelinde şüpheli dosya erişimini, indirme davranışını ve paylaşım etkinliğini tespit etmek için nasıl uygulanabileceğini açıklayacaktır.
Okuduğunuz için teşekkürler.
Saygılarımla.
Bu konuyla ilgili forum tartışmaları
- Sürekli Outlook Veri Dosyasının Bozulması Hk.
- Exchange hesaplarına girişlerde sorun yaşayanlar varmı acaba ?
- Microsoft Entra Hybrid Join ve Intune Auto Enrollment Yapılandırması Hakkında Destek Talebi
- Office 365 Outlook
- Exchange Online'da Gruplara Atılan maillerin gönderene gelmemesi
- 365 Fatura işlemleri hakkında










Eline sağlık.