マシンでホストされている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リクエストを送信する方法を誰かが知っているかどうか疑問に思っています。
Localhost(または127. *または:: 1)にリクエストを送信することにより、localhostチェックに「合格」します。たとえば、 http:// localhost / または http:// [:: 1] / に移動することで、Webブラウザーにこれを実行させることができます。サーバー用に投稿したC#コードスニペットはローカルIPアドレスをチェックしているため、サーバーが接続要求を受信したIPアドレスであり、クライアントの観点からは、クライアントが接続しようとしているIPアドレスです(目的地)。
接続しようとしているマシン以外のマシンからそのようなリクエストを送信しようとすると、自分のマシンにリクエストがルーティングされますが、これは希望どおりではありません(ループバックアドレスのポイントです)。たまたまTCP/IPトラフィックを含んでいる生のイーサネットパケットを作成して、IP宛先を127.0.0.1に設定し、そのパケットを(MACアドレス経由で)別のマシンに送信しようとすると、次のいずれかが起こります。
SYN
パケットとして受け入れられます。ただし、サーバーがSYN/ACK
、無効なパケットを送信しようとしているため失敗します(localhostから発信されたが、外部ホストにバインドされています)。 UDPパケットはそのようなハンドシェイクを必要としないため、これはまだネットワークドライバー/ IPスタックのセキュリティバグである可能性があります。非常に報告する価値があります。SYN/ACK
サーバーから、最後のACK
を使用してハンドシェイクを完了し、データの送信を開始するよう招待します。 OSネットワークスタックは着信パケットをTCPハンドシェイクが動作していたものの一部として認識しないため、これにはrawソケットリスナーが必要になるでしょう(可能ですが、 これは、サーバーのネットワークスタックに深刻なセキュリティバグがあることを示します 。これらのいずれの場合でも、最後のケースを除いて、C#Webサーバーがリクエストを受信する可能性はありません。HTTPはTCP経由で送信され、TCPサーバーはハンドシェイクが完了するまで誰かがそれらに接続していることさえ通知しました。したがって、ネットワークスタックに本当に深刻なバグがあり、かなり直接接続されていない限り、これは決して起こりません発生する。
ここで、マシンの外部からループバックでのみリッスンしているサーバーに到達する方法を知りたい場合、その解決策は、が実行するターゲットサーバーと同じホスト上にあるプログラムを見つけることです外部トラフィックをリッスンし、指定された宛先(プロキシ)にリクエストをリレーするか、新しいWebリクエストの作成に使用できます(これは サーバーサイドリクエストフォージェリ(SSRF) 攻撃です、そしてそれらを作成する一般的な方法の1つは、 XML eXternal Entity(XXE) 攻撃による)です。