
Cobalt Strike Beacon Object File implementando CVE-2020-0796 SMBGhost escalonamento de privilégio local com caminhos duplos de weaponização para roubo de token e elevação de sessão.
Este é o tinkering do Raphael com o SMBGhost LPE.
Comecei com o código-fonte do Metasploit Framework:
cve-2020-0796: SMBv3 Compression Buffer Overflow (SMBGhost) (CVE 2020-0796) https://github.com/rapid7/metasploit-framework/tree/master/external/source/exploits/CVE-2020-0796 [Licenciado sob BSD]
E, aqui está o que eu fiz:
Isso exigiu declarar várias APIs Win32 no formato MODULE$Function da Resolução Dinâmica de Funções. No lado positivo, isso reduziu parte do código para chamar coisas no NTDLL, já que a DFR está cuidando disso para nós. :)
Removi o array de ponteiros de 1000 itens não utilizado do get_handle_addr. Isso estava fazendo o cl.exe inserir uma função __chkstk devido às variáveis locais excederem um limite de 8KB. BOFs não têm essa função disponível para eles.
Em seguida, adicionei algumas APIs específicas do Beacon (por exemplo, BeaconPrintf, BeaconInjectProcess, etc.) para fazer as coisas usando a forma nativa do Beacon.
Tive que escrever algumas funções para compensar coisas da libc que não tenho (devido a... BOFs).
Use o alias 'smbghost' no Beacon, sem argumentos, para executar este exploit e afetar apenas o token do processo Beacon. Se o exploit for bem-sucedido, seu token de processo atual terá superpoderes que não tinha antes. Por exemplo, você pode agora injetar em outros processos (mesmo em outras sessões de desktop) ou criar um processo filho sob winlogon.exe. Talvez você precise executar smbghost várias vezes, pois o exploit nem sempre é bem-sucedido na primeira execução.
Opcionalmente, use 'elevate smbghost' para obter uma nova sessão Beacon usando a API de escalonamento de privilégios disponível no Aggressor Script do Cobalt Strike. Isso é OK para uma demonstração rápida, se encaixa nos fluxos de trabalho do produto, etc., mas... injeta no winlogon.exe. Injetar no winlogon.exe não é um invariante desta elevação específica. Suspeito que todos os POCs públicos fazem isso porque CreateRemoteThread não funciona entre limites de processo e quem quer escrever o boilerplate extra para spoofing de processo pai? winlogon.exe é a fruta mais fácil para demonstrar que temos direitos elevados.
Para compilar isso com o Visual Studio:
Use o make.bat a partir do Prompt de Comando Cross Tools x64.
Isso irá gerar expoit.x64.o em dist/
Usei Visual Studio 2013. Outros compiladores/versões não foram testados. Não tentei/testei x86.