web-dev-qa-db-ja.com

内部IPアドレス(プライベート)がインターネットから見えるのはなぜですか?

http://www.monip.org または http://ip-api.com のようないくつかのWebサイトにアクセスすると、次の結果が得られます。

Your current IP Address
 - IP:    197.158.x.x
 - Internal IP:    192.168.x.x

パブリックIPアドレス(197.158.x.x)が表示されることを理解しています。私が理解できないのは、私の内部IPアドレスインターネット経由で表示される理由です

これらのWebサイトは Flash プラグイン、Javaアプレットまたはその他のスクリプトを使用していないようです。私のISPはNAT of myインターネットにアクセスするための内部IPアドレス:

3G Wireless Modem [192.168.x.x] -------- ISP [NAT to 197.158.x.x] ------- Internet

では、どのようにしてWebサイトが私の内部IPアドレスを確認できるのでしょうか。

この情報の最も可能性の高いソースは、ブラウザの WebRTC 実装です。

これは、ip-api.comの ソースコード で確認できます。

https://github.com/diafygi/webrtc-ips から、この手法のデモも提供しています。

FirefoxとChromeはWebRTCを実装しており、ローカルおよびパブリックIPアドレスを返すSTUNサーバーへのリクエストを許可しますこれらのリクエスト結果はJavaScriptで利用できるため、JavaScriptでユーザーのローカルIPアドレスとパブリックIPアドレスを取得できます。

New York Times がこの手法を使用して、実際の訪問者とボットを区別していることが最近指摘されました(つまり、WebRTC APIが利用可能であり、有効な情報を返す場合、それはおそらく実際のブラウザです)。

このAPIをブロックすることを目的とした Chromeextensions がいくつかありますが、現時点では効果がないようです。これはおそらくGitHub READMEが示唆しているように、ブラウザにはまだフックがないためです。

さらに、これらのSTUNリクエストは通常​​のXMLHttpRequestプロシージャの外で行われるため、開発者コンソールに表示されないか、AdBlockPlusやGhosteryなどのプラグインによってブロックされる可能性があります。

112
Christopher

内部IPアドレスを取得する一般的な方法は、JavaScriptでRTCPeerConnectionを使用することです。

http://ip-api.com/ たとえば、次のコードを含む「gi」という名前のJavaScript関数を呼び出しています。

...
 o = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection,
...

技術的には、RTC接続(オブジェクトo)に "onicecandidate"を指定してコールバックを設定し、イベントから候補者候補を取得します。これにより、すべてのローカルIPアドレスが一覧表示されます。ネットワークインターフェース。

Module:Get Internal IP WebRTCを見てください。

JavaScriptスクリプトはこの情報をインターネットサーバーに送り返すことができますが、例として http://ip-api.com/ はそれをクライアントに表示しているだけです。

47
r00t

WebRTC は、LAN IPアドレスを検出できるいくつかの方法の1つにすぎません。

Blend Threats and JavaScript:A Plan For Permanent Network Compromise と呼ばれるこのトピックに関して、Nice Black Hat 2012の講演がありましたが、 Phil PurvianceJosh Brashars は、ホームwifiルーターを見つけてワイプする自動化された方法を発表しましたウェブサイトをシングルクリック。

Blended Threats and JavaScript

これはWebRTCに先行していたため、別の方法でルーターのIPアドレスを検出する必要がありました。これは、 jslanscannerJSScanJS-Recon ですが、ルーターのアドレスを推測するだけの埋め込みオブジェクトの単純な(まだ大きい)コレクションです(たとえば、予期されるルーターイメージを埋め込み、いつ通知するかによって)正常にロードされます)。アドレスを取得したら、 RouterPasswords.com を使用するか、 Routerpwn.com

概念実証として、彼らのデモンストレーションはルーターIPを発見し、デフォルトのパスワードを調べてログインし、自動的に交換ファームウェア(DD-WRT)をインストールしました。実際の攻撃では、新しいファームウェアに悪意のある機能がいくつもあり、変更されていない元のルーターシステムのように見せかけることができます。

(確かに、これはローカルLAN IPアドレスではなく、自宅のwifiルーターのLAN IPアドレスを識別しますが、かなり近く、間違いなくより警戒感があります。)

23
Adam Katz

ほとんどの場合、ブラウザー(またはISP)が内部IPアドレスを明らかにする X-Forwarded-Forヘッダー を送信しています。 this one のようなサイトをチェックして、送信しているヘッダーを確認します。

6
Mark

2つのリンクのうち最初のリンクは機能しませんでしたが、2番目のリンクは機能しました。 2番目のリンクのJavaScriptコードを表示すると、window.RTCPeerConnectionを使用していることがわかりました。

すべてのブラウザがRTCPeerConnectionをサポートしているわけではありませんが、サポートしているブラウザでは、ブラウザのローカルIPアドレスを識別するために使用できます。これ スタックオーバーフローの回答 は、RTCPeerConnectionの非同期APIを使用してローカルIPアドレスを見つける方法の例を示しています。

3
kasperd

このサイトは、マシンで実行されているJavaScriptをホストしており、内部アドレスを把握して画面に表示している可能性があります。

リモートサーバーは内部アドレスを認識せず、HTTPヘッダーで転送されることはほとんどありません。

1
kevino_17

基盤となるTCP/IPプロトコルは内部アドレスを公開しません-パブリックインターネット経由のルーティングには使用されず、境界ルーターによってパケットが作成されるため、レイヤー3のプロトコルパケット自体にキャプチャ/格納されません。 。実行している任意の数のサービスまたはクライアントmayヘッダー、サービスバナーなどのレイヤー7でこれを開示します。

この情報を漏らしているものを見つける確実な方法は、内部ネットワーク(wiresharkやtcpdumpなど)でネットワークトラフィックダンププログラムを使用して、レイヤー7のパケットの内容、つまりデータペイロードを確認し、内部アドレスがそうでないかどうかを確認することです。クライアントによってデータペイロードのどこかに記録されている場合、おそらく境界ルーターから送信されます(これはありそうもないことです)。ルーターのインターネット側のネットワークトラフィックをキャプチャして、これがどのように行われているかを確認する必要があります。

1