Reversing Malware Sample 5 (Simda Trojan)

borekaenxd97

Blue Tim Emektar
24 Nis 2020
218
339
Ey Türk Gençliği!
Herkese merhabalar. Bugünkü konumda Simda Trojan örneğini ele alacağım. Şimdiden iyi okumalar.

NOT: Buraya eklemek istediğim bir not var, bu yüzden konuma başlamadan önce belirtmekte fayda gördüm. Analizimizi Sanal Windows ortamımızda gerçekleştiriyoruz. Zararlının ne tür işlevi, nerelere çağrıda bulunduğu, bilgi aktardığını ilk başta bilmediğimiz için analizlerimizi daima İZOLE bir sanal ortamda gerçekleştirmemiz gerekmektedir.

Kullanılan Araçlar
TrIDNet
DiE(Detect it Easy)
Exeinfo PE
PeStudio
Ghidra
x32dbg
wk600ry.jpg

TrIDNet: TrID aracının GUI(grafik arayüzlü) halidir. Ben analizim sırasında GUI nin daha kullanışlı olduğunu düşündüm. Dosya tipi tanımlamalarında, dosya uzantısı/biçiminin belirlenmesinde kullanılan işlevli araçlardan birisidir. İndirmek istediğimiz/indirdiğimiz dosyanın bizim istediğimiz dosya olup olmadığını kontrol etmek amacıyla da kullanılmaktadır. TrIDNet, dosya türlerini ikili imzalarından tanımlamak için tasarlanmış bir yardımcı programdır.
NOT: Örneğin Linuxta bir dosya indirdiğimizi varsayalım. Bu dosyanın adı 123123123 olsun(uzantısı yok). Bu dosyanın ne olduğunu ilk bakışta komut satırında anlayamayacağımız için ---> file 123123123 komutunu çalıştırırız. Komut sonrasında zip archive yazarsa ne yapmamız gerekir ? mv 123123123 123123123.zip yaparız ki sıkıştırmayı unzip ile açabilelim ve sıkıştırılan dosyalara erişebilelim. İşte bu araç da dosya uzantısı hakkında bilgi edinmemize yaramaktadır.

wk600ry.jpg

DiE(Detect it Easy): Dosya türlerini ve daha fazlasını hızlı bir şekilde tanımlamak için Açık Kaynaklı paket tanımlayıcı yardımcı programıdır. Analiz esnasında araç hakkında bu kadarını bilmemiz yeterli. Daha sonra detaylı olarak değineceğimiz bir araç.
wk600ry.jpg

Exeinfo PE: Yürütülebilir(executable) veya ikili(binary) bir dosya hakkındaki bilgileri görüntülemenizi sağlar. Kötü amaçlı yazılım genellikle Windows Taşınabilir Yürütülebilir (PE) biçiminde gizlenir ve bu PE analiz aracı burada yararlı olabilir. Entry Point, File Offset, File Size, SubSystem(başlama noktası, dosya offseti, dosya boyutu ve altsistem) ve daha fazlası hakkında bilgiye erişebiliriz.
wk600ry.jpg

PeStudio: Statik Analizlerde genellikle zararlı yazılımın ilk değerlendirmesini gerçekleştirmek için kullanılan GUI bir araçtır. Tecrübe edinildiğinde analiz sonucunda kendisi üzerinde birçok birçok bilgi barındıran bir araçtır.
NOT: Kötü amaçlı yazılımlar, erken tespit ve statik analizden kaçınmak(tespit edilmekten kaçınma) için genellikle davranışlarını gizlemeye çalışır. Bunu yaparken, genellikle şüpheli kalıplar, beklenmedik meta veriler, anormallikler ve diğer değerli göstergeler bırakırlar.
wk600ry.jpg

