
Detecte se um serviço está instalado (às cegas) e/ou em execução (se expondo named pipes) em uma máquina remota sem usar privilégios de administrador local.
Detecta se um serviço está instalado (às cegas) e/ou em execução (se expuser named pipes) em uma máquina remota sem usar privilégios administrativos locais.
Em mais detalhes, a execução deste script conecta-se remotamente ao serviço SMB do alvo (445/tcp) e faz o seguinte:
Verifica se o serviço está instalado por meio da chamada RPC LsarLookupNames() do [MS-LSAT]. Não é necessário usar uma conta privilegiada, mas apenas uma consulta "cega" é possível (não é possível listar os serviços, só podemos perguntar o estado de um serviço específico).
Verifica se o Named Pipe especificado existe no alvo. Serviços (processos) podem expor um named pipe característico do serviço, que pode ser visto por um usuário sem privilégios. Portanto, verificar named pipes específicos e característicos de serviços pode nos permitir inferir se o serviço está ou não em execução.
Este é um script Python autônomo que usa o Impacket, não é necessário instalar nada. Testei em Kali e Arch Linux atualizados usando as versões oficiais mais recentes do Impacket (0.10.0 e 0.9.24) e Python (3.9 e 3.10).
Os serviços, os nomes de serviços a verificar e os named pipes característicos do serviço são especificados em arquivos de configuração JSON (ou arquivos CSV, se for mais confortável, o que percebi depois :), então um conversor customizado de csv2json também está disponível) na pasta conf. Para entender o formato, veja os exemplos incluídos.
Arquivos de configuração incluídos:
Os casos de uso podem ser ampliados com mais serviços / named pipes; a configuração de EDR está bastante incompleta, fique à vontade para adicionar mais.
O script usa o formato de configuração JSON, mas depois percebi que escrever CSV é muito mais confortável, então incluí o script csv2json.py para converter o CSV em JSON.
Executar contra um único alvo para enumerar serviços de AV/EDR (ou qualquer outra coisa) é simples:
./serviceDetector.py -conf conf/edr.json evil.corp/johndoe:[email protected]
A autenticação Kerberos também é suportada (a variável de ambiente KRB5CCNAME aponta para o arquivo ccache):
./serviceDetector.py -conf conf/edr.json -k -no-pass server.ecorp.local
Para executar contra vários alvos de forma eficaz, o GNU parallel é super útil:
cat targets.txt | parallel -j 50 ./serviceDetector.py evil.corp/johndoe:Passw0rd1@{}
Observe que antes de executar contra vários alvos, teste contra um para evitar o bloqueio de conta (por exemplo, no caso de uma senha digitada incorretamente).
Nota de OpSec: esteja ciente de que o login em massa simultâneo em diferentes alvos pode acionar alertas de SOC.
As duas técnicas usadas aqui não são novas.
A chamada RPC LsarLookupNames() do [MS-LSAT] foi usada anteriormente por Vincent Le Toux (@mysmartlogon) no módulo Antivirusscanner da incrível ferramenta PingCastle.
A ideia do named pipe para detectar serviços em execução foi inspirada por este tweet de Lee Christensen (@tifkin_) quando ele a usou para a detecção do serviço WebClient. Essa técnica para detecção de AV/EDR também foi usada pela ferramenta NamedPipeTouch da NSA (vazada pelo grupo The Shadow Brokers).