Selamlar herkese.
Çözüp flag giremediğimiz özel bir soru kendisi.(Son ana bırakmak kötü bir şey anladım artık)
Soruyu ilk açtığımızda şu şekilde bir metin ile karşılaşıyoruz. Amaç akış sonunda elde ettiklerimizle flag’i bulmak.
Zip içerisinde “onemli.docm” adında makro bazlı bir dosya var. İlk olarak bu dosyanın ne yaptığına, nasıl bir önyükleyici olduğuna karar vermek için neşteri elimize almamız gerekiyor.
https://github.com/unixfreak0037/officeparser
Ofis dosyalarına ait nesneleri kazımak için şu aracı kullandım. İçeride makro var ve o güzel yolu gösterecek.
Aracımız ile dosyamıza attığımız neşter darbesi sonucu “onemli.bas” adında bir modül ortaya çıktı. İlgili modülü açtığımız zaman klasik bir karıştırma metodu(pek karışık değil) ile oluşturulmuş, temel amacı uzak sunucuda bulunan powershell scriptini indirip çalıştırmak olan bir modül olduğunu görüyoruz.
http://85.111.95.27/264dc8a2e84a32512a24142ca203cd86/tgh43ft56du7asw59oa02smawx2cbnm.ps1
Çalıştırılan scripti indirip baktığımızda kendisinin içinde bulundurduğu base64 ile encode edilmiş farklı bir scripti decode edip çalıştıran önyükleyici olduğunu anlıyoruz.
(Encoded stringler uzun ondan açıklayıcı farklı stringler kullanmayı tercih ettim :P)
Çalıştırdığı diğer scripti elde etmek için şöyle ufak bir script yeterli.
Çarşaflara dolanmış bu zararlımızın bu scriptinde ise artık gerçek yüzünü görmeye başlıyor gibiyiz. Kendileri bir DLL’e ve tekrardan çalıştırmak için farklı bir payload’a sahip.
Oluşturduklarını görmek amacıyla son kısımda şöyle bir değiştirme yapmamız yeterli.
DLL ve artık zararlıya ait son payload elimizde.
Bu arkadaş ilk olarak kendini dinamik analiz esnasında analistin gözlerine kum atmak amacıyla bazı kontroller yapıyor. Basit bir anti-analiz fonksiyonu.
Ardından o decode edilen DLL’i “C:\ProgramData” altında “ScreenSaver.dll” adı ile kaydediyor.
Bu işlemden sonra çalıştığı domainin isminin “TEKNOSARIMSAK” olup olmamasına göre bir takım işlemler yapıyor.
Soruda bahsi geçen muhabbet burada gerçekleşiyor. Onlarda farklı bizde logger olayı.
Şayet çalıştığı bilgisayar bu kurala uygun değilse zararlımız hedef DLL’i “logger” fonksiyonunu tetikleyerek başlatıyor.
Öncesinde zamanlanmış görev olarak kendini oluşturuyor.
Kurala uyuyor ise VoidFunc fonksiyonu ile bu işlem gerçekleştiriliyor.
Scriptler için neşter yeterliydi. Şimdi elimize samuray kılıcını alma vakti geldi.
İlgili fonksiyon çok uzun olduğundan tümünü sığdırmam biraz zor ondan kabaca ne yaptığını anlatayım. Hedef sistemde bu fonksiyon ile çalıştırıldıktan ilk olarak “3572” portunu dinlemeye alıyor. Port üzerinden bir veri aldıysa aldığı veriyi bir dizi kontrolden geçiriyor.
Kontrollerden ilki CRC doğrulaması. Hedefe verilen verinin CRC32 sonucu EE1E51C3 değerine denk mi değil mi diye bir kontrol yapılıyor. Denk değilse “Hatali CRC (Patchlebeni!”) şeklinde bir mesaj veriliyor.
Bu kontrolün ardından 6 adet karakter bazlı bir doğrulama yapılıyor.
CRC doğrulamasının verebileceği pek bir şey yok zaten. 6 adet karakter doğrulamasından girdinin 6 karakterli olması gerektiğini de bariz şekilde anlıyoruz.
Karakter doğrulama bu şekilde gerçekleşiyor.
Karakter doğrulama olayında kullanılan bir taslak dizi var. “102030405060” şeklinde.
Her işlemde bu dizi üzerinde oynama yapıldıktan sonra sub_74181EB0 fonksyionu çağrılıyor ve ardından elde edilen çıktı ile bizim girdimizin karakterleri sırayla karşılaştırılıyor.
cmp cl, [eax+4]
Karakter sırasına ait veri de burada yer alıyor.
Dizi modifikasyonunda sonra çağrılan fonksiyon ise girdiyi “A5” ile xor’layıp dönütlüyor.
Fonksiyon var, veri var. Yapalım öyleyse.
eax+4 6954030201h = 0
eax+2 6054D00201h = u
eax+3 60590030201h = 5
eax+1 605403DD01h = x
eax+0 6054030295h = 0
eax+5 0C8054030201h = m
Sırasıyla hangi verilerin karşılaştırıldığına bakıp kendimiz xor işlemini yaptığımızda yukarıda bulunan değerleri elde ediyoruz.
Elde ettiklerimizi sıralarsak
0xu50m bize kapıları açacak olan anahtar olmuş oluyor.
F_L_4_G: USOM_MHh1NTBt
Bu soruda VoidFunc kısmına gelip takılmıştım. IDA ile Rundll32’ye “ScreenSaver.dll,VoidFunc” parametresini vererek dll’yi debuglamaya çalıştım fakat hiçbir zaman breakpointlerim trigger olmadı. Ollydbg ile de sürekli Segfault aldım. IDA ile nasıl becerdiniz bunu? Anlatırsanız sevinirim
BeğenBeğen
Attach ettim sadece. İlk dll’i normal şekilde çağırdım. Sonrasında debug ettim.
BeğenBeğen
Attach edip $IP’yi VoidFunc’a dönecek şekilde değiştirdiniz yani?
BeğenLiked by 1 kişi
Attach ettikten sonra rundll32.exe üzerinde load edilmiş ilgili dll’in kendisine ida üzerinden bp atmak yeterli oldu
BeğenBeğen