0% acharam este documento útil (0 voto)
3 visualizações87 páginas

06 - Code Injection e API Hooking

O documento aborda a técnica de injeção de código utilizada por malwares para ocultar sua presença em processos legítimos, permitindo a execução sem ser detectado. Discute os propósitos da injeção, como stealth, elevação de privilégios e alteração de funcionalidades, além de descrever metodologias e APIs relevantes para a execução da injeção. Também menciona técnicas populares e os passos necessários para injetar código em processos alvo.

Enviado por

igornzalez
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
3 visualizações87 páginas

06 - Code Injection e API Hooking

O documento aborda a técnica de injeção de código utilizada por malwares para ocultar sua presença em processos legítimos, permitindo a execução sem ser detectado. Discute os propósitos da injeção, como stealth, elevação de privilégios e alteração de funcionalidades, além de descrever metodologias e APIs relevantes para a execução da injeção. Também menciona técnicas populares e os passos necessários para injetar código em processos alvo.

Enviado por

igornzalez
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Fundamentos de Análise de Softwares Maliciosos

Componentes de Malwares: Stealth

Prof. Igor C. G. Ribeiro


Code Injection
• Técnica utilizada por um processo para injetar parte do seu código (ou todo ele) em um
outro processo alvo

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 2/87


Code Injection - Propósitos
1. Stealth

• O malware pode injetar código malicioso


em um processo legítimo e depois finalizar
• Após essa etapa, apenas o processo
legítimo será identificado no sistema
• Com isso, a execução do malware pode
passar despercebida pelo usuário e por
produtos antimalware

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 3/87


Code Injection - Propósitos
2. Elevação de Privilégios

• O malware pode executar em uma


infraestrutura na qual o firewall bloqueia
conexões de dentro para fora da rede,
exceto para alguns processos
• Assim, se o malware injetar seu código em
um desses processos permitidos, ele eleva
seu privilégio e passa a poder se conectar a
serviços externos

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 4/87


Code Injection - Propósitos
3. Alterar Funcionalidades

• A ideia é alterar a funcionalidade de certos


processos ou do sistema operacional como
um todo
• Exemplo: o malware cria um arquivo e não
quer que ele seja removido do sistema
• Para remover um arquivo, a API DeleteFile() é
utilizada
• O malware injeta uma versão modificada da
API, chamada FakeDeleteFile(), a qual não
remove o arquivo caso ele seja o do malware

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 5/87


Code Injection - Propósitos
3. Alterar Funcionalidades

• A ideia é alterar a funcionalidade de certos


processos ou do sistema operacional como
um todo
• Exemplo: o malware cria um arquivo e não
quer que ele seja removido do sistema
• O malware utiliza API Hooking para direcionar a
execução para FakeDeleteFile() quando
DeleteFile() for chamada

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 6/87


Code Injection – Escolhendo o Alvo
• Antes de injetar código, o malware precisa escolher seu alvo, podendo ele ser:
• Um processo existente (ativo)
• Um processo novo, criado pelo malware
• O kernel

• No caso de processos em modo usuário, o código é injetado no espaço de memória virtual


do processo
• Somente o processo no qual o código foi injetado é afetado

• Ao injetar código no kernel (adicionando um módulo ou alterando um existente), todos os


processos do sistema são afetados
• O kernel normalmente é altamente protegido, tornando a tarefa mais difícil
• Um pequeno erro pode levar o sistema a colapsar

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 7/87


Code Injection – Técnicas
Algumas das técnicas mais populares para injeção de código incluem:

• Process Hollowing • Shellcode Injection


• Thread Injection • Code Cave
• DLL Injection • QueueUserAPC
• DLL Injection clássica
• Atom Bombing
• Reflective DLL Injection

• Veremos os detalhes de como essas técnicas funcionam nesta aula

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 8/87


Code Injection – Metodologia
As etapas para executar injeção de código em modo usuário podem ser descritas
genericamente da seguinte forma:
1. Localize o alvo da injeção de código

2. Aloque memória no processo alvo

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 9/87


Code Injection – Metodologia
As etapas para executar injeção de código em modo usuário podem ser descritas
genericamente da seguinte forma:
3. Escreva o código no espaço de memória alocado

4. Execute o código injetado

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 10/87


Code Injection – Metodologia
1. Localize o alvo da injeção de código

• Para injetar código em um processo, precisamos do PID do alvo


