Üstad crypter artık çok da aşırı işe yaramaz. Bildiğim kadarı ile ESET ile Avast artık memory snapshot alıyor düzenli, yani senin program hafızada decrypt edildikten sonra gene yakalanır. Diğer virüs tarama programları da aynı akımı izleyecektir. Windows defender da aynı haltı yaptığı anda kurban sayınız sıfıra inecektir.
Senelerdir dediğim gibi, trojan yedirmek istiyorsan üşenmeyip, tek bir satırı bile copy paste etmeden kendin yazarsın. Benim 7-8 sene önce zevk için yazdığım trojan, sadece payload'u scan ettirdiğimde bile hala 0 çekiyor. Vakit alır mı? Alır. Ama en mantıklı yol budur.
@zztri Sen, ben zararlı yazılım yapabiliyoruz ama her pattern matching yapmak için imza ürettiklerinde cidden yeni bir zararlı yapmak istiyor mu bu insanlar? Bir zararlı yazılım yapabilecek kadar yetkinler mi? Bunlar için zamanları var mı? Var olan bir zararlı yazılımı kullanmak kadar tembel oldu insanlar yeni çağda. Post-exploitation araçlarını harekete geçirmek istiyorlar bir noktada. Örneğin mimikatz var, bir şirketin Active Directory'sine saldırrmak için kullanılan birincil araçlardan biri. lsass.exe'yi dump ettikten sonra ağdaki domain'lere yanal hareket yapmak istiyorlar ve en son Domain Controller'ı ele geçiriyorlar. Sen bu adamlara mimikatz'i tekrar kendin implement et diyemezsin. O antivirüsün bilgisayarda bulundurduğu imza tabanının formatını ayrıştırmak için antivirüsü tersine mühendislik ile analiz etmedikçe sen hangi baytlardan, constant'lardan, string'lerden yakaladıklarını bulamazsın. Yaymana rağmen hala 0 çekiyorsa uzun süreli, yüksek volüme ulaşmış bir saldırı yapmamışsındır, buradakiler hedefli saldırılardan ziyade rastgele kurbanların olduğu bir havuz istiyor. Bu şirketlerde çalışan araştırmacılar demeyecek mi "Ya bu imzasız sample, 100 tane kurbanımızda görülmüş. Şunu analiz edelim"
Yıllarca gördüğümüz "crypter" denen, aslında tanımına uymayan, güvenlik ürünlerinin radarından kaçınma uygulamalarının geliştiricileri cidden amatör, kodun işleyişinden haberdar olmayan skidder'lar:
Urban Dictionary: skidder
Ben sana hafızada tarama, çalıştırılma sırasında implement ettikleri savunma taktiklerinden kaçınmak için birkaç öneri vereceğim
Biliyorsun ki kötü niyetli kişiler dışında ticari amaçla packer, obfuscator kullanan birtakım ticari şirketler var. Örnek olarak "Point Blank" isimli bir oyun dinamik kitaplığını sıkıştırmak için UPX isimli yaygın olarak bilinen, birçok platformu ve mimirayi destekleyen açık kaynaklı bir yazılım kullanıyor. Ayrıca bu DLL imzalı. Bu DLL'deki bir bölüm kesin olarak okunabilir, yazılabilir ve çalıştırılabilir oluyor. Kısacası RWX. Bir sanal alanın diskten mi eşlendiğini her aplikasyon görebiliyor, bunlar unbacked section olarak adlandırılıyor, "crypter" araçları çalıştırılabilir bir alan açmak için VirtualAlloc + VirtualProtect ikilisini kullanıyor. Hafıza tarayan araçların ilgilendiği kısım hem çalıştırılabilir, hem de kullanıcı modunda oluşturulmuş hafıza kısımlarıdır. Bu DLL'i kendi çalışacak işlemimize eşleyebiliriz. Bilgisayarda onlarca işlemin çalıştığını, çalıştırılabilir alan barındırdıklarını unutmamak gerekiyor. Hepsini sürekli tarayıp makineyi yoramaz bu ürünler.
Fakat çalıştırılacak olan dosyamız imzasız olacağı için hala bir zararlı aktivitenin habericisi olabilir. Bu bulaştırma zincirini desteklemek için DLL sideloading ataklarından yararlanabiliriz
You can control the specific location from which any given DLL is loaded by specifying a full path. If you don't use that method, then the system searches for the DLL at load time as described in this topic.
learn.microsoft.com
İlk 6 maddenin bu durumda devreye girmediğini ve birçok programın kitaplıkları ararken bir filtreleme yapmadığını varsayarsak kendi zararlı kitaplığımızı sözde imzalı çalıştırılabilir işlemin hafıza alanına yükleyip daha önce bahsedilen DLL'yi çağırabilir ve o RWX alanına nihai zararlı yükü yazıp giriş noktasına atlayabiliriz. Bunun için o imzalı programın yüklediği DLL'i silebilir, kendi DLL'imizi o programın yanına koyabiliriz. Bazı programlar DLL'in giriş noktasını çalıştırmak istemeyebilir, LoadLibraryEx fonksiyonu kullanıyor kimi program bunu önlemek için. Önceki sildiğimiz legit DLL'in export ettiği fonksiyonlardan ilk çalışanı kendi DLL'imizde export edebiliriz. Eğer bu DLL dotnet olacaksa DLL'i MSIL hale çevirdikten sonra .export direktifi kullanılabilir.
DLL sideloading teknikleri devlet, finansal destekli gruplar tarafından epey istismar ediliyor ve efektif bir teknik.
Bir zararlı kodu çağırmak için mümkünse thread oluşturmayın, bir driver ile oluşturulan thread'lerden anlık olarak haberdar olabiliyorlar:
PsSetCreateThreadNotifyRoutine function (ntddk.h) - Windows drivers
Bazı hafıza tarayan araçlar MZ imzasını çalıştırılabilir alanların başında arayabilir. PE header'ı eğer lazım değilse strip etmek gerekiyor. Eğer lazım olursa strip edilmeden evvel bu header serialize edilebilir
Güvenlik ürünleri ayrıca kullandığınız kernel32, ntdll fonksiyonlarını yamalayarak kancalıyor. Bu kancalama işlemi için birkaç x86, x64 instruction'ı var. jmp ve call. Ya dönüş adresini edinip stack'e itip kendi fonksiyonlarını call ile çağıracaklar ya da jmp ile kendi fonksiyonlarına atlayacaklar. Bu atladıkları fonksiyonun görevi şüpheli olabilecek fonksiyonların parametrelerini kontrol etmek, eğer sıradışı bir aktivite algılarlarsa o programın çalışması kesilecek ve gereken tedbirler güvenlik ürünü tarafından uygulanacak. Bunu önleyebileceğimiz 4 teknik:
- Diskten veya KnownDlls cache'inden kancalanan DLL'in orijinalini bulup kancalanan DLL'in hafızadaki .text bölümünü orijinale çevirmek
- syscall kullanmak. Buradaki sorun *nix sistemlerinin aksine Windows her minör, majör güncelleme yaşadığında bu numaralar değişebiliyor. ntdll'de bir arama yapılarak dinamik olarak elde edilebilir (Bunu endpoint ürünleri algılıyor, bunları atlatmak için de teknik var fakat konumuz ev bilgisayarlarında kullanılan ürünler)
- Microsoft imzalı olmayan modüllerin zararlı işleminize enjekte olmayı önlemek için işleminiz üzerinde PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON değerini uygulayabilirsiniz. Kancalama işlemini yapmadan önce bu güvenlik ürünleri callback fonksiyonlarının bulunduğu DLL'i yüklemeye çalışır, bu ürünlerin çoğunun DLL'i Microsoft sertifikasıyla imzalanmıyor
- Bazı incelediğim DLL'lerde WINAPI, NTDLL fonksiyonlarını saran fonksiyonlar olabiliyor. Fonksiyon imzası tıpatıp aynı oluyor. Eğer bulunduğunuz diskteki DLL'ler tarayacak, calling convention'a uygun olarak o fonksiyona paslanan parametrelerin sarılan fonksiyonlara paslandığını kontrol eden bir betik yazabilirseniz bu DLL'leri kullanmak adına istismar edebilirsiniz. Güvenlik ürünleri call stack'te şüpheli fonksiyonun imzalı bir parçadan çağrıldığını görecek, false positive'lerin oluşmaması için de es geçecek.
Statik analizde kullandığımız şühepli fonksiyonlar yine PE ayrıştırılarak bulunabilir. Bunları gizlemenin yollarından bir tanesi dinamik olarak çalışma sırasında onları çağırmak:
- kernel32/ntdll adresi elde edilir (PEB'e erişilerek bulunabilir bunlar. Yanlış bilmiyorsam her işleme işletim sistemi bu kitaplıkları yüklüyor. PEB'e erişmek için 32 bit işlemde fs register'ındaki 0x30. offset, 64 bit işlemde gs register'ındaki 0x60. offset'e erişmek yeterli. msvc kullanıyorsanız __readgsqword, __readfsqword intrinsic'lerini de kullanabilirsiniz)
- Import Address Table ayrıştırılır, fonksiyonların isimlerinin hash'li hali daha önce programa hardcoded olarak yazdığımız sözlükteki değerlerle eşleştirilir
- Eğer istediğimiz fonksiyonu bulduğumuzu düşünüyorsak adresi alınır ve uygun fonksiyon imzasıyla çağrılır
Zararlı yazılımımız eninde sonunda bir gün analizcilerin eline düşecek ve tersine mühendislik yöntemiyle alan adları, IP adresleri onların havuzlarının bir parçası olacak. Eğer alan adımıza kayıtlı olan sunucunun IP adresini değiştirip, zararlı yazılımda alan adını resolve etmek için Dns-Over-HTTPS yöntemini kullanırsak bir DNS sorgusunda bulunduğumuzu öğrenemeyecekler. Bunu sağlayan web API'ları var. Yani bu aşamayı takip edecek zararlı yazılım:
Yeni bağlantı kuran sınıfın bağlanma fonksiyonu bağlantı kurmadan önce IP adresini belirten sınıf özelliğini modifiye etmek için fonksiyon ezilir veya extension method yazılır
Bu fonksiyon her çağrıldığında API'a istek atar: dns.bilmem-ne-sirketi.com/api/resolve?domain=bilmem-ne-zararli-yazilim-sunucu.com
API'dan dönen IP adresi IP adresini belirten sınıf özelliğine eşitlenir
Bağlantı kurulur
Dotnet programcısı olduğunu bildiğimden birkaç tüyo vermek istiyorum
Assembly.Load ile dotnet assembly'leri bayt dizisinden hafızaya yüklenebiliyor fakat şöyle bir sorun gelişti
We are happy to let you know that .NET Framework 4.8 is now feature complete and we have an early access build to share with you all! We will continue to stabilize this release and take more fixes over the coming months, and we would greatly appreciate it if you could help us ensure this […]
devblogs.microsoft.com
In previous versions of .NET Framework, Windows Defender or third-party antimalware software would automatically scan all assemblies loaded from disk for malware. However, assemblies loaded from elsewhere, such as by using Assembly.Load(byte[]), would not be scanned and could potentially carry viruses undetected.
AMSI, bir arayüz sunarak uygulamaları ve güvenlik uygulamalarını bütünleştiriyor. Kendi AMSI sağlayıcılarını da kendi COM server'larını register ederek kurabiliyorlar. Hatta antivirüsünün tarama fonksiyonunu kendi uygulaman içinde kullanabiliyorsun. AMSI'yi dotnet assembly'lerini, Powershell komutlarını tespit etmek isteyen Windows Defender, Avast, Kaspersky, ESET gibi her ürün tercih ediyor.
Yüklenen dotnet assembly'ler AmsiScanBuffer fonksiyonu ile kontrol ediliyor:
AmsiScanBuffer function (amsi.h) - Win32 apps
Bu fonksiyon native bir fonksiyon ve döndüreceği değerler yazılımın zararlı olup olmamasına göre değişkenlik gösteriyor, burada enum değerler listelenmiş:
AMSI_RESULT (amsi.h) - Win32 apps
Atlatmak için teknikler:
- AmsiScanBuffer yamalanır, fonksiyon girişinde eax register'ı mov instruction'ı ile manipüle edilir
- Hardware Breakpoint yapmak için otomatik debugger bağlanır ve istenilen EIP/RIP hit olunca eax/rax manipüle edilir
- CLR seviyesinde Reflection ile Assembly.Load'un çağırdığı, AMSI'yi çağırmaktan sorumlu olan fonksiyon yamalanır
Dotnet assembly'lerinde oluşturulmuş AppDomain'ler kontrolünde olan programdan EtwEventWrite fonksiyonu ile herkesin haberdar olması için izinin sürülmesine yardımcı oluyor. Bu fonksiyon da yamalanabilir
Derin taramanın, izlemenin yapıldığı sandbox ortamlarında zararlı yazılımın bir süre oyalanması gerekiyor. Çünkü bu sandbox'lara iletilen şüpheli yazılımlar için uzun kuyruk var, o yüzden kısıtlı bir süreye sahipler. Artık Sleep ile uykuya aldığınızda veya Red pill ile kontrol etmeye çalıştığımızda yemiyorlar, birçok teknik var fakat ben birkaçından bahsedeceğim
- Time-Lock puzzle dediğimiz, yaklaşık 30 yıl önce bulunan ve bir mesajın spesifik bir süre geçene kadar çözülemeyeceği konseptini tanımlayan bir teknik var. Sandbox'ları alt edeceğini varsaydığımız sürede çözülecek bir metin belirleyip hash'ini aldıktan sonra bu metin brute-force'lanabilir
- Bazı sandbox'lar timing fonksiyonlarını yamalayarak işleme devam etmek istiyor karşı hareket olarak, aradaki süreyi hesaplayarak yamalandığını anlayabilir ve bu sebepten de programdan çıkış yapılabilir veya zararsız bir kod bloğuna atlanabilir
- Rezerve edilmemiş IP aralıkları var:
Bogon IP Address Ranges Bunlara zaman aşımı yüksek olacak şekilde ICMP isteği atılabilir
- Kurbanın arayüzde bir butona, mesaj kutusunu onaylaması gibi interaktif işlemler yapılabilir
- Eğer zararlı yazılımın indirildiği yere kendiniz ev sahipliği yapıyorsanız indirilen her zararlı yazılım örneğine zararlı yazılımın okuyabileceği, sistem özellikleriyle karşılaştırebileceği sistem özelliklerini User-Agent'dan, lokasyondan, Javascript'ten edinerek yazın. Eğer uyuşmuyorsa analiz edilmek üzere başka bir sanallaştırma makinesinde açılmıştır
- Zararlı kod bloğu başka zaman çalıştırılmak üzere ertelenebilir (örneğin o bilgisayara kurulduktan birkaç saat sonra)
- Windows Explorer, dosyaların hangi kaynaktan indirdiğini anlamak için Zone.Identifier dosyalarını okuyor. Bir sıkıştırma programı sıkıştırılan dosyayı çıkarmak istediğinde veya tarayıcılar bir dosya indirdiğinde çalıştırılabilir, rastgele kod çalıştırabilen dosyalara bunu uyguluyor. Sandbox'a veya analiz için oluşturulmuş sanallaştırılma makinelerinde iletilen dosyalarda bu dosya bazen olmuyor, bu da kurbanın indirmediğinin habercisi olabilir
Son olarak pek tercih edilmeyen, hile yapımcılarının da tercih ettiği bir yöntem var: Sürücüler ile yüksek haklar elde etmek.
Sürücüler yüksek hakla çalıştığı için antivirüs işlemlerini öldürme ve hatta antivirüsün korumalı dosyalarını silme yetkisi var. Kullanıcı modundaki ve çekirdek modundaki iletişim genelde IOCTL istekleriyle sağlanıyor. Pek bilinmeyen anti-malware ve dosya silme yazılımlarının sürücülerinde bu iletişime başka Windows işlemlerinin de dahil olmasına neden olan zafiyetler var. Bunları bir disassembler/decompiler ile analiz ederek nasıl istekte bulunulacağı öğrenildikten sonra UAC bypass aracılığıyla yönetici hakları elde edilip sürücü yüklenir ve antivirüs işleminin ID'si ile antivirüs işlemi sonlandırılır. Sürücülerin bir işlemi sonlandırırken kullandığı fonksiyon:
ZwTerminateProcess function (ntddk.h) - Windows drivers
Bu sürücülerin istismar edilmesinin bilinmesi durumunda sürücüler güvenlik yazılımı tarafından kara listeye alınıp yüklenmesi engellenebilir.
Konuşmak istediğim çok teknik var fakat bunlar karşılaştığımız teknikleri yenmek için yeterli. Kedi-fare oyunundan ibaret bu sektör. Bir defans tekniği geliştiğinde onu yenecek bir başka saldırı tekniği ortaya çıkıyor