analyzing-linux-elf-malware について
不審なLinux ELFバイナリを調べるセキュリティ分析者向けのスキルです。静的検査、実行時トレース、逆アセンブル、永続化の確認を扱い、複数のLinuxアーキテクチャに対応する手順を示します。Windows PE解析は対象外です。
主な機能
- 01ELFヘッダーとバイナリ属性の検査
- 02文字列とインジケーターの抽出
- 03システムコールとライブラリ呼び出しの追跡
- 04GDBによる実行時デバッグ
- 05コードとLinuxの永続化機構の分析
活用シーン
- 01侵害されたLinuxサーバー上のマイナー調査
- 02ボットネットのネットワーク指標と挙動の特定
- 03コンテナやクラウド環境の不審なバイナリの調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill analyzing-linux-elf-malwareインストール後、Claude Code で/analyzing-linux-elf-malwareを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
Linux ELF マルウェアの分析
使用する場面
- Linux サーバーまたはコンテナーが侵害され、不審な ELF バイナリが見つかった場合
- Linux ボットネット(Mirai、Gafgyt、XorDDoS)、クリプトマイナー、ランサムウェアを分析する場合
- クラウドインフラストラクチャ、Docker コンテナー、Kubernetes ポッドを標的とするマルウェアを調査する場合
- Linux ルートキットやカーネルモジュールをリバースエンジニアリングする場合
- Linux x86_64、ARM、MIPS アーキテクチャ向けにコンパイルされたクロスプラットフォームマルウェアを分析する場合
Windows PE バイナリの分析には使用しないでください。Windows マルウェアには PEStudio、Ghidra、または IDA を使用してください。
前提条件
- 逆アセンブルと逆コンパイルに対応した Linux ELF サポートを備える Ghidra または IDA
- 開発ツールをインストールした Linux 分析用 VM(Ubuntu 22.04 を推奨)
- 動的解析とデバッグ用の strace、ltrace、GDB
- 静的検査用の GNU binutils に含まれる readelf、objdump、nm
- 迅速なバイナリの初期調査とスクリプトによる分析用の Radare2
- 分離されたコンテナー環境でマルウェアを実行するための Docker
ワークフロー
ステップ 1:ELF バイナリのプロパティを特定する
ELF ヘッダーと基本プロパティを調べます。
# File type identification
file suspect_binary
# Detailed ELF header analysis
readelf -h suspect_binary
# Section headers
readelf -S suspect_binary
# Program headers (segments)
readelf -l suspect_binary
# Symbol table (if not stripped)
readelf -s suspect_binary
nm suspect_binary 2>/dev/null
# Dynamic linking information
readelf -d suspect_binary
ldd suspect_binary 2>/dev/null # Only on matching architecture!
# Compute hashes
md5sum suspect_binary
sha256sum suspect_binary
# Check for packing/UPX
upx -t suspect_binary
# Python-based ELF analysis
from elftools.elf.elffile import ELFFile
import hashlib
with open("suspect_binary", "rb") as f:
data = f.read()
sha256 = hashlib.sha256(data).hexdigest()
with open("suspect_binary", "rb") as f:
elf = ELFFile(f)
print(f"SHA-256: {sha256}")
print(f"Class: {elf.elfclass}-bit")
print(f"Endian: {elf.little_endian and 'Little' or 'Big'}")
print(f"Machine: {elf.header.e_machine}")
print(f"Type: {elf.header.e_type}")
print(f"Entry Point: 0x{elf.header.e_entry:X}")
# Check if stripped
symtab = elf.get_section_by_name('.symtab')
print(f"Stripped: {'Yes' if symtab is None else 'No'}")
# Section entropy analysis
import math
from collections import Counter
for section in elf.iter_sections():
data = section.data()
if len(data) > 0:
entropy = -sum((c/len(data)) * math.log2(c/len(data))
for c in Counter(data).values() if c > 0)
if entropy > 7.0:
print(f" [!] High entropy section: {section.name} ({entropy:.2f})")
ステップ 2:文字列と指標を抽出する
埋め込まれた IOC と機能の手がかりを検索します。
# ASCII strings
strings suspect_binary > strings_output.txt
# Search for network indicators
grep -iE "(http|https|ftp)://" strings_output.txt
grep -iE "([0-9]{1,3}\.){3}[0-9]{1,3}" strings_output.txt
grep -iE "[a-zA-Z0-9.-]+\.(com|net|org|io|ru|cn)" strings_output.txt
# Search for shell commands
grep -iE "(bash|sh|wget|curl|chmod|/tmp/|/dev/)" strings_output.txt
# Search for crypto mining indicators
grep -iE "(stratum|xmr|monero|pool\.|mining)" strings_output.txt
# Search for SSH/credential theft
grep -iE "(ssh|authorized_keys|id_rsa|shadow|passwd)" strings_output.txt
# Search for persistence mechanisms
grep -iE "(crontab|systemd|init\.d|rc\.local|ld\.so\.preload)" strings_output.txt
# FLOSS for obfuscated strings (if available)
floss suspect_binary
ステップ 3:システムコールとライブラリの使用状況を分析する
マルウェアが使用するシステムコールとライブラリを特定します。
# List imported functions (dynamically linked)
readelf -r suspect_binary | grep -E "socket|connect|exec|fork|open|write|bind|listen"
# Trace system calls during execution (in isolated VM only)
strace -f -e trace=network,process,file -o strace_output.txt ./suspect_binary
# Trace library calls
ltrace -f -o ltrace_output.txt ./suspect_binary
# Key system calls to watch:
# Network: socket, connect, bind, listen, accept, sendto, recvfrom
# Process: fork, execve, clone, kill, ptrace
# File: open, read, write, unlink, rename, chmod
# Persistence: inotify_add_watch (file monitoring)
ステップ 4:GDB で動的解析を行う
マルウェアをデバッグして、実行時の動作を観察します。
# Start GDB with the binary
gdb ./suspect_binary
# Set breakpoints on key functions
(gdb) break main
(gdb) break socket
(gdb) break connect
(gdb) break execve
(gdb) break fork
# Run and analyze
(gdb) run
(gdb) info registers # View register state
(gdb) x/20s $rdi # Examine string argument
(gdb) bt # Backtrace
(gdb) continue
# For stripped binaries, break on entry point
(gdb) break *0x400580 # Entry point from readelf
(gdb) run
# Monitor network connections during execution
# In another terminal:
ss -tlnp # List listening sockets
ss -tnp # List established connections
ステップ 5:Ghidra でリバースエンジニアリングを行う
ELF バイナリの詳細なコード分析を実行します。
Ghidra Analysis for Linux ELF:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. Import: File -> Import -> Select ELF binary
- Ghidra auto-detects ELF format and architecture
- Accept default analysis options
2. Key analysis targets:
- main() function (or entry point if stripped)
- Socket creation and connection functions
- Command dispatch logic (switch/case on received data)
- Encryption/encoding routines
- Persistence installation code
- Self-propagation/scanning functions
3. For Mirai-like botnets, look for:
- Credential list for brute-forcing (telnet/SSH)
- Attack module selection (UDP flood, SYN flood, ACK flood)
- Scanner module (port scanning for vulnerable devices)
- Killer module (killing competing botnets)
4. For cryptominers, look for:
- Mining pool connection (stratum protocol)
- Wallet address strings
- CPU/GPU utilization functions
- Process hiding techniques
ステップ 6:Linux 固有の永続化を分析する
永続化の仕組みを確認します。
# Check for LD_PRELOAD rootkit
strings suspect_binary | grep "ld.so.preload"
# Malware writing to /etc/ld.so.preload can hook all dynamic library calls
# Check for crontab persistence
strings suspect_binary | grep -i "cron"
# Check for systemd service creation
strings suspect_binary | grep -iE "systemd|\.service|systemctl"
# Check for init script creation
strings suspect_binary | grep -iE "init\.d|rc\.local|update-rc"
# Check for SSH key injection
strings suspect_binary | grep -i "authorized_keys"
# Check for kernel module (rootkit) loading
strings suspect_binary | grep -iE "insmod|modprobe|init_module"
# Check for process hiding
strings suspect_binary | grep -iE "proc|readdir|getdents"
主要な概念
| 用語 | 定義 |
|---|---|
| ELF(実行可能ファイルおよびリンク可能形式) | ヘッダー、セクション、セグメントを含む、Linux の実行可能ファイル、共有ライブラリ、コアダンプ向けの標準バイナリ形式 |
| シンボル削除済みバイナリ | デバッグシンボルを削除した ELF バイナリです。関数名が失われるため、リバースエンジニアリングがより困難になります |
| LD_PRELOAD | 他のすべてのライブラリより先に読み込む共有ライブラリを指定する Linux 環境変数です。ルートキットがシステムライブラリの呼び出しを傍受するために悪用します |
| strace | プロセスが実行するすべてのシステムコールとシグナルを記録し、ファイル、ネットワーク、プロセスの操作を明らかにする Linux システムコールトレーサーです |
| GOT/PLT | グローバルオフセットテーブルとプロシージャリンクテーブルです。動的リンクのための ELF 構造であり、関数フックに悪用される可能性があります |
| 静的リンク | すべてのライブラリコードを含めてコンパイルされたバイナリです。一致する共有ライブラリがないシステムで実行できるため、IoT マルウェアでよく使われます |
| Mirai | Telnet の総当たり攻撃で IoT デバイスを標的にする、広く知られた Linux ボットネットです。ソースコードが流出し、多数の亜種が生まれました |
ツールとシステム
- Ghidra:x86、x86_64、ARM、MIPS などの Linux アーキテクチャを完全にサポートする、NSA のリバースエンジニアリングツールです
- Radare2:迅速なバイナリ分析とスクリプト作成に使えるコマンドラインインターフェースを備えた、オープンソースのリバースエンジニアリングフレームワークです
- strace:ファイル、ネットワーク、プロセスの操作を含むバイナリの動作を観察するための、Linux システムコールトレースツールです
- GDB:ブレークポイントの設定、メモリの検査、Linux バイナリの実行のステップ実行に使う GNU デバッガーです
- pyelftools:自動分析パイプライン向けに、ELF ファイルをプログラムで解析する Python ライブラリです
よくあるシナリオ
シナリオ:侵害された Linux サーバーで見つかったクリプトマイナーの分析
コンテキスト:クラウドサーバーの CPU 使用率が 100%になっています。調査の結果、/tmp から不審な名前の未知のバイナリが実行されていることがわかりました。このバイナリを分析し、クリプトマイナーであることを確認して、攻撃者のウォレットとプールを特定する必要があります。
アプローチ:
- バイナリを分析用 VM にコピーし、SHA-256 ハッシュを計算します
fileとreadelfを実行して、アーキテクチャとリンク方式を特定します- 文字列を抽出し、マイニングプールのアドレス(stratum+tcp://)とウォレットアドレスを検索します
- サンドボックス内で strace を実行し、ネットワーク接続(マイニングプールへの接続)を観察します
- Ghidra にインポートし、マイニングアルゴリズムと設定の抽出方法を特定します
- 永続化の仕組み(crontab、systemd サービス、SSH キー)を確認します
- プールアドレス、ウォレット、アップデート用 C2、永続化の痕跡など、すべての IOC を記録します
注意点:
- サンドボックスの外でマルウェアに対して
lddを実行する(ldd はバイナリ内のコードを実行する可能性があります) - x86_64 での実行を試みる前に ARM/MIPS アーキテクチャかどうかを確認しない
- 永続化やクリーンアップを担う可能性のある付随スクリプト(.sh ファイル)を見落とす
- 初期侵入経路(マイナーがどのように展開されたか:SSH ブルートフォース、Web エクスプロイト、コンテナーエスケープ)を無視する
出力形式
LINUX ELF MALWARE ANALYSIS REPORT
====================================
File: /tmp/.X11-unix/.rsync
SHA-256: e3b0c44298fc1c149afbf4c8996fb924...
Type: ELF 64-bit LSB executable, x86-64
Linking: Statically linked (all libraries embedded)
Stripped: Yes
Size: 2,847,232 bytes
Packer: UPX 3.96 (unpacked for analysis)
CLASSIFICATION
Family: XMRig Cryptominer (modified)
Variant: Custom build with C2 update mechanism
FUNCTIONALITY
[*] XMR (Monero) mining via RandomX algorithm
[*] Stratum pool connection for work submission
[*] C2 check-in for configuration updates
[*] Process name masquerading (argv[0] = "[kworker/0:0]")
[*] Competitor process killing (kills other miners)
[*] SSH key injection for re-access
NETWORK INDICATORS
Mining Pool: stratum+tcp://pool.minexmr[.]com:4444
C2 Server: hxxp://update.malicious[.]com/config
Wallet: 49jZ5Q3b...Monero_Wallet_Address...
PERSISTENCE
[1] Crontab entry: */5 * * * * /tmp/.X11-unix/.rsync
[2] SSH key added to /root/.ssh/authorized_keys
[3] Systemd service: /etc/systemd/system/rsync-daemon.service
[4] Modified /etc/ld.so.preload for process hiding
PROCESS HIDING
LD_PRELOAD: /usr/lib/.libsystem.so
Hook: readdir() to hide /tmp/.X11-unix/.rsync from ls
Hook: fopen() to hide from /proc/*/maps reading
コメント
Markdown 対応