macOS .Net Applications Injection
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)
Este é um resumo do post https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/. Confira para mais detalhes!
O manuseio da comunicação entre o depurador e o depurado no .NET é gerenciado por dbgtransportsession.cpp. Este componente configura dois pipes nomeados por processo .NET, como visto em dbgtransportsession.cpp#L127, que são iniciados via twowaypipe.cpp#L27. Esses pipes são sufixados com -in
e -out
.
Ao visitar o $TMPDIR
do usuário, pode-se encontrar FIFOs de depuração disponíveis para depurar aplicações .Net.
DbgTransportSession::TransportWorker é responsável por gerenciar a comunicação de um depurador. Para iniciar uma nova sessão de depuração, um depurador deve enviar uma mensagem via o pipe out
começando com uma estrutura MessageHeader
, detalhada no código-fonte do .NET:
Para solicitar uma nova sessão, esta struct é preenchida da seguinte forma, definindo o tipo de mensagem como MT_SessionRequest
e a versão do protocolo como a versão atual:
Este cabeçalho é então enviado para o alvo usando a chamada de sistema write
, seguido pela estrutura sessionRequestData
contendo um GUID para a sessão:
Uma operação de leitura no pipe out
confirma o sucesso ou falha do estabelecimento da sessão de depuração:
Uma vez que uma sessão de depuração é estabelecida, a memória pode ser lida usando o tipo de mensagem MT_ReadMemory
. A função readMemory é detalhada, realizando os passos necessários para enviar um pedido de leitura e recuperar a resposta:
A prova de conceito (POC) completa está disponível aqui.
Da mesma forma, a memória pode ser escrita usando a função writeMemory
. O processo envolve definir o tipo de mensagem como MT_WriteMemory
, especificar o endereço e o comprimento dos dados e, em seguida, enviar os dados:
O POC associado está disponível aqui.
Para executar código, é necessário identificar uma região de memória com permissões rwx, o que pode ser feito usando vmmap -pages:
Localizar um lugar para sobrescrever um ponteiro de função é necessário, e no .NET Core, isso pode ser feito direcionando-se para a Dynamic Function Table (DFT). Esta tabela, detalhada em jithelpers.h
, é usada pelo runtime para funções auxiliares de compilação JIT.
Para sistemas x64, a busca por assinatura pode ser usada para encontrar uma referência ao símbolo _hlpDynamicFuncTable
em libcorclr.dll
.
A função de depuração MT_GetDCB
fornece informações úteis, incluindo o endereço de uma função auxiliar, m_helperRemoteStartAddr
, indicando a localização de libcorclr.dll
na memória do processo. Este endereço é então usado para iniciar uma busca pela DFT e sobrescrever um ponteiro de função com o endereço do shellcode.
O código completo do POC para injeção no PowerShell está acessível aqui.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)