
SigFlip é uma ferramenta para aplicar patches em arquivos PE assinados com authenticode (exe, dll, sys, etc.) sem invalidar ou quebrar a assinatura existente.
O SigFlip é uma ferramenta para modificar arquivos PE assinados digitalmente (exe, dll, sys, etc.) de uma forma que não afeta ou quebra a assinatura authenticode existente. Em outras palavras, você pode alterar o checksum/hash do arquivo PE incorporando dados (ex: shellcode) sem quebrar a assinatura do arquivo, verificações de integridade ou a funcionalidade do arquivo PE.
O SigInject criptografa e injeta shellcode na tabela de certificados [WIN_CERTIFICATE] de um arquivo PE. A chave de criptografia é exibida para uso com um carregador básico BOF/C/C# (SigLoader). O SigInject salva as alterações em um arquivo PE modificado e mantém sua assinatura e validade do certificado intactas.
O SigLoader é um carregador básico que recebe como parâmetros o caminho de um arquivo PE modificado criado pelo SigInject e a chave de descriptografia, então extrai e descriptografa o shellcode incorporado para uso com uma injeção de shellcode de sua escolha.
O SigFlip verificará se o hash do PE foi alterado com sucesso e também verificará e encerrará normalmente caso os endpoints estejam protegidos contra essa configuração incorreta comum (consulte a seção "Detalhes").
Nota rápida: SigFlip, SigInject e SigLoader estão disponíveis como scripts BOF e assemblies .NET. A única diferença é que a funcionalidade do SigInject é implementada como parte do SigFlip (-i) caso você escolha usar artefatos .NET em vez de BOFs.
Pode ser usado principalmente para persistência, movimento lateral ou execução de código/comandos e pode ajudar com:
BOFs pré-compilados não são fornecidos neste projeto. Podem ser compilados usando Mingw-w64. Para .NET, use VS ou csc.exe para compilar projetos .NET (SigFlip, SigLoader). Para BOF, siga os passos abaixo;
➜ i686-w64-mingw32-gcc -c sigflip.c -o sigflip.x86.o➜ x86_64-w64-mingw32-gcc -c sigflip.c -o sigflip.x64.o➜ x86_64-w64-mingw32-gcc -c SigLoader/sigloader.c -o sigloader.x64.o➜ i686-w64-mingw32-gcc -c SigLoader/sigloader.c -o sigloader.x86.oCertifique-se de que todos os arquivos objeto estejam no mesmo diretório que sigflip.cna, depois carregue o script sigflip.cna no Cobalt Strike.
Nota rápida: os BOFs pré-compilados foram testados e são compatíveis com mingw-64 v8.0.0_3. Usar mingw-64 >= v9 pode funcionar, mas pode travar beacons ativos. Consulte https://github.com/med0x2e/SigFlip/issues/2 para mais detalhes.
Execute-Assembly
execute-assembly SigFlip.exe -hexecute-assembly SigLoader -hBOF
SigFlip: Altera o hash de um arquivo PE (DLL, EXE, SYS, OCX, etc.) sem quebrar a assinatura ou a validade do certificado:
SigFlip "<CAMINHO_DO_ARQUIVO_PE>" "<CAMINHO_DO_ARQUIVO_PE_DE_SAÍDA (com extensão)>"SigInject: Criptografa e injeta shellcode na tabela de certificados [WIN_CERTIFICATE] de um arquivo PE. A chave de criptografia é exibida para uso com um carregador básico C/C# e mantém a assinatura e validade do certificado intactas:
SigInject "<CAMINHO_DO_ARQUIVO_PE> <CAMINHO_DO_ARQUIVO_PE_DE_SAÍDA (com extensão)>" "<ARQUIVO_DE_SHELLCODE>"SigLoader: Carrega shellcode criptografado de arquivos PE criados pelo SigInject, depois usa Early Bird queueuserapc para gerar/injetar sc em um processo sacrificial. A lógica de injeção de shellcode pode ser personalizada ou substituída por qualquer outra técnica de injeção de código de sua escolha:
SigLoader <CAMINHO_DO_ARQUIVO_PE_COM_SH> <CHAVE_DE_DESCRIPTOGRAFIA> <CAMINHO_DO_PROCESSO_SPAWNTO> <ID_DO_PROCESSO_PAI>Exemplos
BOF:
SigFlip "C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" "C:\lolbins\modified-msbuild.exe"SigInject "C:\Windows\System32\kernel32.dll" "C:\random\modified-kernel32.dll" "C:\shellcode\cobaltstrike_or_msf_shellcode.bin"Sigloader "C:\random\modified-kernel32.dll" "CHAVE_DE_DESCRIPTOGRAFIA" "C:\Windows\System32\werfault.exe" 6300Execute-Assembly:
execute-assembly SigFlip.exe -b C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe -o C:\Temp\MSBuild.exeexecute-assembly SigFlip.exe -i C:\Windows\System32\kernel32.dll -s C:\Temp\x86shellcode.bin -o C:\Temp\kernel32.dll -e TestSecretKeyexecute-assembly SigLoader.exe -f C:\Temp\modified-kernel32.dll -e TestSecretKey -pid 2354Esta é uma técnica conhecida usada pelo APT#10 em várias campanhas ou conjuntos de intrusão.
O Authenticode é uma tecnologia de assinatura de código da Microsoft que identifica o editor de software assinado com Authenticode. O Authenticode também verifica se o software não foi adulterado desde que foi assinado e publicado.
A Microsoft depende principalmente do formato de assinatura Authenticode para verificar a integridade e a origem de binários PE. De acordo com a especificação do formato PE do Authenticode, as assinaturas Authenticode podem ser "incorporadas" em um arquivo PE do Windows, em um local especificado pela entrada da Tabela de Certificados nos Diretórios de Dados do Cabeçalho Opcional. Quando o Authenticode é usado para assinar um arquivo PE do Windows, o algoritmo que calcula o valor hash Authenticode do arquivo exclui certos campos PE. Ao incorporar a assinatura no arquivo, o processo de assinatura pode modificar esses campos sem afetar o valor hash do arquivo. Esses campos são os seguintes: **o checksum, o RVA da tabela de certificados, o tamanho da tabela de certificados e a tabela de certificados de atributo. A tabela de certificados de atributo contém uma estrutura PKCS #7 SignedData contendo o valor hash do arquivo PE, uma assinatura criada pela chave privada do editor do software e os certificados X.509 v3 que vinculam a chave de assinatura do editor do software a uma entidade legal.
Em termos leigos, podemos modificar ou incorporar dados em campos excluídos do cálculo hash authenticode sem nos preocupar em quebrar a assinatura authenticode e as verificações de integridade do arquivo.
Mais detalhes sobre esses campos excluídos:
RVA e Tamanho da Tabela de Certificados: A estrutura do cabeçalho opcional de um arquivo PE assinado contém uma matriz de diretórios de dados, incluindo a entrada do diretório de segurança IMAGE_DIRECTORY_ENTRY_SECURITY, que possui dois campos: RVA e Tamanho.
Tabela de Certificados de Atributo: uma estrutura de dados WIN_CERTIFICATE que encapsula a assinatura e os certificados e possui os seguintes campos:
dwLength: tamanho da tabela de certificados.wRevision: a "revisão" do WIN_CERTIFICATE.wCertificateType: o tipo de dados de certificado encapsulado.bCertificate: os dados reais do certificado. Para WIN_CERT_TYPE_PKCS_SIGNED_DATA, esta é a estrutura PKCS#7 SignedData mencionada acima (que contém o valor hash do PE, a assinatura e o certificado x.509). É exatamente aqui que o SigFlip incorpora dados aleatórios ou shellcode.Com tudo isso em mente, agora o SifFlip faz o seguinte:
O primeiro passo é essencial para confirmar se o sistema está mal configurado de forma a permitir o preenchimento e a injeção de shellcode em arquivos PE assinados com authenticode. Portanto, as seguintes verificações de sanidade são realizadas:
X86:
X64:
O carregador do Windows não carrega dados de certificado no espaço de endereçamento do processo. Essa é a razão pela qual você precisa de um carregador personalizado para extrair dados como shellcode e usá-los (ex: SigLoader). Isso também explica por que o RVA da entrada do diretório de dados IMAGE_DIRECTORY_ENTRY_SECURITY é um deslocamento de arquivo em vez de um deslocamento de memória típico.