Sockstressは、インターネットやその他のTCPベースのネットワーク上でTCP接続を受け入れるサーバーやその他のデバイスを攻撃する方法です。[1]この方法は、サービスまたはマシン全体をクラッシュさせるためにローカルリソースを枯渇させ、本質的にはサービス拒否攻撃として機能します。
Sockstress は、Outpost24 の故 Jack C. Louis 氏によって社内で概念実証として開発されました。Louis 氏は、企業セキュリティのためにネットワークをテストおよび調査するために Unicornscan を使用して異常を発見し、それが Sockstress の開発につながりました。 [2]この概念は、2008 年 9 月に初めて実証されました。[3] [4] [5] [6]研究者は、攻撃を実証したフィンランドの T2 カンファレンスで詳細を発表する予定でした。[7] [8]代わりに、彼らはベンダーおよび標準化コミュニティと緊密に協力し、より多くの時間を割くことを選択しました。ブログのエントリで、彼らは「私たちは、不十分に実装された急いで修正を出すよう、ベンダーに過度のプレッシャーをかけていません」と述べています。
sockstressに似た攻撃を実証した概念実証ツールNkiller2が、Phrack ezineでFotis Chantzis(別名ithilgore)によってリリースされました。[9] Nkiller2はパケット解析技術と仮想状態を使用して完全にステートレスに動作し、TCPの固有のメカニズムであるPersist Timerを利用して、最小限のネットワークトラフィックで一般的なDoS攻撃を実行し、無限に延長することができます。
ソックストレスについて
Sockstress は、ユーザー ランドの TCP ソケット ストレス フレームワークで、状態を追跡する一般的なオーバーヘッドを発生させることなく、任意の数のオープン ソケットを完了できます。ソケットが確立されると、カウンター、タイマー、メモリ プールなどの特定の種類のカーネルおよびシステム リソースをターゲットにした TCP 攻撃を送信できます。ここで説明する攻撃の一部は「よく知られている」と考えられていますが、これらの攻撃の完全な影響はあまり知られていません。さらに、まだ発見または文書化されていない攻撃が他にもあります。研究者が特定のリソースを枯渇させる方法を文書化すると、攻撃モジュールが sockstress フレームワークのツリーに追加される可能性があります。
sockstress 攻撃ツールは、主に次の 2 つの部分で構成されています。
1) Fantaip: Fantaip [10]は、sockstress で使用するために IP アドレスを偽装するプログラムです。これは、偽装された IP を要求するホストに ARP 応答を送信することで実現されます。fantaip を使用するには、「fantaip -i interface CIDR」と入力します (例: 「fantaip -i eth0 192.168.0.128/25」)。この ARP/レイヤー 2 機能は、ローカル ネットワーク トポロジの要件に応じて、他の手段でオプションで提供できます。sockstress はユーザー ランドで TCP ソケットを完了するため、カーネルが使用するように設定された IP アドレスで sockstress を使用することはお勧めできません。カーネルがソケットを RST するからです。これは厳密には必須ではありません。ファイアウォールを使用して rst フラグ付きの着信パケットをドロップすることで、同じ目的を達成し、カーネルが攻撃ベクトルに干渉するのを防ぐことができます。
2) Sockstress: 最も基本的な使用法では、sockstress は TCP ソケットを開き、指定された TCP ストレス テストを送信するだけです。オプションで、アプリケーション固有の TCP ペイロード (HTTP 要求など) を送信できます。デフォルトでは、攻撃後、確立されたソケットでの後続の通信は無視されます。オプションで、アクティブなソケットの ACK プローブを送信できます。攻撃は、ターゲットがハンドシェイク後に使用可能にする公開リソースを利用します。
ブログ、ニュース、ディスカッション リストで頻繁に議論されているクライアント側 Cookie は、sockstress の実装の詳細であり、これらの攻撃を実行するために厳密に必要というわけではありません。
攻撃シナリオ
sockstress フレームワークにおけるすべての攻撃は、攻撃対象のシステム/サービスに何らかの影響を及ぼします。ただし、特定のシステム/サービスの組み合わせに対しては、一部の攻撃が他の攻撃よりも効果的です。
接続フラッドストレス
Sockstress には単純な接続フラッド攻撃を実行するための特別な攻撃モジュールはありませんが、-c-1 (最大接続数無制限) および -m-1 (最大 syn 無制限) オプションを使用すると、任意の攻撃モジュールを攻撃モジュールとして使用できます。
コマンドの例:
fantaip -i eth0 192.168.1.128/25 -vvvsockstress -A -c-1 -d 192.168.1.100 -m-1 -Mz -p22,80 -r300 -s192.168.1.128/25 -vv
ウィンドウ接続のストレスゼロ
リスニング ソケットへの接続を作成し、3 ウェイ ハンドシェイク (最後の ACK 内) 時に 0 ウィンドウを送信します。
syn -> (4k ウィンドウ)
<- syn+ack (32k ウィンドウ)
ack -> (0 ウィンドウ)
これで、サーバーはゼロ ウィンドウが開くまでクライアントを「プローブ」する必要があります。これは、最も理解しやすい攻撃タイプです。結果は接続フラッドに似ていますが、ソケットが潜在的に無期限に開いたままになる点が異なります (-A/ACK が有効になっている場合)。これは、CPNI ドキュメントのセクション 2.2 で説明されています。ここでのバリエーションは、ウィンドウを 0 に設定する前に、クライアント ペイロード (つまり 'GET / HTTP/1.0') を PSH することです。このバリエーションは、CPNI ドキュメントのセクション 5.1.1 で説明されているものと似ています。さらにバリエーションとして、0 より大きい TCP ウィンドウをときどきアドバタイズしてから、0 ウィンドウに戻るという方法があります。
良い相手:
- タイムアウトが長いサービス
コマンドの例:
fantaip -i eth0 192.168.1.128/25 -vvvsockstress -A -c-1 -d 192.168.1.100 -m-1 -Mz -p22,80 -r300 -s192.168.1.128/25 -vv
小さな窓のストレス
リスニング ソケットへの接続を作成し、3 ウェイ ハンドシェイク (最後の ACK 内) でウィンドウ サイズを 4 バイトに設定し、TCP ペイロードを含む ACK/PSH パケット (うまくいけばそれを受け入れられる大きさのウィンドウ内) を作成します。このときウィンドウは 4 バイトのままです。これにより、応答を取得してそれを 4 バイトの小さなチャンクに分割するため、カーネル メモリが消費される可能性があります。これは、要求が行われるたびにメモリが消費されるという点で、接続フラッドとは異なります。これにより、Linux/Apache および Linux/sendmail システムが確実に機能停止状態になります。これは他のシステムに対しても有効です。これは、CPNI ドキュメントの 17 ページの最後から 2 番目の段落で説明されている効果と類似していると予想されます。
sockstress ソースの payload.c ファイルを参照してください。hport スイッチ ステートメントを探します。そのセクションでは、特定のポートに送信されるペイロードを指定できます。できるだけ大きな応答を生成するペイロード (つまり 'GET /largefile.zip') を送信するのが最も効果的です。
良い相手:
- 初期接続バナーを含むサービス
- 最初のリクエストを受け入れて大きなレスポンスを送信するサービス(たとえば、大きな Web ページに対する GET リクエストやファイルのダウンロードなど)
コマンドの例:
fantaip -i eth0 192.168.1.128/25 -vvvsockstress -A -c-1 -d 192.168.1.100 -m-1 -Mw -p22,80 -r300 -s192.168.1.128/25 -vv
セグメント穴の応力
リスニング ソケットへの接続を作成し、3 ウェイ ハンドシェイク (最後の ACK 内) 時に、リモート システムによって通知されたウィンドウの先頭に 4 バイトを送信します。次に、ウィンドウの末尾に 4 バイトを送信します。次に、接続を 0 ウィンドウにします。スタックによっては、これによりリモート システムが接続ごとにカーネル メモリの複数のページを割り当てる可能性があります。これは、確立された接続ごとにメモリが消費されるという点で、接続フラッドとは異なります。この攻撃は Linux をターゲットにするために作成されました。Windows に対しても非常に効果的です。これは、sec-t および T2 デモで使用された攻撃です。これは、CPNI ドキュメントのセクション 5.2.2 の 5 番目の段落とセクション 5.3 で説明されているものと同様の効果があると予想されます。
良い相手:
- この刺激に応じてカーネルメモリの複数のページを割り当てるスタック
コマンドの例:
fantaip -i eth0 192.168.1.128/25 -vvvsockstress -A -c-1 -d 192.168.1.100 -m-1 -Ms -p22,80 -r300 -s192.168.1.128/25 -vv
REQ FIN 一時停止 ストレス
リスニング ソケットへの接続を作成します。PSH はアプリケーション ペイロード (つまり 'GET / HTTP/1.0') です。接続を FIN し、0 ウィンドウにします。この攻撃は、ターゲットとするスタック/アプリケーションによって結果が大きく異なります。これを Cisco 1700 (IOS) Web サーバーに対して使用すると、ソケットが FIN_WAIT_1 に無期限に残されることが観察されました。このようなソケットが十分に増えると、ルータは TCP を正しく通信できなくなります。
sockstress ソースの payload.c ファイルを見てください。hport スイッチ ステートメントを探してください。そのセクションでは、特定のポートに送信するペイロードを指定できます。やり取りするアプリケーションに、通常のクライアントのように見えるペイロードを送信する必要があります。Cisco 1700 に対してこの攻撃を使用する場合、非常に遅い速度で攻撃することが重要でした。
コマンドの例:
fantaip -i eth0 192.168.1.128/25 -vvvsockstress -A -c-1 -d 192.168.1.100 -m-1 -MS -p80 -r10 -s192.168.1.128/25 -vv
リノ圧力ストレスを活性化する
リスニング ソケットへの接続を作成します。PSH はアプリケーション ペイロード (つまり 'GET / HTTP/1.0') です。トリプル重複 ACK。
sockstress ソースの payload.c ファイルを見てください。hport スイッチ ステートメントを探してください。そのセクションでは、特定のポートに送信されるペイロードを指定できます。対話するアプリケーションには、通常のクライアントのように見えるペイロードを送信する必要があります。
良い相手:
- reno または同様のスケジューラ機能をアクティブ化するこの方法をサポートするスタック
コマンドの例:
fantaip -i eth0 192.168.1.128/25 -vvvsockstress -A -c-1 -d 192.168.1.100 -m-1 -MR -p22,80 -r300 -s192.168.1.128/25 -vv
その他のアイデア
- FIN_WAIT_2 ストレス
リスニング ソケットへの接続を作成します。反対側のアプリケーションがソケットを閉じる原因となる可能性のあるアプリケーション ペイロードを PSH します (ターゲットが FIN を送信します)。FIN を ACK します。
良い相手:
- FIN_WAIT_2 タイムアウトがないスタック。
- 大きな輻輳ウィンドウのストレス
- パスMTUストレスを縮小
- MD5ストレス
攻撃の影響
攻撃によって接続が永続的に停止状態になる場合、サーバーの接続テーブルがすぐにいっぱいになり、特定のサービスに対してサービス拒否状態が効果的に発生します。また、多くの場合、攻撃によって大量のイベント キューとシステム メモリが消費され、攻撃の影響が強まります。その結果、TCP 通信のイベント タイマーがなくなったシステム、フリーズしたシステム、システムの再起動が発生します。攻撃にはそれほど多くの帯域幅は必要ありません。
1 つのサービスが数秒で利用できなくなるのは簡単ですが、システム全体が機能しなくなるには何分も、場合によっては何時間もかかることがあります。原則として、システムのサービスが多いほど、攻撃による壊滅的な影響 (TCP の破損、システムのロック、再起動など) に屈する時間が早くなります。あるいは、より多くの IP アドレスから攻撃することで、攻撃を増幅することもできます。私たちのラボでは、通常、/29 から /25 までを攻撃します。/32 からの攻撃は、通常、システム全体の障害を引き起こすのにあまり効果がありません。
悪用に関する注意事項
この攻撃では、被害者の接続テーブルを効果的に埋めるために、TCP 3 ウェイ ハンドシェイクが成功する必要があります。これにより、攻撃者は追跡を回避するためにクライアントの IP アドレスを偽装することができないため、攻撃の有効性が制限されます。
sockstress スタイルのエクスプロイトでは、パケットをOS の connect() APIではなくユーザー空間で処理する必要があるため、攻撃マシンのraw ソケットへのアクセスも必要です。raw ソケットはWindows XP SP2以降では無効になっていますが、デバイス ドライバーはすぐに利用可能で[11]、この機能を Windows に戻すことができます。このエクスプロイトは、 *nixなどの raw ソケットを備えた他のプラットフォームでもそのまま実行でき、ルート (スーパーユーザー) 権限が必要です。
緩和
攻撃者がターゲットに影響を与えるには TCP ソケットを確立する必要があるため、重要なシステムやルーター上の TCP サービスへのアクセスをホワイトリスト化することが、現時点で最も効果的な軽減手段です。IPsec の使用も効果的な軽減策です。
Cisco Response [12]によると、現在の緩和策は、信頼できるソースのみが TCP ベースのサービスにアクセスできるようにすることです。この緩和策は、重要なインフラストラクチャ デバイスにとって特に重要です。Red Hat は、「アップストリームがアップデートをリリースしないという決定により、Red Hat はこれらの問題を解決するアップデートをリリースする予定はありませんが、これらの攻撃の影響を軽減することはできます」と述べています。Linux では、接続追跡とレート制限を備えたiptables を使用すると、悪用の影響を大幅に制限できます。[13]
参考文献
- ^ Security Now! ポッドキャストで Sockstress について解説
- ^ ロバート・E・リーとジャック・C・ルイスのインタビュー(英語が始まってから最初の8分間)2008年10月2日にWayback Machineにアーカイブ
- ^ 「Robert E. Lee: Sec-T Sockstress Recap」。2008年11月5日時点のオリジナルよりアーカイブ。
- ^ Carl Nordenfelt のブログ投稿 2008-10-05 に Wayback Machineでアーカイブ
- ^ アメリア・ニルソンのブログ投稿
- ^ Mikael (FireLynx) のブログ投稿 2012-08-02 archive.todayにアーカイブ
- ^ http://www.t2.fi/
- ^ http://radian.org/notebook/van-helsingfors
- ^ TCP と Persist タイマーの無限性を利用する
- ^ Fantaip には Unicornscan が付属しています。2013-04-16 にarchive.todayでアーカイブされました。
- ^ 「Raw TCP ソケットと Npcap | PingPlotter」。
- ^ シスコの回答
- ^ CVE-2008-4609 は Red Hat Enterprise Linux に影響しますか?
外部リンク
- ソースコード - Slackware 14 でクリーンコンパイル
- パブリックドメインC実装(サードパーティ)
- アウトポスト24
- セキュリティナウポッドキャストの編集
- セキュリティナウ #164 番組ノート トランスクリプト
- ユニコーンスキャン
- スラッシュドットニュース記事