Ghidra: Tersine mühendisliklerde kullanılan bir araçtır. Bilgi birikimi ile üzerinde çok güzel analizler yapılabilen araçlardan birisidir(ollydbg,ghidra). Pratik kazanıldığında ve tecrübeyle birleştiğinde Zararlı Yazılım Analizinde çok kullanışlı bir araç haline gelmektedir.
wk600ry.jpg

x32dbg: Zararlı yazılım analizlerinde kullanılan açık kaynaklı bir debuggerdır(hata ayıklayıcı). Kod yürütülürken adım adım ilerlemek için bir hata ayıklayıcı kullanılır, böylece zararlının tam olarak ne yaptığını görebilirsiniz. Hata ayıklayıcılar, debugger özelliğine ek olarak kötü amaçlı yazılımları tersine çevirmek için de kullanılırlar.



Analize başlamadan önce değinmek istediğim birkaç şey daha var. Bunlara da kısaca değineyim.

Shellcode: Bilgisayar korsanlığında kabuk kodu, bir yazılım güvenlik açığından yararlanmada yük olarak kullanılan küçük bir kod parçasıdır. "Kabuk kodu" olarak adlandırılır, çünkü genellikle saldırganın güvenliği ihlal edilmiş makineyi kontrol edebildiği bir komut kabuğu başlatır veya bu makineden yararlanmak için yazılımda bir komut yürüten bir dizi talimattır ancak benzer bir görevi gerçekleştiren herhangi bir kod parçasına da kabuk kodu denebilir.
Kabuk kodu terimi, orijinal olarak, kodun yürütülmesi yoluyla bir ters kabuk oluşturma veya oluşturma amacına dayalı olarak türetilmiştir. Shellcode, bir sonucu gerçekleştirmek için programı doğrudan manipüle ederek bir programın kayıtları ve işlevleri ile etkileşime girer. Bu etkileşim nedeniyle, Assemblyde yazılır ve daha sonra onaltılık işlem kodlarına çevrilir.

NOT: Örneğin bir program yazıldıktan sonra, diyelim ki Assembly, o programın onaltılık baytları, C ile yazılmış başka bir programa eklenir. C programı çalıştırıldığında, temeldeki “kabuk kodu” da yürütülür.

wk600ry.jpg

Fake Returns:

Bu, anormal işlev epiloguna bir örnektir, bazen bir adresi yığına iten bir push görürüz. Bunu takiben, bir RET talimatı olacaktır.
Normalde, ret'ten hemen önce bir itme bulmayacağız, ret'ten önce bir itmemiz olduğunu varsayacağız. Ancak bu anormal kötü amaçlı yazılım kodunda bazen ret'ten önce bir push görürsünüz ve ret yığındaki adres neyse onu döndürür.
Yani bu ret'in bu işlevi döndürmeye niyeti yok.
Bunun yerine ret, yığında bulunan adrese doğrudan atlamak için bir mekanizmadır.
Ve yığında bulunan şey, kötü niyetli talimatlar içeren gömülü kodun kendisidir.
Yığının üst kısmı gömülü kodu gösterir.
Yani bu bir yol, çünkü ret'in bu fonksiyonun rengine geri dönme niyeti yok.
Ayrıca bu, başka bir işlevi kontrol etmek için anormal bir aktarımdır.
wk600ry.jpg

Unexpected Jumps:

Bazen bazılarını ittiririz ve ardından doğrudan nedene atlarız çünkü ret, kötü amaçlı koddaki gömülü kötü amaçlı talimatların adresini içerecektir.
Böylece atlama beklenmedik bir şekilde doğrudan ret'e gelecek. Böylece ret şimdi doğrudan yığının tepesindeki(top of the stack) adres tarafından atıfta bulunulan gömülü koda gidecektir. Yani buna beklenmedik sıçramalar denir.


TrIDNet ile .bin uzantılı zararlı yazılımımızın uzantılarını inceliyoruz:


(PE) Exe yani executable bir dosya.
DiE (Detect It Easy) aracımız ile biraz daha derine inelim.