• Isso ocorre, pois antes precisamos abrir o processo utilizando a API OpenProcess(), que recebe o pid do
processo como argumento

• Para obter o PID do processo, podemos utilizar as APIs CreateTool32Help(), Process32First()


e Process32Next() para enumerar os processos ativos no sistema
• Esse padrão também é utilizado por malwares em outros cenários, como a detecção do ambiente de
análise (armoring)

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 11/87


Code Injection – Metodologia
1. Localize o alvo da injeção de código

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 12/87


Code Injection – Metodologia
1. Localize o alvo da injeção de código

• Ao invés de escolher um processo ativo, o malware pode criar um novo processo a partir de
um executável legítimo do sistema
• Para isso, a API CreateProcess() pode ser usada (ou variantes)

• Porém, o processo deve ser criado em modo suspenso


• Isso permite ao malware substituir o código do processo pelo seu código malicioso

• Por fim, o processo é movido para o estado pronto utilizando a API ResumeThread (ou
variantes)
• Essa técnica é chamada de Process Hollowing

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 13/87


Code Injection – Metodologia
1. Localize o alvo da injeção de código

Resumo de APIs úteis para essa primeira fase da injeção de código:


• CreateToolhelp32Snapshot
• Process32First
• Process32Next
• CreateProcessA e CreateProcessW
• CreateProcessInternalA e CreateProcessInternalW

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 14/87


Code Injection – Metodologia
2. Alocação de Memória no Processo Alvo

• Agora que temos o PID do processo alvo, podemos utilizar a API OpenProcess() para obter
um Handle para o processo
• De posse desse Handle, podemos utilizar a API VirtualAllocEx() para alocar memória no
processo alvo
• Entretanto, é evidente que não é todo processo que pode manipular a memória virtual de
um processo remoto
• Se fosse assim, o isolamento provido pelo SO através do conceito de processos estaria perdido

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 15/87


Code Injection – Metodologia
2. Alocação de Memória no Processo Alvo

• Assim, para que um processo manipule a memória virtual de um processo remoto, ele
precisa ter um conjunto de permissões sobre esse processo remoto, sendo elas:
• PROCESS_VM_OPERATION: necessária para realizar qualquer tipo de operação na memória virtual de
um processo remoto
• PROCESS_VM_WRITE: necessária para realizar operações de escrita na memória virtual do processo
remoto
• PROCESS_VM_READ: necessária para realizar operações de leitura na memória virtual do processo
remoto
• PROCESS_SUSPEND_RESUME: necessária para suspender ou retomar um processo remoto
• PROCESS_CREATE_THREAD: necessária para criar uma thread em um processo remoto

• Para uma lista completa, acesse a documentação oficial

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 16/87


Code Injection – Metodologia
2. Alocação de Memória no Processo Alvo

• A função abaixo ilustra o processo de alocação de memória


• Ao abrir o processo, solicitamos todas as permissões de uma vez utilizando PROCESS_ALL_ACCESS
• Ao alocar a memória, solicitamos a alocação de memória física também, utilizando MEM_COMMIT e que
as páginas alocadas tenham permissão de escrita, leitura e execução (PAGE_EXECUTE_READWRITE)

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 17/87


Code Injection – Metodologia
2. Alocação de Memória no Processo Alvo

Vamos agora verificar se esse código funciona mesmo


1. Abra uma instância do [Link];
2. Abra o Process Hacker e descubra o PID do processo [Link]
3. Execute o programa [Link]
a) Para o tamanho, informe 4000 bytes (esse tamanho será arredondado para 4096 pelo programa)
b) Informe o PID do [Link]
c) Escolha as permissões que você quiser
d) Anote o endereço de memória informado (esse é o endereço inicial do bloco alocado)

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 18/87


Code Injection – Metodologia
2. Alocação de Memória no Processo Alvo

Vamos agora verificar se esse código funciona mesmo


4. Abra as propriedades do processo [Link] e vá para aba Memory
5. Procure por um bloco de memória de 4KiB com o endereço obtido

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 19/87


Code Injection – Metodologia
2. Alocação de Memória no Processo Alvo

Vamos agora verificar se esse código funciona mesmo

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 20/87


Code Injection – Metodologia
2. Alocação de Memória no Processo Alvo

Vamos agora verificar se esse código funciona mesmo

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 21/87


Code Injection – Metodologia
2. Alocação de Memória no Processo Alvo

• Ao invés de alocar a memória já com permissão de execução, o malware pode aloca-la


