
Cobalt Strike Beacon对象文件,实现CVE-2020-0796 SMBGhost本地权限提升,具有令牌窃取和会话提升的双重武器化路径。
これは、RaphaelがSMBGhost LPE(ローカル特権昇格)を試行錯誤したものです。
まず、Metasploit Frameworkのソースコードから始めました:
cve-2020-0796: SMBv3圧縮バッファオーバーフロー(SMBGhost)(CVE 2020-0796) https://github.com/rapid7/metasploit-framework/tree/master/external/source/exploits/CVE-2020-0796 [BSDライセンス]
そして、私がやったことは次のとおりです:
これには、Dynamic Function ResolutionのMODULE$Function形式でいくつかのWin32 APIを宣言する必要がありました。 良い面としては、DFRがその処理を肩代わりしてくれるため、NTDLL内のものを呼び出すコードの一部を削減できました。:)
get_handle_addrから未使用の1,000要素のptr配列を削除しました。これは、ローカル変数が8KBの制限を超えたためにcl.exeが__chkstk関数を挿入する原因となっていました。BOFにはこの関数はありません。
その後、Beacon固有のAPI(例:BeaconPrintf、BeaconInjectProcessなど)をいくつか取り込み、Beaconネイティブの方法で処理を行うようにしました。
libc相当の機能が手元にないため(BOFのため...)、それを補ういくつかの関数を書く必要がありました。
Beaconの'smbghost'エイリアスを引数なしで使用すると、このエクスプロイトを実行して、Beaconプロセスのトークンにのみ影響を与えます。エクスプロイトが成功すると、現在のプロセスのトークンは、以前にはなかったスーパーパワーを得ることになります。たとえば、他のプロセス(他のデスクトップセッション内のプロセスであっても)にインジェクションしたり、winlogon.exeの配下に子プロセスを生成したりできます。エクスプロイトは最初の実行で常に成功するとは限らないため、smbghostを複数回実行する必要があるかもしれません。
あるいは、Cobalt StrikeのAggressor Scriptで利用できる特権昇格APIを使用して、'elevate smbghost'を実行し、新しいBeaconセッションを取得することもできます。これは簡単なデモには十分で、製品のワークフローにも適合しますが... winlogon.exeにインジェクションを行います。winlogon.exeへのインジェクションは、この特定の昇格に必須の条件ではありません。公開されているPOCがすべてそうしているのは、CreateRemoteThreadがプロセス境界を越えて機能しないからであり、さらに親プロセスの偽装(parent process spoofing)のために余分なボイラープレートを書きたくないからだと思います。winlogon.exeは、権限が昇格したことを示すための簡単で手頃な標的です。
これをVisual Studioでコンパイルするには:
x64 Cross Toolsコマンドプロンプトからmake.batを使用します。
これにより、expoit.x64.oがdist/に出力されます。
私はVisual Studio 2013を使用しました。他のコンパイラやバージョンはテストしていません。x86も試していません。