
Snoopy: 分散型トラッキングおよびデータ傍受フレームワーク
| || | | || || || || | | |
| _____|| |_| || _ || _ || _ || |_| |
| |_____ | || | | || | | || |_| || |
|_____ || _ || |_| || |_| || ___||_ _|
_____| || | | || || || | | |
|_______||_| |__||_______||_______||___| |___|
V0.1
「エイミー、テクノロジーは本質的に善でも悪でもない。使い方次第だ。死の光線のようにね。」
-ファーンズワース教授
Snoopy へようこそ。これは分散型トラッキング/プロファイリングフレームワークです。Snoopy は開発途中のプロジェクトなので、提案や修正があれば遠慮なく送ってください。このドキュメントでは基本的な使い方を説明します。もう少し背景を理解するには、以下を参照してください:
クライアント側ソフトウェアは、私たちが「ドローン」と呼ぶデバイス上で動作します。ドローンは、WiFiインターフェース(インジェクションドライバー付き)と外向きのインターネット接続を備えた Linux ベースの任意のデバイスです。Snoopy は Nokia N900 と BackTrack を実行するノートPCでテストされています。ドローンは次の2つの操作を行います:
収集されたプローブリクエスト(例:BTHomeHub-4123 を探しているボブの iPhone)は、定期的に Snoopy サーバーへアップロードされます。Rogue AP に接続したすべてのデバイスのインターネットアクセスは、Snoopy サーバーを経由して提供されます。
サーバーはすべてのプローブリクエストをデータベースに格納し、Wigle を使って GPS 座標を特定し、Google マップを使って住所(およびストリートビューの写真)を特定します。つまり、あなたが自宅のネットワークをプローブしている場合、私はあなたの家の写真を入手できる可能性があるということです。
各ドローンは OpenVPN 経由でサーバーに接続し、独自のサブネットを持ちます。関連付けられたクライアントはドローンから IP アドレスを受け取り、そのドローンを経由してトラフィックをルーティングします。つまり、サーバー上でクライアントの IP アドレス(したがって MAC アドレス)をインターネット活動と照合できるということです。
サーバー上では、次のことが行われます:
ネットワーク図は次のようになります:
Client1 Drone1 Snoopy Server
+----------+ +-----------------------+ +-----------------------+
| wlan0-|<---WiFi--->|-at0 | | eth0|<-squid-sslstrip-mitmproxy->Internet
| | | | 10.2.0.1 | | 11.22.33.44| |
| dhclient | | | | | | Traffic inspection
| | | | tap0-|<-openvpn----->|-tap0 | Social media analysis
+----------+ | | 192.168.42.2 | +--/| 192.168.42.1 |
10.2.0.2 | +-----------------------+ | +-----------------------+
| |
| | route 10.2.0.0 via 192.168.42.2
| | route 10.3.0.0 via 192.168.42.3
Client2 | |
+----------+ | |
| wlan0-|<---+ |
| | |
| dhclient | |
| | |
+----------+ |
10.2.0.3 |
|
|
|
Client3 Drone2 |
+----------+ +-----------------------+ |
| wlan0-|<---WiFi--->|-at0 | |
| | | | 10.3.0.1 | |
| dhclient | | | | |
| | | | tap0-|<-openvpn--+
+----------+ | | 192.168.42.3 |
10.3.0.2 | +-----------------------+
|
|
|
Client4 |
+----------+ |
| wlan0-|<---+
| |
| dhclient |
| |
+----------+
10.3.0.3
Walter が Snoopy 用の Web インターフェースを作成しました。http://your-snoopy-server.com:5000/ からアクセスできます。
収集したデータをグラフィカルに調査するための Maltego トランスフォームがいくつかあります(詳細は下記参照)。
インストール ================ サーバーのインストールは簡単なはずです。Ubuntu 12.04 LTS 32bit の標準インストールでのみテストされています。複数のサーバーコンポーネントに変更が加えられるため、基本インストール済みの状態でインストールスクリプトを実行し、そのマシンでは他にあまり何も実行しないことを強くお勧めします(実行するとしてもごく僅かに)。不明な点がある場合は、install.sh ファイルを確認して手動で変更してください。そうでなければ、インストーラー(./install.sh)を実行するだけです。
使用方法 ======== インストールが完了すると、'snoopy' と入力するだけでサーバーメニューが読み込まれるはずです。そうでない場合(または不明な場合)は、インストールフェーズで作成したユーザーのホームディレクトリに移動してください。'snoopy/server/' ディレクトリの中に 'snoopy.sh' ファイルがあり、それを実行できます。以下がメニューです:
+---------------------------------------------------------------+
| Welcome to Snoopy V0.1 |
| SERVER SIDE |
| |
| SensePost Information Security |
| [email protected] / www.sensepost.com |
+---------------------------------------------------------------+
Date: Thu Nov 1 16:37:08 CET 2012
Snoopy Server Status: Stopped
Connected Drones: 0
Wigle User: setYourWigleAccount
Would you like to:
[1] (Re)Start Snoopy server components
[2] Stop Snoopy server components
[3] Manage drone configuration packs
[4] Configure server options
[5] Set web traffic injection string
[6] Observe logs
[X] Exit
[?] Help
ドローンパックの作成 メニューのオプション[3]を使用すると、ドローンデバイス用のクライアント側'パック'を作成できます。各ドローンは、独自の OpenVPN 鍵と SSH 鍵、DHCP レンジ、ルーティングテーブルを取得します。ドローンデバイスごとにダウンロード URL が提供されます。サーバーとドローンの時刻が正しく設定されていることを確認してください。正しくないと VPN 接続が確立されません。
ドローンへの Snoopy のインストールと実行 ドローンは最大100台まで使用できます(それ以上必要な場合は、ソースを確認するか私にメールしてください。実際の制限はありません)。インストールは、前の手順で作成した設定パックをダウンロードし、該当するセットアップスクリプトを実行することで構成されます。Nokia N900 の場合、デスクトップにアイコンが配置されます。例:
haxor@drone001# wget http://snoopy-server.com/secretdir/drone001.tar.gz
haxor@drone001# tar xzvf drone001.tar.gz
haxor@drone001# cd snoopy && ./setup_n900.sh
各 Snoopy エンティティには、異なるトランスフォームを適用できます。'Snoopy' エンティティをグラフにドラッグして開始してください。エンティティのプロパティで開始日または終了日を指定しない場合、デフォルトで過去5分間の結果を取得します(この値はサーバー設定メニューで変更できます)。
Snoopy マシンを使用すると、トランスフォームを自動的に連続実行し、要件に基づいてノードをフィルタリング/削除できます。ソース/コメントを見れば、それらの動作方法は十分に理解できるはずです。
法的な考慮事項 ======================= Snoopy のコンポーネントのすべてまたは一部は、お住まいの地域では違法である可能性があります。ソフトウェアを使用する前に確認してください。英国では、トラフィックがブロードキャストであるため、プローブ収集コンポーネントは合法です。ただし、不正アクセスポイントコンポーネントは、ほとんどの地域で違法である可能性が高いです。SensePost は、このツールの使用によってあなたがトラブルに巻き込まれても一切責任を負いません。
セキュリティ上の考慮事項 ========================== 各'ドローンパック'には OpenVPN 鍵と SSH 鍵が含まれています。ドローンが(盗難などにより)侵害された場合、サーバーにセキュリティリスクをもたらす可能性があります。Snoopy サーバーは専用で運用することを強くお勧めします。サーバー上に作成されたユーザーには、少しの追加セキュリティのために、次の行が .ssh/authorized_hosts ファイル に自動的に追加されます:
"no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/usr/bin/rsync ${SSH_ORIGINAL_COMMAND#* }""
今後の作業 =============== やるべきこと/追加すべきことはまだたくさんあります。このバージョンはどちらかというと PoC です。
助け、アドバイス、意見をくれた人々に感謝します:
Q. 外国人スパイが11月11日にヒースロー空港に到着することはわかっているが、それがいつで、どの便かはわからない。情報筋によると、彼は到着後ヒルトンに滞在し、14日にルートン空港から飛行機に乗るという(これも時間も目的地もわからない)。彼は変装の達人だ。どうやって彼を特定すればよいか?
A. ヒースロー空港、ヒルトン、ルートン空港に Snoopy ドローンを配備します。'CommonLocation' Maltego トランスフォームが、これら3か所に存在するすべてのデバイスの共通部分を記録します。うまくいけば結果は1つだけになるはずです。それが私たちの標的です。特定できれば、Google マップとストリートビューの写真で、スパイがどこへ移動したかを調べることができます。彼のデバイスが Snoopy の不正アクセスポイントに接続するよう仕向けられれば(Facebook、Twitter、メールなど)、彼の正体が明らかになるかもしれません。
特定の sandy^W 好ましくない国々の WiFi スポットに接続したすべての個人を記録するよう Snoopy に依頼します。
10 のデパートに Snoopy を配備します。人の流れ、リピーター客、顧客のタイプを記録します。
クライアントデバイスを乗っ取ってマルウェアをインストールするために、悪意のあるコードを注入します。ルーティングテーブルにより、サーバーから接続中の被害者へ直接エクスプロイトを送り込むことができます。
TFL は各ロンドン地下鉄に Snoopy ドローンを配備できます。人の流れを監視し、ピーク時と閑散時の時間帯/曜日を記録して、それに応じてスタッフを配置・削減できます。
ロンドン全域に500台の Snoopy ドローンを配備します。人々がドローンのそばを通る際の動きを監視します。数週間から数ヶ月にわたって適用すれば、興味深い人の移動パターンが必ず現れます。
Linux ベースのデスクトップ/ノートPCの場合、Alfa AWUS036H カードは平均的な性能です。より信頼性の高いカードは Ubiquity SR-71 です。インジェクションドライバーのサポートに関して、動作した/しなかった情報があればお知らせください。
N900 では、インジェクションドライバーを読み込むとバッテリー寿命が大幅に短縮されることに気づくでしょう。TecNet 6600mAh バッテリーパックは、テストで約6〜8時間持ちました。ただし、N900 をバッテリーパックに接続するには アダプター が必要です。GPS のポーリング頻度を減らす(または無効にする)こともバッテリー寿命に役立ちます。
SSH のために N900 をノートPCに USB 接続する方法のヒントは、こちら にあります。
現在、RaspberryPi、Alfa R36 mini AP、SheevaPlug でテストしています。結果は後日公開します。
収集したデータを調査するための独自の Maltego トランスフォームを作成できます。提供されているものは、ほとんどが何ができるかを示すためのデモンストレーションです。ソースコードを確認し、以下を読んでください:
質問があれば [email protected] まで連絡してください(または素晴らしい Maltego チームに聞いてください)。
Web UI のコードには次の場所からアクセスできます。 ~user/snoopy/server/bin/snoopy/src/snoopy/
プラグインは次の2つの部分で構成されます:
プラグインは、Snoopy アプリケーションによって動的にロードされる呼び出し可能オブジェクトです。例から始めましょう:
from snoopy import db, pluginregistry
@pluginregistry.add('client-data', 'ssidlist', 'SSID List', js='/static/js/ssidlist.js')
def ssid_list(mac):
with db.SessionCtx() as session:
query = session.query(
distinct(db.Probe.probe_ssid) # SELECT DISTINCT probe_ssid FROM probes
).filter_by(
device_mac=mac # WHERE device_mac=$mac
).order_by(
db.Probe.probe_ssid # ORDER BY probe_ssid
)
return query.all()
では、詳しく説明していきます...
from snoopy import db, pluginregistry
Snoopy データベースにアクセスするには db が必要で、プラグインを登録するには pluginregistry が必要です。
@pluginregistry.add('client-data', 'ssidlist', 'SSID List', js='/static/js/ssidlist.js')
これがプラグイン(任意の呼び出し可能オブジェクト)を登録する方法です。最初の引数は、このプラグインが属するグループの名前を指定します。このプラグインは MAC アドレスを受け取り、クライアントデータウィンドウに表示するデータを返すため、client-data を指定しました。client-data の他に、近接セッションを操作する session-data グループのプラグインもあります。2番目のパラメータはプラグイン名です。この名前は内部使用のみで、JSON に適した形式である必要があります。3番目のパラメータはプラグインのタイトルです。基本的には名前と同じですが、タイトルは GUI に表示されます。具体的には、クライアントデータウィンドウ内のデータセクションのタイトルです。
タイトル以降のすべてのキーワード引数はオプションとして保存されます。プラグインシステムはオプションを必須としませんが、Snoopy は js オプションをサポートしています。このオプションは、このプラグインの JavaScript コンポーネントの URL(Snoopy/サーバー側ではなく、ブラウザ側から見た URL)を指定します。
def ssid_list(mac):
このプラグインは単純な関数です。client-data プラグインの定義に従い、MAC アドレスの文字列を受け取ります。呼び出し可能オブジェクトの名前は使用されません。このサンプルプラグインの本体は、基本的に
SELECT DISTINCT probe_ssid FROM probes WHERE device_mac=$mac を実行するSQLAlchemyクエリを実行し、
結果をリストとして返すだけです。プラグインの戻り値は通常、
JSONレスポンスの一部として追加されます。したがって、結果には、
JSONフレンドリー(Flaskの jsonify() 関数でサポートされる形式)でなければならないという制限があります。
これだけシンプルです!
クライアントデータ用のフロントエンドプラグインは、クライアントデータハンドラと呼ばれます。
これらは Snoopy.registerPlugin(sectionName, dataHandler) 関数を介して
登録されます。sectionName は、データハンドラが処理したいデータセクションの名前です。
この名前は、データを生成したバックエンドプラグイン名と同じです。
dataHandler は、次のシグネチャを持つ関数でなければなりません:
function($section, clientData) {...}。$section は、
データハンドラがデータを表示したり変更を加えたりできるdiv要素のjQuery
オブジェクトです。クライアントデータ(バックエンドプラグインによって生成されたもの)は、
clientData パラメータで渡されます。
データハンドラに許可されている出力は、指定されたdiv($section)への変更のみであるため、
戻り値は不要です。
SSIDの場所を調べる www.wigle.net でアカウントを作成し、'Configure server options' から資格情報を設定してください。
Web インターフェース http://your-snoopy-server:5000/ から Web インターフェースにアクセスできます。データを参照・表示する独自のプラグインを作成できます。Walter があなたにとって簡単になるようにしてくれています(このドキュメントの付録を参照)。
Maltego でデータを調査する Snoopy サーバーメニューで 'Configure Server Options' > 'Maltego' に移動します。ここに、Snoopy エンティティ、マシン、そしてトランスフォーム用 URL のダウンロード URL が表示されます。Maltego トランスフォームを使用するには、次の操作が必要です: