Malware Analysis

Tip

AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE) Değerlendirme yolları (ARTA/GRTA/AzRTA) ve Linux Hacking Expert (LHE) için tam HackTricks Training kataloğuna göz atın.

HackTricks'i Destekleyin

Adli Bilişim CheatSheets

https://www.jaiminton.com/cheatsheet/DFIR/#

Online Servisler

Offline Antivirus ve Detection Araçları

Yara

Install

sudo apt-get install -y yara

Kuralları hazırlayın

Tüm yara malware kurallarını github’dan indirmek ve birleştirmek için bu script’i kullanın: https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9
rules dizinini oluşturun ve bunu çalıştırın. Bu, tüm malware için yara kurallarını içeren malware_rules.yar adlı bir dosya oluşturacaktır.

wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
mkdir rules
python malware_yara_rules.py

Tarama

yara -w malware_rules.yar image  #Scan 1 file
yara -w malware_rules.yar folder #Scan the whole folder

YaraGen: Malware olup olmadığını kontrol et ve kurallar oluştur

Binary’den yara rules oluşturmak için YaraGen aracını kullanabilirsiniz. Şu eğitimlere göz atın: Part 1, Part 2, Part 3

python3 yarGen.py --update
python3.exe yarGen.py --excludegood -m  ../../mals/

ClamAV

Kurulum

sudo apt-get install -y clamav

Tarama

sudo freshclam      #Update rules
clamscan filepath   #Scan 1 file
clamscan folderpath #Scan the whole folder

Capa

Capa, executable’lerde potansiyel olarak kötü amaçlı capabilities tespit eder: PE, ELF, .NET. Bu yüzden Att&ck tactics veya şu tür şüpheli capabilities gibi şeyleri bulur:

  • OutputDebugString hatasını kontrol et
  • bir service olarak çalış
  • process oluştur

Bunu Github repo üzerinden edinin.

IOCs

IOC, Indicator Of Compromise anlamına gelir. Bir IOC, potansiyel olarak istenmeyen bir yazılımı veya doğrulanmış malware’i tanımlayan koşullar kümesidir. Blue Teams bu tür tanımları, kendi sistemlerinde ve ağlarında bu tür kötü amaçlı dosyaları aramak için kullanır.
Bu tanımları paylaşmak çok faydalıdır; çünkü bir bilgisayarda malware tespit edilip o malware için bir IOC oluşturulduğunda, diğer Blue Teams bunu malware’i daha hızlı tespit etmek için kullanabilir.

IOC oluşturmak veya değiştirmek için bir araç IOC Editor.
Bir cihazda tanımlanmış IOCs’leri aramak için Redline gibi araçları kullanabilirsiniz.

Loki

Loki, Simple Indicators of Compromise için bir tarayıcıdır.
Tespit, dört detection methoduna dayanır:

1. File Name IOC
Regex match on full file path/name

2. Yara Rule Check
Yara signature matches on file data and process memory

3. Hash Check
Compares known malicious hashes (MD5, SHA1, SHA256) with scanned files

4. C2 Back Connect Check
Compares process connection endpoints with C2 IOCs (new since version v.10)

Linux Malware Detect

Linux Malware Detect (LMD) Linux için GNU GPLv2 lisansı altında yayımlanan, paylaşımlı barındırma ortamlarında karşılaşılan tehditler etrafında tasarlanmış bir malware tarayıcısıdır. Ağ kenarı intrusion detection systems’ten gelen tehdit verilerini kullanarak saldırılarda aktif olarak kullanılan malware’i çıkarır ve tespit için signature’lar üretir. Buna ek olarak, tehdit verileri LMD checkout özelliği ve malware topluluk kaynakları aracılığıyla kullanıcı gönderimlerinden de elde edilir.

rkhunter

rkhunter gibi araçlar, filesystem üzerinde olası rootkit’leri ve malware’i kontrol etmek için kullanılabilir.

sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]

FLOSS

FLOSS farklı teknikler kullanarak executable içindeki obfuscated string’leri bulmaya çalışan bir araçtır.

PEpper

PEpper executable içindeki bazı temel şeyleri (binary data, entropy, URLs ve IPs, bazı yara rules) kontrol eder.

PEstudio

