web-dev-qa-db-ja.com

バッファオーバーフローなどのローカルプログラムに対する攻撃を行う場合、攻撃者は何を達成しようとしますか?

スタックバッファオーバーフローなどのプログラムに対する攻撃で、攻撃者の目的は何ですか?このような攻撃の目的が明確でないため、攻撃の技術的な詳細(関数の戻りアドレスの上書きなど)を理解できません。たとえば、SQLインジェクションでは通常、機密情報を取得したり、サーバーでコードを実行したりするために行われます。バッファオーバーフロー攻撃の前提条件は、攻撃者が既にマシンでコードを実行する能力を持っていることであると思われます。

通常、これらの状況で攻撃されているのはリモートコンピューター上のプログラムですか?ちなみに、私はCよりもC++に精通しています。

4
Celeritas

まだ明確に言及されていない側面:マルチユーザーシステムがあり(Windows、Linux、Unixなどの最新のPC OSがすべてそうである)、通常の(非特権)ユーザーであるとします。 「通常の」アプリケーションプログラムを実行できる人。今、あなたはあなたのPCに何か悪意のあることをしたいです(PCの他のユーザーが入力しているすべてのパスワードを取得するためにキーロガーをインストールする、または他のユーザーのメールを読むなど)。ただし、それは通常のユーザーであり、管理者権限がなく、ソフトウェアをインストールできず、他のユーザーのデータを表示できないため、実行できません。

したがって、あなたの目標は、管理者権限を持つユーザーになることです(Windowsの管理者、Linux/Unixのrootなど)。管理者をだましてパスワードを教えてもらう以外に、これを達成する別の方法は、すでに管理者権限で実行されている脆弱なプログラムを攻撃することです。このようなプログラムでコードを実行できるようにした場合(たとえば、バッファーオーバーフローを悪用することにより)、このコードは管理者特権でも実行され、-bang-でマシンを好きなように実行できます。

これはprivilege escalationと呼ばれます。 (ここでは詳しく説明できない技術的な理由により)実際にはすべてのシステムにバックグラウンドで実行されているroot権限を持つ多くの(サーバー)プロセスがあるため、これは実際のシナリオです(実際には、ほとんどのローカルプログラムに対する攻撃の一部は、特権の昇格のために行われます)。

したがって、重要な要素は、あなた(通常のユーザー)がプログラムを実行すると、このプログラムは独自の特権とアクセス制限で実行されますが、既に管理者特権で実行されているプログラムに、バッファオーバーフローを悪用することで独自のコードを実行させることができる場合です。および同様の手法では、コードは管理者権限でも実行されます。

この説明は大幅に簡略化されています(たとえば、Linux/UnixにはSUIDプログラムなどがある)ことに注意してください。

最後に、権限の昇格は、攻撃がローカルで行われるかリモートで行われるかに関係なく、多くの場合目標です。多くの場合、攻撃は2つのステップで機能します。

  1. 最初に、攻撃者はナイーブユーザーのパスワードを取得し(たとえば、弱すぎるため、妻の誕生日や犬の名前です)、これらの資格情報を使用して、それぞれのマシンにリモートから侵入します。

  2. 次に、そのユーザーである2番目のステップとして、攻撃者はそれぞれのマシンをスキャンして脆弱な特権ソフトウェアを探し、たとえばそのソフトウェアのバッファオーバーフローを悪用することにより、そのソフトウェアに悪意のあるコードを実行させ、次に同じ特権で実行します脆弱なソフトウェアとして、効果的に攻撃者を管理者にします。

もちろん、攻撃者がリモートシステムで実行されている特権ソフトウェアを直接悪用するケースも多くあります(たとえば、ルートの下のLinuxで実行されているWebサーバープロセス)。しかし、主にローカル攻撃の感覚を求めてきたので、ここではそれを省略します。

7
Binarus

バッファオーバーフローの脆弱性を利用するエクスプロイトのほとんどは、被害者のマシンでコード実行を行います。これは、リモートまたはローカルで他のコンピュータを制御することを攻撃者の主な目的としています。

3
avicoder

バッファオーバーフローの原因となるバグは、プログラムがネットワークメッセージまたは開こうとしたファイルから受け取った不正な形式のデータを操作するときによく現れます。

