この記事は、Infection Monkey v2.30の時に作成しています。
オープンソースのセキュリティプロダクトとして、Infection Monkeyというものがあります。(最近更新されていなくて寂しい)
Infection MonckyはBAS
セキュリティの脆弱性管理では Breach and Attach Simulation と呼ばれる分野の製品があります(この分野の一覧は、私のお粗末なこちらの記事を参考になると思います)。
BASの一般的な内容・特徴は、下記が特徴となります。
- 実際の攻撃者の戦術、手法、手順(TTP)でシミュレーションを流す(「アドバーサリーエミュレーション」とよばれるもの)
- パッチ未適用のサーバのあぶり出し、およびパッチ適用の効果の検証に使える
- ツール化されているので、継続的にシミュレーションを自動で繰り返し実行できる(実行すべき)
- セキュリティ製品の導入効果の検証に使える。セキュリティインシデント訓練に使える
- 「安全なマルウェア」を使った攻撃シナリオも実行できる(製品によるが Infection Monkey はできる)
その中でもAkamaiがオープンソースで公開している Infection Monkeyを使ってみたので紹介します。
「名前に猿ってなんだよぉ」と思っちゃいますが、Monkey Test なんて言葉もあることだから良しとしましょう。
注意
この手のツールは Monkey test のノリで実行すると周り(会社、社会)に迷惑かけたり、場合によっては犯罪になってしまうのでご注意ください。
テストしてみたければ、仮想環境を作って古めのOSをすっぴんで入れてみるとか(これだけでも十分に遊べる)、古いOSのPCをターゲットにするのがおすすめです。(ただし、古いOSを使う場合は外部から隔離された環境で行うことを推奨)
導入前に
当然ですが、会社で業務的に使用する場合は、まず限られた範囲で実行してから導入しましょう。
セキュリティソフトが 邪魔して 防御が動いて全然動いている感がなくてつまんないとか、セキュリティソフトが 余計なことして 検知隔離してその後が面倒とか、いろんなところでアラートが鳴りまくってCISOまで連絡が行って始末書とか、まぁ 自業自得事 事前準備が足らなかったとして反省しましょう。
これで業務のシステムを止めたりするのは迷惑の範囲が違うので正直シャレになりません。(アラート鳴りまくるのも、それを受け持つ担当者にとって肉体的にも精神的も悪いので絶対にNGです)
Infection Monkeyはどこで公開されているか
前置き長くなりましたが、本編です。
普通にGoogle検索でも出てきますし、GitHubでソースコード含め公開されています。
- 製品紹介:https://www.akamai.com/ja/infectionmonkey
- GitHUB:https://github.com/guardicore/monkey/releases/
- ドキュメント(英語):https://techdocs.akamai.com/infection-monkey/docs/welcome-infection-monkey
なお、Public SlackワークスペースやEメールでのサポートコミュニティがあります。
基本構成
猿と猿島から構成されます
- Monkey Agent(略してMonkey):
ローカルネットワーク上に対してスキャン・攻撃するバイナリプログラム。
対象がローカルネットワークなので、リモートネットワーク(別セグメント)には別の猿に攻撃させます。 - Monkey Island Server (略してIsland):
C&C(コマンド&コントロール)のWebサーバでGUIを提供。猿島から猿が派遣されて攻撃するわけですね。
サポートプラットフォーム
下記通り、サポート範囲は広いですが、今回は Kali 2023.1 にて インストール版で検証します。
-
Windows:
特にバージョンの制限はなさそうなので、サポートされているバージョンのWindowsなら動くでしょう。 -
Linux:
Docker版とインストール版があります。
インストール版は、FUSEが入っていることが前提とのこと。公式にテストされているのは、Ubuntu18~22のLTS、RHEL8~、Kali2023.1などです。 -
クラウド:
AWS、Azureのマーケットプレイスから利用できます。
Windowsでは、DefenderなどからMalwareとして認識されたりします。LinuxでもEDRなど入っていると検知に引っかかると思います。
なので会社で試しに入れてみるという方は、事前に社内のセキュリティ担当に仁義を通しておいたほうが身の安全です。
ハードウェア要件
すくなくとも現時点ではGPUには対応していないようで、普通のCPUで大丈夫です。セキュリティプラダクトでたまにあるIntel縛りもありません。
参考までに私が使っている検証環境は、AMD RYZENの4年くらいのPCを仮想化し、4コア2Gメモリで使っています。
ディスクは、インストールしプラグインまで導入すると、目安 500M程度は消費するようです。
インストールして猿島を準備する
1. Infection Monkeyのダウンロード
猿でもできる簡単さと早さです。
Infection MonkeyのAppImageファイルをGitHub から入手します
今回はLinuxのインストール版なので、InfectionMonkey-v2.3.0.AppImage を使用します。
$ wget https://github.com/guardicore/monkey/releases/download/v2.3.0/InfectionMonkey-v2.3.0.AppImage
:
:
InfectionMonkey-v2. 100%[================>] 153.02M 9.35MB/s in 16s
2024-11-09 09:35:48 (9.51 MB/s) - ‘InfectionMonkey-v2.3.0.AppImage’ saved [160453824/160453824]
我が家のしょぼいインターネット接続環境(100M)でもすぐにダウンロード完了しました。
2. まず検証なので手軽にターミナルで起動
まず検証なので、ターミナル上で Infection Monkey を起動してみます。この実行により、実行ユーザのホームディレクトリ配下に .monkey_island ディレクトリが作成されます。
検証を終えて終了する際には、この .monkey_island とダウンロードしたファイルを削除すればお掃除が済みます。
$ chmod u+x InfectionMonkey-v2.3.0.AppImage
$ ./InfectionMonkey-v2.3.0.AppImage
2025-06-01 05:51:52,977 - DEBUG - __init__.py:449 - __getattr__() - loaded lazy attr 'SafeConfigParser': <class 'configparser.ConfigParser'>
:
:
2025-06-01 05:51:55,808 - INFO - server_setup.py:234 - _log_web_interface_access_urls() - To access the web interface, navigate to one of the the following URLs using your browser: https://xx.xx.xx.xx:5000
2025-06-01 05:51:57,332 - DEBUG - aws_metadata.py:31 - fetch_aws_instance_metadata() - Failed init of AWSInstance while getting metadata: HTTPConnectionPool(host='169.254.169.254', port=80): Max retries exceeded with url: /latest/meta-data/instance-id (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x7fa8acdf1750>, 'Connection to 169.254.169.254 timed out. (connect timeout=2)'))
案外とすぐに終わります。
ログを見ると 「httpsの5000番ポートで接続しろ」と言っていますね。
なお、aws環境を想定してインスタンスのメタデータを取りに行こうとしてエラーが出ますが無視しましょう。
3. やっぱりサービスで起動したい
ある程度検証したら、OSのサービスとして起動しましょう。これはroot権限が必要になります。
どうせサービスとして起動するなら、Infection Monkey用 のユーザも作っちゃいましょう。
.monkey_island ディレクトリが作成されて内部DBのデータが保存されることを鑑みて、モジュールの置き場所は、 とりあえずInfectionMonkeyユーザのホームディレクトリとしています。
# ユーザ作る
$ sudo groupadd InfectionMonkey
$ sudo useradd -g InfectionMonkey -s /usr/sbin/nologin -d /home/InfectionMonkey -m InfectionMonkey
# InfectionMonkeyのユーザディレクトリに置く
$ sudo su - InfectionMonkey
$ wget https://github.com/guardicore/monkey/releases/download/v2.3.0/InfectionMonkey-v2.3.0.AppImage
$ chmod u+x InfectionMonkey-v2.3.0.AppImage
# 以下InfectionMonkeyユーザ権限で実行
$ sudo -v ./InfectionMonkey-v2.3.0.AppImage service --install --user <USERNAME>
さあ猿島へ行ってみよう
インストールと起動が完了したので、Infection Monkey(Monkey Island)へブラウザで接続します。デフォルトでは自己証明書を使っているので証明書エラーが出ますが無視して接続します。
https://{インストールサーバ}:5000'
ユーザ作成
初期ユーザをまず登録します(パスワードルールは8文字以上と緩い模様)。入力後トップページが表示されます。
猿の武器、プラグインを入れる
この素の状態は単に島に猿が住んでいるだけで、消費電力を餌に与えているだけで何もできません。
Infection Monkey では、攻撃シナリオをPluginで追加することにより実際の攻撃シナリオを利用できるようになります。
画面左にあるPluginをクリックしましょう。
15しかないのは寂しいですが、とりあえず、プラグインを入れます。
プラグインには Safety なものと Unsafe なものがあります。Descriptionの部分に内容が記載されていますので内容が気になる方は読んでみましょう。
Safetyは、商用環境などで利用しても大丈夫なものということですので、画面上のALL SAFE PLUGINをクリックして入手しましょう。(Unsafeなものは、なんとなく商用環境で使うとクレデンシャルを盗んでしまったりでよろしくないものっぽい)
なお、プラグインを入れる導入は、本体のダウンロードよりは時間がかかります。
攻撃開始
プラグインは入ったことなので、実際にInfection Monkeyで攻撃をしてみましょう。画面の Run Monkey をクリックします。
Infection Monkeyは、アクセス可能なすべての機器とポートをオープンしているサービスをマッピングし、資格情報を盗んだりします。
- From Island では、Infection Monkey をインストールしたサーバ上で実行し、ローカルネットワーク全域を攻撃します
- Manual では、猿は特定のサーバに Infection Monkey をダウンロードし、サーバに侵入した前提での攻撃者をシミュレートします。これは別途記事を書きます
攻撃が完了すると画面左にチェックが付きます
攻撃結果を確認
あれ、1台だけ、、、Agentが入っているのがここだからですね
その1台をクリックするとInfection Monkeyログなど取得するボタンが出てきます
設定を変えてみる
画面の左の ConfigurationでExploitを有効化し、ネットワークスキャンを有効化してみましょう(Submitボタンがあるので押し忘れずに)
今度はnodeマップが表示されました。
次回予定
この記事を書き始めてすでに1年近くたってしまいましたが、、、、次回以降はより具体的にやっていきたいと思います