PEstudio Windows executable’ları hakkında imports, exports, headers gibi bilgiler almayı sağlayan bir araçtır, ayrıca virus total’ı kontrol eder ve potansiyel Att&ck techniques bulur.

Detect It Easy(DiE)

DiE bir dosyanın encrypted olup olmadığını tespit etmek ve ayrıca packers bulmak için kullanılan bir araçtır.

NeoPI

NeoPI metin/script dosyaları içindeki obfuscated ve encrypted içeriği tespit etmek için çeşitli statistical methods kullanan bir Python scriptidir. NeoPI’nin amaçlanan kullanım amacı, gizli web shell code tespitine yardımcı olmaktır.

php-malware-finder

PHP-malware-finder obfuscated/dodgy code ile birlikte PHP fonksiyonlarını sıkça kullanan malwares/webshell dosyalarını tespit etmek için elinden gelenin en iyisini yapar.

Apple Binary Signatures

Bazı malware sample’ları kontrol ederken, binary’nin signature’ını her zaman check etmelisiniz; çünkü onu imzalamış olan developer zaten malware. ile related olabilir.

#Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"

#Check if the app’s contents have been modified
codesign --verify --verbose /Applications/Safari.app

#Check if the signature is valid
spctl --assess --verbose /Applications/Safari.app

Detection Techniques

File Stacking

Eğer bir web sunucusunun dosyalarını içeren bir klasörün en son belirli bir tarihte güncellendiğini biliyorsanız. Web sunucusundaki tüm dosyaların oluşturulma ve değiştirilme tarihlerini kontrol edin ve herhangi bir tarih şüpheliyse, o dosyayı inceleyin.

Baselines

Bir klasördeki dosyalar değiştirilmemiş olmalıysa, klasördeki orijinal dosyaların hash değerini hesaplayıp bunları mevcut olanlarla karşılaştırabilirsiniz. Değiştirilmiş olan her şey şüpheli olacaktır.

Statistical Analysis

Bilgiler loglarda saklanıyorsa, her bir web sunucusu dosyasına kaç kez erişildiği gibi istatistikleri kontrol edebilirsiniz, çünkü bir web shell bunların en çok görülenlerinden biri olabilir.


Android in-app native telemetry (no root)

Android’de, diğer JNI libs initialize olmadan önce küçük bir logger library’yi preload ederek hedef app process içinde native code’u instrument edebilirsiniz. Bu, system-wide hooks veya root olmadan native davranışa erken görünürlük sağlar. Popüler bir yaklaşım SoTap’tir: doğru ABI için libsotap.so’yu APK içine ekleyin ve erken bir aşamada System.loadLibrary(“sotap”) çağrısı inject edin (ör. static initializer veya Application.onCreate), ardından logları internal/external paths ya da Logcat fallback üzerinden toplayın.

Kurulum detayları ve log paths için Android native reversing sayfasına bakın:

Reversing Native Libraries


Android/JNI native string deobfuscation with angr + Ghidra

Bazı Android malware ve RASP-protected apps, JNI method names ve signatures bilgilerini RegisterNatives çağırmadan önce runtime’da decode ederek gizler. Frida/ptrace instrumentation anti-debug nedeniyle öldürülüyorsa, yine de plaintext’i offline olarak binary içindeki decoder’ı angr ile çalıştırıp sonra sonuçları comments olarak Ghidra’ya geri aktararak elde edebilirsiniz.

Temel fikir: .so içindeki decoder’ı çağrılabilir bir function olarak ele alın, .rodata içindeki obfuscated byte blobs üzerinde çalıştırın ve çıktıyı ilk \x00’a kadar (C-string terminator) somutlaştırın. Address mismatches’ten kaçınmak için angr ve Ghidra’nın aynı image base’i kullandığından emin olun.

Workflow overview

  • Ghidra’da triage: decoder’ı ve JNI_OnLoad ile RegisterNatives setup içindeki calling convention/arguments yapısını belirleyin.
  • angr (CPython3) çalıştırın: her target string için decoder’ı execute edin ve sonuçları dump edin.
  • Ghidra’da annotate edin: hızlı JNI reconstruction için decoded strings’i her call site’ta auto-comment olarak ekleyin.

Ghidra triage (JNI_OnLoad pattern)

  • Ghidra’nın JNINativeMethod structures’ı tanıması için JNI datatypes’ını JNI_OnLoad’a uygulayın.
  • Oracle docs’a göre tipik JNINativeMethod:
typedef struct {
char *name;      // e.g., "nativeFoo"
char *signature; // e.g., "()V", "()[B"
void *fnPtr;     // native implementation address
} JNINativeMethod;
  • RegisterNatives çağrılarını arayın. Eğer library name/signature’ı local bir routine ile (ör. FUN_00100e10) oluşturuyorsa ve bu rutin static byte table’a (ör. DAT_00100bf4) referans veriyor ve (encoded_ptr, out_buf, length) gibi parameters alıyorsa, bu offline execution için ideal bir hedeftir.

angr setup (execute the decoder offline)

  • .so’yu Ghidra’da kullanılan aynı base ile yükleyin (örnek: 0x00100000) ve state’i küçük tutmak için external libs’lerin auto-loading’ini devre dışı bırakın.
angr setup and offline decoder execution ```python import angr, json

project = angr.Project( ‘/path/to/libtarget.so’, load_options={‘main_opts’: {‘base_addr’: 0x00100000}}, auto_load_libs=False, )

ENCODING_FUNC_ADDR = 0x00100e10 # decoder function discovered in Ghidra

def decode_string(enc_addr, length):

fresh blank state per evaluation

st = project.factory.blank_state() outbuf = st.heap.allocate(length) call = project.factory.callable(ENCODING_FUNC_ADDR, base_state=st) ret_ptr = call(enc_addr, outbuf, length) # returns outbuf pointer rs = call.result_state raw = rs.solver.eval(rs.memory.load(ret_ptr, length), cast_to=bytes) return raw.split(b’\x00’, 1)[0].decode(‘utf-8’, errors=‘ignore’)

Example: decode a JNI signature at 0x100933 of length 5 → should be ()[B

print(decode_string(0x00100933, 5))

</details>

- Ölçekte, çağrı noktalarının decoder’ın argümanlarına (encoded_ptr, size) statik bir haritasını oluşturun. Wrapper’lar argümanları gizleyebilir, bu yüzden API recovery gürültülüyse bu eşlemeyi Ghidra xrefs’ten manuel olarak oluşturabilirsiniz.

<details>
<summary>angr ile birden fazla çağrı noktasını toplu çöz</summary>
```python
# call_site -> (encoded_addr, size)
call_site_args_map = {
0x00100f8c: (0x00100b81, 0x41),
0x00100fa8: (0x00100bca, 0x04),
0x00100fcc: (0x001007a0, 0x41),
0x00100fe8: (0x00100933, 0x05),
0x0010100c: (0x00100c62, 0x41),
0x00101028: (0x00100c15, 0x16),
0x00101050: (0x00100a49, 0x101),
0x00100cf4: (0x00100821, 0x11),
0x00101170: (0x00100940, 0x101),
0x001011cc: (0x0010084e, 0x13),
0x00101334: (0x001007e9, 0x0f),
0x00101478: (0x0010087d, 0x15),
0x001014f8: (0x00100800, 0x19),
0x001015e8: (0x001008e6, 0x27),
0x0010160c: (0x00100c33, 0x13),
}

decoded_map = { hex(cs): decode_string(enc, sz)
for cs, (enc, sz) in call_site_args_map.items() }

import json
print(json.dumps(decoded_map, indent=2))
with open('decoded_strings.json', 'w') as f:
json.dump(decoded_map, f, indent=2)

Ghidra’da call sites’i annotate et Option A: Jython-only comment writer (önceden hesaplanmış bir JSON kullan)

  • angr CPython3 gerektirdiği için, deobfuscation ve annotation işlemlerini ayrı tut. Önce yukarıdaki angr script’ini çalıştırarak decoded_strings.json üret. Sonra her call site’ta PRE_COMMENT yazmak için bu Jython GhidraScript’i çalıştır (ve context için caller function name’i de dahil et):
