2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIにマルウェアの静的解析を行わせてみた。

2
Last updated at Posted at 2026-09-24

表層解析はこちら。

今回は!!

前回の表層解析編に続き、静的解析編です。
最初は地道に一つずつデコンパイル結果や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)

  1. srandom() / init_rand() を time() ^ getpid() でシード
  2. getOurIP() で自機 IP を取得(8.8.8.8 へ UDP 接続してローカル IP を判定)
  3. 二重 fork() + setsid() でデーモン化、chdir()、signal(SIGPIPE, SIG_IGN)
  4. initConnection() で C2 へ接続(失敗時は 5 秒間隔でリトライ)
  5. 接続確立後、Device Connected: %s | Port: %s | Arch: %s を C2 へ報告
  6. recvLine() ループで C2 コマンドを受信 → ! で始まる行をトークン化し processCmd() へディスパッチ
  7. 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 でコマンド名テーブル(.rodata 0x432810~)と照合
  • 引数解釈後、各攻撃は 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 (TCP 4444, フォールバック 6982)
  • 自 IP 判定: 8.8.8.8 への UDP

ファイル / ハッシュ

  • SHA-256: 7cc0b40e8819ec9139ffae5942add2db1c26e168edaeda57302c9047f23dfb6c
  • MD5: d665e53e7c7d6f34e493c3e8b0f66fcc

文字列アーティファクト

  • VixaatiServices
  • dayzddos.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 点

  1. C2 = 131.123.40.104:4444(大学帯域の侵害ホストの疑い → 通報候補)
  2. 標的は OVH / ゲームサーバ / Cloudflare 保護サイトで、正体は booter「dayzddos.co」のバックエンド bot
  3. 痕跡は 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。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?