Aracımız herhangi bir paketleyici(packer) tespit edemedi.
Entropy’ye tıkladığımzıda bize paketlenmediğini bildiriyor.

Başka bir aracımızla işlem gerçekleştireceğiz. (Exeinfo PE)
Bu aracımız vasıtasıyla da paketlenmediğini görüyoruz:

Kontrollerimizi tamamıyla sağlamak adına bir aracımızla daha işlem gerçekleştirelim. (PEStudio)

MZ imzası, MS-DOS yeniden yerleştirilebilir 16 bit EXE biçimi tarafından kullanılan bir imzadır.
Bir PE ikili dosyasının bir MZ başlığı içermesinin nedeni geriye dönük uyumluluk içindir. Yürütülebilir dosya DOS tabanlı bir sistemde çalıştırılıyorsa, MZ sürümünü çalıştırır (ki bu, hemen hemen her zaman, programı bir Win32 sisteminde çalıştırmanız gerektiğini söyleyen saplamadır).
Zaten yukarıdaki first-bytes-hex satırını hex to text ile çevirdiğimizde bizi aşağıdaki gibi MZ başlıkları (hex header) karşılıyor.
NOT: Windows ikili dosyaları, Taşınabilir Yürütülebilir veya PE adı verilen bir biçimde paketlenir

**Bir EXE dosyasının başlığı sihirli (magic number) “MZ” harfleriyle başlar ve program yükleyicinin programı belleğe yüklemek ve yürütmeye hazırlamak için kullandığı diğer bilgilerle devam eder.

“MZ” = Mark Zbikowski.
“NE” = “New Executable"
“PE” = “Portable Executable”
“LE” = “Linear Executable
Functions sekmesi:

Burada 8 adet işlevimiz bulunuyor.
Bu, bu kötü amaçlı yazılımların paketlendiğine dair olumlu bir onaydır.
Sections sekmesi:



Burada gösterilen Entropi fazla olmasına rağmen bu paketlenmediği anlamına gelmez.
Strings sekmesi:


Strings sekmesi altında value sütununda bu anlamsız değerlerin olması, zararlı yazılımın paketlendiğini gösterir.
Sonuç olarak zararlı yazılımın paketlendiği varsayımımızı doğruladık. Şimdi ise paketinden çıkartma işlemine (unpacking) geçelim



UNPACKING

Zararlı yazılımın nasıl paketlendiğini araştırmak için Ghidra'yı kullanacağız ve ardından paketin nasıl açılacağı hakkında bir fikir edineceğiz.

Zararlımızı Ghidra ile açtığımızda bu ekran karşılıyor.
Sol taraftaki Sembol Ağacından Function > Entry Point ile başlama noktamıza gidelim


Başlama noktasına tıkladıktan sonra bizi decompile sekmesine yönlendirecek ve bu kod blokları ile karşılaşacağız. Sonrasında en sondaki return e tıkladığımızda bizi (refer) yani atıfta bulunduğu/yönlendirme yapacağı return ile ilgili Assembly kodlarına götürecek.

Yukarıdaki assembly kodlarında anormal ret fonksiyonları görüyoruz:
RET den önce bir PUSH, aynı zamanda bir RET den önce tekrardan PUSH
Bunlar daha öncesinde bahsettiğimiz (fake return araştır anlar, burada da öncesinde anlattık de) Sahte RETURN(fake rets)ler.
  • Kırmızı ile altını çizdiğimiz adımlarda şu işlemler gerçekleşir. PUSH ile DAT_004013a0 ı Stack’e iter, RET ile yığında olan değeri döndürür.​
  • Ardından PUSH ile DAT_004013a6 yı Stack’e iter, RET ile yığında olan değeri döndürür.​
Tamamlanmamış bir işlevi yeniden oluşturmaya çalışmak için RET-PUSH bloklarının altında kalan kısımları (yani dışarıda kalan kısımları) disassemble etmesini söyleyebiliriz.

