
Aggrokatz é uma extensão de plugin agressor para o Cobalt Strike que permite ao pypykatz interagir com os beacons remotamente e possibilita analisar arquivos de dump LSASS e arquivos de hive do registro para extrair credenciais e outros segredos armazenados sem baixar o arquivo e sem enviar nenhum código suspeito para o beacon.

aggrokatz é uma extensão de plugin Aggressor para CobaltStrike que permite que o pypykatz se comunique remotamente com os beacons.
A versão atual do aggrokatz permite que o pypykatz analise arquivos de dump do LSASS e arquivos de hive do Registro para extrair credenciais e outros segredos armazenados, sem baixar o arquivo e sem enviar nenhum código suspeito para o beacon (o Cobalt Strike já está lá de qualquer forma).
No futuro, este projeto visa fornecer recursos adicionais para operações encobertas, como pesquisar e descriptografar todos os segredos DPAPI/kerberoasting/etc.
Publicamos um breve post no blog para o lançamento desta ferramenta, que também inclui algumas capturas de tela.
O dump do LSASS/Registro não é o objetivo deste projeto, apenas a análise. Motivos:
CredBandit que despeja os bytes brutos no disco em vez de base64. Ferramenta legal, dê uma olhada.No cliente CS, não use "reload" nem tente descarregar e recarregar manualmente o script se você o modificou. Você DEVE descarregá-lo, fechar o cliente e iniciá-lo novamente, e então carregar o script modificado. Caso contrário, você terá várias versões rodando simultaneamente e uma tonelada de erros e comportamentos estranhos acontecerão!
Ao analisar arquivos LSASS/registro no lado remoto, por favor, não interaja com o beacon específico no qual você iniciou o script. Normalmente, isso não causaria problemas, mas não posso dar garantias.
pycobalt instalado e configurado. Há um readme na página do GitHub deles.pypykatz cuja versão deve ser >=0.4.8aggressor.cna do pycobalt esteja configurado e saiba a localização do seu interpretador Pythonaggrokatz.cna para apontar para pycobalt.cnaView > Script Console e Cobalt Strike > Script Manager. Usando o Script Manager, carregue o script aggkatz.cna.aggkatz.cna carregou com sucesso, você terá um novo item de menu pypykatz ao clicar com o botão direito em um beacon.Script Console.Script Console quanto na janela do próprio Beacon.Arquivo LSASS: A localização do arquivo lsass.dmp no computador remoto. Você também pode usar caminhos UNC para acessar arquivos lsass.dmp compartilhados via SMBchunksize: A quantidade máxima que será lida de uma só vezArquivo BOF: O arquivo BOF (Beacon Object File) que permite leituras em blocos. Este arquivo será enviado e executado (em memória) cada vez que um novo bloco for lido.(módulo): Especifica quais módulos serão analisados. Padrão: todosSaída : Especifica o(s) formato(s) de saídaPopular a guia de Credenciais: Após uma análise bem-sucedida, todas as credenciais obtidas estarão disponíveis na guia de Credenciais do Cobalt Strike. Este recurso está em betaExcluir arquivo remoto após a análise: Após uma análise bem-sucedida, o arquivo de dump do LSASS será removido do alvoArquivo SYSTEM: A localização do arquivo SYSTEM.reg no computador remoto. Você também pode usar caminhos UNC para acessar arquivos compartilhados via SMBArquivo SAM (opcional): A localização do arquivo SAM.reg no computador remoto. Você também pode usar caminhos UNC para acessar arquivos compartilhados via SMBArquivo SECURITY (opcional): A localização do arquivo SECURITY.reg no computador remoto. Você também pode usar caminhos UNC para acessar arquivos compartilhados via SMBArquivo SOFTWARE (opcional): A localização do arquivo SOFTWARE.reg no computador remoto. Você também pode usar caminhos UNC para acessar arquivos compartilhados via SMBchunksize: A quantidade máxima que será lida de uma só vezArquivo BOF: O arquivo BOF (Beacon Object File) que permite leituras em blocos. Este arquivo será enviado e executado (em memória) cada vez que um novo bloco for lido.Saída : Especifica o(s) formato(s) de saídaAtualmente, o BOF de leitura de arquivo suporta leituras de até 4Gb. Isso pode ser estendido com algumas modificações, mas até agora arquivos tão grandes não foram observados.
Normalmente, o analisador do pypykatz realiza uma série de operações de leitura de arquivo no disco, mas com a ajuda do aggrokatz essas operações de leitura são canalizadas para o beacon usando um BOF especialmente criado (Beacon Object File) que permite ler o conteúdo do arquivo remoto em blocos. Isso permite que o pypykatz extraia todos os segredos dos arquivos remotos sem ler o arquivo inteiro, apenas capturando os blocos necessários onde os segredos estão localizados.
Para ter uma visão completa de todo o processo, precisamos destacar duas partes:
pypykatz se integra ao CobaltStrikepypykatz realiza a extração de credenciais sem ler o arquivo inteiroO CobaltStrike (agente) é escrito em Java, o pypykatz é escrito em Python. Isso é um problema. Felizmente para nós, uma entidade desconhecida criou o pycobalt que fornece uma interface elegante entre os dois mundos, completa com APIs úteis que podem ser invocadas diretamente do Python. Apesar de pycobalt ser uma peça maravilhosa de engenharia, existem alguns problemas/desvantagens que precisamos apontar:
pycobalt:pycobalt será mantido no futuro.pycobalt.pycobalt e CobaltStrike. Isso resulta em algumas chamadas de API que retornariam bytes que não podem ser usados porque alguns bytes são distorcidos pelo codificador. Ao verificar o código, concluímos que a maioria dos problemas de codificação/decodificação ocorre porque pycobalt usa STDOUT/STDIN para se comunicar com o processo Java.bof_pack, que é crucial para este projeto, teve que ser implementada como um script puro do Aggressor e invocada apenas a partir do Python usando estruturas de dados básicas (string e int) e não usando bytes.pycobalt, sem suporte a threads. Bem, pelo menos observamos que as threads quebram aleatoriamente, mas meio que esperávamos isso.O pypykatz e seu módulo companheiro minidump tiveram que ser modificados para permitir uma análise mais eficiente em blocos do que a implementada anteriormente, mas isso é assunto para outro dia.
Depois que o pypykatz foi capaz de se comunicar com o CobaltStrike via pycobalt, o próximo passo foi permitir a leitura de arquivos em blocos. Infelizmente, esse recurso não está disponível por padrão em nenhuma das soluções C2 que vimos, então tivemos que implementá-lo. A forma como abordamos esse problema foi implementando a leitura em blocos por meio do uso da interface Beacon Object Files do CobaltStrike, BOF para abreviar. BOFs são programas em C que rodam no beacon não como um executável separado, mas como parte do beacon já em execução. Essa interface é super útil porque torna os BOFs muito mais furtivos, já que todo o código é executado em memória sem que nada seja escrito no disco.
Nossa solução BOF é uma função simples que recebe 4 argumentos:
fileName: Caminho completo do arquivo de dump do LSASS ou hive do registro (no lado remoto)buffsize: Quantidade (em bytes) a ser lida do arquivoseekSize: A posição onde a operação de leitura do arquivo deve começar (a partir do início do arquivo)rplyid : Um número de identificação a ser incorporado na resposta para evitar possíveis colisõesCom esses parâmetros, o pypykatz (rodando no agente) pode emitir operações de leitura de arquivo no beacon (computador alvo) que visam especificamente certas partes do arquivo.
Do outro lado (no CobaltStrike), o aggrokatz registra um callback para monitorar cada mensagem retornada pelo beacon alvo. Se o cabeçalho da mensagem corresponder ao cabeçalho de uma operação de leitura de arquivo, ela será processada como um bloco de um arquivo minidump e será despachada para o analisador minidump, que despachará o resultado para o pypykatz. Caso seja necessária mais leitura, o pypykatz emitirá uma leitura usando o leitor minidump, que despachará um novo comando de leitura no beacon via interface BOF. Esse processo se repete até que o arquivo seja analisado.
Após analisar cerca de 100 dumps do LSASS usando este método, podemos afirmar o seguinte (o tamanho do bloco usado foi 20k):
dcsync - autor do pycobalt
@anthemtotheego Twitter - Criador do CredBandit
Nicol Jos @shinepaw - design do logotipo