表層解析はこちら。
今回は!!
前回の表層解析編に続き、静的解析編です。
最初は地道に一つずつデコンパイル結果やMIPSアセンブリを読んでいましたが、X(旧twitter)でMCPをおすすめされたので使ってみたら、すごすぎました。
この凄さを共有したく、皆様の手元でやって欲しいのですが、malwareをそのまま公開・共有するわけにはいきませんので、今回はclaudeが作ってくれたレポートをそのまま貼り付けます。
僕自身、AIを使いすぎた勉強はあまり好きではなく、実際に手を動かしながら一つずつ理解したい派です。しかし、今回のレポートを見てみるとそうも行ってられないのかなと思うほどです。。。。。
一旦、これを手がかりに動的解析へ移行する予定。
勉強とAI仕様のバランスをうまく保ち、引き続き効率の良い勉強を進めていきたい。
以下AIがghidraMCPを使用して作成した静的解析結果。
マルウェア静的解析レポート
⚠️ 本レポートは静的解析のみの結果です。検体バイナリの実行・ネットワーク通信は一切行っていません。
動的解析を行う場合は、ネットワーク遮断された隔離環境(VM 等)で実施してください。
- 解析日: 2026-09-23
-
対象ファイル:
/home/takuramy/workspace/malware -
解析手法: Ghidra デコンパイル +
objdump(読み取りのみ)
1. 概要
captured した検体は MIPS 向け IoT DDoS ボット(Gafgyt / Qbot 系)。IRC 風のテキストコマンドを C2 から受信し、多彩な L4/L7 フラッド攻撃を実行する。SSH 経由での拡散機能も備える。
- ボット内部タグ:
VixaatiServices - パディング内の煽り文:
dayzddos.co runs you if you read this lol ...
2. ファイル情報
| 項目 | 値 |
|---|---|
| フォーマット | ELF 32-bit LSB executable |
| アーキテクチャ | MIPS, MIPS-I version 1 (SYSV) |
| リンク | 静的リンク(uClibc + LinuxThreads 同梱) |
| シンボル | not stripped |
| サイズ | 305,654 bytes |
| コンパイラ | GCC (GNU) 4.1.2 / 3.3.2 |
| SHA-256 | 7cc0b40e8819ec9139ffae5942add2db1c26e168edaeda57302c9047f23dfb6c |
| MD5 | d665e53e7c7d6f34e493c3e8b0f66fcc |
3. 実行フロー(main)
-
srandom()/init_rand()をtime() ^ getpid()でシード -
getOurIP()で自機 IP を取得(8.8.8.8へ UDP 接続してローカル IP を判定) -
二重
fork()+setsid()でデーモン化、chdir()、signal(SIGPIPE, SIG_IGN) -
initConnection()で C2 へ接続(失敗時は 5 秒間隔でリトライ) - 接続確立後、
Device Connected: %s | Port: %s | Arch: %sを C2 へ報告 -
recvLine()ループで C2 コマンドを受信 →!で始まる行をトークン化しprocessCmd()へディスパッチ - fork した攻撃用子プロセスを
waitpid()で刈り取り、pids配列を動的に再構築(ゾンビ回収 + プロセス数管理)
C2 接続(initConnection)
-
commServer配列から接続先を選択 -
host:port形式を:でパースし、ポート未指定時のデフォルトは 6982 (0x1b46) -
connectTimeout()によりタイムアウト 30 秒で TCP 接続
4. C2 / ネットワーク指標
| 項目 | 値 |
|---|---|
| C2 サーバ | 131.123.40.104:4444 |
| デフォルトポート | 6982 (0x1b46)(文字列に :port が無い場合のみ) |
| 自 IP 判定先 |
8.8.8.8(UDP) |
| Arch 報告 |
getArch() の戻り値 |
| "Port" 報告値 | 端末フィンガープリント(下記 getPortz) |
getPortz() の挙動(端末種別の推定)
以下のいずれかのファイル存在を access() で確認し、存在すれば "22"、いずれも無ければ "Unknown Port" を C2 へ報告する(実質的にターゲット端末の素性を通知)。
/usr/bin/python/usr/bin/python3/usr/bin/perl/usr/sbin/telnetd
5. 拡散機能
SSH 経由でペイロードを配布する亜種コマンドを内包:
sshpass -p '%s' ssh -o StrictHostKeyChecking=no %s@%s '%scd; python udp.py %s %s %s'
弱い / 既知の SSH 認証情報を用いて他ホストへログインし、python udp.py を投下・実行する構造。
6. コマンド体系(processCmd)
- 書式:
!<group> <COMMAND> <args...>(<group>はボット群セレクタ) -
argv[0]をstrcmpでコマンド名テーブル(.rodata0x432810~)と照合 - 引数解釈後、各攻撃は
fork()した子プロセスで並行実行
コマンド一覧
| コマンド | 分類 | 内部関数 / 備考 |
|---|---|---|
UDP |
L4 UDP flood | SendUDP |
UDPRAW |
L4 raw UDP | UDPRAW |
TCP |
L4 TCP flood | TCP 系 |
STD |
L4 flood | SendSTD |
RANDHEX |
L4 flood | ランダム hex ペイロード(Randhex) |
VSE |
Source Engine query flood |
vseattack(A2S、example.ulfheim.net を利用) |
HTTP-KO |
L7 HTTP flood | SendHTTPHex |
HTTPS-KTN |
L7 flood |
SendSTDHEX / stdhexflood / SendSTD / SendSTD_HEX
|
CF-KILL |
Cloudflare 迂回 |
SendCloudflare(/cdn-cgi/l/chk_captcha) |
NULL-CF |
Cloudflare 迂回 | SendHTTPCloudflare |
NFO-COM / NFO-KTN
|
HTTP flood | httpattack |
OVH-STORM |
対 OVH flood | SendOVH_STORM |
HIPER-OVH |
対 OVH flood | HIPER_OVH |
HOME-DOWN |
flood |
SendHOME1 / SendHOME2
|
GTAV / CSGO / TF2
|
ゲームサーバ狙い |
SendOVH_STORM 系にマッピング |
AG / HYDRA-KILL
|
flood | — |
KILLALLV3 |
攻撃/プロセス停止 | sendKILLALL |
STOP |
全攻撃停止 | 全子プロセスを kill |
補足: L7 攻撃には多数の正規ブラウザ・クローラの User-Agent 文字列がハードコードされており、リクエストごとにローテーションして検知を回避する。
7. 侵害指標(IOC)まとめ
ネットワーク
- C2:
131.123.40.104(TCP4444, フォールバック6982) - 自 IP 判定:
8.8.8.8への UDP
ファイル / ハッシュ
- SHA-256:
7cc0b40e8819ec9139ffae5942add2db1c26e168edaeda57302c9047f23dfb6c - MD5:
d665e53e7c7d6f34e493c3e8b0f66fcc
文字列アーティファクト
VixaatiServicesdayzddos.co runs you if you read this lol ...sshpass -p '%s' ssh -o StrictHostKeyChecking=no ... python udp.py ...- C2 報告フォーマット:
Device Connected: %s | Port: %s | Arch: %s
ホスト挙動
- 二重 fork +
setsidによるデーモン化 -
access()による/usr/bin/python{,3},/usr/bin/perl,/usr/sbin/telnetdの存在確認
8. 検知・対策の示唆
- C2 IP
131.123.40.104および ポート4444/6982宛の egress をファイアウォール/IDS でブロック・監視 - ハニーポット側で上記コマンドキーワード(
OVH-STORM,CF-KILL,HYDRA-KILL等)を含む TCP セッションを検知シグネチャ化 - SSH 総当り拡散に対し、鍵認証の強制 /
sshpass経由ログインの監視 - ハッシュ値をエンドポイント/AV のブロックリストへ登録
9. 関数リファレンス
★ = バイト列 / デコンパイルで実体確認済み、無印 = 名前・コールグラフ・ファミリ慣例による役割推定。
インフラ / ヘルパー
| 関数 | アドレス | 説明 |
|---|---|---|
| ★senditbudAMP | 00400310 |
SSH 自己拡散ランチャ。キーワード一致で sshpass ... ssh ... python udp.py を system() 実行 |
| init_rand | 00400458 |
CMWC PRNG 状態の初期化 |
| ★rand_cmwc | 00400584 |
CMWC 疑似乱数生成(ポート/シーケンス/偽装 IP の乱数源) |
| getRandomIP | 0040075c |
ランダム公開 IPv4 生成(予約/私設帯を除外、偽装送信元用) |
| fdgets | 00400808 |
fd/ソケットからの行読み取りヘルパー |
| ★getOurIP | 0040092c |
8.8.8.8 へ UDP 接続し getsockname() で自 IP を判定 |
| trim | 00400cac |
前後空白・CR/LF 除去(C2 コマンド整形) |
| printchar / prints / printi / print |
00400e78–00401404
|
独自 printf 実装(文字 / 文字列 / 整数 / 本体) |
| ★sockprintf | 004019b4 |
ソケットへの printf 書式送信(C2 への状態報告) |
| ★getHost | 00401b0c |
inet_addr で IPv4 文字列を解析、失敗時 true |
| makeRandomStr | 00401bac |
ランダム文字列生成(ホスト名 / パス / ペイロード) |
| ★recvLine | 00401cb8 |
C2 ソケットから CRLF 区切り 1 行受信 |
| connectTimeout | 00402024 |
select タイムアウト付きノンブロッキング connect |
| ★listFork | 00402360 |
攻撃子プロセスの fork + PID を pids[]/numpids へ登録 |
| ★realrand | 0041189c |
再シード後 [a,b] の乱数を返す |
| ★getArch | 0040c010 |
ハードコードされたアーキ識別子文字列を返す |
| ★getPortz | 0040c048 |
端末フィンガープリント(python/perl/telnetd 検出→"22"/"Unknown Port") |
パケット生成
| 関数 | アドレス | 説明 |
|---|---|---|
| csum | 004025d8 |
16bit Internet チェックサム |
| tcpcsum | 004027a4 |
TCP 疑似ヘッダチェックサム |
| makeIPPacket | 00402908 |
IPv4 ヘッダテンプレート充填(raw socket 用) |
| socket_connect | 00403c20 |
ソケット生成 + host:port へ connect |
| makevsepacket | 00403ddc |
Source Engine A2S クエリパケット生成 |
攻撃メソッド(各 C2 コマンドに対応)
| 関数 | アドレス | 対応コマンド / 説明 |
|---|---|---|
| SendUDP | 00402a30 |
UDP: UDP flood |
| UDPRAW | 00409998 |
UDPRAW: raw ソケット UDP flood |
| ★xtdcustom | 0040a068 |
固定 0x5B4 バイト UDP flood |
| ftcp / rtcp |
004030e0 / 00404f04
|
raw TCP flood エンジン |
| audp / atcp / astd |
004055d0 / 00405e5c / 00406770
|
UDP / TCP / STD flood ルーチン |
| SendSTD / SendSTDHEX / SendSTD_HEX / stdhexflood |
004048a4 / 004039f4 / 00404cb8 / 00404aa8
|
STD / HTTPS-KTN 系ジャンクペイロード flood(hex 変種含む) |
| ★vseattack | 00403f28 |
VSE: Valve Source Engine A2S クエリ flood |
| SendHTTPHex | 00406988 |
HTTP-KO: UA ローテーション付き HTTP flood |
| sendHTTPtwo / httpattack |
00406c30 / 004073b8
|
NFO-COM / NFO-KTN: HTTP flood |
| SendCloudflare / SendHTTPCloudflare |
00406ed8 / 00407148
|
CF-KILL / NULL-CF: /cdn-cgi/l/chk_captcha で CF 回避狙い |
| SendOVH_STORM | 00407b30 |
OVH-STORM / GTAV / CSGO / TF2: 対 OVH / ゲーム flood |
| HIPER_OVH | 00408dc4 |
HIPER-OVH: 対 OVH flood 変種 |
| SendHOME1 / SendHOME2 |
0040906c / 004092b8
|
HOME-DOWN flood 段 1 / 2 |
| ★SendDOMINATE | 0040a278 |
DOMINATE: 送信元 IP 偽装 raw TCP flood(ランダムフラグ、raw socket 失敗を C2 報告) |
| ★sendTLS | 0040ab30 |
HTTPS-KTN 系: TCP コネクション枯渇 flood(ノンブロッキング状態機械、MIPS EINPROGRESS=150) |
| ★sendHLD | 0040b888 |
TCP コネクション枯渇 flood(read/write 両監視版) |
| ★DNSw | 0040b468 |
DNS water-torture(ランダムサブドメインクエリ flood) |
| Randhex | 00409db8 |
RANDHEX: ランダム hex ペイロード flood |
| sendnfo | 00409ba8 |
NFO 向け flood ヘルパー |
| sendPkt | 0040b1e4 |
汎用 raw パケット送信ヘルパー |
| sendKILLALL | 00409504 |
KILLALLV3: 稼働中の攻撃子プロセスを停止 |
10. 処理フロー図
フロー要点: 親プロセスは「C2接続 → 報告 → コマンド受信ループ」を維持し、ゾンビ回収を毎周回で行う。攻撃は
listForkで切り離した子プロセスが実行し、STOP/KILLALLV3で停止する。senditbudAMPは SSH 経由の拡散経路(キーワード起動)。
11. 総括・脅威評価
検体の正体
-
MIPS 向け IoT DDoS ボット(Gafgyt / Qbot 系)。ソースファイル名
bot.cがシンボルに残存 - 静的リンク・not stripped・uClibc + LinuxThreads、GCC 4.1.2 / 3.3.2 でクロスコンパイル → 典型的な IoT 向けビルド環境
- ルータ / カメラ等の MIPS 組込み機器を踏み台にする設計(二重 fork でデーモン化して常駐)
攻撃者インフラ(C2)
| 項目 | 値 | 備考 |
|---|---|---|
| C2 サーバ | 131.123.40.104:4444 |
最重要 IOC |
| フォールバックポート | 6982 (0x1b46) |
ポート未指定時 |
- ⚠️
131.123.0.0/16は米 Kent State University 割り当て帯域の可能性が高い(要 WHOIS / OSINT 確認)。事実なら大学ネットワーク内の侵害ホストが C2 として悪用されている構図が疑われ、通報先の手がかりになる。
標的・攻撃先
攻撃コマンド名から狙いが明確:
-
ホスティング / OVH:
OVH-STORM,HIPER-OVH— OVH 系サーバを名指し -
ゲームサーバ:
GTAV,CSGO,TF2,VSE(Valve Source Engine A2S クエリ flood) — ゲーム鯖 DDoS が主用途 -
Cloudflare 保護サイト:
CF-KILL,NULL-CF(/cdn-cgi/l/chk_captchaで CF チャレンジ回避狙い) -
家庭 / 一般回線:
HOME-DOWN -
汎用 Web / L4: HTTP flood(正規 UA ローテーション)、UDP / TCP / STD / DNS water-torture、送信元 IP 偽装 raw TCP flood(
DOMINATE)
→ booter / stresser(DDoS 代行)のバックエンド bot と評価するのが自然。
拡散手法
-
senditbudAMP:sshpass -p '%s' ssh -o StrictHostKeyChecking=no ... 'cd; python udp.py ...'
→ 弱い / 既知の SSH 認証情報でログインしpython udp.pyを投下して二次拡散
攻撃者の痕跡・帰属手がかり
| 痕跡 | 意味 |
|---|---|
dayzddos.co |
煽り文に埋め込まれた booter サービスのブランド名。最有力の帰属手がかり |
煽り文 "...runs you if you read this lol ... patch it lolololol"
|
解析者への挑発。作者の口調の手がかり |
VixaatiServices |
ボット / アクターのタグ。他検体との横断検索キー |
RyM... |
別パディングタグ(ビルド識別 / ハンドル) |
bot.c |
ソースファイル名の残存 |
ハードコード UA 群 / example.ulfheim.net(VSE 用) |
ファミリ判定・YARA 化に使える固有文字列 |
特に押さえるべき 3 点
-
C2 =
131.123.40.104:4444(大学帯域の侵害ホストの疑い → 通報候補) - 標的は OVH / ゲームサーバ / Cloudflare 保護サイトで、正体は booter「dayzddos.co」のバックエンド bot
-
痕跡は
dayzddos.coとVixaatiServices— 帰属・横断追跡の最大の足がかり
推奨アクション
- egress で
131.123.40.104/ port 4444・6982 をブロック&アラート - ハニーポット検知に コマンドキーワード(
OVH-STORM,CF-KILL,HYDRA-KILL,KILLALLV3等)と C2 報告フォーマットDevice Connected: %s | Port: %s | Arch: %sを追加 - SSH 総当り拡散対策(鍵認証強制・
sshpass経由ログイン監視) - ハッシュ
7cc0b40e88.../d665e53e...をブロックリスト登録 -
dayzddos.coとVixaatiServicesを軸に関連 C2・別アーキ検体(ARM/x86 版)を追跡
解析範囲: main, initConnection, processCmd, getPortz, getOurIP, getArch, getHost, listFork, realrand, senditbudAMP, sendTLS, sendHLD, DNSw, xtdcustom, SendDOMINATE はデコンパイルで実体確認済み。その他の flood 関数は名前・コールグラフ・ファミリ慣例に基づく役割推定(★印以外)。Ghidra DB には全 58 関数へ日本語デコンパイラコメント([解析] タグ付き)と C2 / タグのデータラベルリネームを反映済み。関連図: malware_flow.png / malware_flow.svg / malware_flow.dot。