Aşağıdaki şekle dönüşecektir:

Ghidra bizim için burayı assemble edecek.
Yapmak istediğimiz bir sonraki şey, tüm bunları işlemsiz hale getirmek ve daha sonra yeni sökülmüş bölgeyi tekrar birleştirmek için tüm işlevi yeniden oluşturmaktır. {Yani tüm bunları işlevsiz hale getirmek için daha yeni disassemble ettiğimiz alanı tekrar birleştirmek için tüm işlevi yeniden oluşturacağız.}


Burayı hex editör ile açalım:




Amacımız sol taraftaki gözüken kodların hex değerlerini no-op (no operation) yapmak. Bu yüzden hex editör ile açıp, değerleriyle oynayacağız yani bunları no-op yapacağız.
Hex değerlerini 90 yaparak no-op a çekelim.
NO-OP (Hiçbir şeyin yürütülmesini istemediğimiz anlamına gelir.)
Buradaki bütün değerleri en alttaki c3 dahil no-op a çekelim.
Hex değerler:

Assembly kodları:

*Değerleri no-op a çektikten sonra hex değerleri editlemek için aktif ettiğimiz tuşa tekrar basıp hex değerlerimizi tekraran kitlemeyi unutmayalım.
İşlevi yeniden oluşturmak için, henüz disassembled olan alt bölümü dahil edelim. Bunu yapmak için, burada üstte ve doğrudan bir yer seçiyoruz ve clear flow and repair sekmesine tıklayalım.

Ok a basarak işlemi bitirelim.
Şimdi Ghidra, talimatların bu yeni bölümünü dahil etmek için gördüğünüz gibi şeyi yeniden inşa etti ve ardından değişikliği yansıtmak için yeni bir işlev yaratacağız.


Decompile: entry kısmına gelerek burada yeni bir fonksiyon olduğunu görebiliriz, ve bu bize orijinal fonksiyonu gösteriyor:

Başlangıç noktasının sonundaki return e tıklayalım.

Return e tıklamamızın amacı bizi yönlendireceği/atıfta bulunduğu yerde (refer) herhangi bir fake return olup olmadığını görüntülemek.

Normal bir itme ve geri dönüş görüyoruz, bu yüzden bu yine, yapacakları daha fazla paketi açmaya çalıştıklarını gösteriyor gibi görünüyor, burada FUN_00401130 un izini sürebiliriz.
MOV satırında EAX a atıyor, PUSH satırında EAX ı Stack’e pushluyor.
FUN_00401130 a 2 kere tıklayarak fonksiyona gidip neler olduğunu görebiliriz.


Burada anormal bir atlama (JMP) görüyoruz.
Daha aşağılara inelim ve bakınalım.

Burada bu RET'e asla ulaşılmadığı anlamına gelir, ECX'i ve atlamaları doğrudan burada RETURN'de olan LAB_00401167'ye itti. Bu ayrıca bir beklenmedik zıplamadır (Unexpected Jump).
ECX'i takip edersiniz, burada ECX'i seçebilir ve vurgulayabiliriz. Ve bu, verilerin ECX'e nasıl itildiğidir.


Undefined – tanımlanmamış

Yani burada ECX'e tam olarak neyin itildiğini bilmek için Debugger kullanmamız gerekiyor.
Bu yüzden buralara bir breakpoint koymamız gerekiyor.
Muhtemelen shellcodu bulacağımız, ECX değerinin ne olduğu ve Unpacked etmeye çalıştığı şey nedir inceleyelim.


SHELLCODE

X32dbg aracımızı kullanarak zararlımızı açalım.

Bu adresimize breakpoint atamamız gerekiyor.
X32dbg aracımıza geliyoruz ve işlemi gerçekleştirelim:
Offset adresini alalım: 00401156