apenas com permissão de leitura e escrita (PAGE_READWRITE)
• Entretanto, antes de executar o código injetado, o malware altera, utilizando a API
VirtualProtect(), a permissão dessas páginas para incluir a permissão de execução

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 22/87


Code Injection – Metodologia
2. Alocação de Memória no Processo Alvo

Lista de APIs importantes para alocação de memória no processo alvo:


• OpenProcess
• VirtualAllocEx
• LookupPrivilegeValue
• AdjustTokenPrivileges
• VirtualProtect

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 23/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

• Vamos agora escrever na memória que alocamos no processo alvo utilizando a API
WriteProcessMemory()

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 24/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

Exercício: Vamos verificar se conseguimos injetar a string “Fundamentos de Analise de


Softwares Maliciosos” no processo [Link]:
1. Abra uma instância do [Link];
2. Abra o Process Hacker e descubra o PID do processo [Link]

3. Execute o programa [Link]


a) Informe o PID do [Link]
b) “Fundamentos de Analise de Softwares Maliciosos”
c) Anote o endereço de memória informado (esse é o endereço inicial do bloco alocado)

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 25/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

Exercício: Vamos verificar se conseguimos injetar a string “Fundamentos de Analise de


Softwares Maliciosos” no processo [Link]:
4. Abra as propriedades do processo [Link] e vá para aba Memory
5. Procure por um bloco de memória de 4KiB com o endereço obtido

6. Dê um duplo clique no bloco de memória e verifique seu conteúdo

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 26/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

Exercício: Vamos verificar se conseguimos injetar a string “Fundamentos de Analise de


Softwares Maliciosos” no processo [Link]:

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 27/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

• Alternativamente, o malware pode utilizar os conceitos de Section Objects e Views para


mapear parte do seu espaço de memória para o processo alvo e injetar seu código sem
recorrer a VirtualAllocEx() e WriteProcessMemory()
• A técnica funciona da seguinte maneira:
1. O malware chama CreateFileMapping() (ou NtCreateSection()) para criar uma seção de memória
anônima (sem arquivo, só memória).

A memória virtual ainda não foi alocada nesse momento.

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 28/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

• Alternativamente, o malware pode utilizar os conceitos de Section Objects e Views para


mapear parte do seu espaço de memória para o processo alvo e injetar seu código sem
recorrer a VirtualAllocEx() e WriteProcessMemory()
• A técnica funciona da seguinte maneira:
2. Ele mapeia essa seção no seu próprio processo
(view local) utilizando a API MapViewOfFile() (ou
NtMapViewOfSection()).
3. Ele mapeia a mesma seção no processo alvo
(view remota) utilizando a API
NtMapViewOfSection().
• Nesse caso só a função NtMapViewOfSection()
funciona

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 29/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

• Alternativamente, o malware pode utilizar os conceitos de Section Objects e Views para


mapear parte do seu espaço de memória para o processo alvo e injetar seu código sem
recorrer a VirtualAllocEx() e WriteProcessMemory()
• Agora os dois processos veem a mesma região de memória física, cada um no seu espaço
virtual.
• O malware escreve o código na sua própria view local (escrita normal em memória)

• Agora os dois processos veem a mesma região de memória física, cada um no seu espaço
virtual
• Automaticamente, o processo alvo “enxerga” essa modificação na sua view remota.

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 30/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

Vamos ver um exemplo de como executar a injeção utilizando essa técnica


1. Abrindo o processo

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 31/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

Vamos ver um exemplo de como executar a injeção utilizando essa técnica


2. Criando um Section Object

• O primeiro argumento de CreateFileMapping é um Handle para o arquivo a ser mapeado


• Ao passar INVALID_HANDLE_VALUE, estamos dizendo que o mapeamento será da memória e não de um
arquivo

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 32/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

Vamos ver um exemplo de como executar a injeção utilizando essa técnica


3. Criando uma view local

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 33/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

Vamos ver um exemplo de como executar a injeção utilizando essa técnica


3. Criando uma View remota
• A API MapViewOfFile permite apenas a criação de view local (não possui argumento que receba um
Handle para um processo remoto)
• Para criar a view remota, precisamos utilizar NtMapViewOfSection()
• Entretanto, essa é uma função de baixo nível do Windows sem documentação oficial
• Por esse motivo, não há arquivos de cabeçalho e bibliotecas para linkarmos como no caso do Win32API
• Sendo assim, para utilizarmos NtMapViewOfSection() precisamos obter ser endereço dinamicamente a
partir de [Link]

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 34/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

