
Ferramenta de ocultação de identidade de processos Linux que falsifica comm, argv, cmdline, environ, caminho do exe e VMAs por meio de um pipeline prctl de 11 fases para se passar por outro processo.
Ocultação de identidade de processos no Linux
O DARKCLOAK encadeia a manipulação de todas as fontes de identidade visíveis no espaço do usuário em um pipeline sequencial de 11 fases que transforma progressivamente um processo até que ele se torne indistinguível do processo personificado para ferramentas de monitoramento no espaço do usuário. Até onde sabemos, nenhuma ferramenta publicada combina a manipulação simultânea de todas as fontes de identidade visíveis no espaço do usuário.
O artigo técnico completo está disponível no blog RAZOR.
task_struct->comm: via PR_SET_NAMEargv[0]: via sobrescrita direta da pilha/proc/$PID/cmdline): via PR_SET_MM_ARG_START/END/proc/$PID/environ): via PR_SET_MM_ENV_START/END/proc/$PID/exe): via PR_SET_MM_EXE_FILE/proc/$PID/maps): substituídas por memória anônimaunshareO pipeline é executado em uma ordem estrita definida pelas dependências entre os subsistemas do kernel que estão sendo manipulados:
_start para resolver o PHT e obter os intervalos de endereços virtuais de todos os três segmentos PT_LOADgetresuid / getresgid para armazenar os UIDs e GIDs originais para restauração posteriorsetresuid(0,0,0) se qualquer um dos três UIDs for 0capget/capsetprctl(PR_SET_NAME) → sobrescreve task_struct->comm[rsp+8] → sobrescreve argv[0]prctl(PR_SET_DUMPABLE, 0) → bloqueia o acesso a e de processos sem privilégiosPR_SET_MM_EXE_FILE falha com EBUSY enquanto qualquer VMA ainda estiver apoiada no binário original. Como o segmento .text não pode ser desmapeado enquanto o RIP estiver dentro dele, a anonimização é executada a partir de uma página anônima temporária:
mmap)mm_start→mm_end) e os metadados dos segmentos para elamprotect).textPT_LOAD: mmap de uma nova região anônima → memcpy do conteúdo do segmento → munmap do original → mremap da cópia anônima de volta ao endereço original → mprotect para restaurar as permissões originais.text agora anônimo, desmapeia a página do trampolimO binário é um ELF estático sem interpretador, então o layout de VMA em tempo de execução é totalmente determinístico: três segmentos PT_LOAD, a pilha e o vDSO do kernel.
nasm -f elf64 darkcloak.asm -o darkcloak.o
ld darkcloak.o -o darkcloak
Os alvos de falsificação são definidos em tempo de compilação na seção .data. Os padrões personificam o sshd:
mimic_name db 'sshd', 0
mimic_argv db './sshd', 0
mimic_exe db '/usr/sbin/sshd', 0
mimic_cmdline db '/usr/sbin/sshd', 0, '-D', 0, '[email protected]', 0, ...
mimic_environ db 'LANG=en_US.UTF-8', 0, 'NOTIFY_SOCKET=/run/systemd/notify', 0, ...
Para personificar um processo diferente, atualize esses valores antes de compilar.
./darkcloak
Requer CAP_SYS_RESOURCE, CAP_SETUID, CAP_SETGID e CAP_SETPCAP no conjunto permitido. Se CAP_SYS_RESOURCE estiver ausente, o bloco de falsificação de MM (anonimização de VMA + troca de EXE_FILE) é totalmente ignorado. Se CAP_SETPCAP estiver ausente, a ferramenta recorre de PR_SET_SECUREBITS para PR_SET_KEEPCAPS.
./darkcloak &
PID=$!
cat /proc/$PID/comm
readlink /proc/$PID/exe
cat /proc/$PID/cmdline | tr '\0' ' '
cat /proc/$PID/environ | tr '\0' '\n' | head -3
cat /proc/$PID/maps | head -5
cat /proc/$PID/status | grep -E 'Uid|Gid|Cap'
ps aux | grep $PID
Publicado exclusivamente para fins educacionais e de pesquisa. Use apenas em sistemas que você possui ou para os quais tem autorização escrita explícita para testar.
/proc/$PID/memptrace(PTRACE_ATTACH)prctl(PR_SET_MM_ARG_START/END) → redireciona /proc/$PID/cmdlineprctl(PR_SET_MM_ENV_START/END) → redireciona /proc/$PID/environprctl(PR_SET_MM_EXE_FILE) → substitui mm_struct->exe_filePR_SET_SECUREBITS (se CAP_SETPCAP) ou PR_SET_KEEPCAPS (fallback) para sobreviver à queda de UIDsetresuid(1000,1000,1000) ou restaura os originaissetresgid(1000,1000,1000) ou restaura os originaisunshare(CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC)nanosleep(120s) e então exit