diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md index 9dd8ebfaa..af1b51c0e 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md @@ -1,8 +1,8 @@ -# Kötü Amaçlı Yazılım Analizi +# Malware Analizi {{#include ../../banners/hacktricks-training.md}} -## Adli Bilişim Hile Sayfaları +## Adli Bilimler Hızlı Referansları [https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/) @@ -24,8 +24,8 @@ sudo apt-get install -y yara ``` #### Kuralları Hazırlayın -Bu script'i kullanarak github'dan tüm yara kötü amaçlı yazılım kurallarını indirin ve birleştirin: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\ -_**rules**_ dizinini oluşturun ve çalıştırın. Bu, tüm kötü amaçlı yazılım için yara kurallarını içeren _**malware_rules.yar**_ adlı bir dosya oluşturacaktır. +Use this script to download and merge all the yara malware rules from github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\ +Create the _**rules**_ directory and execute it. This will create a file called _**malware_rules.yar**_ which contains all the yara rules for malware. ```bash wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py mkdir rules @@ -57,17 +57,17 @@ clamscan folderpath #Scan the whole folder ``` ### [Capa](https://github.com/mandiant/capa) -**Capa**, potansiyel olarak zararlı **yetenekleri** yürütülebilir dosyalarda tespit eder: PE, ELF, .NET. Bu nedenle, Att\&ck taktikleri veya şüpheli yetenekler gibi şeyleri bulacaktır: +**Capa**, potansiyel olarak zararlı **yetenekleri** yürütülebilir dosyalarda tespit eder: PE, ELF, .NET. Bu nedenle, Att\&ck taktikleri veya aşağıdaki gibi şüpheli yetenekler gibi şeyleri bulacaktır: - OutputDebugString hatasını kontrol et -- bir hizmet olarak çalış +- hizmet olarak çalış - işlem oluştur Bunu [**Github repo**](https://github.com/mandiant/capa) üzerinden edinebilirsiniz. ### IOCs -IOC, Kompromi İndikatörü anlamına gelir. Bir IOC, bazı potansiyel olarak istenmeyen yazılımları veya onaylanmış **kötü amaçlı yazılımları** tanımlayan **koşulların** bir setidir. Mavi Takımlar, bu tür tanımları **sistemlerinde** ve **ağlarında** bu tür kötü amaçlı dosyaları **arama** amacıyla kullanır.\ +IOC, Kompromi Göstergesi anlamına gelir. Bir IOC, bazı potansiyel olarak istenmeyen yazılımları veya onaylanmış **kötü amaçlı yazılımları** tanımlayan bir **koşullar setidir**. Mavi Takımlar, bu tür tanımları **sistemlerinde** ve **ağlarında** bu tür kötü amaçlı dosyaları **arama** amacıyla kullanır.\ Bu tanımları paylaşmak çok faydalıdır çünkü bir bilgisayarda kötü amaçlı yazılım tespit edildiğinde ve o kötü amaçlı yazılım için bir IOC oluşturulduğunda, diğer Mavi Takımlar bunu kötü amaçlı yazılımı daha hızlı tanımlamak için kullanabilir. IOC'leri oluşturmak veya değiştirmek için bir araç [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\ @@ -75,7 +75,7 @@ Tanımlı IOCs'leri bir cihazda **arama** yapmak için [**Redline**](https://www ### Loki -[**Loki**](https://github.com/Neo23x0/Loki), Basit Kompromi İndikatörleri için bir tarayıcıdır.\ +[**Loki**](https://github.com/Neo23x0/Loki), Basit Kompromi Göstergeleri için bir tarayıcıdır.\ Tespit, dört tespit yöntemine dayanmaktadır: ``` 1. File Name IOC @@ -102,7 +102,7 @@ sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--sk ``` ### FLOSS -[**FLOSS**](https://github.com/mandiant/flare-floss) bir dizi farklı teknik kullanarak yürütülebilir dosyalar içinde obfuscate edilmiş dizeleri bulmaya çalışan bir araçtır. +[**FLOSS**](https://github.com/mandiant/flare-floss) bir dizi teknik kullanarak yürütülebilir dosyalar içinde obfuscate edilmiş dizeleri bulmaya çalışan bir araçtır. ### PEpper @@ -114,15 +114,15 @@ sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--sk ### Detect It Easy(DiE) -[**DiE**](https://github.com/horsicq/Detect-It-Easy/) bir dosyanın **şifreli** olup olmadığını tespit etmek ve ayrıca **paketleyicileri** bulmak için bir araçtır. +[**DiE**](https://github.com/horsicq/Detect-It-Easy/) bir dosyanın **şifreli** olup olmadığını tespit etmek ve ayrıca **paketleyicileri** bulmak için kullanılan bir araçtır. ### NeoPI -[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI) metin/script dosyaları içinde **obfuscate** edilmiş ve **şifreli** içeriği tespit etmek için çeşitli **istatistiksel yöntemler** kullanan bir Python betiğidir. NeoPI'nin amacı, **gizli web shell kodunun tespitine** yardımcı olmaktır. +[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI) metin/script dosyaları içinde **obfuscate** edilmiş ve **şifreli** içeriği tespit etmek için çeşitli **istatistiksel yöntemler** kullanan bir Python betiğidir. NeoPI'nin amacı, **gizli web shell kodunun** tespitine yardımcı olmaktır. ### **php-malware-finder** -[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) **obfuscate** edilmiş/**şüpheli kodu** ve ayrıca **malware**/webshell'lerde sıkça kullanılan **PHP** fonksiyonlarını içeren dosyaları tespit etmek için elinden gelenin en iyisini yapar. +[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) **obfuscate** edilmiş/**şüpheli kod** ile birlikte, genellikle **malware**/webshell'lerde kullanılan **PHP** fonksiyonlarını içeren dosyaları tespit etmek için elinden gelenin en iyisini yapar. ### Apple Binary Signatures @@ -145,10 +145,92 @@ Eğer bir web sunucusunun **dosyalarını** içeren bir klasörün **son güncel ### Temel Değerler -Eğer bir klasörün dosyaları **değiştirilmemiş olmalıysa**, klasörün **orijinal dosyalarının** **hash'ini** hesaplayabilir ve bunları **mevcut** olanlarla **karşılaştırabilirsiniz**. Değiştirilen her şey **şüpheli** olacaktır. +Eğer bir klasörün dosyaları **değiştirilmemiş olmalıysa**, klasörün **orijinal dosyalarının** **hash'ini** hesaplayabilir ve bunları **mevcut** olanlarla **karşılaştırabilirsiniz**. Değiştirilen herhangi bir şey **şüpheli** olacaktır. ### İstatistiksel Analiz -Bilgiler loglarda saklandığında, her bir web sunucusu dosyasının ne kadar kez erişildiği gibi **istatistikleri kontrol edebilirsiniz; çünkü bir web shell en çok erişilenlerden biri olabilir**. +Bilgiler günlüklerde saklandığında, her bir web sunucusu dosyasının ne kadar sıklıkla erişildiğini kontrol edebilirsiniz; çünkü bir web shell en çok erişilenlerden biri olabilir. + +--- + +## Dinamik Kontrol Akışını Deşifre Etme (JMP/CALL RAX Dağıtıcıları) + +Modern kötü amaçlı yazılım aileleri Kontrol Akış Grafiği (CFG) obfuscation'ı yoğun bir şekilde kötüye kullanmaktadır: doğrudan bir atlama/çağrı yerine, hedefi çalışma zamanında hesaplar ve `jmp rax` veya `call rax` komutunu yürütür. Küçük bir *dağıtıcı* (genellikle dokuz talimat) CPU `ZF`/`CF` bayraklarına bağlı olarak son hedefi belirler ve statik CFG geri kazanımını tamamen bozar. + +SLOW#TEMPEST yükleyicisi tarafından sergilenen bu teknik, yalnızca IDAPython ve Unicorn CPU emülatörüne dayanan üç adımlı bir iş akışı ile yenilebilir. + +### 1. Her dolaylı atlama / çağrıyı bulun +```python +import idautils, idc + +for ea in idautils.FunctionItems(idc.here()): +mnem = idc.print_insn_mnem(ea) +if mnem in ("jmp", "call") and idc.print_operand(ea, 0) == "rax": +print(f"[+] Dispatcher found @ {ea:X}") +``` +### 2. Dispatcher byte-code'u çıkarın +```python +import idc + +def get_dispatcher_start(jmp_ea, count=9): +s = jmp_ea +for _ in range(count): +s = idc.prev_head(s, 0) +return s + +start = get_dispatcher_start(jmp_ea) +size = jmp_ea + idc.get_item_size(jmp_ea) - start +code = idc.get_bytes(start, size) +open(f"{start:X}.bin", "wb").write(code) +``` +### 3. Unicorn ile iki kez taklit et +```python +from unicorn import * +from unicorn.x86_const import * +import struct + +def run(code, zf=0, cf=0): +BASE = 0x1000 +mu = Uc(UC_ARCH_X86, UC_MODE_64) +mu.mem_map(BASE, 0x1000) +mu.mem_write(BASE, code) +mu.reg_write(UC_X86_REG_RFLAGS, (zf << 6) | cf) +mu.reg_write(UC_X86_REG_RAX, 0) +mu.emu_start(BASE, BASE+len(code)) +return mu.reg_read(UC_X86_REG_RAX) +``` +`run(code,0,0)` ve `run(code,1,1)` komutlarını çalıştırarak *false* ve *true* dal hedeflerini elde edin. + +### 4. Doğrudan bir atlama / çağrıyı geri düzeltin +```python +import struct, ida_bytes + +def patch_direct(ea, target, is_call=False): +op = 0xE8 if is_call else 0xE9 # CALL rel32 or JMP rel32 +disp = target - (ea + 5) & 0xFFFFFFFF +ida_bytes.patch_bytes(ea, bytes([op]) + struct.pack('