decoded JNI strings'i annotate etmek için Ghidra Jython script'i ```python #@category Android/Deobfuscation # Jython in Ghidra 10/11 import json from ghidra.program.model.listing import CodeUnit

Ask for the JSON produced by the angr script

f = askFile(‘Select decoded_strings.json’, ‘Load’) mapping = json.load(open(f.absolutePath, ‘r’)) # keys as hex strings

fm = currentProgram.getFunctionManager() rm = currentProgram.getReferenceManager()

Replace with your decoder address to locate call-xrefs (optional)

ENCODING_FUNC_ADDR = 0x00100e10 enc_addr = toAddr(ENCODING_FUNC_ADDR)

callsite_to_fn = {} for ref in rm.getReferencesTo(enc_addr): if ref.getReferenceType().isCall(): from_addr = ref.getFromAddress() fn = fm.getFunctionContaining(from_addr) if fn: callsite_to_fn[from_addr.getOffset()] = fn.getName()

Write comments from JSON

for k_hex, s in mapping.items(): cs = int(k_hex, 16) site = toAddr(cs) caller = callsite_to_fn.get(cs, None) text = s if caller is None else ‘%s @ %s’ % (s, caller) currentProgram.getListing().setComment(site, CodeUnit.PRE_COMMENT, text) print(‘[+] Annotated %d call sites’ % len(mapping))

</details>

Option B: Single CPython script via pyhidra/ghidra_bridge
- Alternatif olarak, aynı angr çalıştıran CPython prosesinden Ghidra’nın API’sini sürmek için pyhidra veya ghidra_bridge kullanın. Bu, ara dosya olmadan decode_string() çağırmayı ve hemen PRE_COMMENTs ayarlamayı sağlar. Mantık Jython scripti ile aynıdır: ReferenceManager üzerinden callsite→function map oluşturun, angr ile decode edin ve comments ayarlayın.

Why this works and when to use it
- Offline execution, RASP/anti-debug’i baypas eder: strings’i kurtarmak için ptrace veya Frida hooks gerekmez.
- Ghidra ve angr base_addr değerlerini hizalı tutmak (ör. 0x00100000), function/data addresses’lerin araçlar arasında eşleşmesini sağlar.
- Decoder’lar için tekrarlanabilir tarif: transform’u saf bir function olarak ele alın, fresh bir state içinde bir output buffer allocate edin, (encoded_ptr, out_ptr, len) ile çağırın, sonra state.solver.eval ile concretize edin ve C-strings’i \x00’a kadar parse edin.

Notes and pitfalls
- Target ABI/calling convention’e uyun. angr.factory.callable arch’e göre birini seçer; arguments kaymış görünüyorsa cc’yi açıkça belirtin.
- Decoder sıfırlanmış output buffers bekliyorsa, çağrıdan önce state içinde outbuf’u zeros ile initialize edin.
- Position-independent Android .so için, angr içindeki addresses’in Ghidra’da görülenlerle eşleşmesi için her zaman base_addr sağlayın.
- App decoder’ı ince stubların arkasına sarsa bile call-xrefs’i listelemek için currentProgram.getReferenceManager() kullanın.

angr basics için bkz: [angr basics](../../reversing/reversing-tools-basic-methods/angr/README.md)

---

## Dinamik Control-Flow’un (JMP/CALL RAX Dispatchers) Obfuscation’ını Çözme

Modern malware aileleri Control-Flow Graph (CFG) obfuscation’ını yoğun biçimde kötüye kullanır: doğrudan bir jump/call yerine destination’ı run-time’da hesaplar ve `jmp rax` veya `call rax` çalıştırırlar. CPU `ZF`/`CF` flags’lerine bağlı olarak final target’ı ayarlayan küçük bir *dispatcher* (genellikle dokuz instructions), static CFG recovery’yi tamamen bozar.

SLOW#TEMPEST loader tarafından gösterilen teknik, yalnızca IDAPython ve Unicorn CPU emulator’üne dayanan üç adımlı bir workflow ile etkisiz hale getirilebilir.

### 1. Tüm indirect jump / call’ları 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. Dağıtıcı byte-code’unu çıkarın

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)

Unicorn ile iki kez emüle et

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. Bir doğrudan jump / call geri yaması yapın

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('<I', disp))

Yama sonrası, tam CFG ve Hex-Rays çıktısı geri gelsin diye IDA’yı fonksiyonu yeniden analiz etmeye zorlayın:

import ida_auto, idaapi
idaapi.reanalyze_function(idc.get_func_attr(ea, idc.FUNCATTR_START))

5. Dolaylı API çağrılarını etiketleyin

Her call rax ifadesinin gerçek hedefi bilindiğinde, IDA’ya bunun ne olduğunu söyleyebilirsiniz; böylece parametre türleri ve değişken adları otomatik olarak geri kazanılır:

idc.set_callee_name(call_ea, resolved_addr, 0)  # IDA 8.3+

Pratik faydalar

  • Gerçek CFG’yi geri yükler → decompilation 10 satırdan binlerce satıra çıkar.
  • string-cross-reference ve xrefs etkinleşir, bu da davranışın yeniden oluşturulmasını önemsiz hale getirir.
  • Scriptler yeniden kullanılabilir: onları aynı trick ile korunan herhangi bir loader içine bırakın.

AutoIt-based loader’lar: .a3x decryption, Task Scheduler masquerade ve RAT injection

Bu intrusion pattern, imzalı bir MSI, .a3x’e derlenmiş AutoIt loader’ları ve masum bir uygulama gibi davranan bir Task Scheduler job’ını zincirler.

MSI → custom actions → AutoIt orchestrator

MSI custom actions tarafından yürütülen process tree ve komutlar:

  • MsiExec.exe → install.bat’i çalıştırmak için cmd.exe
  • Sahte bir error dialog göstermek için WScript.exe
%SystemRoot%\system32\cmd.exe /c %APPDATA%\스트레스 클리어\install.bat
%SystemRoot%\System32\WScript.exe %APPDATA%\스트레스 클리어\error.vbs

install.bat (loader bırakır, persistence ayarlar, kendini temizler):

@echo off
set dr=Music

copy "%~dp0AutoIt3.exe" %public%\%dr%\AutoIt3.exe
copy "%~dp0IoKlTr.au3" %public%\%dr%\IoKlTr.au3

cd /d %public%\%dr% & copy c:\windows\system32\schtasks.exe hwpviewer.exe ^
& hwpviewer /delete /tn "IoKlTr" /f ^
& hwpviewer /create /sc minute /mo 1 /tn "IoKlTr" /tr "%public%\%dr%\AutoIt3.exe %public%\%dr%\IoKlTr.au3"

del /f /q "%~dp0AutoIt3.exe"
del /f /q "%~dp0IoKlTr.au3"
del /f /q "%~f0"

error.vbs (kullanıcı yem):

MsgBox "현재 시스템 언어팩과 프로그램 언어팩이 호환되지 않아 실행할 수 없습니다." & vbCrLf & _
"설정에서 한국어(대한민국) 언어팩을 설치하거나 변경한 뒤 다시 실행해 주세요.", _
vbCritical, "언어팩 오류"

Anahtar artefaktlar ve masquerade:

  • AutoIt3.exe ve IoKlTr.au3 dosyalarını C:\Users\Public\Music konumuna bırakır
  • schtasks.exe dosyasını hwpviewer.exe olarak kopyalar (Hangul Word Processor viewer olarak masquerade eder)
  • Her 1 dakikada bir çalışan “IoKlTr” adlı bir scheduled task oluşturur
  • Startup LNK, Smart_Web.lnk olarak görülür; mutex: Global\AB732E15-D8DD-87A1-7464-CE6698819E701
  • Modülleri %APPDATA%\Google\Browser\ alt klasörlerinde, içinde adb veya adv bulunan dizinlere yerleştirir ve bunları autoit.vbs/install.bat yardımcıları üzerinden başlatır

Adli ön inceleme ipuçları:

  • schtasks envanteri: schtasks /query /fo LIST /v | findstr /i "IoKlTr hwpviewer"
  • Task XML ile aynı konumda bulunan yeniden adlandırılmış schtasks.exe kopyalarını arayın: dir /a "C:\Users\Public\Music\hwpviewer.exe"
  • Yaygın yollar: C:\Users\Public\Music\AutoIt3.exe, ...\IoKlTr.au3, Startup Smart_Web.lnk, %APPDATA%\Google\Browser\(adb|adv)*
  • Process creation korelasyonu: AutoIt3.exe’nin temizmgr.exe, hncfinder.exe gibi meşru Windows binary’lerini başlatması

AutoIt yükleyicileri ve .a3x payload decryption → injection

  • AutoIt modülleri #AutoIt3Wrapper_Outfile_type=a3x ile derlenir ve benign süreçlere inject etmeden önce gömülü payload’ları decrypt eder.
  • Gözlemlenen aileler: QuasarRAT (hncfinder.exe içine inject edilir) ve RftRAT/RFTServer (cleanmgr.exe içine inject edilir), ayrıca RemcosRAT modülleri (Remcos\RunBinary.a3x).
  • Decryption paterni: HMAC ile bir AES anahtarı türetin, gömülü blob’u decrypt edin, ardından plaintext modülü inject edin.

Genel decryption iskeleti (tam HMAC girdisi/algoritması aileye özeldir):

import hmac, hashlib
from Crypto.Cipher import AES

def derive_aes_key(secret: bytes, data: bytes) -> bytes:
# Example: HMAC-SHA256 → first 16/32 bytes as AES key
return hmac.new(secret, data, hashlib.sha256).digest()

def aes_decrypt_cbc(key: bytes, iv: bytes, ct: bytes) -> bytes:
return AES.new(key, AES.MODE_CBC, iv=iv).decrypt(ct)

Common injection flow (CreateRemoteThread-style):

  • CreateProcess (suspended) of the target host (e.g., cleanmgr.exe)
  • VirtualAllocEx + WriteProcessMemory with decrypted module/shellcode
  • CreateRemoteThread or QueueUserAPC to execute payload

Hunting ideas

  • AutoIt3.exe parented by MsiExec.exe or WScript.exe spawning system utilities
  • Files with .a3x extensions or AutoIt script runners under public/user-writable paths
  • Suspicious scheduled tasks executing AutoIt3.exe or binaries not signed by Microsoft, with minute-level triggers

Android Find My Device (Find Hub) hesap ele geçirme kötüye kullanımı

Windows sızması sırasında, operatörler çalınan Google kimlik bilgilerini kullanarak kurbanın Android cihazlarını tekrar tekrar sıfırladı; bu sırada, kurbanın oturum açmış masaüstü messenger’ı üzerinden erişimi genişletirken bildirimleri bastırdılar.

Operatör adımları (oturum açılmış bir tarayıcı oturumundan):

  • Google Account → Security → Your devices incele; Find My Phone → Find Hub (https://www.google.com/android/find) yolunu izle
  • Cihazı seç → Google şifresini yeniden gir → “Erase device” uygula (fabrika ayarı sıfırlama); kurtarmayı geciktirmek için bunu tekrarla
  • İsteğe bağlı: güvenlik bildirimlerini gizlemek için bağlı posta kutusundaki (örn. Naver) uyarı e-postalarını sil

Ağır şekilde obfuscate edilmiş Node.js loader’larını izleme

Saldırganlar giderek JavaScript loader’ları nexe ile derlenmiş bağımsız Windows binary’lerin içine paketliyor; böylece runtime script ile birlikte geliyor. Ortaya çıkan PE genellikle 60–90 MB olur ve Node.js yüklü olmasa bile çalışır. Triyaj sırasında:

  • Gömülü JavaScript’i PE içinden ayıklamak ve statik diffing için yerel araçlara vermek üzere nexe_unpacker kullan.
  • %TEMP% içinde disk tabanlı bir mutex bekle (GachiLoader rastgele bir <name>.lock dosyası bırakır ve bu dosya yaklaşık 5 dakika sonra süresi dolur). Dosyayı çalıştırmadan önce sandbox’a kopyalamak, sonraki payload’ları hâlâ görürken gereksiz aşamaları atlamanı sağlar.

Anti-analysis’i yenmek için Node.js API tracing

Check Point’in Nodejs-Tracer aracı, herhangi bir Node.js prosesinin içindeki core module’ları hook’lar, anti-VM kontrollerini spoof etmeni sağlar ve örneğin yazdığı her artifact’i korur. Analyst-controlled instrumentation’ı call stack’te tutmak için obfuscate edilmiş script’leri tracer üzerinden başlat:

node -r .\tracer.js main.js

Key configuration toggles inside tracer.js allow you to:

  • Dosya sistemi, child-process ve HTTP aktivitelerini loglamak (LOG_HTTP_REQUESTS, SAVE_FILE_WRITES). Atılan her dosya—örneğin kidkadi.node—malware silmeden önce working directory’ye kopyalanır.
  • Environment fingerprint’lerini gerçekçi RAM/CPU sayıları döndürerek, tasklist çıktısını taklit ederek ve PowerShell/WMI cevaplarını manipüle ederek override etmek. Bu, ≥4 GB RAM, ≥2 core isteyen ve kullanıcı adlarını (mashinesssss, wdagutilityaccount, vb.), hostnames (desktop-vrsqlag, server1 …) ve process adlarını (vmtoolsd.exe, fiddler.exe, x64dbg.exe, frida-server.exe) inceleyen loaders’ları bypass eder.
  • Get-WmiObject Win32_DiskDrive gibi WMI hardware kontrollerini etkisizleştirmek (vmware, kvm, virtio, … arayan), Win32_VideoController (“VirtualBox Graphics Adapter”, “Hyper-V Video”, vb. engelleyen) ve Win32_PortConnector sayımlarını etkisizleştirmek. Bu probe’lar “gerçek” hardware raporladığında, sandboxes artık GachiLoader’ın analysis time’ı boşa harcamak için linkedin.com, grok.com, whatsapp.com ve benzeri domain’lere yaptığı sonsuz benign Invoke-WebRequest döngüsüne takılmaz.

Gated C2 trafiğini otomatik yakalama

Tracer’ın network hook’ları, JavaScript obfuscation’ı reverse etmeden çok katmanlı C2 authentication’ı açığa çıkarır. Gözlemlenen campaign’de loader:

  1. Her hard-coded C2’ye host telemetry’yi /log ile POST eder.
  2. Base64-encoded payload URL’sini almak için X-Secret: gachifamily ile GET /richfamily/<per-sample key> isteği yapar.
  3. O URL’ye uzun, sample başına değişen bir X-Secret header’ı ile final GET atar; bu header eksikse 403 Forbidden döner.

Tracer tam request’leri (headers, bodies, destinations) kaydettiği için, payload’ları çekmek, Themida/VMProtect shells’i memory’de dump etmek ve Rhadamanthys configuration verisini scale ederek çıkarmak için aynı trafiği replay edebilirsiniz.

AdaptixC2: Configuration Extraction and TTPs

Ayrı sayfaya bakın:

Adaptixc2 Config Extraction And Ttps

Kimwolf Android Botnet Tradecraft

TV box’larda APK loader & native ELF execution

  • com.n2.systemservice06* gibi malicious APK’ler, res/raw içinde statically linked ARM ELF taşır (ör. R.raw.libniggakernel). Bir BOOT_COMPLETED receiver startup’ta çalışır, raw resource’u app sandbox’ına çıkarır (ör. /data/data/<pkg>/niggakernel), executable yapar ve su ile çağırır.
  • Birçok Android TV box/tablet, önceden root’lu image’lar veya world-writable su ile gelir; bu yüzden loader, exploit chain olmadan bile ELF’i güvenilir şekilde UID 0 ile boot eder. Persistence “bedava” gelir; çünkü receiver her reboot veya app restart sonrası yeniden başlar.
  • Bu pattern’i avlayan reverse engineer’ler, AndroidManifest.xml içinde gizli boot receiver’lar ile Resources.openRawResourceFileOutputStreamRuntime.getRuntime().exec("su") referanslayan code’ları diff edebilir. ELF düştüğünde, onu Linux userland backdoor olarak triage edin (Kimwolf UPX-packed, stripped, statically linked, 32-bit ARM EABI5).

Runtime mutexes & masquerading IOCs

  • Start sırasında Kimwolf, @niggaboxv4/@niggaboxv5 gibi bir abstract UNIX domain socket bağlar. Var olan socket’ler exit’e zorlar; bu yüzden socket adı hem mutex hem de forensic artifact olarak çalışır.
  • Process title, Android process listing’lerine karışmak için service benzeri adlarla (netd_services, tv_helper, vb.) üzerine yazılır. Host-based detections, bu adları mutex socket ile birlikte alarm üretecek şekilde izleyebilir.

Stack XOR string decoding with ARM NEON + flare_emu

  • Hassas strings (C2 domains, resolvers, DoT endpoints) stack üzerine encrypted 8-byte blocks halinde itilip VEOR Qx, Qx, Qy (veorq_s64) ile yerinde decode edilir. Analistler, decryptor bunları caller’a her verdiğinde decrypted pointer’ı yakalamak için flare_emu scriptleyebilir:
import flare_emu

eh = flare_emu.EmuHelper()

def hook(eh, addr, argv, _):
if eh.isValidEmuPtr(argv[1]):
print(hex(addr), eh.getEmuString(argv[1]))

eh.iterate(0x8F00, hook)  # sub_8F00 consumes the plaintext R1 argument
  • VEOR Q8, Q8, Q9 / veorq_s64 dizilerini aramak ve bunların aralıklarını emüle etmek, çözülen her stringi topluca döker ve plaintext’in stack-only ömrünü aşar.

DNS-over-TLS çözümlemesi ve XOR IP türetme

  • Tüm Kimwolf varyantları, C2 domainlerini DNS-over-TLS (TCP/853) ile doğrudan Google (8.8.8.8) veya Cloudflare (1.1.1.1) üzerinden çözer; böylece düz DNS logging veya hijacking etkisiz kalır.
  • v4 botları yalnızca dönen IPv4 A record’u kullanır. v5 botları A record’u 32-bit integer olarak ele alır, endianness’ini değiştirir, bunu 0x00ce0491 sabitiyle XOR’lar, ardından gerçek C2 IP’sini elde etmek için endianness’i tekrar tersine çevirir. CyberChef recipe: Change IP format → swap endianness per 4-byte chunk → XOR with 00 ce 04 91 → convert back to dotted decimal.

ENS / EtherHiding fallback

  • Daha sonraki build’ler, resolver text key "lol" içinde zararsız görünen bir IPv6 (fed0:5dec:...:1be7:8599) saklayan bir ENS domaini (pawsatyou.eth) ekler.
  • Bot son dört baytı (1b e7 85 99) alır, bunları 0x93141715 ile XOR’lar ve sonucu bir IPv4 C2 (136.243.146.140) olarak yorumlar. ENS text record’unu güncellemek, DNS’e dokunmadan blockchain üzerinden downstream C2’leri anında değiştirir.

TLS + ECDSA authenticated command channel

  • Traffic, özel bir framed protocol ile wolfSSL içinde encapsulate edilir:
struct Header {
Magic    [4]byte // e.g. "DPRK", "FD9177FF", "AD216CD4"
Reserved uint8   // 0x01
MsgType  uint8   // verb
MsgID    uint32
BodyLen  uint32
CRC32    uint32
}
  • Bootstrap: bot iki boş MsgType=0 (register) header gönderir. C2, rastgele bir challenge ve bir ASN.1 DER ECDSA imzası içeren MsgType=1 (verify) ile yanıt verir. Botlar bunu embedded bir SubjectPublicKeyInfo blob’una karşı doğrular; başarısızlıklar oturumu sonlandırır ve ele geçirilmiş/sinkholed C2 node’larının fleet’i task etmesini engeller.
  • Doğrulama tamamlanınca bot, operatör tarafından tanımlanan group string’i taşıyan bir MsgType=0 body gönderir (ör. android-postboot-rt). Grup etkinse C2, ardından tasking’in (MsgType 5–12) başladığı MsgType=2 (confirm) ile yanıt verir.
  • Desteklenen verbs arasında SOCKS-style TCP/UDP proxying (residential proxy monetization), reverse shell / single command exec, file read/write ve Mirai-compatible DDoSBody payload’ları (aynı AtkType, Duration, Targets[], Flags[] layout) bulunur.

Partial-encryption ransomware: kaybolan stream-cipher nonce’ları

Bazı ransomware family’leri hız için dosyaları kısmen encrypt eder, ancak bir stream cipher’ı birden fazla chunk üzerinde bağımsız kullanırlarsa, her encrypted region’ın kendi kalıcı nonce/IV’si gerekir. Eğer sample her chunk için yeni bir nonce üretip loop içinde aynı 12-byte buffer’ı overwrite ediyor ve disk’e yalnızca son değeri append ediyorsa, önceki chunk’lar saldırgan sonradan key’i paylaşsa bile cryptographically unrecoverable hale gelir.

Tipik bozuk pattern:

for (i = 0; i < 4; i++) {
randombytes_buf(nonce, 12);                // same buffer reused each round
crypto_stream_chacha20_ietf_xor(chunk, chunk, len, nonce, key);
}
write(fd, nonce, 12);                          // only the last nonce survives

References

Tip

AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE) Değerlendirme yolları (ARTA/GRTA/AzRTA) ve Linux Hacking Expert (LHE) için tam HackTricks Training kataloğuna göz atın.

HackTricks'i Destekleyin