
Um simples injetor de bibliotecas compartilhadas sem ptrace para Linux x64
Um injetor de bibliotecas compartilhadas sem ptrace para Linux x64.
linux_injector <mode> <pid> <file>
modo
pid
ID do processo alvo. Você deve ter direitos de ptrace sobre ele (necessário para acessar /proc/$pid/mem). O processo não é ptraced, então outro processo pode executar ptrace nele livremente.
arquivo
Para o modo 1: Módulo a injetar, que será carregado com dlopen no processo remoto. Provavelmente deve ser um caminho completo, caso contrário o LD_LIBRARY_PATH remoto será usado para resolução.
Para o modo 2: Módulo a injetar, que será carregado com dlopen no processo remoto a partir de um memfd, para onde o conteúdo será copiado.
Para o modo 3: Shellcode bruto a injetar. Você será mapeado em um endereço alinhado a 16 bytes e iniciará a execução em uma thread aleatória sequestrada. Coloque hooks ou crie uma thread e então retorne.
Para o sequestro de fluxo de controle, este programa precisa de um candidato ao sequestro. O código apresentado aqui usa malloc; isso pode ser alterado editando FUN_NAME e recompilando. Garanta que a função hookada consiga ser executada em menos de 100ms, para que não seja sobrescrita durante sua execução. Isso significa que chamadas como sleep ou wait são más candidatas para o shellcode inicial. A função em questão também precisa ter mais de 0x50 bytes para que o shellcode não sobrescreva outras funções.
Glibc e musl são suportados tanto para o processo alvo quanto para o processo de origem. O processo alvo pode estar sendo executado em um contêiner e pode usar uma libc diferente. Os modos 2 e 3 não exigem nenhum caminho acessível ao processo alvo.
O modo 2 requer Linux 3.17.
Testado em Oracle Linux 7 (modo 2 não suportado), Fedora 37 e Alpine Linux 3.17