bp = breakpoint
Enter ile komutumuzu çalıştırıyoruz ve başarılı bir şekilde kesme noktamızın ayarlandığını söylüyor.

Bunu Kesme Noktaları sekmesine gelip oradan da kontrol edip, işlemin içeriğini de görebiliriz.

Çalıştır butonuna tıklayarak ayarladığımız breakpointe kadar olan işlemi görüntüleyebiliriz.

Sonrasında prosedürün içine girmeden devam et (step over) diyerek çalıştırmaya devam edelim.



Fake RET:

Tekardan Step Over diyoruz.

Şimdi shellcode’u dump edelim yani boşaltalım. Bu yüzden savedata komutunu kullanacağız x32dbg üzerinde.
Savedata path_to_output_file, base_addr, size
Parametreler yukarıdaki gibidir.
savedata “C:\Users\thres\OneDrive\Masaüstü\Simda Trojan\malware-sample-5\shellcode.bin”,

Base address: “022A0000”
Boyut: “00087000”
savedata "C:\Users\thres\OneDrive\Masaüstü\Simda Trojan\malware-sample-5\shellcode.bin", "022A0000", "00087000"
x32dbg aracımızda yukarıdaki komutu yazdığımızda shellcode.bin dosyamız oluşturulur.


Shellcode’u Ghidraya eklemeye çalıştığımızda tanıyamıyor.

Açık olan Ghidra oturumumuzda Ctrl+o ile shellcode.bin dosyamızı açıp devam ediyoruz.
Shellcode üzerinde başlama noktası verilmiyor.
Offseti hesaplamak için x32dbg aracına gireceğiz, burası biraz karışacak.
Ayarladığımız breakpointten base addresi çıkarmamız gerekiyor.

Aracı tekrardan çalıştırdığım için base adresi değişti. (00706ED0)

680000
706ED0 – 680000 = 86ED0
**(Breakpoint sabit olduğu için, step over işlemlerinden sonra vardığınız adres (00706ED0) ve Hafızadaki base adres (00680000) farklı olsa da çıkan sonuç sabit olacaktır [86ED0])
Shellcode da kullanacağımız offset adresimiz ortaya çıkmış oldu böylece.

Ghidraya geçip go to ile bu offset adresimize ilerleyelim.

Ve karşımıza Entry Point çıkıyor.
Aynı şekilde burdan da return ile dallanmaları görüntülemeye çalışalım:


RET den önce bir PUSH EDX görüyoruz.
Yerel değere PUSH ediyor gibi gözüküyor.
00086fc4 e bir kesme noktası ayarlayalım fakat burada dikkat etmemiz gereken bir nokta var. RET değerinin offseti 00086fc4, x32dbg deki 022F6ED0. Son 4 değere gelene kadar x32dbg deki değeri yazacağız, sonraki 4 offset değerini Ghidradaki shellcode.bin deki entry point noktasından alacağız. Yani şunu demek istiyorum:
022F – 6fc4 = 022F6FC4


Ghidradaki RET değerine karşılık geldiğini x32dbg > Kesme Noktalarından da doğrulamış olduk.
Kesme noktamızı çalıştıralım:

ECX, geri dönen adrestir, bu nedenle artık geri dönmek için bir adım ileri gidebiliriz.
Sonrasında step over diyerek devam edelim.

Bu zaten kabuk kodunun dışında. Ana kodun kendisi değil.
Bu, paketin açılmasının zaten bittiğinin bir göstergesi olabilir.
Simda Trojan bizi orijinal konuma geri yönlendiriyor gibi görünebilir.
Açıkçası, orijinal ana entry point ve bunun üzerine muhtemelen bazı yeni kodlar yazılmıştır.


Final Unpacking

Yeni keşfedilen unpack dosyasını boşaltacağız(dump).


