
Heavily-modified fork of David Buchanan's dlinject project. Injects arbitrary assembly (or precompiled binary) payloads directly into x86-64, x86, and ARM32 Linux processes without the use of ptrace by accessing /proc/<pid>/mem. Useful for certain post-exploitation scenarios, recovering content from process memory, etc..
asminject.py é um fork fortemente modificado do projeto dlinject de David Buchanan. Injeta payloads de assembly arbitrário (ou binário pré-compilado) diretamente em processos Linux x86-64, x86 e ARM32 acessando /proc/<pid>/mem em vez de anexar via ptrace. Útil para adulterar processos confiáveis, certos cenários de pós-exploração, recuperar conteúdo da memória de processos e contornar alguns controles de segurança. Pode injetar em processos conteinerizados de fora do contêiner, desde que você tenha acesso root no host.
Você também pode ler mais sobre o asminject.py e suas origens na página da ferramenta Bishop Fox, incluindo um relato detalhado do trabalho que inspirou a ferramenta.
Neste documento:
Documentação separada, mais detalhada:
asminject.py é como o dlinject, exceto que permite injetar qualquer payload que você quiser em vez de apenas carregar uma biblioteca, e funciona em múltiplas arquiteturas."asminject.py é vagamente como o Frida, exceto que não se anexa via interface ptrace, então os processos não podem bloqueá-lo ao usarem ptrace em si mesmos."asminject.py foi escrito para dois cenários principais em testes de penetração em ambientes Linux:
Por exemplo, considere um teste de penetração em que o pentester obteve acesso root a um servidor que hospeda muitos contêineres. Um dos contêineres processa transferências bancárias e possui um produto de segurança de endpoint muito robusto instalado. Quando o pentester tenta modificar os dados de transferência bancária de dentro do contêiner, o software de segurança de endpoint detecta e bloqueia a tentativa. O asminject.py permite que o pentester injete código arbitrário diretamente na memória do processo do software bancário ou até mesmo no produto de segurança de endpoint, de fora do contêiner. Como uma vítima do "demônio maligno" de Descartes, o software de segurança dentro do contêiner é impotente, pois existe em um ambiente totalmente sob o controle do atacante.
O dlinject.py original foi projetado especificamente para carregar bibliotecas compartilhadas Linux em um processo existente. O asminject.py faz tudo o que o original fazia e muito mais. Ele executa código assembly arbitrário e inclui modelos para uma variedade de ataques. Ele também foi redesenhado para ajudar a evitar a detecção por mecanismos de segurança que se baseiam em atividades potencialmente suspeitas, como eventos de carregamento de bibliotecas.
O diretório practice deste repositório inclui código básico de loop que exibe um timestamp e a iteração do loop no console, para que você possa praticar a injeção de vários tipos de código em um ambiente controlado. Esses loops de prática são referenciados nos exemplos restantes.
A sintaxe básica para chamar o asminject.py é:
# python3 ./asminject.py <target_process_id> <payload> \
--arch [x86-64|x86|arm32] --relative-offsets-from-binaries --stop-method "slow" \
--var <payload_variable_1_name> <payload_variable_1_value> \
# ... \
--var <payload_variable_n_name> <payload_variable_n_value>
Na maioria dos casos, qualquer um dos payloads usados nos exemplos será executado em qualquer uma das arquiteturas suportadas.
A maioria das distribuições Linux inclui um módulo de segurança do kernel chamado Yama que controla o acesso ao uso da capacidade ptrace contra outros processos. Embora o asminject.py não se anexe à interface do depurador, ele ainda exige permissão para usar a capacidade ptrace. Se você estiver recebendo erros relacionados a essa capacidade, verifique o conteúdo de /proc/sys/kernel/yama/ptrace_scope. Se estiver definido como 2, execute o seguinte comando como root:
echo 1 > /proc/sys/kernel/yama/ptrace_scope
Valores 3 ou superiores não podem ser desativados sem uma reinicialização. No entanto, se você for um administrador autorizado de um sistema Linux em que alguém definiu acidentalmente /proc/sys/kernel/yama/ptrace_scope como 3, ou estiver conduzindo um teste de penetração autorizado em um ambiente onde esse valor foi definido, veja o diretório ptrace_scope_kernel_module para uma possível solução alternativa que não exige reinicialização.
gcc em nível de SO.eval de código de script legível por humanos), fornecer payloads para aproveitar essa capacidade para obter ainda mais furtividade.dlinject.py.asminject.py - mais pesquisa é necessária.asminject.py poderia solicitar ao operador uma linha de código para injetar, injetá-la, retornar a saída resultante e então solicitar ao operador outra linha de código.
asminject.py de uma forma que evite a necessidade de o Frida invocar temporariamente a interface do depurador.asminject.py/proc/mem