***Herhangi bir atak yaşanmıyor ise bu sorunu aşağıdaki durumlar tetikleyebiliyor;
1- Eski (Stale) Eşleşmeler: Artık kullanılmayan ancak Exchange üzerinde kaydı kalan cihazlar.
2- Hayalet Trafik: Exchange eşleşmesi silinmiş olsa bile sunucuya sürekli istek gönderen cihazlar.
Exchange üzerinde kaydı var ise “Get-MobileDevice/Get-MobileDeviceStatistics” ile belirleyerek “Remove-MobileDevice” ile cihazı kaldırabiliyoruz.
Ancak “Hayalet Trafik” yaratan cihazlar sistem üzerinde görünmediği için bu yapılamıyor.
Hayalet Trafik aşağıdaki görseldeki şekilde Security:4768 Event oluşturup, hesap disabled olduğu için Status 0x12 kaydı basıyor.


Log içerisinde de ip adresi, Exchange sunucu(larını) gösteriyor.
User’ ın bu iletişimini kesmek için “Logon To” kısımına var olmayan bir computer yazmak yeterli olmuyor, çünkü bir Kerberos TGT isteği geldiğinde, DC önce “Hesap Aktif mi?” diye bakıyor. Eğer hesap Disabled ise, 0x12 hatasını basıp işlemi sonlandırıyor. “Logon To” kısıtlaması, bu aşamadan sonra kontrol edildiği için, sistem o kurala gelmeden hatayı zaten event’ a yazmış oluyor.
Bundan sonraki adımda device tespit edebilmek için Exchange loglarda Default_Path :(C:\inetpub\logs\LogFiles\W3SVC1) ilgili zaman aralığında Event içerisindeki kullanıcı adını aratıyoruz ve aşağıdaki içerik görülüyor.

“cs-uri-stem” karşılığında ActiveSync olduğu görülüyor, hesap kapalı olduğu için de ActiveSync bağlantısı reddediliyor (sc-status 401 alıyor) ancak cihaz sürekli denediği için Exchange sunucusuna, o da Domain Controller’a istek gönderiyor.
Oluşan logları ve requestleri kesmenin yolu, isteği Exchange (IIS) seviyesinde durdurmak oluyor, böylece istek DC’ de hiç oluşmuyor.
Buna bağlı olarak durum “ActiveSync” özelinde olduğundan Virtual Directory özelinde URL Rewrite ile “Connection Abort” kuralı yazılması gerekiyor.
Ancak sıralamaya göre authentication denemesi, önce “Default Web Site” uğrayıp gerçekleştiği için kural “Default Web Site” üzerine yazıyorum.


***Not: “URL Rewrite Module” yüklü.
Pattern alanında ^Microsoft-Server-ActiveSync.* yazmamın sebebi;
(Tepeden “Default Web Site” a yazıldığı için)
“^” sadece Active Sync isteklerine bakması için (Performans açısından),
“.*” Gelen tüm, Active Sync isteklerine bakması için

Conditions kısmında “Add” ile “Condition” girişi yapıyoruz.
Pattern:
DeviceId=(ID1|ID2|ID3)
IIS bu düzeni gördüğünde “ID1 veya ID2 veya ID3” olarak algılıyor.
Action: AbortRequest: Eşleşme olursa, IIS cevap vermiyor, TCP bağlantısını (Socket) kapatıyor.

Test Pattern: Örnek içinde girilmiş ID olan bir satırı log dosyasından kopyalayarak test edebiliyoruz.

· Sonuç: IIS, bir istek geldiğinde önce Site seviyesindeki Rewrite kurallarına bakıyor. Burada eşleşme olursa (DeviceId yakalanırsa) ve Abort ederse, IIS isteği ActiveSync uygulamasına hiç teslim etmiyor.
Bağlantı, Authentication modülüne hiç ulaşamadığı için Domain Controller’a gitmiyor ve Log oluşmuyor.
Bu kadar şey ile uğraşmayayım bir ps olsun onu koşturayım işlem yapılsın dersenizde
Kod aşağıdaki gibidir;
# İşlem Yapılacak Exchange Sunucu Listesi
$ServerList = @("Exchange01", " Exchange02", " Exchange03", " Exchange04")
# Engellenecek Cihazların ID Listesi
$DeviceList = @(
"OPCC2E5B1E0C91C3F8E1C11111111111", #deneme --> "#" ID' nin User karşılığı
"OPCC25E863D96E51932DC32222222222" #test --> "#" ID' nin User karşılığı
)
Write-Host "İşlem Başlatılıyor" -ForegroundColor Cyan
Invoke-Command -ComputerName $ServerList -ScriptBlock {
$LocalList = $using:DeviceList
Import-Module WebAdministration
$Hostname = $env:COMPUTERNAME
$RuleName = "Block_Ghost_ActiveSync_Devices_Global"
$IISPath = "IIS:\Sites\Default Web Site"
# Regex Oluşturuluyor
$CleanList = $LocalList | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }
$RegexPattern = "DeviceId=(" + ($CleanList -join "|") + ")"
Write-Host "[$Hostname] İşlem başlıyor..." -ForegroundColor Yellow
# KURAL OLUŞTURMA
try {
Add-WebConfigurationProperty -PSPath $IISPath `
-Filter "system.webServer/rewrite/rules" `
-Name "." `
-Value @{
name = $RuleName
patternSyntax = "Regular Expressions"
stopProcessing = "true"
} -ErrorAction Stop
Write-Host "[$Hostname] Yeni kural oluşturuldu." -ForegroundColor Green
}
catch {
# Eğer kural zaten var ise, bunu görmezden gel ve devam et.
if ($_.Exception.Message -match "duplicate" -or $_.Exception.Message -match "Cannot add") {
Write-Host "[$Hostname] Kural zaten mevcut, içeriği güncelleniyor..." -ForegroundColor Gray
}
else {
# Başka bir hata ise (Yetki vb.) bildir.
Write-Host "[$Hostname] OLUŞTURMA HATASI: $_" -ForegroundColor Red
}
}
# İÇERİK GÜNCELLEME
# Kural ister yeni olsun ister eski, özelliklerini ezip yaz.
try {
# Match URL Ayarı
Set-WebConfigurationProperty -PSPath $IISPath `
-Filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/match" `
-Name "url" -Value "^Microsoft-Server-ActiveSync.*"
# Action (Abort) Ayarı
Set-WebConfigurationProperty -PSPath $IISPath `
-Filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/action" `
-Name "type" -Value "AbortRequest"
# Conditions (Cihaz Listesi) Ayarı
# Önce eski şartları temizle, sonra yenisini ekle.
Clear-WebConfiguration -PSPath $IISPath -Filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/conditions" -ErrorAction SilentlyContinue
Add-WebConfigurationProperty -PSPath $IISPath `
-Filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/conditions" `
-Name "." `
-Value @{
input = "{QUERY_STRING}"
pattern = $RegexPattern
ignoreCase = "true"
}
Write-Host "[$Hostname] BAŞARILI: Cihaz listesi ve kural güncellendi." -ForegroundColor Green
} catch {
Write-Host "[$Hostname] GÜNCELLEME HATASI: $_" -ForegroundColor Red
}
}