Vamos ver um exemplo de como executar a injeção utilizando essa técnica


3. Criando uma View remota
Convenção de Tipo que representa um ponteiro
Primeiramente, definimos chamada
um tipo que representa um Tipo de retorno para NtMapViewOfSection
ponteiro para a função
NtMapViewOfSection

Argumentos

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 35/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

Vamos ver um exemplo de como executar a injeção utilizando essa técnica


3. Criando uma View remota

Agora precisamos obter um Handle para [Link]

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 36/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

Vamos ver um exemplo de como executar a injeção utilizando essa técnica


3. Criando uma View remota

Em seguida, precisamos obter o endereço da função NtMapViewOfSection

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 37/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

Vamos ver um exemplo de como executar a injeção utilizando essa técnica


3. Criando uma View remota

Agora podemos chamar a função NtMapViewOfSection

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 38/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

Vamos ver um exemplo de como executar a injeção utilizando essa técnica


4. Injetando uma string no processo remoto

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 39/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

Exercício: Vamos verificar se conseguimos injetar a string “Fundamentos de Analise de


Softwares Maliciosos” no processo [Link]:
1. Abra uma instância do [Link];
2. Abra o Process Hacker e descubra o PID do processo [Link]

3. Execute o programa [Link]


a) Informe o PID do [Link]
b) Informe a string “Fundamentos de Analise de Softwares Maliciosos”
c) Anote o endereço de memória informado

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 40/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

Exercício: Vamos verificar se conseguimos injetar a string “Fundamentos de Analise de


Softwares Maliciosos” no processo [Link]:
4. Abra as propriedades do processo [Link] e vá para aba Memory
5. Procure por um bloco de memória de 4KiB com o endereço obtido

6. Dê um duplo clique no bloco de memória e verifique seu conteúdo

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 41/87


Code Injection – Metodologia
3. Escrevendo na Memória do Processo Alvo

Lista de APIs importantes para escrita na memória do processo alvo:


• WriteProcessMemory
• CreateFileMapping e NtCreateSection
• MapViewOfFile e MapViewOfFileEx
• NtMapViewOfSection e NtUnmapViewOfSection

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 42/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

• Agora que já conseguimos injetar código no processo remoto, precisamos fazer com que
esse código seja executado
• As seguintes técnicas são as mais comuns:
• Criação de Threads Remotas: o processo injetor cria threads no processo remoto e direciona essas
threads para executar o código injetado através de APIs como CreateRemoteThread()
• Filas de Chamada de Procedimento Assíncrona (APC)
• Alteração de Contexto da Thread: alterar o ponteiro de instrução da thread para o código injetado
utilizando as APIs GetThreadContext() e SetThreadContext()

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 43/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Criação de Threads Remotas


• Nessa técnica, o processo injetor cria uma nova thread no processo alvo, direcionando a
execução para o código injetado
• O código injetado é o que chamamos de payload ou shellcode

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 44/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Criação de Threads Remotas


• Como exemplo, queremos injetar um payload no processo [Link] o qual estabelece
um shell reverso com a máquina do atacante
• Nossa primeira tarefa é gerar o payload. Para isso, vamos utilizar a ferramenta msfvenom,
que compõe o Metasploit Framework
• A ferramenta já vem instalada no Kali Linux

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 45/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Criação de Threads Remotas


• Primeiro, vamos verificar os payloads disponíveis. Como estamos interessados em injetar
em um executável Windows, vamos filtrar por payloads apenas para o Windows

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 46/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Criação de Threads Remotas


• Ao pesquisar os payloads disponíveis, vamos encontrar o payload
windows/x64/shell_reverse_tcp
• Para gerar o payload, precisamos utilizar dois argumentos:
• LHOST: Endereço IP da máquina do atacante ([Link] no exemplo)
• LPORT: Porta na qual o atacante está escutando (4444 no exemplo)

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 47/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Criação de Threads Remotas


• O próximo passo é determinarmos o formato de saída do payload

Uma vez que estamos escrevendo o código do Injetor em c/c++,


queremos o payload no formato c

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 48/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Criação de Threads Remotas


• Agora podemos gerar o payload

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 49/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Criação de Threads Remotas


• Um problema com o payload que geramos é que ele é facilmente detectado por produtos
antimalware
• Para reduzir as chances de detecção, precisamos ofuscar o payload

