web-dev-qa-db-ja.com

着信リクエストのローカルホストチェックに合格する方法は?

マシンでホストされているhttpサーバーにリクエストを送信しようとしています。 httpサーバーはC#にあり、localhostからではないパケットをすべてドロップします。

public void Request(HttpListenerContext context) {
    if(!IPAddress.IsLoopback(context.Request.LocalEndPoint.Address))
        this.ConnectionRefused()
    ...
}

私はscapyを使用してTCP src IP for 127.0.0.1)をスプーフィングするというアイデアを持っていましたが、マシンは(wiresharkで確認された)パケットを受信しましたが、リクエストはトリガーされていないようです。ループバックチェックをバイパスしてこのポートにhttpリクエストを送信する方法を誰かが知っているかどうか疑問に思っています。

1
Rob Gates

Localhost(または127. *または:: 1)にリクエストを送信することにより、localhostチェックに「合格」します。たとえば、 http:// localhost / または http:// [:: 1] / に移動することで、Webブラウザーにこれを実行させることができます。サーバー用に投稿したC#コードスニペットはローカルIPアドレスをチェックしているため、サーバーが接続要求を受信したIPアドレスであり、クライアントの観点からは、クライアントが接続しようとしているIPアドレスです(目的地)。

接続しようとしているマシン以外のマシンからそのようなリクエストを送信しようとすると、自分のマシンにリクエストがルーティングされますが、これは希望どおりではありません(ループバックアドレスのポイントです)。たまたまTCP/IPトラフィックを含んでいる生のイーサネットパケットを作成して、IP宛先を127.0.0.1に設定し、そのパケットを(MACアドレス経由で)別のマシンに送信しようとすると、次のいずれかが起こります。

  • パケットがIPトラフィックであると認識され、誤って送信されているため、ネットワークスタックからエラーが発生します。しかし、ほとんどのネットワークドライバーはおそらくこれを行わないでしょう。もしそうであれば、(理論的には)その動作を編集できます。
  • パケットはネットワーク上に送信されますが、再び無効になるため、パケットが到着した最初のノード(おそらく、他のマシンに直接接続していない限り、スイッチまたはルーター)によって拒否されます。ループバックネットワークにバインドされていますが、外部ネットワークからのものです。これは、Wiresharkで表示されているものかもしれません
  • パケットはルーターまたはスイッチで受け入れられますが、他のホストに渡すのではなく(結局のところ、それが宛先IPアドレスです)、そのルーター/スイッチのループバックネットワークに渡されます(次の送信先がわかりません)パケット)。 これはデバイスのセキュリティバグであり、見つかった場合は製造元に報告する価値があります。
  • パケットは宛先コンピューターに送信され(直接接続されている場合、またはネットワークハブを介してブロードキャストされる場合)、最初にネットワークスタックによってTCP SYNパケットとして受け入れられます。ただし、サーバーがSYN/ACK、無効なパケットを送信しようとしているため失敗します(localhostから発信されたが、外部ホストにバインドされています)。 UDPパケットはそのようなハンドシェイクを必要としないため、これはまだネットワークドライバー/ IPスタックのセキュリティバグである可能性があります。非常に報告する価値があります。
  • パケットは宛先ホストに到達し、(上記のように)受け入れられ、TCP SYN/ACKサーバーから、最後のACKを使用してハンドシェイクを完了し、データの送信を開始するよう招待します。 OSネットワークスタックは着信パケットをTCPハンドシェイクが動作していたものの一部として認識しないため、これにはrawソケットリスナーが必要になるでしょう(可能ですが、 これは、サーバーのネットワークスタックに深刻なセキュリティバグがあることを示します

これらのいずれの場合でも、最後のケースを除いて、C#Webサーバーがリクエストを受信する可能性はありません。HTTPはTCP経由で送信され、TCPサーバーはハンドシェイクが完了するまで誰かがそれらに接続していることさえ通知しました。したがって、ネットワークスタックに本当に深刻なバグがあり、かなり直接接続されていない限り、これは決して起こりません発生する。

ここで、マシンの外部からループバックでのみリッスンしているサーバーに到達する方法を知りたい場合、その解決策は、が実行するターゲットサーバーと同じホスト上にあるプログラムを見つけることです外部トラフィックをリッスンし、指定された宛先(プロキシ)にリクエストをリレーするか、新しいWebリクエストの作成に使用できます(これは サーバーサイドリクエストフォージェリ(SSRF) 攻撃です、そしてそれらを作成する一般的な方法の1つは、 XML eXternal Entity(XXE) 攻撃による)です。

3
CBHacking