
Scanner automatizado para descobrir candidatos a sequestro de ordem de busca de DLL em executáveis do Windows, com análise de tabela de importação, enumeração de módulos em tempo de execução e hooking de API via Microsoft Detours.
DLL Hijack SCanner - Uma ferramenta para gerar leads e automatizar a descoberta de candidatos para DLL Search Order Hijacking
Este repositório hospeda o arquivo de projeto do Visual Studio para a ferramenta (DLLHSC), o arquivo de projeto para a funcionalidade de hooking de API (detour), o arquivo de projeto para o payload e, por último, mas não menos importante, os executáveis compilados para as arquiteturas x86 e x64 (na seção de releases deste repositório). O código foi escrito e compilado com Visual Studio Community 2019.
Se optar por compilar a ferramenta a partir do código fonte, precisará compilar os projetos DLLHSC, detour e payload. O DLLHSC implementa a funcionalidade principal desta ferramenta. O projeto detour gera uma DLL usada para fazer hook de APIs. E o projeto payload gera a DLL que é usada como prova de conceito para verificar se o executável testado pode carregá-la via hijacking da ordem de pesquisa. O payload gerado deve ser colocado no mesmo diretório do DLLHSC e detour, nomeado payload32.dll para arquitetura x86 e payload64.dll para arquitetura x64.
A ferramenta implementa 3 modos de operação, explicados abaixo.
Carrega a imagem do executável na memória, analisa a tabela de importação e então substitui qualquer DLL referida na tabela de importação por uma DLL de payload.
A ferramenta coloca no diretório da aplicação apenas um módulo (DLL) que não está presente no diretório da aplicação, não pertence ao WinSxS e não pertence às KnownDLLs.
A DLL de payload, ao ser executada, cria um arquivo no seguinte caminho:
C:\Users\%USERNAME%\AppData\Local\Temp\DLLHSC.tmp como prova de
execução. A ferramenta lança a aplicação e relata se a DLL de payload
foi executada, verificando se o arquivo temporário existe. Como alguns
executáveis importam funções das DLLs que carregam, podem surgir caixas de
mensagem de erro quando a DLL fornecida não exporta essas funções e,
assim, não atende às dependências da imagem fornecida. No entanto, as caixas
de mensagem indicam que a DLL pode ser um bom candidato para execução do
payload se as dependências forem atendidas. Nesse caso, é necessária uma
análise adicional. O título dessas caixas de mensagem pode conter as strings:
Ordinal Not Found ou Entry Point Not Found. O DLLHSC procura por janelas
que contenham essas strings, fecha-as assim que aparecem e relata
os resultados.
Cria um processo com a imagem do executável fornecido, enumera os módulos que são carregados no espaço de endereçamento deste processo e relata os resultados após aplicar filtros.
A ferramenta apenas relata os módulos carregados do diretório System que não pertencem às KnownDLLs. Os resultados são leads que requerem análise adicional. O analista pode então colocar os módulos reportados no diretório da aplicação e verificar se a aplicação carrega o módulo fornecido em vez do original.
Faz hook das APIs LoadLibrary e LoadLibraryEx via Microsoft Detours e relata os módulos que são carregados em tempo de execução.
Cada vez que a aplicação escaneada chama LoadLibrary e LoadLibraryEx,
a ferramenta intercepta a chamada e escreve o módulo solicitado no arquivo
C:\Users\%USERNAME%\AppData\Local\Temp\DLLHSCRTLOG.tmp. Se o LoadLibraryEx
for chamado especificamente com a flag
LOAD_LIBRARY_SEARCH_SYSTEM32, nenhuma saída é escrita no arquivo. Após
todas as intercepções terem terminado, a ferramenta lê o arquivo e imprime
os resultados. De interesse para análise adicional são módulos que não
existem na chave de registro KnownDLLs, módulos que não existem no diretório
System e módulos sem caminho completo (para estes módulos, o carregador
aplica a ordem de pesquisa normal).
Se optar por compilar a ferramenta a partir do código fonte, é recomendado fazê-lo no Visual Studio 2019. Para que a ferramenta funcione corretamente, os projetos DLLHSC, detour e payload devem ser compilados para a mesma arquitetura e depois colocados no mesmo diretório. Note que a DLL gerada pelo projeto payload deve ser renomeada para payload32.dll para arquitetura de 32 bits ou payload64.dll para arquitetura de 64 bits.
O menu de ajuda para esta aplicação
NAME
dllhsc - DLL Hijack SCanner
SYNOPSIS
dllhsc.exe -h
dllhsc.exe -e <executable image path> (-l|-lm|-rt) [-t seconds]
DESCRIPTION
DLLHSC scans a given executable image for DLL Hijacking and reports the results
It requires elevated privileges
OPTIONS
-h, --help
display this help menu and exit
-e, --executable-image
executable image to scan
-l, --lightweight
parse the import table, attempt to launch a payload and report the results
-lm, --list-modules
list loaded modules that do not exist in the application's directory
-rt, --runtime-load
display modules loaded in run-time by hooking LoadLibrary and LoadLibraryEx APIs
-t, --timeout
number of seconds to wait for checking any popup error windows - defaults to 10 seconds
Esta secção fornece exemplos de como pode executar o DLLHSC e os resultados que ele reporta. Para este propósito, foi utilizada a ferramenta legítima da Microsoft OleView.exe (MD5: D1E6767900C85535F300E08D76AAC9AB). Para melhores resultados, é recomendado que a imagem executável fornecida seja escaneada dentro do seu diretório de instalação.
A flag -l analisa a tabela de importação do executável fornecido, aplica filtros e tenta instrumentalizar os módulos importados colocando uma DLL de payload no diretório atual da aplicação. O executável escaneado pode exibir uma caixa de erro quando as dependências para a DLL de payload (funções exportadas) não são atendidas. Nesse caso, uma caixa de mensagem de erro é exibida. Por padrão, o DLLHSC verifica por 10 segundos se uma caixa de mensagem foi aberta, ou pelo número de segundos especificado pelo utilizador com a flag -t. Uma caixa de mensagem de erro indica que, se as dependências forem atendidas, o módulo pode ser instrumentalizado.
A seguinte captura de tela mostra a caixa de mensagem de erro gerada quando OleView.dll carrega a DLL de payload:

A ferramenta aguarda um tempo máximo de 10 segundos ou -t segundos para garantir que a inicialização do processo terminou e que qualquer caixa de mensagem foi gerada. Em seguida, deteta a caixa de mensagem, fecha-a e reporta o resultado:

A flag -lm lança o executável fornecido e imprime os módulos que ele carrega que não pertencem à lista KnownDLLs nem são dependências WinSxS. Este modo visa dar uma ideia de DLLs que podem ser usadas como payload e existe apenas para gerar leads para o analista.

A flag -rt imprime os módulos que a imagem executável fornecida carrega no seu espaço de endereçamento quando lançada como um processo. Isto é alcançado fazendo hook das APIs LoadLibrary e LoadLibraryEx via Microsoft Detours.

Para qualquer feedback sobre esta ferramenta, utilize a secção de Issues do GitHub.