
Contorne o UAC sequestrando uma DLL localizada no Cache de Imagens Nativas
Bypass do Controle de Conta de Usuário (UAC) para obter privilégios elevados (Administrador) para executar qualquer programa em um nível de integridade alto.

Eu decidi atualizar o ByeIntegrity para que seja muito mais rápido, leve e confiável. Esta é uma revisão significativa, então criei um novo projeto na solução VS chamado "ByeIntegrity2021", que é a versão atualizada deste ataque. Claro, a versão original ainda está lá. Para mais informações sobre a nova versão, expanda os detalhes abaixo.
A nova versão agora é capaz de sequestrar o NIC sem depender das imagens nativas existentes instaladas no NIC. Ela faz isso criando seus próprios descritores de imagem nativa e payloads, e então os move para o NIC, eliminando a necessidade de:
*.ni existentes produzidas por NGEN.exeO CLR carrega imagens nativas do NIC fazendo uma varredura recursiva de diretório de cada entrada e, em seguida, lendo seu arquivo *.aux. Este arquivo contém informações sobre a imagem nativa e suas dependências. Com base nas informações do arquivo AUX, o CLR carregará a imagem ou a rejeitará e passará para o próximo candidato. Se nenhum candidato viável for encontrado, ele carrega a imagem padrão e usa o jit para compilá-la normalmente. Nenhuma parte da imagem nativa real é lida (apenas sua existência é verificada), então o ByeIntegrity simplesmente coloca a DLL de payload com o mesmo nome que a imagem nativa teria.
A versão atualizada do ByeIntegrity vem com uma ferramenta chamada AUXGen, que recebe o nome de um assembly do GAC e gera seu arquivo AUX correspondente. O arquivo AUX é gerado de forma que corresponda às verificações do CLR e o CLR carregará a "imagem nativa" descrita pelo arquivo AUX. Nota: AUXGen não lida com dependências ao gerar o arquivo AUX. Ele faz apenas o necessário para que o CLR carregue a imagem. Postarei detalhes do formato do arquivo AUX mais tarde.
O ByeIntegrity agora usa ISecurityEditor, assim como o UACMe faz, o que reduz o código necessário. Também requer que você tenha gerado o arquivo AUX para o assembly MMCEx e o colocado no mesmo diretório do ByeIntegrity. MMCEx agora é a imagem alvo devido à sua ordem de carregamento e nome mais curto.
O ByeIntegrity sequestra uma DLL localizada no Cache de Imagens Nativas (NIC). O NIC é usado pelo .NET Framework para armazenar assemblies .NET otimizados que foram gerados por programas como Ngen, o Gerador de Imagens Nativas do .NET Framework. Como o Ngen geralmente é executado sob o usuário atual com privilégios de Administrador através do Agendador de Tarefas, o NIC concede acesso de modificação para membros do grupo Administradores.
O Snap-in do Firewall do Windows do Console de Gerenciamento Microsoft (MMC) usa o .NET Framework e, ao inicializá-lo, módulos do NIC são carregados no processo do MMC. O executável do MMC usa o AutoElevate, um mecanismo que o Windows usa para elevar automaticamente o token de um processo sem solicitação do UAC.
O ByeIntegrity sequestra uma DLL específica localizada no NIC chamada Accessibility.ni.dll. Ele escreve algum shellcode em uma área de preenchimento de tamanho apropriado localizada na seção .text da DLL. O ponto de entrada da DLL é então atualizado para apontar para o shellcode. Ao carregar a DLL, o ponto de entrada (que na verdade é o shellcode) é executado. O shellcode calcula o endereço de kernel32!CreateProcessW, cria uma nova instância do cmd.exe executando como Administrador e então simplesmente retorna TRUE. Isso é apenas para o motivo DLL_PROCESS_ATTACH; todos os outros motivos retornarão TRUE imediatamente.
Este ataque está implementado no UACMe como método #63. Se você quiser testar este ataque, use o UACMe primeiro. O ataque é o mesmo, no entanto, o UACMe usa um método diferente para modificar o NIC. O ByeIntegrity usa IFileOperation enquanto o UACMe usa ISecurityEditor. Além disso, o UACMe escolhe o Accessibility.ni.dll correto para o seu sistema e realiza as tarefas de manutenção do sistema, se necessário (para gerar os componentes do NIC). O ByeIntegrity simplesmente escolhe a primeira entrada do NIC que existe (que pode ou não ser a entrada correta que o MMC está usando) e não executa as tarefas de manutenção do sistema. O ByeIntegrity contém significativamente mais código do que o UACMe, então ler a implementação do UACMe será muito mais fácil do que ler o código do ByeIntegrity. Por último, o ByeIntegrity inicia um processo filho durante o ataque, enquanto o UACMe não.
tl;dr: UACMe é mais simples e mais eficaz que o ByeIntegrity, então use o UACMe primeiro.
Se você está lendo isso, provavelmente sabe como compilar o código. Apenas note que isso não foi testado ou projetado pensando em x86, e provavelmente não funcionará em x86 de qualquer maneira.
Assim como o UACMe, nunca enviarei binários compilados para este repositório. Sempre há pessoas que querem que o mundo queime, e não vou fornecer um caminho fácil para elas executarem isso no computador de outra pessoa e causarem danos intencionais. Também não quero que script-kiddies usem este ataque sem entender o que ele faz e os danos que pode causar.
Este ataque funciona a partir do Windows 7 (7600) até a versão mais recente do Windows.