A descrição abaixo é escrita pelo autor, de https://github.com/memN0ps/mordor-rs
Chamei esse projeto de Mordor porque Hell's Gate / Halo's Gate / Tartarus' Gate me lembram o Portão Negro de Mordor em O Senhor dos Anéis por algum motivo estranho haha e o projeto precisa de um nome legal, então por que não? Créditos para Middle-earth: Shadow of War Wiki
TODO (Desenvolvimento em andamento)
Torná-lo mais amigável
Adicionar uso ao README.md
Adicionar macros de chamada/montagem do sistema
Decida se quero mantê-lo como uma biblioteca ou algo que gere arquivos de saída como SysWhispers1, SysWhispers2, SysWhispers3
Enganchar
Hooking é uma técnica usada para interceptar chamadas para funções pré-existentes ou redirecionar o fluxo de execução de uma API legítima para outro local na memória. Esse local de memória pode ser controlado por um invasor, antivírus (AV), detecção e resposta de ponto final (EDR) ou anti-fraude (AC).
Inline Hooking: Isso nos permite substituir os primeiros bytes da função de destino (instruções de montagem) por uma instrução de salto para redirecionar o fluxo de execução para outro local na memória.
Hooking de Tabela de Endereços de Importação (hooking IAT): A tabela de Endereços de Importação é uma tabela de pesquisa de ponteiros de função para funções importadas de DLLs ou executáveis. O hooking IAT nos permite substituir o endereço da função na Tabela de Endereços de Importação por outro para redirecionar o fluxo de execução do programa. Créditos para Kyle Mistele
Descrição
O que é Hell's Gate / Halo's Gate / Tartarus' Gate?
Hell's Gate é uma técnica de injeção de processo que nos permite procurar um número de bytes chamado syscall stub, do módulo ntdll.dll para extrair os números de chamada do sistema e salvá-los em uma tabela de memória dedicada, que é então usada para chamar o sistema API diretamente. No entanto, a limitação do Hell's Gate é que ele precisa de acesso a um módulo ntdll.dll limpo se as funções estiverem conectadas. Caso contrário, ele não pode preencher os números de syscall necessários e, eventualmente, falha ao entregar chamadas de API nativas. Para resolver esse problema, nasceu uma irmã gêmea chamada Halo's Gate, que é apenas um patch para Hell's Gate com base em uma observação muito simples.
Quando um gancho é colocado em uma função (jmp <endereço>), não seremos capazes de recuperar dinamicamente os números da syscall, portanto, para resolver esse problema, podemos examinar os números de chamada do sistema das funções vizinhas e ajustar os cálculos de acordo com obtenha nosso número de chamada do sistema, porque o ID do syscall no stub do syscall segue um ao outro de forma incremental.
Hell's Gate verifica apenas uma sequência de bytes na seguinte ordem 4c8bd1b8, que se parece com isso em assembly:
mov r10, rcx
mov eax, <syscall>
O portão do Halo faz o mesmo que o Portão do Inferno, mas com uma verificação adicional para ver se há um gancho no lugar, verificando se o primeiro byte da exportação é e9 (jmp) e se há um gancho no lugar, então o portão do Halo começa a olhar nas funções vizinhas e ajuste os cálculos de acordo para obter nosso número de chamada do sistema, uma vez que o ID do syscall no stub do syscall segue um ao outro de forma incremental.
No entanto, nem todos os EDRs se conectam no mesmo local (no início da função). E se os EDRs travarem logo após mov r10, rcx (4c8bd1)? Isso quebrará nosso código.
Tartarus' Gate resolve esse problema adicionando uma verificação adicional ao portão de Halo, procurando por esses bytes sequencialmente 4c8bd1e9 também, que se parece com isso em assembly.
mov r10, rcx
jmp <endereço>
No entanto, se todas as funções estiverem conectadas, podemos encontrar a primeira e desconectar todas, uma por uma, começando pelo ID de chamada 0. Esse método é chamado Veles' Reek em SEKTOR7 .
FreshyCalls / SysWhispers1 / SysWhispers2 / SysWhispers3
A técnica FreshyCalls pesquisa o Diretório de exportação para funções que começam com Nt (excluindo Ntdll) e as classifica por endereços. Surpreendentemente, o endereço mais baixo é o syscall número 0 e o próximo será o syscall números 1, 2 e 3... Você mesmo pode verificar isso em x64 dbg ou Windbg.
Syswhispers2 faz a mesma coisa, mas em vez de procurar as funções Nt dentro do diretório de exportação de ntdll.dll, ele procura funções começando com Zw. Surpreendentemente, as funções Zw e as funções Nt apontam para os mesmos stubs syscall e terão o mesmo número de chamada do sistema.
Aqui podemos verificar que: A diferença entre as funções Zw e Nt são explicadas pela Microsoft aqui https://learn.microsoft.com/en-us/windo … s-routines
A API de serviços do sistema operacional nativo do Windows é implementada como um conjunto de rotinas executadas no modo kernel. Essas rotinas têm nomes que começam com o prefixo Nt ou Zw. Os drivers do modo kernel podem chamar essas rotinas diretamente. Os aplicativos do modo usuário podem acessar essas rotinas usando chamadas do sistema.
Com algumas exceções, cada rotina de serviços do sistema nativo tem duas versões ligeiramente diferentes com nomes semelhantes, mas prefixos diferentes. Por exemplo, as chamadas para NtCreateFile e ZwCreateFile executam operações semelhantes e são, de fato, atendidas por a mesma rotina de sistema do modo kernel.
Para chamadas de sistema do modo de usuário, as versões Nt e Zw de uma rotina se comportam de forma idêntica. Para chamadas de um driver de modo kernel, as versões Nt e Zw de uma rotina diferem em como lidam com os valores de parâmetro que o chamador passa para a rotina.
Um driver de modo kernel chama a versão Zw de uma rotina de serviços do sistema nativo para informar à rotina que os parâmetros vêm de uma fonte confiável de modo kernel. Nesse caso, a rotina assume que pode usar os parâmetros com segurança sem antes validá-los. No entanto, se os parâmetros puderem ser de uma fonte de modo de usuário ou de modo kernel, o driver chama a versão Nt da rotina, que determina, com base no histórico do thread de chamada, se os parâmetros originados no usuário modo ou modo kernel*"
Em poucas palavras:
Hell's Gate: Isso analisará ntdll.dll para encontrar o início do stub syscall (4c8bd1b8) e, em seguida, recuperará o ID do syscall. No entanto, se o stub do syscall estiver viciado, nosso código será interrompido.
Halo's Gate: O mesmo que Hell's Gate, mas adiciona uma verificação adicional para ver se os primeiros ganchos estão no lugar, verificando se o primeiro byte é e9 (jmp) e se há um gancho no lugar, o portão do Halo começa a olhar para o funções vizinhas e ajuste os cálculos de acordo para obter nosso número de chamada do sistema, uma vez que o ID do syscall no stub do syscall segue um ao outro de forma incremental.
Tartarus' Gate: O mesmo Halo's Gate, mas adiciona uma verificação adicional para ver se o stub syscall está conectado na segunda linha, após as instruções de montagem mov r10, rcx pesquisando a seguinte sequência de bytes: `4c8bd1e9.
FreshyCalls: Isso pesquisará as funções que começam com Nt no Diretório de exportação e as classificará por endereços e o endereço mais baixo é o identificador syscall 0.
SysWhispers1: Usa as informações da versão do sistema operacional para selecionar o número de chamada do sistema correto.
Syswhispers2: O mesmo que FreshyCalls, mas procurará funções Zw no Diretório de exportação e armazenará o nome substituindo Zw por Nt.
SysWhispers3 Isso é muito semelhante ao SysWhispers2 com a exceção de que também suporta x86/WoW64, substituição de instruções syscalls por um EGG (a ser substituído dinamicamente), saltos diretos para syscalls no modo x86/x64 (no WOW64 é quase padrão), saltos diretos para syscalls aleatórios (pegando emprestada a ideia de @ElephantSeal ).
Exercício para o leitor por: Um excelente blog porAlice Climent-Pommeret e Kelzvirus
Referências e Créditos
https://github.com/am0nsec/HellsGate - smelly__vx (@RtlMateusz) e Paul Laîné ( @am0nsec )
https://vxug.fakedoma.in/papers/VXUG/Ex … lsGate.pdf
https://blog.sektor7.net/#!res/2021/halosgate.md - @Reenz0h / @SEKTOR7net
https://github.com/trickster0/TartarusGate ( trickster0 / @trickster012 )
https://klezvirus.github.io/RedTeaming/ … ysWhisper/
https://www.mdsec.co.uk/2020/12/byp...e … red-teams/ - @modexpblog
https://github.com/janoglezcampos/rust_syscalls/
https://kylemistele.medium.com/a-beginn … 8cc076eb9a
https://alice.climent-pommeret.red/post … whispers2/
https://github.com/crummie5/FreshyCalls - crummie5
https://github.com/jthuraisamy/SysWhispers - jthuraisamy
https://github.com/jthuraisamy/SysWhispers2 - jthuraisamy
https://github.com/klezVirus/SysWhispers3 - @klezVirus