
Snoopy v2.0 - モジュラー型デジタル地上追跡フレームワーク
SensePost presents:
/$$$$$$
/$$__ $$
| $$ \__/ /$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$ /$$
| $$$$$$ | $$__ $$ /$$__ $$ /$$__ $$ /$$__ $$| $$ | $$
\____ $$| $$ \ $$| $$ \ $$| $$ \ $$| $$ \ $$| $$ | $$
/$$ \ $$| $$ | $$| $$ | $$| $$ | $$| $$ | $$| $$ | $$
| $$$$$$/| $$ | $$| $$$$$$/| $$$$$$/| $$$$$$$/| $$$$$$$
\______/ |__/ |__/ \______/ \______/ | $$____/ \____ $$
| $$ /$$ | $$
| $$ | $$$$$$/
|__/ \______/
Version: 2.0
Code: [email protected] // @glennzw
Visit: www.sensepost.com // @sensepost
License: Non-commercial use
Snoopy バージョン 2.0 へようこそ!
Snoopy をインストールしてセットアップするには:
bash install.sh
ワイヤレス、システム情報、ハートビートプラグインのデータをローカルに保存するには:
snoopy -v -m wifi:mon=True -m sysinfo -m heartbeat -d myDrone -l London
クライアントからサーバーにデータを同期するには:
サーバー側:
snoopy_auth --create myDrone # アカウントを作成
snoopy -v -m server # サーバープラグインを起動
クライアント側:
snoopy -v -m wifi:mon=True -s http://<server>:9001/ -d myDrone -l London -k <key>
はじめにと概要 ================= Snoopy は分散型のセンサー、データ収集、傍受、分析、可視化フレームワークです。モジュール形式で記述されており、Python プラグインを介してさまざまなソースから任意のデータを収集できます。
アーキテクチャ
各 Snoopy インスタンスは複数のプラグインを同時に実行できます。プラグインはデータを収集し、メインの Snoopy プロセスによってクエリされ、ローカルデータベースに書き込まれます。Snoopy はクライアント(ドローン)とサーバー間でデータを同期でき、クライアント(ドローン)はサーバーからデータのレプリカをプルすることもできます。各 Snoopy インスタンスは、全体像における自身の位置に適したプラグインを実行できます。以下は、考えられる設定の 1 つを示す図です。
Drone01 Server01
+---------------+ +--------------+
| Plugins: | | Plugins: |
| * WiFi | | *Server |
| * Bluetooth |====3G====>| |<=========================\
| * GSM | | | ||
| * FitBit | | | ||
+---------------+ +--------------+ ||
||
Drone02 Server02 Server03 ||
+---------------+ +--------------+ +-------------+ ||
| Plugins: | | Plugins: | | Plugins: | ||
| * WiFi | | * Server | | * Server | ||
| * Cookie |=====Xbee==>| * Heartbeat |==3G==>| * Wigle |<==\
| thief | || | | | * DataViz | ||
| * GPS | || | | | | ||
+---------------+ || +--------------+ +-------------+ ||
|| Internet
Drone03 || Laptop01 ||
+---------------+ || +--------------+ ||
| Plugins: | || | Plugins: | ||
| * Thermal | || | *RemotePull | ||
| * Camera |===/ | |====/
| * Heat | | Run: |
| | | *Maltego |
+---------------+ +--------------+
上図では、3 台のドローンが実行され、データを 2 つの別々のサーバーに同期しています。1 つは 3G 経由、残り 2 つは Xbee 経由です。2 番目のサーバーは自身のデータを 3 番目のサーバーに同期します。最後に、クライアント(ラップトップ)が 1 番目と 3 番目のサーバーからすべてのデータをプルし、Maltego を実行してデータを探索します。
snoopy-ng.git ディレクトリ内で 'sh install.sh' を実行すると、必要なパッケージがすべてインストールされます。aircrack をソースからインストールするかどうかのオプションが表示されます。これは、このパッケージがないディストリビューション(ワイヤレスプラグインに aircrack スイートを使用)に必要です。データ探索には Maltego を強くお勧めします。コミュニティエディション(一部制限あり)は Paterva の Web サイト http://paterva.com から無料でダウンロードできます。
利用可能なすべてのフラグとオプションを確認するために、2 つのコマンドを用意しました。
root@kali:~# snoopy --help (短縮形 -h)
このコマンドは、同期先のサーバー、ドローンの名前、場所など、すべての実行オプションを表示します。さらに、さまざまなプラグインの実行方法も紹介します。
root@kali:~# snoopy --list (短縮形 -i)
このコマンドは、利用可能なすべてのプラグインと、各プラグインが正しく機能するために必要なパラメータを一覧表示します。各プラグインの詳細情報を得るには '-ii' または '-iii' を使用します。特定のプラグインの情報を得るには '-i -m ' を使用します。
プラグインは --plugin(または短縮形 -m)オプションで指定できます。複数のプラグインを指定でき、指定された順序で起動されます。各プラグインには準備完了状態を示すまで 60 秒の猶予が与えられ、タイムアウトすると次のプラグインが開始されます。これは、後続のプラグインが前のプラグインの動作に依存する場合に便利です。
各プラグインは、カンマ区切りのキーと値のペア形式で多数のパラメータを取ることができます(--list の出力を参照)。以下では、単純に乱数を生成する 'example' プラグインを使用します。
snoopy --plugin example:x=1,v=True
ドローンや場所のオプションが指定されていない場合は、デフォルト値が使用されます。または、以下のように指定することもできます。
snoopy --plugin example:x=1,v=True --drone myDrone --location Cansas
--server (-s) オプションを指定することで、データをリモートマシンに同期できます。リモートマシンではサーバープラグイン(--plugin server)を実行している必要があります。事前にドローン名用のキーを生成する必要があります。以下にその例を示します。
サーバー
root@server:~# snoopy_auth --create myDrone01 --verbose
[+] 新しい Snoopy サーバー同期アカウントを作成中
[+] 'myDrone01' のキー: 'GWWVF'
[+] クライアントモードでこの値を使用して、リモートサーバーにデータを同期します。
root@kali:~# snoopy --plugin server
[+] ウェブサーバーを '0.0.0.0:9001' で実行中
[+] プラグイン server が 2 テーブルのデータを取得しました。
クライアント
root@client:~# snoopy --plugin example:x=1 --drone myDrone --key GWWVF --server http://<server_ip>:9001/ --verbose
[+] Snoopy をプラグイン example で起動中
[+] プラグイン example が新しい乱数を生成: 21
[+] Snoopy が 2 テーブルにわたる 2 要素の同期に成功しました。
リモートデータプル
local_sync プラグインを使用してサーバーからデータをプルできます。例えば、上記のようにサーバーが実行されていると仮定し、クライアントから次の操作を実行します。
root@client:~# snoopy --plugin local_sync:server_url=http://<server_ip>:9001/ --drone myDrone --key GWWVF
[+] プラグイン local_sync がリモートサーバーから 888 件のレコードをプルしました。
デフォルトでは、すべてのデータは SQLITE ファイル snoopy.db に保存されます。これは --dbms パラメータで上書きできます。異なるデータベースエンジンの指定方法については、SQL Alchemy のドキュメントを参照してください(http://docs.sqlalchemy.org/en/rel_0_9/dialects/index.html)。例として、以下では MySQL を使用しています。
root@client:~# snoopy -v --plugin example --dbms=mysql://glenn:secret@localhost/snoopy_db
[+] ローカルのみキャプチャ中。'mysql://glenn:secret@localhost/snoopy_db' に保存中
小型デバイスでは SQLITE ストレージを使用し、サーバープラグインが MySQL(または類似)に保存するのが便利かもしれません。さらに、リムーバブルメディアなど、データを保存するファイルの場所を指定する場合の別の例を示します。
root@client:~# snoopy -v --plugin example --dbms=sqlite:////media/USB01/snoopy.db
データが上流サーバーと同期された後、ローカルストレージからデータを「フラッシュ」する --flush (-f) オプションもあります。
Snoopy は upstart スクリプトを使用して起動できます(./setup/upstarts フォルダーを参照)。同じディレクトリに他のサンプル upstart スクリプトも用意されています(例:3G モデムから PPP 接続を立ち上げるもの、SSH リモートコマンドチャネルを作成するもの)。
Debian ベースのシステム(Kali など)は upstart をサポートしていないようです。当面は、付属の rc.local ファイルを使用して、起動時に Snoopy および関連サービスを開始できます。
可視化には Maltego が推奨されます。手順は以下の通りです。
これでエンティティとトランスフォームの両方がインポートされます。まず、パレットメニューの Snoopy タブから「Base of Operations」エンティティを空白のグラフにドラッグします。例として、エンティティに対して次の操作を実行します。
(パッシブモニタリングからの)ドメインとクッキーの取得、SSID のストリートアドレスの検索、および双方向のトランスフォーム(例:場所からクライアントを検索、クライアントから場所を検索)が存在します。ぜひ試してみてください。
デフォルトの sqlite 形式を使用しない場合は、以下のファイルを編集してデータの場所を指定します。
snoopy_ng/transforms/db_path.conf
Maltego のコラボレーション機能を使用すると、複数のアナリストが同時に Snoopy グラフを共有できます。「Collaboration」→「Share Current Graph」を選択します。
商用利用 =================== Snoopy のリリースライセンスは、その使用による金銭的利益(またはその他)を得ることを禁じています(LICENSE.txt 参照)。商用利用向けの別のライセンスも提供しており、以下のような追加機能が含まれています。
ご興味があれば、お問い合わせください([email protected] / [email protected])。
プラグインの作成方法については、plugins/example.py ファイルを参照してください。plugins フォルダーに配置されたファイルはすべてプラグインとして扱われ、以下の特性を持つ必要があります。
それ以外は、プラグインは自由に動作させることができます。
Snoopy は、install.sh ファイルからファイルをインストールするために十分なサポートがあれば、どの Linux デバイスでも実行できます。つまり、Python と関連パッケージが必要です。必要なプラグインによってハードウェアサポートは異なりますが、最も一般的な WiFi データ収集と 3G アップロードのシナリオでは、以下の構成を推奨します。
Kali 1.05 および Ubuntu 12.04 でテスト済みです。同様のシステムでも動作するはずです。
データをローカルで収集し、リモートサーバーに同期し、その後サーバーからレプリカをプルすると、エラーが発生します。例:
サーバー
root@kali:~# snoopy -m server -m wigle:username=u,password=p,[email protected]
[+] ウェブサーバーを '0.0.0.0:9001' で実行中
[+] プラグイン server が 2 テーブルのデータを取得しました。
クライアント
root@client:~# snoopy -m wifi -m local_sync:server_url=http://1.1.1.1:9001/ -d myDrone -l London -k secretkey -s http://1.1.1.1:9001/