コンピュータ ユーザーが最初に学ぶ低レベル ネットワーク ツールの XNUMX つは、由緒ある ping
ユーティリティ。
潜水艦が登場する昔ながらの戦争映画のあらゆる場面に出てくる効果音にちなんで名付けられたこのコマンドは、SONAR として知られる RADAR の水中バージョンの比喩的な反響です (そこで何をしたか見てください)。
ping を送信します (動作中のノイズのようなものです。 現実その不気味なエコーが戻ってくるまでの時間を測定し、周囲の海の音速を推定することで、エコーを生成したオブジェクトまでの距離を計算できます。
興味深いことに、インターネットを動かしているプロトコルの接着剤の一般的な説明として TCP/IP という略語が使われているのを聞いたことがあるかもしれません。 ping
技術的には TCP/IP をまったく使用しません。
実際、TCP/IP は インターネットプロトコル上の伝送制御プロトコル、およびネットワーク自体が多くの「それは実際に正しく機能したか?」というような方法で、インターネット経由でデータを送信するためのかなり高レベルのメカニズムを指します。 あなたのための努力。
たとえば、TCP 接続では、送信するデータのチャンクは、相手側に完全に到着するか、エラーを発生させて、データが到達しなかったことがわかるように保証されます。
さらに、異なるデータ チャンクがインターネット上で異なるルートを使用することになった場合でも (たとえば、負荷分散、一時的な停止、またはその他の回復可能なエラーが原因で)、一部のチャンクが他のチャンクよりも到着に時間がかかる場合でも、TCP データは正しくバッファリングされます。アップし、反対側で正しい順序で提示します。
ピンが違う
ping
ただし、コマンドは通常、関心のあるコンピューターがオンラインであるかどうかを確認するために使用されます。特に、電子メールの受信や SSH ログインの許可など、期待する種類の高レベル TCP 接続を受け入れていない場合は特にそうです。
これにより、停止の原因がネットワークまたはサーバー自体のダウンにある可能性が高いのか、そのサーバーで実行されている個々のサービスが正しく開始されていないことが原因である可能性が高いかをすばやく判断できます。
結果として、 ping
TCP よりもはるかに低レベルのプロトコルを使用します。
確かに、 ping
TCP のよりカジュアルな従兄弟である UDP も使用しません。 ユーザーデータグラムプロトコルこれは、高速で簡単なデータ チャンクを送信する方法ですが、一般的にセンド アンド ホープ (冷笑的な人はスプレー アンド プレイ) と呼ばれています。
UDP 自体は、データが相手に届いたかどうかを通知しません。また、データがそのまま届いたとしても、UDP はパケットが最初に送信された順序を追跡しないため、パケットを再配置することはできません。彼らが順不同でそこに着いたら、もう一方の端。
Ping
、それが価値があるために、ICMPとして知られる、トラブルシューティングとネットワークの再構成の目的のために特別に設計された非常に低レベルの実際のプロトコルを使用する、または インターネット制御メッセージ プロトコル.
通常、オペレーティング システム カーネルで正しく処理されるため、上位レベルのネットワーク ソフトウェアが正しく起動していなくても、ICMP/IP パケットはほぼ確実に通過します。ICMP には、特に XNUMX つの特別なメッセージ タイプが含まれています。
- 0x08 と入力します。 正式に呼ばれた
ICMP Echo
、 この パケットの種類 通常、エコー リクエストと呼ばれます。 それはping
プログラムは、ネットワーク上のアクティブなコンピューターをプローブするために送信します。 - 0x00 と入力します。 正式に呼ばれた
ICMP Echo Reply
、このパケット タイプは まさにそれが言うこと. 生きていて、オンラインで、ICMP Echo トラフィックをブロックするように構成されていないコンピューターは、この種のパケットを要求したコンピューターに直接送り返すことになっています。
いいね:
$ ping -c 3 -p 4E414B45445345435552495459 baresecurity.sophos.com パターン: 0x4e414b45445345435552495459 PING news-sophos.go-vip.net (192.0.66.227) 56(84) バイトのデータ。 64 (192.0.66.227) からの 192.0.66.227 バイト: icmp_seq=1 ttl=53 time=84.0 ミリ秒 64 (192.0.66.227) からの 192.0.66.227 バイト: icmp_seq=2 ttl=53 time=85.1 ミリ秒 64 (192.0.66.227) からの 192.0.66.227 バイト: icmp_seq=3 ttl=53 time=84.8 ミリ秒 --- news-sophos.go-vip.net ping 統計 --- 3 パケット送信、3 パケット受信、パケット損失 0%、時間 2004 ミリ秒 rtt 最小/平均/最大/mdev = 84.025/84.644/85.062/0.446 ミリ秒
見るには ping
少し低いレベルでの動作では、この記事の最後にある Lua コードを使用して、独自の ICMP Echo パケットを作成し、返された応答があればそれを読み取ります。
$ sudo luax ping.lua baresecurity.sophos.com ICMP ECHO リクエストを 192.0.66.227 に送信します --> 00000000 08 00 03 02 bb 5a 6f 1d 50 69 6e 67 52 65 71 75 |....Zo.PingRequ| 00000010 65 73 74 4d 65 73 73 61 67 65 20 42 42 35 41 36 |estMessage BB5A6| 00000020 46 31 44 |F1D | 戻りました --> 00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5....B.| 00000010 XX XX XX XX 00 00 0b 02 bb 5a 6f 1d 50 69 6e 67 |..........Zo.Ping| 00000020 52 65 71 75 65 73 74 4d 65 73 73 61 67 65 20 42 |リクエストメッセージ B| 00000030 42 35 41 36 46 31 44 |B5A6F1D |
ところで、使用する必要がありました sudo
として知られているものを作成したため、スーパーユーザー権限でスクリプトを実行します。 raw IP ソケット – TCP、UDP、および必要に応じて ICMP など、基本的な任意のフォーマットに作成できるもの。
多くの Linux/Unix システムでは、 ping
ディストリビューションによって提供されるコマンドは、ルート権限を明示的に与えられていなくても機能します。通常、特別なセキュリティ機能がインストールされているため、またはその setuid
フラグが設定されています。つまり、実行したユーザーとは異なるユーザー アカウントで実行が開始されます。
よく設計された ping
もちろん、プログラムは、必要な raw ソケットを開くと、余分な特権を自動的に破棄します。
簡潔にするために、サンプル スクリプトからこの権限を削除するコードを省略しました。 を使用できます。 posix.unistd.setpid()
ソケットを作成した後、データを送受信する前に非特権アカウントに切り替える機能。
返信の確認
上記のスクリプトのデータ ダンプでわかるように、応答サーバーからデータを読み取るために使用しているネットワーク ソケット関数には、ICMP Echo Reply データだけでなく、低レベル IP (インターネット プロトコル ヘッダー) も含まれています。基礎となるパケットで。
このデータの解析やその他の処理は試みていませんが、FreeBSD ping
プログラムは、戻ってきたエラーメッセージを理解することを含め、応答を理解するためにそうする必要があります.
Status ping
何らかの方法で拒否された場合、エコー応答には通常、独自の IP ヘッダー (上記を参照) だけでなく、IP ヘッダーの参照コピーと、元の送信要求に表示された ICMP データも含まれます。
通常、IPv4 パケット ヘッダーは、IP ヘッダーが で始まる上記のように見えます。 45 00 00 37...
次のように示されているバイトまで、合計で 20 バイト継続します。 ...XX XX XX XX
、これは私のラップトップの IP アドレスです。
いいね:
00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5....B.| 00000010 XX XX XX XX |.... | IP バージョンとヘッダー長: 0x45 (4 = IPv4、5 = 32 つの 20 ビット ワード、つまり 0 バイト) サービスタイプと輻輳データ:00x0 パケットの合計長: 0037x55 (6 進数 00) シーケンス情報:F00 AF 0 35 生存時間 (残りホップ): 53x0 (01 進数 0) プロトコルタイプ: 947x38015 (ICMP) チェックサム: 0x00F (42 進数 3) 送信側コンピュータの IP 番号: C192.0.66.227 XNUMX XNUMX EXNUMX (XNUMX = baresecurity.sophos.com) 受信者の IP (私のラップトップ): XX XX XX XX (編集済み = 私自身の IP 番号)
FreeBSD の ping
プログラマーは、この種のヘッダーは、実際には常に正確に 20 バイトの長さであると想定していたようです。 0x45
、IPv4 を示す (0x4?
) 5-DWORD (0x?5
)、または 20 バイトのヘッダー。
心配するのはわずか 20 バイトで、プログラマーはスタックに固定サイズのバッファーを割り当てました。そこでは、応答の IP ヘッダーのコピーと、元の要求から埋め込まれた IP ヘッダーのコピーを保持できます (処理するエラー状態が発生した場合)。 .
これがどこに向かっているのか推測できます。
IPv4 ヘッダーの最初のバイトは、合法的に任意の値を持つことができます。 0x45
(示されているように、5 DWORD または 20 バイトの最小ヘッダー サイズ) 0x4F
(15xF は 0 進数の 15、つまり合計 60 バイトのヘッダー データであるため、40 DWORD を意味します)、したがって、オプションで追加の XNUMX バイトのヘッダー データを適切に使用できます。
これらのまれではあるが合法的な追加のヘッダー バイトは、次のような奇妙な名前を持つさまざまなファンキーで珍しい「機能」に使用できます。 選択的ダイレクト ブロードキャスト, 実験的なフロー制御 および アップストリーム マルチキャスト パケット – 聞いたことはあるが、故意に使用したり、見たりしたことがないもの。
あなたをテストするサイバー犯罪者に注意してください
ご想像のとおり、これらの余分なフィールドがほとんど使用されないことを考えると、IPv4 パケット以外には何も表示されない可能性があります。 0x45
最初は、合計で 20 バイトのヘッダー データが含まれています。
悲しいことに、FreeBSD を使用しているかどうかを推測するサーバーを攻撃者が不正に操作するのを阻止する方法はあまりなく、攻撃を誘発するために特大の ICMP/IP Echo Reply パケットを意図的に生成します。 スタックバッファオーバーフロー あなたの中に ping
プログラム。
サーバーがアクティブかどうかを確認したことがある場合 (疑わしいと思われる場合は、そうするかもしれませんし、特にそうするかもしれません!)、ブービー トラップ応答の対象になる可能性があります。
せいぜい、あなたの ping
プログラムがクラッシュします。 ただし、最悪の場合、FreeBSD セキュリティ勧告が寛大に認めているように、 「悪意のあるホストが ping でリモート コード実行をトリガーする可能性があります。」
幸いなことに、FreeBSD の作成者も同様です。 指摘する, 「[t]ping プロセスは、影響を受けるすべてのバージョンの FreeBSD で機能モード サンドボックスで実行されるため、バグが発生する可能性がある時点で、システムの残りの部分と対話する方法が非常に制限されます。」
つまり、パッチは必ず必要ですが、リスクは小さいと考えられます。
特に、 ping
セキュリティ アドバイザリで確認されているように、プログラムはサンドボックスにロックされているだけでなく、バグのあるコードに到達したときに root として実行されていません。 "いつ ping
実行すると、その作業を行うために必要な raw ソケットが作成され、昇格された特権が取り消されます。」
前述のように、スーパーユーザーの権限は、オペレーティング システムから生の IP ソケットを取得する場合にのみ必要であり、 sendto()
および recvfrom()
その後、そのソケットで機能します。
このバグには公式の識別子が与えられています CVE-2022-23093; これはセキュリティ アドバイザリに記載されています FreeBSD-SA-22:15.ping.
何をするか?
- あなたが FreeBSD ユーザーなら、 影響を受けるリリース (FreeBSD 12 および FreeBSD 13) を、このバグが修正された最新バージョンに更新するだけです。
- あなたがネットワークプログラマーなら、 異常なサイズの変動を示す可能性のあるパケット ヘッダーを考慮していることを常に確認してください。 自分で変化を見たことがないという事実は、明日、通常とは異なるが完全に合法的なパケットに直面することを止めるものではありません.
- あなたがネットワーク管理者なら、 サイズが 4 バイトではない IP ヘッダーを持つ IPv20 パケットをブロックすることを検討してください。 一部のソフトウェア製品に異常な IPv4 ヘッダー オプションの使用を本当に許可する必要があると思われる場合は、それらの異常なパケットをログに記録して理由を調べることを検討してください。
気をつけて!
ping トラフィックを示すサンプル コード