Tatilimi WSC tersine mühendisliğiyle nasıl mahvettim
(blog.es3n1n.eu)- Seul seyahati sırasında yapılan defendnot, Windows Security Center (WSC) servis API’sini doğrudan çağırarak Windows Defender’ı devre dışı bırakmayı amaçlayan bir araçtı ve bu çalışma birkaç günlük bir tersine mühendislik sürecine dönüştü
- Önceki araç no-defender, mevcut antivirüs kodunu kullanarak WSC’ye başka bir antivirüs varmış gibi kayıt yaptırıyordu; yaklaşık 1.5k GitHub yıldızına ulaştıktan sonra bir antivirüs üreticisinin DMCA talebiyle kaldırıldı
- İlk etapta WSC’nin COM API çağrıları yaklaşık 1 saat içinde yeniden üretildi, ancak WSC çağrıyı yapan süreci doğruladığı için normal süreçlerde erişim reddedildi
- Analiz sonucunda WSC’nin WinDefend SID, yönetici yetkisi, imza ve PE içindeki
DllCharacteristicsalanında yer alanForceIntegritybayrağını kontrol ettiği görüldü; nihai uygulamadaTaskmgr.exekullanıldı - arm64 MacBook, ABD’deki uzak PC, Parsec’te 210 ms gecikme ve Shadow.tech VM’in iç içe geçtiği bir ortamda
ctx.binyol hatası ile autorun güç koşulu sorunları düzeltilerek uygulama tamamlandı
defendnot’u yapmaya götüren arka plan
- defendnot, Windows Security Center servis API’sini doğrudan kullanarak Windows Defender’ı devre dışı bırakan bir araçtır
- Uygulama sürecinin asıl zorluğu WSC çağrısının kendisinden çok, bunu engelleyen doğrulama koşullarını ve elverişsiz çalışma ortamını tek tek aşmaktı
- WSC hakkında daha ayrıntılı teknik dokümantasyon daha sonra başka biri tarafından yayımlanacak
1 yıl önceki no-defender ve DMCA
- Yaklaşık 1 yıl önce yayımlanan no-defender, Windows Defender’ı kapatmak için antivirüslere yönelik Windows API’sini kullanıyordu
- Bu API, sisteme “başka bir antivirüs var, bu yüzden Defender taraması çalıştırmaya gerek yok” bilgisini vermek için tasarlanmıştı
- Bu alanı yöneten sistem bileşeni Windows Security Center (WSC) idi
- no-defender, mevcut bir antivirüsün üçüncü taraf kodunu kullanarak o antivirüsün WSC’ye kaydolmasını zorlayacak şekilde çalışıyordu
- Yayımlandıktan sonraki birkaç hafta içinde yaklaşık 1.5k stars aldı; kullanılan antivirüs geliştiricisi bir DMCA takedown talebi gönderince depo içeriği silinip konu kapatıldı
Seul seyahati sırasında yeniden başlayan WSC analizi
- Seul’de bir Airbnb’de kalırken MrBruh, no-defender’a baktığını ve antivirüs ikilileri olmadan “temiz” bir uygulamanın mümkün olup olmadığını araştırdığını mesajla iletti
- Normalde CTF ya da x86 reverse mühendislik işleri için ayrı bir x86 dizüstü bilgisayar taşınsa da bu seyahatte yalnızca M4Pro MacBook vardı
- x86 reverse mühendislik için uygun donanım olmamasına rağmen, arkadaşlar uyanmadan önceki zaman kullanılarak WSC analizi başlatıldı
Day 1: WSC COM API’nin yeniden üretilmesi ve ilk erişim reddi
- MrBruh en güncel WSC ikililerini sağladı ve daha önce kullanılan antivirüsün WSC kayıt uygulaması referans olarak alındı
- WSC’de antivirüslerin kullandığı bir COM API vardı ve mevcut antivirüsün yaptığı çağrılar yaklaşık 1 saat içinde yeniden üretildi
- Test için Parallels üzerinde arm64 Windows başlatıldı, ancak sonuç access denied oldu
- Önceki deneyimlerden WSC’nin API çağrısı yapan süreci doğruladığı biliniyordu ve ilk şüphe imza doğrulaması yönündeydi
- Mevcut antivirüsün WSC işlemleri için kullandığı sürece kod enjekte edildiğinde, yeni antivirüs kaydı ve durum güncelleme COM çağrıları düzgün çalıştı
Antivirüs ikililerinden kurtulma girişimi
- Yeni projenin önceki antivirüs satıcısının itirazlarıyla yeniden karşılaşmaması için, antivirüs ikilileri yerine sistem tarafından sağlanan ikililerin kullanılması hedeflendi
- İlk hedef süreç olarak
cmd.exeseçildi, ancak WSC API çağrısı reddedildi wscsvc.dllincelendiğinde, çağrıyı yapan sürecin PPL olup olmadığını denetleyen kod görüldü- Basit bir
CreateProcessAile başlatılan süreç PPL korumalı süreç değildi ve o gece daha fazla ilerlenemedi
Day 2: Kullanışsız uzak hata ayıklama ortamının kurulması
- arm64 MacBook üzerinde x86 Windows ile düzgün çalışmak zordu; arm64 ortamında ilerlemek ya da x64dbg kullanamamak istenmiyordu
- Arkadaş pindos PC erişimi açtı ve Parsec ile uzaktan bağlanıldı
- Kore’den ABD’deki bir PC’ye bağlanıldığı için ortalama gecikme yaklaşık 210ms idi
- O sıradaki çalışma akışı son derece hantaldı
- Parallels içindeki Windows arm64 ortamında MSVC ile modül derleme
- Derleme çıktılarının paylaşımlı klasör üzerinden ana sistemle paylaşılması
- AnyDesk ile çıktıları pindos’un PC’sindeki VM’e kopyalama
- Parsec’te 210 ms gecikmeyle WSC servisini hata ayıklama
- Ortam o kadar elverişsizdi ki geliştirme ve analiz hızı ciddi biçimde düştü
WSC servisini hata ayıklama ve WinDefend SID
- WSC servisi,
svchosttarafından çalıştırılan bir DLL’di ve hata ayıklayıcı bağlanmasını engelleyen temel unsur PPL korumasıydı - VM’de test modu açıldı ve çekirdek modunda birkaç satırlık kodla hedef sürecin PPL’ini kaldıran bir sürücü kullanıldı
cmd.exe, WSC’ye antivirüs kaydı talebi gönderdiğinde başarısız olan noktaWscServiceUtils::CreateExternalBaseFromCalleridi- Bu fonksiyon, RPC istemcisini taklit ettikten sonra çağrıyı yapan sürecin token’ında
WinDefendSID bulunup bulunmadığını kontrol ediyordu - O sırada Windows token davranışı iyi bilinmediğinden,
WinDefendkimliğine bürünmenin bu kontrolü geçmeye yeteceği düşünüldü - Uykusuzluk halinde, mevcut antivirüs ikilisinin de bu
IsMemberkontrolünü geçtiği yanlış yorumlandı
WinDefend kimliğine bürünme denemesi ve başarısızlık
- Windows token’ları birkaç saat incelendikten sonra, içinde WinDefend SID bulunan bir token ile çalıştırmanın WSC kontrolünü geçirebileceği yönünde bir uygulama yapıldı
cmdsürecineWinDefendSID eklenmiş halde kod çalıştırıldı, ancak COM çağrısıSTATUS_SUCCESSdöndürse de gerçekte yeni antivirüs kaydı oluşmadı- Sonuç olarak bu yaklaşım işe yaramadı ve ertesi gün yeniden doğrulanması gerekti
Day 3: Gerçek doğrulama algoritmasının yeniden kurulması
- Tekrar kontrol edildiğinde, mevcut antivirüs ikilisi WinDefend SID kontrolünü geçmiyordu
- Bu kontrol geçilse bile Windows Defender’ın WSC nesnesiyle çalışılıyor, ancak yalnızca WSC çağrılarıyla Defender doğrudan devre dışı bırakılamıyordu; bu yüzden yararsızdı
- WinDefend kimliğine bürünme kodu kaldırıldı ve koşul ifadesinin diğer dalı analiz edildi
- Bu dalda çağrıyı yapan ikili için şunlar kontrol ediliyordu
- Sürecin elevated olup olmadığı
- İkili imzasının geçerli olup olmadığı
- PE içindeki
DllCharacteristicsalanında belirli bir bayrağın bulunup bulunmadığı
CSecurityVerificationManager::CreateExternalBaseFromPESettingsiçinde kontrol edilenDllCharacteristicsbayrağı ForceIntegrity idi- WSC’nin yaptığı ikili doğrulamasını yeniden üreten kod, defendnot deposundaki
wsc-binary-checkklasöründe oluşturuldu ve System32 ikilileri üzerinde test edildi
Taskmgr.exe kullanımı ve ctx.bin hatası
- Arkadaşın PC’yi yeniden kullanması gerektiği için doğrudan VM’e Parsec ile bağlanıldı, ancak yazılımsal kodlama da devreye girince ortam daha da yavaşladı
cmd.exeyerineTaskmgr.exekullanıldı, fakat yine RPC hatası alındı- Gecikme ve giriş sorunları nedeniyle aynı VM’de hata ayıklama zorlaştı; öneri üzerine shadow.tech aboneliği için $30 ödendi
- Shadow.tech VM’inde Windows sürümü daha eskiydi; bu nedenle
wscsvckodu güncel sürümdeki kadar tek bir fonksiyona yoğun biçimde inline edilmemişti ve decompile çıktısı daha okunurdu - Asıl hata nedeni, WSC’ye iletilen AV adının yanlış olmasıydı
defendnot-loaderiledefendnot.dllarasında veri aktarmak için serileştirilmiş parametreleri içerenctx.binkullanılıyordu- Durum takibi için ayrı bir IPC uygulanmış olsa da yapılandırma aktarımında eski no-defender kodundan kalan
ctx.binyöntemi sürüyordu ctx.binyolunu bulan fonksiyon,nodefend.dllyerineTaskmgr.exemodülünün temel klasörünü esas alıyordu- Sonuç olarak AV adı olarak null byte gönderiliyor ve WSC bu buffer’ı reddediyordu
- Yol sorunu düzeltildikten sonra test başarıyla geçti
Kodun toparlanması ve autorun sorunu
- Aynı gün bitirmek için sabah 8’e kadar kod toparlandı ve ek özellikler geliştirildi
- Ek özellikler arasında kendini autorun listesine ekleme işlevi de vardı
- Sabah 8 itibarıyla yalnızca autorun düzgün çalışmıyordu; çeşitli yöntemler denendikten sonra başarısız olunup uyundu
- Ertesi gün tekrar bakıldığında, görev zamanlayıcı görevi oluşturulurken güçle ilgili iki onay kutusunun sorun çıkardığı görüldü
- Dizüstü bilgisayar AC güce bağlı olmadığı için görev çalışmıyordu; bu bayraklar kapatılınca autorun çalıştı
- Ardından birkaç saat daha kod düzenlendi ve iş tamamlandı
Kapanış
- Çalışmanın kendisi eğlenceliydi, ancak birkaç gün boyunca tekrarlanan ortam sorunları ve uzaktan hata ayıklama akışı tekrar yaşamak istenmeyecek bir deneyimdi
- Özellikle arm64 MacBook, uzak x86 VM, yüksek gecikme, yavaş kodlama ve sonradan ortaya çıkan dosya yolu hatası uygulamanın zorluk seviyesini ciddi biçimde artırdı
- WSC ile ilgili daha teknik bir doküman daha sonra ayrıca yayımlanacak
1 yorum
Hacker News yorumları
Defender’ı kapatmanın en müdahaleci ama etkili yollarından biri, canlı Linux USB ile önyükleme yapıp
C:\ProgramData\Microsoft\Windows Defenderklasörünün adını değiştirmek, ardından yerine boş bir dosya oluşturmaktıBu arada WSC, Windows Security Center’ın kısaltmasıdır
the antivirus I was usingifadesi yüzünden epey kafam karıştı. O antivirüs şirketinin yazara neden DMCA kaldırma talebi göndermek için bir gerekçesi olduğunu anlayamadımMuhtemelen yazarın başka bir antivirüsü tersine mühendislik edip bunun bir kısmını açık kaynak projeye koyduğu anlamına geliyor. Ama
Impersonating WinDefendgibi bir başlık da görünüyor; sonuçta yazarın bir şekilde telif hakkı yasasını ihlal edip etmediğini merak ediyorumAlıntılanan paragrafın hemen öncesinde, “proje zaten var olan bir antivirüsün üçüncü taraf kodunu kullandı ve o antivirüsün WSC’ye antivirüs olarak kaydedilmesini zorladı” açıklaması var
Bu kod lanetli gibi duruyor:
https://github.com/es3n1n/defendnot/blob/master/defendnot-lo...
Gerçekte ne olduğunu merak ediyorsanız burası:
https://github.com/es3n1n/defendnot/blob/master/cxx-shared/s...
Örneğin D dilinde kapsamın sonunda çalışan statement kavramı dile yerleşik olarak bulunuyor
Özetle, yapay zeka tarafından yazılmış değil. Bu kod, nesne kapsam dışına çıkana kadar fonksiyon çağrısını erteliyor. Uygulama, C makrolarıyla gerekli C lambda/anonim fonksiyon tanımının bir kısmını atlayan daha kısa bir sözdizimi oluşturuyor ve ertelenmiş çağrıyı yönetecek benzersiz bir değişken adı üretiyor
Ancak ortaya çıkan sözdizimi, C makrolarını belirtmek için yaygın gelenek olan büyük harf kullanımından kaçınıyor ve ilk bakışta nesne işaretçisi üzerinden fonksiyon çağrısı gibi görünüyor. Bu desene aşina değilseniz veya makroların farklı görünmesini bekliyorsanız kafa karıştırıcı olabilir
Bazıları için yeterince yaygın ve kullanışlı olduğundan belirli bağlamlarda neredeyse deyimleşmiş bir kullanım sayılabilir. Teknik açıklama için https://news.ycombinator.com/item?id=43959403#43960905 makronun nasıl çalıştığını iyi açıklıyor
Tatilde Windows’un sanal masaüstlerini tersine mühendislik yaptım ve tatilim çok daha iyi hâle geldi. Geçen yılın en iyi anısı, tersine mühendisliğin gerçekten eğlenceli olduğunu fark etmekti
Bir sürü ilginç şey de öğrendim; Windows’un RPC’sinin altında belgelenmemiş bir mesajlaşma katmanı var: https://csandker.io/2022/05/24/Offensive-Windows-IPC-3-ALPC....
Profil fotoğrafı anime karakteriyse yazının iyi olacağını her seferinde anlıyorum. İleride berbat bir Windows ortamına geri dönmek zorunda kalırsam diye kaydettim
Merak edenler için: WSC, Windows Security Center’ın kısaltmasıdır. Benim de bakmam gerekti
Neden WSC’yi kapatmak istesinler ki?
Bir EDR tedarikçisiyseniz bu, Windows Firewall’u bastırmak veya devre dışı bırakmak için kullanılabilecek gizlenmiş bir API çağrısıdır. Örneğin CrowdStrike’ın hem Windows Firewall’u kullanabildiğini hem de kendi uygulamasını kullanabildiğini varsayıyorum
netcat.exeolmaz diye dadı gibi karışmasını umursamak istemiyorumYakın zamanda https://nostarch.com/windows-security-internals okudum; bu yazı sayesinde çok daha iyi oturdu
Windows’ta bu arka plandaki işlerin kabaca nasıl döndüğünü biraz biliyordum, ama zamanlaması iyi oldu. O kitabın son bölümü de bu yazının yazarının ele aldığı gibi token’lar ve SID’ler konusuna oldukça ayrıntılı giriyor