• Uma técnica simples é executar a operação XOR byte a byte no payload utilizando uma
chave
• Para exibir todos os encoders disponíveis, podemos utilizar o comando

msfvenom –l encoders

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 50/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Criação de Threads Remotas


• Vamos utilizar o encoder x64/xor_dynamic
• É importante notar que quando utilizamos um encoder, o msfvenom já gera o payload com
o código para fazer a decodificação

• Para tornar o payload mais difícil de detectar, podemos executar o encoding múltiplas
vezes utilizando chaves diferentes
• O número de iteração é controlado pela opção -i do vsfvenom

• Agora basta gerar o payload

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 51/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Criação de Threads Remotas

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 52/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Criação de Threads Remotas


• Agora basta transportar o payload (unsigned char buf[]) para o código do injetor e executar
os passos abaixo:
1. Alocar memória no processo alvo o suficiente para caber o payload
2. Escrever o payload na memória alocada
3. Criar uma thread remota, passando o endereço de memória alocado como argumento, o qual será o
ponto de entrada da execução da thread

• Os dois primeiros passos nós já vimos. Falta o último

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 53/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Criação de Threads Remotas


• Agora basta transportar o payload (unsigned char buf[]) para o código do injetor e executar
os passos abaixo:
1. Alocar memória no processo alvo o suficiente para caber o payload
2. Escrever o payload na memória alocada
3. Criar uma thread remota, passando o endereço de memória alocado como argumento, o qual será o
ponto de entrada da execução da thread

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 54/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Criação de Threads Remotas


• Os dois primeiros passos nós já vimos. Falta o último

• Antes de executar o código do injetor, é importante fazer com que a máquina do atacante
escute na porta especificada no payload. Para isso, basta executar o comando:

nc -l -p 4444

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 55/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Criação de Threads Remotas


• Os dois primeiros passos nós já vimos. Falta o último

• Antes de executar o código do injetor, é importante fazer com que a máquina do atacante
escute na porta especificada no payload. Para isso, basta executar o comando:

nc -l -p 4444

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 56/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Filas de Chamada de Procedimento Assíncrono (APC)


• A criação de threads remotas tem um overhead associado, pois exige a alocação de
recursos para a nova thread e pode ser considerada comportamento suspeito por produtos
antimalware
• Ao invés de criar uma nova thread, o processo injetor pode fazer com que uma das threads
já existentes executem o código injetado

• Uma maneira de fazer isso é registrar o código injetado em uma Fila de Chamada de
Procedimento Assíncrono ( o que é feito através da API QueueUserAPC())
• Quando uma thread entra no estado alertable, ela irá pausar o que está fazendo e irá
verificar se existe alguma tarefa em sua fila APC

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 57/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Filas de Chamada de Procedimento Assíncrono (APC)


• Caso haja, a thread executa a tarefa e depois retoma sua execução normal

Uma thread entra em estado alertable, quando


chama uma das seguintes APIs:
• SleepEx()
• WaitForSingleObectEx()
• WaitForMultipleObjectsEx()
• SignalObjectAndWait()
• MsgWaitForMultipleObjects()

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 58/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Alterando o Contexto da Thread


• Outra maneira de fazer uma thread executar o código injetado é modificando seu contexto
de execução
• Mais precisamente, alterando o valor do seu EIP/RIP atual

• O procedimento é o seguinte:
1. O processo injetor escolhe uma thread suspensa no processo alvo ou suspende uma thread ativa
utilizando a API SuspendThread()
2. O processo injetor obtém o contexto da thread utilizando a API GetThreadContext()
3. O processo injetor redefine o valor de EIP/RIP para o endereço do código injetado

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 59/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Alterando o Contexto da Thread


• Outra maneira de fazer uma thread executar o código injetado é modificando seu contexto
de execução
• Mais precisamente, alterando o valor do seu EIP/RIP atual

• O procedimento é o seguinte:
4. O processo injetor reseta o contexto da thread utilizando o contexto modificado através da API
SetThreadContext()
5. Por fim, o processo injetor reativa a thread utilizando a API ResumeThread()

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 60/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Alterando o Contexto da Thread


