github.com
ファイル構成と概要
GlytchC2-main/
├── attacker/
│ ├── attacker.py ... Attacker側メイン(コマンド送信・ストリーム録画・デコード制御)
│ ├── crawler.py ... Twitch配信URL取得 + ffmpegフレームキャプチャ
│ ├── decoder.py ... グレースケールPNG → バイナリデータ復元
│ ├── twitch_chat_irc.py ... Twitch IRC通信ライブラリ(victim側と同一)
│ └── example.env ... Twitch認証情報テンプレート
├── victim/
│ ├── victim.py ... Victim側メイン(コマンド受信・実行・エンコード・配信)
│ ├── encoder.py ... バイナリデータ → グレースケールPNG変換
│ ├── twitch_chat_irc.py ... Twitch IRC通信ライブラリ(attacker側と同一)
│ └── example.env ... Twitch認証情報テンプレート
├── rsc/ ... スクリーンショット・バナー画像(16ファイル)
│ ├── GlytchC2_newbanner.png
│ ├── GlytchC2_MainExecutionFlow.jpg
│ └── ... (14 PNG/JPG files)
├── README.md ... プロジェクト説明・使用方法・動作原理
├── requirements.txt ... Python依存パッケージ(Pillow, emoji, python-decouple)
└── LICENSE ... MIT License
| ファイル |
種別 |
行数/サイズ |
役割概要 |
attacker/attacker.py |
Python スクリプト |
179行 |
コマンド送信、ハンドシェイク、ストリーム録画→デコードのオーケストレーション |
attacker/crawler.py |
Python スクリプト |
71行 |
streamlinkでHLS URL取得、ffmpegでフレームキャプチャ |
attacker/decoder.py |
Python スクリプト |
250行 |
マーカー検出→ヘッダ解析→ペイロードグリッド読取→フラグメント結合→ファイル再構成 |
victim/victim.py |
Python スクリプト |
164行 |
IRCコマンド受信→OSコマンド実行/ファイル読取→エンコード→動画化→配信 |
victim/encoder.py |
Python スクリプト |
222行 |
データをニブル単位でグレースケールPNGにエンコード(フラグメンテーション対応) |
twitch_chat_irc.py |
Python ライブラリ |
217行 |
Twitch IRC通信(接続・認証・チャンネル参加・メッセージ送受信) |
example.env × 2 |
設定テンプレート |
各5行 |
NICK / PASS(OAuthトークン)のテンプレート |
rsc/*.png, *.jpg |
画像(バイナリ) |
16ファイル |
README用スクリーンショット・バナー画像 |
README.md |
ドキュメント |
268行 |
プロジェクト概要、PoC手順、エンコーダ/デコーダの原理説明 |
requirements.txt |
設定 |
7行 |
Pillow, emoji, python-decouple + ffmpeg/streamlinkの注記 |
LICENSE |
ライセンス |
339行 |
MIT License |
解析の流れ: 本ドキュメントは全体概要として、GlytchC2の目的と攻撃フロー、コンポーネント間の関係、データフロー、通信プロトコル、および検知ポイントを俯瞰する。各コンポーネントの行レベル解析は以下の詳細ドキュメントを参照のこと:
- GlytchC2 詳細技術解析 [victim] - Scarlet Tactics — Victim側(victim.py + encoder.py)の詳細解析
- GlytchC2 詳細技術解析 [attacker] - Scarlet Tactics — Attacker側(attacker.py + crawler.py + decoder.py)の詳細解析
- GlytchC2 詳細技術解析 [twitch irc] - Scarlet Tactics — 共有通信基盤(twitch_chat_irc.py)の詳細解析
1. ツール全体の目的
GlytchC2 は ポストエクスプロイテーション(初期侵害後のフェーズ)向けの C2(Command and Control)ツールであり、以下の 2 つの機能を提供する:
- リモートコマンド実行: Victim マシン上で任意の OS コマンドを実行し、その出力を Attacker に返す
- ファイル窃取(Data Exfiltration): Victim マシン上の任意のファイルを Attacker に転送する
最大の特徴は、Twitch のライブ配信プラットフォームを C2 通信チャネルとして利用する点にある。従来のC2ツールが専用サーバーや一般的なWebサービス(DNS、HTTP等)を使用するのに対し、GlytchC2は以下の2つのチャネルを組み合わせる:
| チャネル |
プロトコル |
用途 |
データ量 |
| IRC チャット |
IRC (TCP:6667) |
制御信号(コマンド、"OK"、"READY") |
少量テキスト |
| 映像ストリーム |
RTMP → HLS |
データ転送(コマンド出力、ファイル) |
大容量バイナリ |
2. 全体の攻撃フロー
攻撃フロー図
ステップの詳細
| ステップ |
方向 |
チャネル |
内容 |
| ① コマンド送信 |
Attacker → Victim |
IRC |
Base64エンコードされた uid:command 文字列 |
| ② 受信確認 |
Victim → Attacker |
IRC |
平文 "OK" |
| ③ 配信準備完了 |
Victim → Attacker |
IRC |
平文 "READY"(エンコード・動画化完了後) |
| ④ 配信開始許可 |
Attacker → Victim |
IRC |
平文 "OK"(Attacker 録画準備完了後) |
| ⑤ 映像ストリーム |
Victim → Twitch → Attacker |
RTMP / HLS |
グレースケール動画(ステガノグラフィ) |
| ⑥ デコード |
Attacker ローカル |
— |
PNG→ニブル→バイト→ファイル |
3. コンポーネント間の関係とデータフロー
3.1 プロセス起動チェーン
[Attacker側]
attacker.py ──subprocess──→ crawler.py ──subprocess──→ streamlink
──subprocess──→ ffmpeg (録画)
──subprocess──→ decoder.py
[Victim側]
victim.py ──subprocess──→ encoder.py
──subprocess──→ ffmpeg (PNG→MP4変換)
──subprocess──→ ffmpeg (RTMP配信)
3.2 データ変換パイプライン
[Victim側: データ → 映像]
コマンド出力/ファイル
│ (バイナリデータ)
↓
encoder.py: バイト → ニブル × 2 → gray値(×17) → PNG画像セル
│ (1〜N枚のPNG)
↓
ffmpeg: PNG群 → MP4動画 (H.264ロスレス, グレースケール, 1枚10秒)
│ (output.mp4)
↓
ffmpeg: MP4 → RTMP → Twitch配信サーバー
[Attacker側: 映像 → データ]
Twitch配信サーバー → HLS (m3u8)
│
↓
streamlink: HLS URL抽出
│
↓
ffmpeg: HLS → PNG (1秒1フレーム)
│ (uid-0001.png 〜 uid-NNNN.png)
↓
SHA-256 重複フレーム除去
│ (ユニークフレームのみ)
↓
decoder.py: マーカー検出 → ヘッダ解析 → グリッド読取
│ gray値 → ÷17 → ニブル → バイト
│ フラグメント結合
↓
復元されたファイル/コマンド出力
3.3 ステガノグラフィ画像のレイアウト

4. 外部依存と環境要件
4.1 Python パッケージ
| パッケージ |
用途 |
使用箇所 |
Pillow |
画像生成・読取 (PIL) |
encoder.py, decoder.py, victim.py |
emoji |
絵文字のテキスト表現変換 |
twitch_chat_irc.py |
python-decouple |
.env ファイルからの設定読込 |
twitch_chat_irc.py |
4.2 外部ツール
| ツール |
用途 |
使用箇所 |
ffmpeg (+ libx264) |
PNG→MP4変換、RTMP配信、HLSフレームキャプチャ |
victim.py, crawler.py |
streamlink |
Twitch配信のHLS URL抽出 |
crawler.py |
4.3 ネットワーク要件
| 接続先 |
ポート |
プロトコル |
必要な側 |
irc.chat.twitch.tv |
6667 |
IRC (平文TCP) |
Attacker + Victim |
live.twitch.tv |
1935 |
RTMP |
Victim(配信) |
| Twitch CDN (可変) |
443 |
HTTPS (HLS) |
Attacker(録画) |
5. 通信プロトコル(ハンドシェイクシーケンス)
5.1 正常フロー
Attacker IRC Chat Victim Twitch 配信
──────── ────────── ──────── ──────────────
│ │ │ │
(1) │── Base64(uid:cmd) ──→│──────────────────────→│ │
│ │ │ コマンド受信 │
│ │ │ Base64デコード │
(2) │←──────── "OK" ───────│←──────────────────────│ │
│ │ │ コマンド実行 │
│ │ │ encoder.py │
│ │ │ ffmpeg (MP4生成) │
(3) │←─────── "READY" ─────│←──────────────────────│ │
│ │ │ │
│ crawler.py 起動 │ │ │
(4) │─────── "OK" ────────→│──────────────────────→│ │
│ │ │── RTMP配信 ──────→│
(5) │ │ │ │
│←── streamlink ────────│ │ │← HLS
│←── ffmpeg (録画) ─────│ │ │
│ │ │ │
│ │ │ 配信完了 │
│ SHA-256 重複除去 │ │ cleanup_files() │
│ decoder.py │ │ │
(6) │ → ファイル復元 │ │ │
│ │ │ │
5.2 タイムアウトと異常系
| 待機ポイント |
タイムアウト |
異常時の動作 |
| Attacker: "OK" 待ち |
30秒 |
タイムアウト → 処理続行(ただし READY 待ちに入らない) |
| Attacker: "READY" 待ち |
600秒 (10分) |
タイムアウト → このコマンドをスキップ |
| Victim: "OK" (配信許可) 待ち |
なし(無限ループ、listen timeout=10秒) |
永久待機(Attacker応答がなければ停止) |
| Attacker: crawler リトライ |
なし(無限ループ) |
配信URL取得成功まで1秒間隔でリトライ |
6. コード上の弱点・検知ポイント総合
6.1 ネットワーク検知
| # |
検知ポイント |
レイヤー |
難易度 |
説明 |
| N1 |
IRC 接続 (TCP:6667) |
ネットワーク |
低 |
irc.chat.twitch.tv:6667 への平文TCP接続。DPIで即検知可能 |
| N2 |
RTMP 配信 (TCP:1935) |
ネットワーク |
低 |
live.twitch.tv:1935 への接続。業務環境からのライブ配信は異常 |
| N3 |
Base64 チャットメッセージ |
アプリケーション |
中 |
IRCトラフィック内のBase64文字列は統計的異常として検知可能 |
| N4 |
"OK"/"READY" パターン |
アプリケーション |
中 |
制御シグナルの定期的な出現パターン |
| N5 |
OAuth トークン平文送信 |
ネットワーク |
低 |
ポート6667は非TLSのため、認証トークンが傍受可能 |
6.2 ホスト検知
| # |
検知ポイント |
レイヤー |
難易度 |
説明 |
| H1 |
ffmpeg + RTMP引数 |
プロセス |
低 |
ffmpeg ... rtmp://live.twitch.tv はEDRで即検知可能 |
| H2 |
streamlink 実行 |
プロセス |
低 |
streamlink --stream-url は正規用途が限られる |
| H3 |
Python プロセスチェーン |
プロセスツリー |
中 |
python → python (encoder) → ffmpeg → ffmpeg の特徴的チェーン |
| H4 |
大量PNG生成→削除 |
ファイルシステム |
中 |
短時間での大量画像生成・削除パターン |
| H5 |
shell=True コマンド実行 |
コマンドライン |
低 |
subprocess.run(command, shell=True) はコマンドライン監視で検知 |
6.3 設計上の弱点
6.4 検知・防御に対する評価
GlytchC2 の主な強みは、Twitch という正規のプラットフォームを通信チャネルとして利用する点にある。Twitch への接続自体は多くの環境で許可されており(ゲーム・エンターテインメント目的)、URL フィルタリングやドメインブロッキングによる遮断が困難な場合がある。
しかし、以下の理由から検知は十分に可能である:
- ポート 6667 の平文 IRC は現代のネットワーク監視で容易に検知・内容検査される
- RTMP 配信(ポート 1935)は一般的な業務端末からは発生しない通信パターン
- ffmpeg + streamlink の組み合わせは、EDR のプロセス監視で検知可能な特徴的なツールチェーン
shell=True による任意コマンド実行は、コマンドライン監視の主要な検知対象
7. 依存関係と技術スタック
┌─────────────────────────────────────────────────────────────┐
│ GlytchC2 技術スタック │
│ │
│ ┌──────────────────────┐ ┌──────────────────────┐ │
│ │ Python 3.x │ │ 外部ツール │ │
│ │ │ │ │ │
│ │ ┌────────────────┐ │ │ ┌────────────────┐ │ │
│ │ │ Pillow (PIL) │ │ │ │ ffmpeg │ │ │
│ │ │ 画像生成/読取 │ │ │ │ + libx264 │ │ │
│ │ └────────────────┘ │ │ │ 動画変換/配信 │ │ │
│ │ ┌────────────────┐ │ │ └────────────────┘ │ │
│ │ │ python-decouple│ │ │ ┌────────────────┐ │ │
│ │ │ .env読み込み │ │ │ │ streamlink │ │ │
│ │ └────────────────┘ │ │ │ HLS URL抽出 │ │ │
│ │ ┌────────────────┐ │ │ └────────────────┘ │ │
│ │ │ emoji │ │ │ │ │
│ │ │ 絵文字変換 │ │ │ │ │
│ │ └────────────────┘ │ │ │ │
│ └──────────────────────┘ └──────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ プロトコル / サービス │ │
│ │ │ │
│ │ IRC (TCP:6667) ──→ irc.chat.twitch.tv │ │
│ │ RTMP (TCP:1935) ──→ live.twitch.tv │ │
│ │ HLS (HTTPS:443) ←── Twitch CDN │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
8. 各コンポーネント詳細解析へのリンク