最初の攻撃の可能性は明白です。攻撃者がリモートシステムでコードを実行することを可能にします。

2番目の方法は、不正なファイルをユーザーに送信し、脆弱なソフトウェアでファイルを開かせるように仕向けることで悪用できます。ほとんどのユーザーは、信頼できないソースからprogramsを実行することは非常に悪い考えであることを認識していますが、信頼できないソースからfilesを開くことにあまり注意を払っていません。

2
Philipp

スタックバッファオーバーフローなどのプログラムに対する攻撃で、攻撃者の目的は何ですか?このような攻撃の目的が明確でないため、攻撃の技術的な詳細(関数の戻りアドレスの上書きなど)を学ぶのに苦労しています。

これらは、リモートでコードを実行することを目的としています。これは、期待される入力をオーバーフローさせて、プログラム内でコードを実行したいという意味です。入力が正しい長さに対応していることを常に確認する必要があります。

別の観点から見てみましょう:mind-control。もしあなたが誰かにあなたがやりたいことを何でもするように心をコントロールできたらどうでしょう?

誰かの脳に8文字のコマンドしか受け取れないエクスプロイトがあるとしましょう。チェックされていないので、それ以外のものは実行されます。

あなた:こんにちは。 「こんにちは...」と返信してください["Hello..." is 8 characters]

被害者:うーん、わかりました。こんにちは... [brain is only capable of processing 8 characters]

あなた:「ケーキ」と返信してください。

Victim:ええと、「ケーキ」?

あなた:「こんにちは...<shellcode to make them say "Buffalo!", beyond the original 8 character limit> "

被害者:こんにちは...バッファロー!

Victim:待って、私に何をしたの?

あなた:お元気ですか?すべての水牛は私たちのものです。

では、「バッファロー!」シェルコードは、RATのダウンロードなど、必要なあらゆる種類のコードを実行するように設計されていましたか?

たとえば、SQLインジェクションでは通常、機密情報を取得したり、サーバーでコードを実行したりするために行われます。 バッファオーバーフロー攻撃の前提条件は、攻撃者が既にマシンでコードを実行する能力を持っていることのように思われるので、さらに何が必要ですか?

なぜなら、リモートコード実行を可能にするあらゆる種類のエクスプロイトと同様に、バッファオーバーフローは通常、他の誰かのコードの欠陥の結果です。 SQLインジェクションのように、リモートマシンでコードを実行しようとしています。

これは、不正な形式のコマンドを通常のプログラムに送信するような単純なものである可能性があります。意図的な脆弱性を独自のプログラムに実装することもできます。それほど慎重ではない個人がそれをするかもしれません。

さまざまな言語でのRCEの脆弱性はたくさんあります。トリックは何か-何か-を見つけることです。これにより、問題のターゲットでコード/コマンドを実行して、追加のアクセス権を取得するさらなる機会が開かれます。

1
Mark Buffalo

バッファオーバーフローの全体的な目標は、プログラムフローを把握し、your(悪意のある)コードを実行することです。

最初に制御したいのは、関数のいわゆる「戻りアドレス」です。関数が呼び出される前に、現在のアドレスがスタックにプッシュされるため、関数が終了した後、プログラムはそれがどこにあったかを認識して実行を継続します。したがって、非常に基本的な例を考えると、

void test() {
  char array[4];
  gets(array);
  printf("%s\n", array);
}

スタックはおそらく次のようになります。

0000000n:  array[0]
00000n+1:  array[1]
00000n+2:  array[2]
00000n+3:  array[3]
00000n+4:  address where *test* was called

したがって、getsは、入力が実際に指定されたバッファに収まるかどうかをチェックしないため、書き込みであっても、スタックに書き込み、書き込みますバッファよりも大きい。したがって、攻撃者は戻りアドレスを操作し、testが終了した後、必要な場所にプログラムをジャンプさせることができます(さらに、戻りアドレスの後にマシンコードを挿入します)どこかにそのエリアにジャンプします)。

この例は非常に抽象的であり、この攻撃の基本的な考え方を理解するためにのみここにあることに注意してください。詳細については、 this 、または thisの簡単な説明 などのサイトにアクセスしてください。

0
Sebastian