
IoTおよび運用技術ハニーポット
| 📢 注意!!! |
|---|
| このリポジトリは Honeynet Project に移動しました :) |
RIoTPot はハイブリッド相互作用ハニーポットであり、主に IoT および OT プロトコルのエミュレーションに焦点を当てていますが、他のサービスもエミュレート可能です。 本質的に、RIoTPot はシステムに含まれる他のハニーポットのプロキシサービスとして機能します。 したがって、任意のハニーポットやその他のサービスを RIoTPot と一緒に実行できます。 さらに、ルーティングを管理するための UI Web アプリケーションも用意されています。
このハニーポットには、すぐに使用できる複数の低対話サービスが付属しています。 これらのサービスは プラグイン として記述されているため、Linux でのみサポートされています。ただし、プラグインなしで RIoTPot を起動することもできます。 次の表は、RIoTPot にデフォルトで含まれているサービス、その内部ポート、およびプロキシポートの一覧です。
目次
RIoTPot のアーキテクチャは、内部および周辺(または外部)のサービス(例:ハニーポット、フルサービス、コンテナ、リモートホストなど)へのプロキシ接続に基づいています。
そのために、ハニーポットはユーザー定義の複数の プロキシ を管理し、サービスと RIoTPot の間の接続を中継します 1。
これにより、RIoTPot は受信した攻撃をどのように、どこにルーティングするかを決定できます。
受信攻撃の処理方法を決定するロジックは、ミドルウェア の形で実装されています 2。
サービス、ミドルウェア、プロキシを管理するために、RIoTPot には REST API 3 と Web アプリ UI 4 が標準で付属しています。
UI はブラウザから localhost:2022 でアクセスでき、API エンドポイントは localhost:2022/api/swagger で Swagger インターフェースを通じて試すことができます。
図 1 は RIoTPot のアーキテクチャを示しています。これには、RIoTPot を構成する 2 つの主要アプリケーション(RIoTPot 自体と RIoTPot UI)とそのコンポーネント、および外部(または隣接)サービスを囲むセクションが含まれています。
RIoTPot は Golang で書かれています 5。 各 RIoTPot インスタンスは、登録されたプロキシ(ポートに基づく)をオンデマンドで公開します。 プロキシを提供するには、バインドされたサービスが存在し、プロキシポートが利用可能である 必要があります(現在、RIoTPot は同じポートで複数のサービスを実行することは許可していません)。 プロキシがバインドされて提供されると、攻撃者はそのポートで RIoTPot にメッセージを送信できるようになり、メッセージはバインドされたサービスに中継され、攻撃者に返信されます 6。
アクセスを容易にするために、複数の RIoTPot インスタンスを RIoTPot UI Web アプリから管理できます。
各インスタンスに登録されたプロキシの管理に加えて、UI では プロファイル の作成、使用、編集が可能です。
各プロファイルには、プロトコルやその他のサービスにちなんだ名前のプロキシが含まれており、RIoTPot インスタンスを実際のデバイス(例:ホームアシスタント)のように見せかけます。
つまり、プロファイルは特定の構成で RIoTPot インスタンスをセットアップおよびプロビジョニングするプロセスを高速化します。
UI は React フロントエンド JavaScript ライブラリ(このプロジェクトでは TypeScript を使用)と Recoil 状態管理ライブラリを使用して記述されています。
RIoTPot は比較的小規模であるため、現時点ではデータベースを使用していません。
RIoTPot の実行は比較的簡単です。 全体的に、3つのオプションがあります。 最初のオプションは、RIoTPot のリリースをダウンロードすることです。最新リリースまたは以前のリリースを選択できます。 2番目のオプションは、自分でプロジェクトをビルドすることです。 最後のオプションは、ソースコードを使用して RIoTPot とハニーポットを強化するいくつかの追加アプリケーションを含む Docker コンテナを作成することです。
情報: このガイドは、特別なニーズがなく、すぐに使えるシンプルな体験を求めるユーザー向けです。
各リリースは riotpot という名前のフォルダにあり、実行可能バイナリ(これも riotpot という名前)と、複数のサービス(または低対話ハニーポット)が入った plugins フォルダが含まれています。
RIoTPot を意図したとおりに動作させるには、内部フォルダ構造を維持することが重要です。
📁 riotpot
┕ riotpot
┕ 📁 plugins
riotpot フォルダを解凍します。riotpot バイナリを実行します。これにより、API が有効になり、すべてのプラグインが使用可能になり、UI サーバーが起動します。
localhost:2022 からアクセスできます。情報: このガイドは、開発環境に慣れている上級ユーザー向けです。
要件
- Golang - プロジェクトのビルドに必要
- Node - UI のビルドに必要
オプション:
- Git - ソースコードのダウンロードに使用
- Make - 既成のコマンドを実行するため
GitHub から RIoTPot ソースコードをダウンロードします。コンソールを開き、次の行を入力します。
git clone [email protected]:aau-network-security/riotpot.git
RIoTPot ソースをダウンロードしたフォルダに移動し、必要な node パッケージをインストールします。
npm install
Make をインストールしている場合、プロジェクトのビルドを支援する複数のコマンドヘルパーが含まれています。簡単に言うと、RIoTPot バイナリとプラグインをビルドする(そして適切なフォルダに配置する)2つの簡単なコマンドを実行できます。
# サーバーをビルド
make build-ui
# RIoTPot とプラグインをビルド
make riotpot-build
注記: UI は Vite を使用してビルドされています。別のビルダーを使用したい場合は、事前にいくつかの変更を自身で行う必要があるかもしれません。
情報: このガイドは、仮想環境で RIoTPot を使用したい上級ユーザー向けです。
要件
- Docker - RIoTPot インスタンスと UI サーバーのイメージをビルドするために使用
- Docker-compose - RIoTPot インスタンス、UI、その他のアプリケーションやサービスを含む単一のコンテナを作成するために使用
このセットアップを使用する主な利点は、最小限のコンテナ構成変更で追加のセキュリティ機能とコンテナ自体が得られることです。 例えば、分離された仮想プライベートネットワークやオーバーレイネットワークを定義して、RIoTPot や他の隣接サービスを隠蔽、サンドボックス化、カプセル化できます。 さらに、コンテナを使用すると、IP アドレスではなく Docker アドレス名を使用してサービスをバインドできるため、非常に便利です。 最後に、他のサービスに影響を与えることなく、オンデマンドで個別のコンテナを起動および停止できます。
一方、仮想化はベアメタルでアプリケーションを使用するよりも、間違いなくリソースを消費します。 RIoTPot の単一インスタンスは比較的軽量ですが、仮想化とハードウェアエミュレーションによって導入される欠点(応答遅延など)を考慮することが重要です。
警告: 技術的には、熟練した攻撃者は、仮想化によって導入される応答時間の遅延を実際のサーバーと比較分析することで、RIoTPot がハニーポットであることに気づく可能性があります(!!)。この種のハニーポットフィンガープリンティングは以前から研究されていますが、クラウドホスティングサービスの一般化と仮想マシンや詳細なサーバー構成により、一般的なインターネットサービス(HTTP、Telnet、SSHなど)の結果は依然として決定的ではありません。
docker-compose ファイルには、RIoTPot 体験を強化するための追加サービスが含まれています。
次の表は、このコンテナに含まれるサービスとアプリケーションの一覧をまとめたものです。
サービス
RIoTPot には、何をどのように起動するかに影響するフラグコマンドが用意されています。 例:
# UI なしで RIoTPot を実行
./riotpot --ui false
https://raw.githubusercontent.com/aau-network-security/riotpot/HEAD/%E5%86%85%E9%83%A8%E3%81%8A%E3%82%88%E3%81%B3%E5%91%A8%E8%BE%BA%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AF%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%8B%E3%82%89%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82 内部サービスは統合されており、RIoTPot からのみアクセス可能です。 これらのサービスは起動時に読み込まれ、削除はできませんが、停止は可能です。 周辺サービスは RIoTPot と同じネットワーク上にある 必要があります。 外部サービスは RIoTPot のみ をホワイトリストに登録する 必要があります。 ↩
https://raw.githubusercontent.com/aau-network-security/riotpot/HEAD/%E3%83%9F%E3%83%89%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AF%E7%8F%BE%E5%9C%A8%E9%96%8B%E7%99%BA%E4%B8%AD%E3%81%A7%E3%81%99%E3%80%82 ↩
RIoTPot API はインターネットに公開しては いけません。 いずれにせよ、現在 API は localhost からの接続のみを受け付けています。 これは将来的に変更される可能性があり、ホストのホワイトリストと標準認証が提供される予定です。 ↩
Web インターフェースは別のコンポーネントとして使用できますが、RIoTPot バイナリに組み込まれています。 ↩
基本アプリケーションは相互運用可能ですが、内部サービス(プラグイン)は Linux、FreeBSD、macOS 環境 でのみ使用できます。 この制限を克服するために、プラグインを gRPC を介して通信するマイクロサービスに置き換える予定です。 ↩
| サービス | 内部ポート | プロキシポート |
|---|
| Echo | 20007 | 7 |
| SSH | 20022 | 22 |
| Telnet | 20023 | 23 |
| HTTP | 28080 | 80 |
| Modbus | 20502 | 502 |
| MQTT | 21883 | 1883 |
| CoAP | 25683 | 5683 |
| サービス | イメージ | ポート | 詳細 |
|---|
| MQTT | eclipse-mosquitto | 1883 | Mosquito MQTT サーバー |
| HTTP | httpd | 80 | 通常の HTTP サーバー |
| Modbus | oitc/modbus-server | 502 | Modbus サーバー |
| OCPP | ocpp1.6-central-system | 443 | OCPP v1.6(電気自動車充電スタンドで使用) |
| アプリケーション | イメージ | 詳細 |
|---|---|---|
| TCPDump | kaazing/tcpdump | パケットレコーダー。ネットワークトラフィックを .pcap ファイルに保存します |
コンテナは 3 つの簡単な手順でセットアップできます:
GitHub から RIoTPot ソースコードをダウンロードします。コンソールを開き、次の行を入力します。
git clone [email protected]:aau-network-security/riotpot.git
RIoTPot ソースをダウンロードしたフォルダに移動します。
Docker が実行されている状態で:Make がインストールされている場合は、次のコマンドを実行します。それ以外の場合は、build/docker フォルダに含まれている docker-compose ファイルを使用して docker-compose コマンドを実行します。
# Make を使用する場合
make up
# docker-compose を使用する場合
docker-compose -p riotpot -f build/docker/docker-compose.yaml up -d --build
| フラグ | 型 | デフォルト | 説明 |
|---|
| debug | Boolean | false | ログレベルをデバッグに設定 |
| api | Boolean | true | API を起動するかどうか |
| plugins | Boolean | true | 低対話ハニーポットプラグインを読み込むかどうか |
| whitelist | String | http://localhost,http://localhost:3000 | API に接続を許可するカンマ区切りのホストリスト |
| ui | Boolean | true | UI を起動するかどうか |
倫理的およびセキュリティ上の理由から、RIoTPot は外部への未承諾リクエスト(リバースシェルなど)を許可しません。 ↩