web-dev-qa-db-ja.com

脆弱性を悪用してリモートシェルを取得することは実際にはどのように機能しますか?

バッファオーバーフローとは何か、そしてメモリオーバーフローを許可できない場所に書き込むことができることを理解できます。また、メモリ内に必要なものを配置できるようにするいくつかの異なる方法で機能する他のソフトウェアの脆弱性が存在する可能性があるという概念も把握できます。私はまた、メタスプロイトを使用して私の古いいくつかのXPマシンにアクセスすることもできました。これは楽しいことでした。

しかし、たとえばバッファオーバーフローの脆弱性を念頭に置いてリモートシステムにアクセスする方法を完全に理解することはできません。

私にははっきりしない点がいくつかあります:

  1. 脆弱性のあるプログラムは実行され、犠牲マシンの特定のポート(ミニサーバーなど)をリッスンする必要がありますか?正しく記述されていないプログラムがポートをリッスンしない場合、リモートで悪用される可能性はありますか?
  2. 私は、プログラムがそのポートからいくつかの入力を読み取り、それをある変数のメモリに書き込んで、処理することを想定しています。読み取る必要があるよりも多くのデータをプログラムに提供し、脆弱性がある場合は、メモリの特定の場所(特に変数の直後)に必要な場所に書き込みます。これにより、プログラムが99.9%の確率でクラッシュしないのはなぜですか。この変数が格納されているメモリ内の場所の直後に、実行に失敗したプログラムへのポインタがあり、プログラムがクラッシュした場合はどうなりますか?
  3. プログラムがクラッシュしない場合、メモリに注入したコードをどのように実行できますか?必要なコードを、実行されることがわかっているメモリ内の場所に配置する必要がありますか?メモリのランダムな部分をどのように実行できますか?他のプログラムを実行したい場合を除いて、私のプログラムではほとんど変数を実行しません。これは非常にまれで、メモリから直接コードを実行するのと同じであってはなりません(eval()を思い出させます)。
  4. ポイント2を提供すると、脆弱なプログラムがポートから悪意のある入力を読み取ったときに通常脆弱性が発生し、このコードが実行されると正しく想定されています。悪意のあるコードでIPアドレスを変数などに送信しますか?
  5. 通常、プログラムは別のプログラムのメモリを読み書きすることはできません。これは、脆弱なプログラムが閉じると、開いているリモートシェルへの接続が失われることを意味しますか?それとも、実行すると独立したサブプロセスが生成され、実際に接続されますか?

誰かがポート全体をリッスンするプログラムから攻撃者がシェルを獲得するまで、システム全体がどのように機能するかを示すシンプルでありながら現実的で完全な例を教えてもらえますか?

8
hytromo
  1. 脆弱なプログラムは、ネットワーク経由で直接アクセスするために、ポートをリッスンする必要があります。ただし、他の方法でシステムにアクセスし、ネットワークにアクセスしない脆弱なプログラム(PDFリーダー)の脆弱性を引き起こすメールマルウェアなど)を悪用することもできます。

  2. 脆弱なプログラムが予想通りに動作する方法を知ることは、脆弱性を見つけて悪用するための鍵です。つまり、エクスプロイトを送信する前に、スタックで何が発生するかを知っておく必要があります。だからこそ、すべてのプログラミングと同様に、テスト、テスト、テストです。

  3. BOを理解していれば、ポインターが実行を指示する場所でスタックに書き込むことがわかります。これがコードを実行する方法です。

  4. 私の#1と同様に、脆弱なプログラムはポートで実行されているネットワークサービスである必要はありません。 「リバースシェル」が必要な場合は、シェルのコードに、接続に必要なネットワークコードを含める必要があります。

  5. はい、そうです。別のプロセスに移行しない場合(実行中のプロセスに埋め込むか、コードによってトリガーされる新しいプロセスのいずれか)、脆弱なプログラムが終了すると接続も終了します。したがって、移行します。

私の答えはあなたの質問の非常に単純化した見解です。私が提供したこと、そして私が言ったことと矛盾するテクニックでさえ、Digを深く掘り下げるためにできることがたくさんありますが、これらは非常に基本です。

単純化したシナリオ:

脆弱なFTPサーバーがポートで実行されています。特定のFTPコマンドが適切に制約されていないことが判明したため、過度に大きなコマンド引数を送信し、FTPサーバーがアクセスするスタックの一部に書き込むことが可能です。 FTPプログラムが占有するスタックスペースに適合するコード(ネットワーク機能を含む)を設計します。次に、FTPサーバーに接続し、シェルコードをペイロードとしてコマンドを送信します。 FTPサーバーがコマンドを処理すると、コードにヒットしてペイロードが処理されます。シェルコードが実行され、マシンへのネットワーク接続が作成されます。

8
schroeder

バッファオーバーフローにより、攻撃者は、関数から戻るときにアプリケーションが使用するスタック上の格納アドレスを上書きできます。攻撃者がこのアドレスを制御すると、アプリケーションまたは使用するライブラリの別の部分に戻ることにより、プログラムの実行をそらすことができます。

最も単純な形式では、攻撃者はアドレスの上書きを超えてシェルコードをスタックに書き込むことができ、戻りアドレスをjmp esp命令に設定します。これにより、スタックにeipをポイントし、スタックとしてデータをコードとして実行します。

シェルコードは、送信接続を確立したり、ポートでリッスンしたりできます。

リモートの悪用という用語は、ブラウザなどのデーモンプログラムや、開始プログラムの脆弱性を悪用するファイルを誰かにメールで送信しない場合によく適用されます。つまり、PDFファイル)。

3
wireghoul