Observação
• O conteúdo do contexto da thread é dependente de arquitetura.
• O Windows suporta 4 arquiteturas: x86, x86-64, Arm32 e Arm64
• A API GetThreadContext() irá retornar uma instância de typedef struct _CONTEXT
• No Windows de 32 bits, o contexto estará de acordo com a arquitetura x86 ou ARM 32
• No Windows de 64 bits, o contexto estará de acordo com a arquitetura x86-64 ou ARM 64

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 61/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

Alterando o Contexto da Thread


Observação
• No Windows de 64 bits é possível ter aplicações de 32 bits sendo executadas
• Essas aplicações utilizam as APIs do WOW64
• Portanto, no Windows de 64 bits, se quisermos obter o contexto de uma thread de 32 bits,
precisamos utilizar a API Wow64GetThreadContext()
• Essa API retorna o contexto utilizando a seguinte struct: typedef struct _WOW64_CONTEXT

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 62/87


Code Injection – Metodologia
4. Executando Código no Processo Remoto

• Em resumo, as seguintes APIs são importantes para a etapa de execução do código


injetado:
• QueueUserAPC()
• SuspendThread()
• ResumeThread()
• CreateRemoteThread()
• RtlCreateUserThread()
• NtCreateThreadEx()
• GetThreadContext()
• SetThreadContext()

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 63/87


DLL Injection Clássica
• Malwares normalmente são compostos por diversos estágios

• Geralmente a vítima é infectada pelo primeiro estágio, o qual baixa (downloader) o


próximo estágio através de um servidor C2 ou extrai o próximo estágio a partir de sua
seção resources (dropper)
• Esse próximo estágio pode ser um executável PE, uma DLL ou outro tipo de arquivo
• No caso de DLLs, não é possível executá-las diretamente

• Ao invés disso, malwares geralmente injetam a DLL em um processo legítimo

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 64/87


DLL Injection Clássica
• Uma forma de injetar uma DLL no processo remoto seria injetar um código que:
1. Obtém um handle para a dll “[Link]” utilizando a API GetModuleHandle()
2. Obtém o endereço para a API LoadLibraryW() através da API GetProcAddress()
3. Executa a API LoadLibrary() para carregar a DLL do malware

• Esse processo funciona, mas é complexo, pois é necessário escrever um payload que realize
as tarefas listadas acima
• Uma forma mais simples envolve a observação de que normalmente o Windows mapeia as
DLLs do sistema sempre no mesmo endereço base para todos os processos
• Isso não é verdade sempre, mas funciona na maioria das vezes

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 65/87


DLL Injection Clássica
• Assim, o processo de DLL Injection fica mais simples, sendo necessários os seguintes
passos:
1. Realizar a injeção da string com o caminho em disco da DLL a ser injetada (ex.: C:\[Link])
2. No código do Injetor, obter o endereço da API LoadLibraryW() utilizando as APIs GetModuleHandle() e
GetProcAddress()
3. Criar uma thread remota (por exemplo) passando o endereço de LoadLibrary() e o path da DLL a ser
injetada como argumento

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 66/87


Process Hollowing
• Ao invés de injetar código em um processo remoto já existente, também é possível criar
um processo novo (normalmente a partir de um executável legítimo do sistema) e
substituir seu código e seus dados pelos do malware

• Assim, ao analisar as características do processo em execução, como nome e caminho do


executável, não será possível identificar que se trata de um malware e não de um processo
legítimo

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 67/87


Process Hollowing
• A técnica envolve os seguintes passos:
1. Criar um processo em estado suspenso
2. Remover os dados e o código do processo e substituir pelos dados e código do malware
3. Reativar o processo

Referências para implementação:


• Process Hollowing and Portable Executable Relocations
| Red Team Notes
• How to perform a Complete Process Hollowing - Red
Team SNCF

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 68/87


Reflective DLL Injection
• é uma técnica de injeção em que uma DLL é carregada na memória de um processo alvo
sem usar as APIs normais do loader do Windows (ex.: sem LoadLibrary)
• o loader da DLL é injetado dentro do processo remoto, junto com a DLL.
• a DLL carrega a si mesma “refletivamente”: ela contém um reflective loader (um pequeno
stub) que, quando executado no processo alvo, realiza todas as etapas que o loader do
sistema faria — relocations, resolução de imports, execução de TLS callbacks e chamada ao
entry point (DllMain).

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 69/87


Reflective DLL Injection - Metodologia
1. Obter os bytes da DLL
• O injetor tem acesso aos bytes binários da DLL (pode vir de disco, rede, recurso embutido, etc.).

2. Alocar memória no processo alvo


