断片

です・ます調が記事によって違ったりするブログ

exitmap

はじめに

TorがOnionRoutingという仕組みで秘匿性を保っていることは既に皆さんご存知かと思います.そしてOnionRoutingにおいて,Torネットワークからクリアネット(非Torネットワーク)への架け橋となる出口ノード(ExitNode)の存在は非常に重要で,エンドtoエンドでの暗号化通信を行っていない場合,ExitNodeにはクライアントの通信内容が筒抜けになります.Torネットワークの各ノード(EntryNode,BridgeNode,RelayNode,ExitNode)は誰でもなることができるため,悪意をもって盗聴や改ざんを行うExitNodeの存在が非常に脅威となります.そこで,今回は悪意のあるExitNodeや,そういった疑いのあるExitNodeを探索するツールであるexitmapについて紹介します.

exitmap

exitmapはスウェーデンのカールスタード大学 PriSecグループとオーストリアのSBA Researchの共同研究によって2014年に開発されたもののようです. Pythonベースのプログラムになっており,内部的にStemを使用しているため,Tor本体をインストールしておく必要があります.

https://www.cs.kau.se/philwint/spoiled_onions/ github.com

イメージとしては,exitmap内でモジュール(例えば,ファイルのダウンロード・Webサーバへの接続等を行うモジュール)が評価対象のExitNodeを通じて実行され,その実行結果からNegative/Positiveを判定する感じです.モジュールは各自で開発することもできます.

使ってみる

環境

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.10
DISTRIB_CODENAME=yakkety
DISTRIB_DESCRIPTION="Ubuntu 16.10"
$ uname -mr
4.8.0-52-generic x86_64

インストール

$ git clone https://github.com/NullHypothesis/exitmap
$ cd exitmap
$ pip install -r requirements.txt
$ cd ..

使い方

$ ./exitmap/bin/exitmap (モジュール名) のように指定します.デフォルトで入っているモジュールには以下のようなものがあります.

  • checktest
    • https://check.torproject.org/に接続し,Torと判定されるかチェックする.(ExitNodeがプロキシを刺しているかチェックする)
  • testfds
    • 単純なWebページの内容を取得できるかチェックする.(ExitNodeのファイルディスクリプタが正しく機能しているかチェックする)
  • dnspoison
    • 名前解決を行い,受信したAレコードと予想されるAレコードの比較を行う.(ExitNodeがDNSスプーフィングを行っているかチェックする)
  • dnssec
    • ExitNodeがDNSSECを検証するかどうかチェックする.
  • patchingCheck
    • ファイルのダウンロードを行い,改ざんをチェックする.
  • cloudflared
  • rtt
    • RTTをチェックする.

正直なところ,各モジュールの役割についてはソースコードを読んだ方が早いです.モジュールは./exitmap/src/modules/以下に配置されています. また,exitmap本体にもいくつかのオプションがあります.詳細はhelpオプションで確認できるので,ここではいくつかの重要なオプションについて紹介します.

  • --country [Country Code]
    • ExitNodeの国を指定するオプションです.日本であればJPのように指定します.
  • --first-hop [FingerPrint]
    • EntryNode(first hop)を20バイトのフィンガープリントで指定します.
  • --exit [FingerPrint]
    • ExitNodeを20バイトのフィンガープリントで指定します.
  • --build-delay [Seconds]
    • Torのサーキットを生成する際に任意の秒数間休止します.

以下の例は全ての出口ノードに対してdnspoisonモジュールを実行した例です.今回はDNSスプーフィングの疑いのあるExitNodeは発見できませんでした.

https://gist.github.com/epcnt19/84d753545ac715a569e31cc44fed883f#file-exitmap

おわりに

悪意のあるExitNodeを発見するためには,exitmapによる継続的なスキャンや,モジュールの拡張・自作を行う必要がありそうです.ただし,継続的なスキャンという点に関してはスキャンがTorネットワークへ負荷を与えているという点に注意する必要があります.

独り言

全出口ノード数は800〜900程度だそうですが,案外少なくないですか(調べてみたら,ここ数年で結構減少してるっぽい)

https://metrics.torproject.org/relayflags.html