Falsificação de PID pai
Monitorar as relações entre os processos pai e filho é uma técnica muito comum para as equipes de caça a ameaças detectarem atividades maliciosas. Por exemplo, se o PowerShell é o processo filho e o Microsoft Word é o pai, então é uma indicação de comprometimento. Vários EDR’s (detecção e resposta de endpoint) podem detectar essa atividade anormal facilmente. Isso levou as equipes vermelhas e os adversários a usar a falsificação PID dos pais como um método de evasão. A chamada de API do Windows “CreateProcess” oferece suporte a um parâmetro que permite ao usuário atribuir o PID pai. Isso significa que um processo mal-intencionado pode usar um pai diferente quando é criado daquele que é realmente executado.
Originalmente, essa técnica foi introduzida no público mais amplo de segurança da informação em 2009 porDidier Stevens. Uma prova de conceito escrita em C++ foi lançada (SelectMyParent) que poderia permitir que o usuário selecionasse o processo pai especificando o PID (identificador de processo). A função “CreateProcess” foi utilizada em conjunto com a função “STARTUPINFOEX” e “LPPROC_Thread_ATTRIBUTE_LIST”.
1 |
|
Falsificação de PID pai – SelectMyParent
O PID 508 corresponde ao processo “lsass.exe”, que é responsável por atividades de logon, alterações de senhas, etc. O bloco de notas será criado sob o processo lsass.exe.
Process Explorer – SelectMyParent
A investigação das propriedades do processo mostrará que o Bloco de Notas está sendo executado com privilégios de nível SYSTEM. Isso ocorre porque o processo filho (bloco de notas.exe) obterá os privilégios do processo pai (lsass.exe).
SelectMyParent – Propriedades do processo
Em uma sessão do Meterpreter, os comandos a seguir podem ser usados para recuperar o PID da sessão atual e, especificando o nome do processo, os resultados serão filtrados somente para esse processo específico.
SelectMyParent – Meterpreter
PowerShell (em inglês)
A F-Secure lançou um script do PowerShell (PPID-Spoof) que pode executar a falsificação PID pai. O script contém código C# incorporado para interagir com a API do Windows “CreateProcess”.
1 2 3 4 5 6 7 8 9 10 11 |
|
A ferramenta aceita 3 argumentos que são o PID do processo pai, o caminho do sistema do processo filho e o caminho de uma DLL arbitrária para execução de código.
1 |
|
Falsificação de ID pai – PowerShell PPID-Spoof
O bloco de notas será executado no contexto do PowerShell e a DLL será carregada dentro do bloco de notas.exe.
PPID Spoof – DLL do bloco de notas carregado
Como a DLL será carregada dentro do processo, um canal de comunicação será aberto com a estrutura de comando e controle.
Falsificação PPID – Meterpreter
Uma abordagem mais furtiva poderia ser carregar a DLL dentro do processo “LSASS”. As equipes de caça a ameaças terão que revisar o EventHeader ProcessId e o ParentProcessID para identificar a falsificação do processo.
1 |
|
Falsificação PPID – LSASS
Um novo processo “LSASS” será criado no sistema que carregará a DLL arbitrária. Esse cenário permite que a equipe vermelha se misture com os processos legítimos do ambiente.
Falsificação PPID – LSASS DLL carregado
Uma sessão do Meterpreter será aberta com a ID do processo de 1312 que corresponde ao processo “rundll32” que é o filho de “lsass.exe” que executa a DLL.
Falsificação PPID – LSASS Meterpreter
Andrea Pieriniimplementou a técnica de falsificação de PID pai incorporando código C# em um script do PowerShell. O script criará um novo processo filho que terá como pai qualquer processo definido pelo usuário. Da mesma forma, com o script da F-Secure Labs, a API “CreateProcess()” é usada para executar a falsificação.
1 2 |
|
Parent PID Spoofing – psgetsys
The created process will obtain the privileges (SYSTEM) of the parent (winlogon.exe).
Parent PID Spoofing – psgetsys Process Explorer
C++
Adam Chesterexplicou em seublogem 2017 como o comando “getsystem” do Meterpreter funciona nos bastidores para elevar os privilégios de um processo de Administrador para SISTEMA. Adam expandiu oartigodeRaphael Mudgeem 2014 sobre as três técnicas que o Meterpreter está usando para se tornar SYSTEM.
O bináriogetsystem-offlineutiliza a API “ImpersonateNamedPipeClient” do Windows para elevar seus privilégios para SYSTEM. Isso é conseguido criando e impondo um serviço que é executado como SYSTEM para se conectar a um canalizado nomeado de um processo e usar a API “ImpersonateNamedPipeClient” para criar um token de representação elevado.
Falsificação de PID pai – getsystem-offline
Por padrão, o binário abrirá um novo prompt de comando com privilégios elevados.
Falsificação de PID pai – getsystem-offline elevado
No entanto, o código pode ser modificado para executar um binário arbitrário que estabelecerá uma comunicação com o prompt de comando.
Falsificação de PID pai – getsystem-offline
getsystem-offline – Meterpreter
De acordo com a documentação da Microsoft, uma “Chamada de procedimento assíncrono” é uma função executada no contexto de um thread específico de forma assíncrona. É um método de injeção de processo queHalil Dalabasmazusou em sua ferramenta C++APC-PPIDque implementa a falsificação PID pai.
Inicialmente, a função “getParentProcessID()” é usada para recuperar o PID do processo pai. O cabeçalho “TlHelp32.h” (parte da Biblioteca de Ajuda daFerramenta) suporta a função “CreateToolhelp32Snapshot” que é responsável por tirar um instantâneo do processo especificado (explorer.exe). Quando o instantâneo é tirado, o tamanho do processo e o PID são recuperados e o identificador é fechado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
A API do Windows “CreateProcess” é utilizada para criar um novo processo no sistema (iexplore.exe) com a estrutura “STARTUPINFOEXA”.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
|
APC-PPID – Processo Pai
Metasploit utilitário “msfvenom” pode ser usado ou qualquer outra alternativa para gerar shellcode na linguagem C. O código será gravado no espaço de endereço do processo criado (iexplore.exe).
1 |
|
Metasploit ShellCode – APC-PPID
APC-PPID – Código C++
A execução do binário no sistema de destino criará um novo processo (iexplore.exe) que terá como pai o explorador.exe. O shellcode será executado no espaço de memória do processo do Internet Explorer usando a chamada de procedimento assíncrono de modo de usuário.
Falsificação de PID pai – APC-PPID
Uma sessão do Meterpreter será estabelecida com o host de destino.
APC-PPID – Meterpreter
A revisão dos processos do sistema de destino mostrará que “iexplore.exe” foi criado com sucesso.
APC-PPID – Explorador de Processos
A revisão das propriedades do processo validará que o processo pai é “explorer.exe”. Essa prova de conceito implementa um método de injeção de processo mais furtivo para ocultar o shellcode dentro de um processo e, como o Explorer e o Internet Explorer são válidos, os processos do sistema Microsoft se misturarão ao ambiente ignorando o produto de detecção e resposta de ponto de extremidade.
APC-PPID – iexplore.exe Properties
Julian Horoszkiewiczdesenvolveu uma ferramenta C++ (spoof) baseada no trabalho de Didier Stevens que pode ser usada para falsificação PID pai, pois permite que o usuário selecione o processo PID pai.
1 |
|
Parent PID Spoofing – Spoof
Once the process is created on the target host the arbitrary payload will executed and a session will open.
Parent PID Spoofing – Spoof Meterpreter
Revisar os detalhes do processo do PID no explorador de processos validará que o processo é um processo filho do explorador.exe.
Falsificação de PID pai – Process Explorer
Falsificação de PID pai – Processo pai do Explorer
C
O binárioGetSystemé desenvolvido em C# e implementa a falsificação de ID do processo pai para elevar os direitos para SYSTEM. Isso é conseguido por meio da API “CreateProcess”, semelhante ao código lançado pela F-Secure Labs. O binário .NET aceita apenas dois argumentos que são o executável arbitrário e o nome do processo que atuará como um pai.
1 |
|
Falsificação de PID pai – GetSystem
O processo “pentestlab.exe” será criado no host de destino como um filho de “lsass.exe”.
GetSystem – Processo LSASS
A comunicação será estabelecida com a estrutura de Comando e Controle correspondente com privilégios de nível SYSTEM.
GetSystem – Meterpreter
O fato de que “GetSystem” é baseado em C# dá a capacidade de implementar essa técnica via Covenant ou qualquer outro Framework relevante (Cobalt Strike) que pode carregar binários de montagem.
1 |
|
GetSystem – Convênio
GetSystem – Meterpreter via Covenant
Semelhante ao comando “migrate” do Metasploit Framework, um binário de assembly pode ser executado para elevar o processo de Administrador para SYSTEM.
Falsificação de PID pai – GetSystem Covenant
A investigação da lista de “Grunts” disponíveis mostrará que o novo agente está sendo executado com privilégios de nível SYSTEM em comparação com o processo inicial.
Aliança – Grunhidos
O processo pai será o “LSASS” ou qualquer outro processo que esteja sendo executado com privilégios de nível SYSTEM.
Convênio – Process Explorer
Chirag Savladesenvolveu em C# umaferramentapara executar injeção de processos com capacidade de executar spoofing PID pai, utilizando todas as APIs comuns do Windows (CreateProcess, VirtualAllocEx, OpenProcess etc.). O benefício desta ferramenta é que suporta diferentes técnicas de injeção de processo com a falsificação PID pai. A ferramenta aceita shelllcode em base-64, C e hex. Metasploit “msfvenom” utilitário pode gerar shellcode nesses formatos.
1 |
|
Generate ShellCode – HEX
The tool requires the path of the injected process, the path of the shellcode, the parent process name, the file format of the payload and the process injection technique. Executing the following command will inject the shellcode into a new process (calc.exe) using as a parent explorer.exe.
1 |
|
ProcessInjenction – Vanilla
Monitoring the processes will validate that the calculator has been created in the context of explorer.exe.
ProcessInjection – Process Explorer
The shellcode will executed in the virtual address space of calc.exe and a communication will established with the command and control.
ProcessInjection – Vanilla Meterpreter
ProcessInjection supports also parent PID spoofing with DLL injection. Arbitrary DLL files can be generated with Metasploit “msfvenom”.
1 |
|
Metasploit – DLL
The path of the DLL needs to be specified instead of the shellcode and the technique value should be changed to 5.
1 |
|
ProcessInjection – DLL Injection
When the remote thread will be created inside the process the shellcode will executed and a Meterpreter session will open.
ProcessInjection – DLL Injection Meterpreter
The session will run under the context of “rundll32” process.
ProcessInjection – Process Explorer DLL
Specifying the technique number 6 will perform parent process spoofing with process hollowing technique.
1 |
|
ProcessInjection – Process Hollowing
ProcessInjection – Meterpreter
The tool also supports process injection with asynchronous procedure call. Execution of the shellcode will occur before the entry point of the main thread of the targeted process for a more stealthier approach.
1 |
|
ProcessInjection – APC Queue
ProcessInjection – APC Queue Meterpreter
A C# utility called RemoteProcessInjection also exists with the ability to perform process injection. The tool was designed for Cobalt Strike and accepts base-64 based payloads. Metasploit utility “msfvenom” can generate raw shellcode which can be trivially converted to base-64.
1 2 |
|
msfvenom – Raw Base64 Payload
The shellcode will be injected into the target process. Even though it doesn’t utilize the “CreateProcess” API to spoof the parent process it gives the ability to hide malware inside legitimate windows processes.
1 |
|
Remote Process Injection
The payload will executed from the memory address space of the target process. The process injection method has similarities with the “migrate” Metasploit command since it uses the same Windows API’s.
Remote Process Injection – Meterpreter
VBA
Microsoft office has been always a very popular delivery mechanism of malware as it helps threat actors and red team to get initial foothold inside an organisation. However execution of malicious code in the form of a macro will create an arbitrary child process that could be easily discovered by EDR’s that have the ability to analyse the anomaly between the parent and child relationship of processes.
There are a variety of approaches that could be used in order to evade detection of EDR products that investigate parent/child relationships. For example VBScript can invoke other system resources to execute malware such as WMI, COM or scheduled tasks. Therefore the parent process will not be WINWORD for example but a process of the Windows operating system.
The following macro will use WMI (Windows Management Instrumentation) in order to create a new process.
1 2 3 4 5 6 7 8 9 |
|
Macro – WMI
The benefit from this approach is that the created process will be spawned under “WmiPrvSE.exe” instead of an office process.
WMI Process Explorer
A communication channel will open with the command and control framework.
WMI Macro – Meterpreter
COM objects can be also used to execute a new process.
1 2 3 4 5 6 |
|
Macro – COM
The result of executing a malicious executable with this method is that the parent process will be “explorer.exe” even though the execution will happen inside the office product.
Macro COM – Process Explorer
The following image demonstrates that a session will open in Meterpreter through a COM object that is executing an arbitrary payload.
Macro COM – Meterpreter
Scheduled tasks are often used as a persistence method since it allows red teams to execute their trade-craft at a specific date or time. However it could be used as well for parent PID spoofing since a scheduled task can be created directly from a vbscript. The following code will register a new scheduled task that will trigger the execution of a payload after 30 seconds.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Macro – Scheduled Task
The new process will not have as a parent the process of a Microsoft product but “svchost.exe” as a more stealthier approach.
Tarefa agendada de macro – Process Explorer
A revisão das propriedades do processo arbitrário validará que o processo pai é “svhcost.exe”.
Tarefa agendada de macro – Propriedades do processo
Metasploit
Metasploit framework contém um módulo de pós-exploração que pode ser usado para migrar uma sessão existente do Meterpreter para outro processo no sistema. O módulo seguirá as mesmas funções que as outras ferramentas descritas neste artigo para reescrever o shellcode existente no espaço de endereço de outro processo. Especificamente, o módulo seguirá o processo abaixo:
- Obter o PID do processo de destino
- Verifique a arquitetura do processo de destino (32 bits ou 64 bits)
- Verifique se a sessão do Meterpreter tem oSeDebugPrivilege
- Recuperar a carga útil do processo existente
- Chame a APIOpenProcess()para obter acesso à memória virtual do processo de destino
- Chame a API VirtualAllocEx()para alocar memória RWX no processo de destino
- Chame a API WriteProcessMemory()para gravar a carga no espaço de memória virtual do processo
- Chame a API CreateRemoteThread()para criar um thread no espaço de memória virtual do processo de destino
- Fechar o thread anterior
Uma sessão existente deve ser definida com o PID e o nome do processo de destino.
1 2 3 4 5 |
|
Metasploit – Migrar a configuração do módulo
A execução bem-sucedida do módulo produzirá os seguintes resultados:
Metasploit – Migrar módulo
Da mesma forma, o Meterpreter também contém o comando “migrate”, que pode migrar a sessão existente para outro processo.
Meterpreter – Migrar
YouTube (em inglês)
Demonstrações de falsificação de PID pai
Toolkit
Ferramenta | Idioma |
Selecionar Meu Pai | C++ |
PPID-Spoof | PowerShell (em inglês) |
GetSystem | C # |
getsystem-offline | C++ |
APC-PPID | C++ |
PPID_spoof | C++ |
psgetsystem | PowerShell (em inglês) |
ProcessInjection (Injeção de Processo) | C # |
RemoteProcessInjection (em inglês) | C # |
Spoofing-Office-Macro | VBA |
Referências
- https://attack.mitre.org/techniques/T1502/
- https://blog.didierstevens.com/2009/11/22/quickpost-selectmyparent-or-playing-with-the-windows-process-tree/
- https://blog.didierstevens.com/2017/03/20/that-is-not-my-child-process/
- https://blog.xpnsec.com/becoming-system/
- https://gist.github.com/xpn/a057a26ec81e736518ee50848b9c2cd6
- https://decoder.cloud/2018/02/02/getting-system/
- https://blog.f-secure.com/detecting-parent-pid-spoofing/
- https://web.archive.org/web/20190526132859/http://www.pwncode.club/2018/08/macro-used-to-spoof-parent-process.html
- https://www.anquanke.com/post/id/168618
- https://medium.com/@r3n_hat/parent-pid-spoofing-b0b17317168e
- https://rastamouse.me/tags/tikitorch/
- https://github.com/rasta-mouse/TikiTorch
- https://gist.github.com/christophetd/0c44fd5e16e352ad924f98620094cd8d#file-createwithparentprocess-cpp
- https://blog.christophetd.fr/building-an-office-macro-to-spoof-process-parent-and-command-line/
- https://blog.f-secure.com/dechaining-macros-and-evading-edr/