• Cria-se uma região de memória no processo remoto e copia-se esses bytes para lá (ou mapeia-se a memória do processo
com o conteúdo).

3. Executar o reflective loader


• A DLL contém um pequeno loader embutido (normalmente no início do binário) — quando esse código é executado dentro
do processo alvo, ele:
• Valida os cabeçalhos PE (IMAGE_DOS_HEADER/IMAGE_NT_HEADERS) na memória.
• Aloca/organiza memória para seções conforme o layout PE.
• Copia seções apropriadas para os locais corretos (se necessário).
• Aplica relocations se o módulo não foi carregado no endereço preferido.
• Resolve import symbols percorrendo a tabela de imports e preenchendo a IAT (procura endereços das APIs necessárias).
• Executa TLS callbacks se houver e chama o entry point (DllMain com DLL_PROCESS_ATTACH) para finalizar a inicialização.

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 70/87


Reflective DLL Injection - Metodologia
4. Controle de execução
• Normalmente um stub pequeno é executado primeiro ([Link]. via CreateRemoteThread ou hijack de
contexto) e esse stub chama o reflective loader.
• Após a inicialização, a DLL pode executar sua lógica normal (hooks, payload, etc.).

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 71/87


API Hooking
• API Hooking representa uma maneira de interceptar e, possivelmente, modificar o
funcionamento de uma chamada de API
• O objetivo para executar essa técnica varia de acordo com as intenções do malware
• Por exemplo, o malware pode querer evitar que um processo seja capaz de remover seus
arquivos
• Para remover arquivos, o processo teria que utilizar uma API como DeteleFile()
• O malware intercepta chamadas para DeleteFile() e verifica se o arquivo a ser deletado é um dos seus,
não removendo-o em caso afirmativo

• Outro exemplo seria o malware que não quer ser exibido na lista de processos ativos do
Task Manager

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 72/87


API Hooking
O procedimento para executar API Hooking segue as seguintes 4 etapas:

1. O malware (processo injetor) identifica um processo alvo, do qual chamadas de API


precisam ser interceptadas;
2. Em seguida, o malware injeta código no processo alvo, utilizando uma das técnicas que
estudamos;
3. O malware induz a execução do código injetado;

4. Ao ser executado, o código injetado cria hooks para as diversas APIs que devem ser
interceptadas. Como consequência, chamadas a essas APIs serão redirecionadas para o
código injetado.

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 73/87


API Hooking
• Para executar a etapa 4, precisamos identificar os pontos
onde podemos adicionar hooks
• Como exemplo, vamos analisar a chamada de API
DeleteFile()
• Ao ser chamada, DeleteFile() desencadeia múltiplas
etapas:
1. O endereço de DeleteFile() é obtido a partir da IAT
2. A função DeleteFile() é efetivamente executada
3. DeleteFile() em [Link] chamada NyDeleteFile() em
[Link]

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 74/87


API Hooking
• Para executar a etapa 4, precisamos identificar os pontos
onde podemos adicionar hooks
• Como exemplo, vamos analisar a chamada de API
DeleteFile()
• Ao ser chamada, DeleteFile() desencadeia múltiplas
etapas:
4. Uma chamada de sistema é realizada e o tratador de
NtDeleteFile() é chamado através da System Service Dispatch
Table (SSDT)
5. Como parte do tratamento da chamada de sistema, um I/O
Request Packet (IRP) para o driver do sistema de arquivos
6. O driver do sistema de arquivos realiza a operação de
remoção do arquivo (interage com o driver do disco)

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 75/87


API Hooking em Modo Usuário
IAT Hooking

• O endereço de API a ser hookada é substituído


na IAT pelo endereço do código injetado
• Quando DeleteFile() é chamada através da IAT,
a execução é redirecionada para o código
injetado
Obs.: Nem sempre as chamadas de funções em
DLLs passam pela IAT. Por exemplo, quando
usamos GetProcAddress() para obter o endereço
da função.

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 76/87


API Hooking em Modo Usuário
Inline Hooking

• O código da função a ser hookada é modificado


diretamente
1. Os primeiros bytes da função original (instruções
completas) são copiados para uma área executável de
memória chamada de trampolim. Um jump para a
instrução seguinte na função original é adicionado ao
trampolim
2. Os primeiros bytes (normalmente 5) são substituídos
por um Jump para o código injetado
3. Se for necessário executar a função original, basta
utilizar o trampolim

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 77/87