Yani IAT, tüm işlevler için tüm içe aktarmaları içeren bir tablodur.
Sonrasında GET Importsa tıklayarak (Kötü amaçlı yazılımın kullandığı tüm içe aktarmaları çalıştıracak)

Dump > Select Location

Yapmamız gereken sonraki şey Fix Dump diyerek, keşfedilenlere (zararlı yazılım tarafından kullanılan içe aktarmalar (kernel32 vs)) dayanan bir onarma gerçekleştirmek.
Yani Fix Dump ile kaydettiğimiz demo2_simda_dump.exe dosyasını seçerek onarım sağlamak.

Şimdi yapmamız gereken şey ise, Dump edip sonrasında Fix Dump seçeneği ile onarım sağladığımız ve uzantısına _SCY eklediğimiz .exe dosyasını Ghidra da analiz etmek.
Ghidrada üzerine bıraktığımızda PE olarak doğru bir şekilde tanımlanıyor.

Sembol Ağacından fonksiyonlarımızı kontrol ediyoruz.
Imports Sekmesi:


*-*API'nin en önemli işlevlerinden biri CreateToolhelp32snapshot dır.
*Bu, kötü amaçlı yazılım tarafından işletim sisteminizde çalışan tüm işlemleri listelemek için kullanılır.
*Bunun amacı, herhangi bir analiz aracı kullanıp kullanmadığınızı görmek, bu kötü amaçlı yazılımı tersine mühendislik yapacak veya analiz edecek.
*Analiz araçlarını kullandığınızı fark ederse, farklı davranır veya çalışmayı reddeder.

3. referansa tıkladıktan sonra

Bizi karşılayan ekran yukarıdaki gibidir.


s_cv.exe_0040cdc8; tıklayarak bize dallanmanın sonucunu göstermesini sağlayalım:

Aşağılara doğru indikçe diğer dosya türlerini görüntülüyoruz.




Anti-analiz mekanizması:


Bu, NT analizi yapmaya çalıştığının bir işaretidir, bu yüzden onu analiz etmek için her türlü girişime direnmeye çalışmaktadır.

Burada, daha gelişmiş paketleme tekniklerinden bazılarını ve bunların üstesinden nasıl gelineceğini belirlemek ve aynı zamanda paketten çıkarma belleğini analiz için ayrı dosyalara boşaltmak(dumping) olan hedefimize ulaşmış oluyoruz.


Burada analizimin sonuna gelmiş bulunmaktayım. Okurken keyif aldıysanız, zararlı yazılım adına size faydam dokunduysa, yeni bilinmeyenler kazandırabildiysem ne mutlu.

sbzcdf3.jpg
 
Son düzenleme:

borekaenxd97

Blue Tim Emektar
24 Nis 2020
218
339
Ey Türk Gençliği!
Ellerine emeklerine sağlık.
Teşekkür ediyorum Hocam.
Elinize sağlık hocam. Zararlı yazılım analizi ile ilgilenen arkadaşlar için çok faydalı içerik. Belki videolu anlatım şeklinde de düşünebilirsiniz
Faydalı olabildiğime sevindim. Videolu anlatımı da düşünüyorum fakat biraz daha zaman gerektiğine inanıyorum.
Teşekkür ederim Ghost.
Eline sağlık kardeşim.
Böyle örneklerin forumda bulunması güzel.
Ben teşekkür ediyorum bu değerli yorumun için. Foruma adına da güzel bir konu olacaktır diye ümit ediyorum.
 

borekaenxd97

Blue Tim Emektar
24 Nis 2020
218
339
Ey Türk Gençliği!
Elinize sağlık. Güzel konu.
Teşekür ederim. Beğenmenize sevindim.
Teşekkür ediyorum.
Elinize sağlık hocam
Teşekkür ederim Kemik.
Ellerinize Sağlık hocam.
Teşekkür ediyorum.
Teşekkür ederim.
Elinize sağlık.
Teşekkür ederim.
Teşekkür ederim.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.