Dll Hijacking
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Bug bounty tip: inscreva-se para Intigriti, uma plataforma de bug bounty premium criada por hackers, para hackers! Junte-se a nós em https://go.intigriti.com/hacktricks hoje e comece a ganhar recompensas de até $100,000!
DLL Hijacking envolve manipular um aplicativo confiável para carregar uma DLL maliciosa. Este termo abrange várias táticas como DLL Spoofing, Injection, e Side-Loading. É utilizado principalmente para execução de código, alcançando persistência e, menos comumente, escalonamento de privilégios. Apesar do foco no escalonamento aqui, o método de hijacking permanece consistente entre os objetivos.
Vários métodos são empregados para DLL hijacking, cada um com sua eficácia dependendo da estratégia de carregamento de DLL do aplicativo:
DLL Replacement: Trocar uma DLL genuína por uma maliciosa, opcionalmente usando DLL Proxying para preservar a funcionalidade da DLL original.
DLL Search Order Hijacking: Colocar a DLL maliciosa em um caminho de busca à frente da legítima, explorando o padrão de busca do aplicativo.
Phantom DLL Hijacking: Criar uma DLL maliciosa para um aplicativo carregar, pensando que é uma DLL necessária que não existe.
DLL Redirection: Modificar parâmetros de busca como %PATH%
ou arquivos .exe.manifest
/ .exe.local
para direcionar o aplicativo para a DLL maliciosa.
WinSxS DLL Replacement: Substituir a DLL legítima por uma maliciosa no diretório WinSxS, um método frequentemente associado ao side-loading de DLL.
Relative Path DLL Hijacking: Colocar a DLL maliciosa em um diretório controlado pelo usuário com o aplicativo copiado, semelhante às técnicas de Binary Proxy Execution.
A maneira mais comum de encontrar DLLs ausentes em um sistema é executar procmon do sysinternals, definindo os seguintes 2 filtros:
e apenas mostrar a Atividade do Sistema de Arquivos:
Se você está procurando por dlls ausentes em geral, você deixa isso rodando por alguns segundos. Se você está procurando por uma dll ausente dentro de um executável específico, você deve definir outro filtro como "Process Name" "contains" "<exec name>", executá-lo e parar de capturar eventos.
Para escalar privilégios, a melhor chance que temos é ser capaz de escrever uma dll que um processo privilegiado tentará carregar em algum lugar onde será pesquisada. Portanto, seremos capazes de escrever uma dll em uma pasta onde a dll é pesquisada antes da pasta onde a dll original está (caso estranho), ou seremos capazes de escrever em alguma pasta onde a dll será pesquisada e a dll original não existe em nenhuma pasta.
Dentro da documentação da Microsoft você pode encontrar como as DLLs são carregadas especificamente.
Aplicativos do Windows procuram por DLLs seguindo um conjunto de caminhos de busca pré-definidos, aderindo a uma sequência particular. O problema do DLL hijacking surge quando uma DLL prejudicial é estrategicamente colocada em um desses diretórios, garantindo que ela seja carregada antes da DLL autêntica. Uma solução para prevenir isso é garantir que o aplicativo use caminhos absolutos ao se referir às DLLs que requer.
Você pode ver a ordem de busca de DLL em sistemas de 32 bits abaixo:
O diretório de onde o aplicativo foi carregado.
O diretório do sistema. Use a função GetSystemDirectory para obter o caminho deste diretório.(C:\Windows\System32)
O diretório do sistema de 16 bits. Não há função que obtenha o caminho deste diretório, mas ele é pesquisado. (C:\Windows\System)
O diretório do Windows. Use a função GetWindowsDirectory para obter o caminho deste diretório.
(C:\Windows)
O diretório atual.
Os diretórios listados na variável de ambiente PATH. Note que isso não inclui o caminho por aplicativo especificado pela chave de registro App Paths. A chave App Paths não é usada ao calcular o caminho de busca da DLL.
Essa é a ordem de busca padrão com SafeDllSearchMode habilitado. Quando desabilitado, o diretório atual sobe para o segundo lugar. Para desativar esse recurso, crie o valor de registro HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode e defina-o como 0 (o padrão é habilitado).
Se a função LoadLibraryEx for chamada com LOAD_WITH_ALTERED_SEARCH_PATH, a busca começa no diretório do módulo executável que LoadLibraryEx está carregando.
Finalmente, note que uma dll pode ser carregada indicando o caminho absoluto em vez de apenas o nome. Nesse caso, essa dll será pesquisada apenas nesse caminho (se a dll tiver dependências, elas serão pesquisadas como se fossem carregadas apenas pelo nome).
Existem outras maneiras de alterar a ordem de busca, mas não vou explicá-las aqui.
Certas exceções à ordem padrão de busca de DLL são notadas na documentação do Windows:
Quando uma DLL que compartilha seu nome com uma já carregada na memória é encontrada, o sistema ignora a busca usual. Em vez disso, ele realiza uma verificação de redirecionamento e um manifesto antes de recorrer à DLL já na memória. Nesse cenário, o sistema não realiza uma busca pela DLL.
Em casos onde a DLL é reconhecida como uma DLL conhecida para a versão atual do Windows, o sistema utilizará sua versão da DLL conhecida, juntamente com quaisquer de suas DLLs dependentes, abrindo mão do processo de busca. A chave de registro HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs contém uma lista dessas DLLs conhecidas.
Se uma DLL tiver dependências, a busca por essas DLLs dependentes é realizada como se fossem indicadas apenas por seus nomes de módulo, independentemente de a DLL inicial ter sido identificada através de um caminho completo.
Requisitos:
Identificar um processo que opera ou operará sob diferentes privilégios (movimento horizontal ou lateral), que está faltando uma DLL.
Garantir que o acesso de gravação esteja disponível para qualquer diretório no qual a DLL será pesquisada. Este local pode ser o diretório do executável ou um diretório dentro do caminho do sistema.
Sim, os requisitos são complicados de encontrar, pois por padrão é meio estranho encontrar um executável privilegiado faltando uma dll e é ainda mais estranho ter permissões de gravação em uma pasta do caminho do sistema (você não pode por padrão). Mas, em ambientes mal configurados, isso é possível. No caso de você ter sorte e se encontrar atendendo aos requisitos, você pode verificar o projeto UACME. Mesmo que o objetivo principal do projeto seja contornar o UAC, você pode encontrar lá uma PoC de um Dll hijacking para a versão do Windows que você pode usar (provavelmente apenas mudando o caminho da pasta onde você tem permissões de gravação).
Note que você pode verificar suas permissões em uma pasta fazendo:
E verifique as permissões de todas as pastas dentro do PATH:
Você também pode verificar as importações de um executável e as exportações de um dll com:
Para um guia completo sobre como abusar do Dll Hijacking para escalar privilégios com permissões para escrever em uma pasta do System Path, consulte:
Writable Sys Path +Dll Hijacking PrivescWinpeas verificará se você tem permissões de escrita em qualquer pasta dentro do system PATH. Outras ferramentas automatizadas interessantes para descobrir essa vulnerabilidade são as funções do PowerSploit: Find-ProcessDLLHijack, Find-PathDLLHijack e Write-HijackDll.
Caso você encontre um cenário explorável, uma das coisas mais importantes para explorá-lo com sucesso seria criar um dll que exporte pelo menos todas as funções que o executável importará dele. De qualquer forma, observe que o Dll Hijacking é útil para escalar do nível de Integridade Média para Alta (contornando o UAC) ou de Alta Integridade para SYSTEM. Você pode encontrar um exemplo de como criar um dll válido dentro deste estudo de dll hijacking focado em dll hijacking para execução: https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows. Além disso, na próxima seção você pode encontrar alguns códigos dll básicos que podem ser úteis como modelos ou para criar um dll com funções não requeridas exportadas.
Basicamente, um Dll proxy é um Dll capaz de executar seu código malicioso quando carregado, mas também de expor e funcionar como esperado ao revezar todas as chamadas para a biblioteca real.
Com a ferramenta DLLirant ou Spartacus, você pode realmente indicar um executável e selecionar a biblioteca que deseja proxificar e gerar um dll proxificado ou indicar o Dll e gerar um dll proxificado.
Obter rev shell (x64):
Obtenha um meterpreter (x86):
Criar um usuário (x86, não vi uma versão x64):
Note que em vários casos a Dll que você compila deve exportar várias funções que serão carregadas pelo processo da vítima; se essas funções não existirem, o binário não conseguirá carregá-las e o exploit falhará.
Dica de bug bounty: inscreva-se na Intigriti, uma plataforma premium de bug bounty criada por hackers, para hackers! Junte-se a nós em https://go.intigriti.com/hacktricks hoje e comece a ganhar recompensas de até $100,000!
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)