API Hooking em Modo Usuário
Inline Hooking

• Obs.1: como as páginas de código são protegidas


contra escrita, será necessário utilizar a API
VirtualProtect()
• Obs.2: para garantir o isolamento entre processos,
quando VirtualProtect() é executada, o SO executa
a operação de copy-on-write. Como resultado, o
hook só é visível no processo hookado

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 78/87


Objetivos de API Hooking
Ao executar API Hooking, o malware pode ter diversos objetivos, como:

• Auto defesa
• Impedir que processos removam arquivos do malware (Hook em DeleteFile() e variantes)
• Impedir que o processo do malware seja encerrado (Hook em TerminateProcess() e variantes)

• Furtividade
• Impedir que a presença do malware seja detectada no sistema
• Implementada através de rootkits

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 79/87


Objetivos de API Hooking
Ao executar API Hooking, o malware pode ter diversos objetivos, como:

• Roubo de dados;
• Todos os tipos de operações envolvem a utilização de APIs do Win32, como copiar dados para a área de
transferência, pressionar uma tecla do teclado, navegar na Internet, etc
• Malwares são conhecidos por interceptarem essas APIs para roubar dados dos usuários
• A seguir são listadas algumas APIs comumente hookadas por malware

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 80/87


Objetivos de API Hooking
Ao executar API Hooking, o malware pode ter diversos objetivos, como:

• Interceptação de Comunicações em Rede


• O malware pode aplicar hooks a APIs utilizadas para estabelecer comunicação em rede para interceptar
dados enviados em rede por aplicações legítimas.
• A maioria das APIs utilizadas para comunicação em rede residem nas dlls ws2_32.dll, [Link] e [Link].

• Malwares também podem interceptar resoluções de domínios DNS e alterar o endereço IP retornado,
redirecionando o usuário para uma página maliciosa
• De maneira similar, malwares podem impedir ferramentas de segurança de baixar atualizações e fazer
qualquer outro tipo de comunicação com o servidor ao impedir a resolução DNS

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 81/87


Objetivos de API Hooking
Ao executar API Hooking, o malware pode ter diversos objetivos, como:

• Interceptação de Comunicações em Rede

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 82/87


Objetivos de API Hooking
Exemplo: Banking Malware implementando ataque Man in Browser

• Para navegar na WEB, as APIs InternetOpen(), InternetConnect(), HttpOpenRequest(),


HttpSendRequest() e InternetReadFile() são comumente utilizadas
• Supondo que queremos acessar a nossa conta através do website do banco, precisamos
antes fazer login no sistema
• Ao preencher os dados de login, esses são enviados ao banco utilizando a API
InternetSendRequest()

• O malware pode adicionar um Hook para InternetSendRequest() no navegador e


interceptar as credenciais do usuário
• Essa técnica é chamada de form grabbing

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 83/87


Objetivos de API Hooking
Exemplo: Banking Malware implementando ataque Man in Browser

• Outra possibilidade é interceptar e modificar dados enviados do servidor para o cliente


• O cliente acessa esses dados utilizando a API InternetReadFile()
• Como exemplo, o malware pode adicionar um Hook na API InternetReadFile(), modificando
a página de login do banco
• O malware então devolve para o navegador uma versão modificada da página de login
• Essa versão modificada pode incluir, por exemplo, um campo para o preenchimento da senha do banco

Obs.: A utilização de TLS não ajuda contra os hooks, pois nesse caso os dados são
interceptados antes da criptografia ou após a descriptografia

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 84/87


Objetivos de API Hooking
Exemplo: Banking Malware implementando ataque Man in Browser

• As seguintes APIs são comumente utilizadas por malwares que visam a interceptação de
comunicação com aplicações bancárias

Mais comum no Microsoft Edge ou Internet Explorer

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 85/87


Objetivos de API Hooking
Exemplo: Banking Malware implementando ataque Man in Browser

• As seguintes APIs são comumente utilizadas por malwares que visam a interceptação de
comunicação com aplicações bancárias

Mais comum no Firefox e Chrome

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 86/87


Objetivos de API Hooking
Exemplo: Banking Malware implementando ataque Man in Browser

• As seguintes APIs são comumente utilizadas por malwares que visam a interceptação de
comunicação com aplicações bancárias

Mais comum no Firefox e Chrome

Prof. Igor C. G. Ribeiro Fundamentos de Análise de Softwares Maliciosos 87/87

Você também pode gostar