
Herramienta de ocultación de identidad de procesos de Linux que falsifica comm, argv, cmdline, environ, ruta de exe y VMAs mediante un pipeline prctl de 11 fases para suplantar a otro proceso.
Ocultación de la identidad de procesos en Linux
DARKCLOAK encadena la manipulación de todas las fuentes de identidad visibles desde el espacio de usuario en un pipeline secuencial de 11 fases que transforma progresivamente un proceso hasta que se vuelve indistinguible del proceso suplantado para las herramientas de monitoreo del espacio de usuario. Hasta donde sabemos, ninguna herramienta publicada combina la manipulación simultánea de todas las fuentes de identidad visibles desde el espacio de usuario.
El análisis técnico completo está disponible en el blog de RAZOR.
task_struct->comm: mediante PR_SET_NAMEargv[0]: mediante sobrescritura directa de la pila/proc/$PID/cmdline): mediante PR_SET_MM_ARG_START/END/proc/$PID/environ): mediante PR_SET_MM_ENV_START/END/proc/$PID/exe): mediante PR_SET_MM_EXE_FILE/proc/$PID/maps): reemplazadas por memoria anónimaunshareEl pipeline se ejecuta en un orden estricto definido por las dependencias entre los subsistemas del kernel que se manipulan:
_start para resolver el PHT y obtener los rangos de direcciones virtuales de los tres segmentos PT_LOADgetresuid / getresgid para almacenar los UIDs y GIDs originales para su posterior restauraciónsetresuid(0,0,0) si alguno de los tres UIDs es 0capget/capsetprctl(PR_SET_NAME) → sobrescribe task_struct->comm[rsp+8] → sobrescribe argv[0]prctl(PR_SET_DUMPABLE, 0) → bloquea el acceso a y desde procesos sin privilegiosPR_SET_MM_EXE_FILE falla con EBUSY mientras alguna VMA siga respaldada por el binario original. Dado que el segmento .text no se puede desmapear mientras RIP esté dentro de él, la anonimización se ejecuta desde una página anónima temporal:
mmap)mm_start→mm_end) y los metadatos de los segmentos en ellamprotect).textPT_LOAD: mmap una nueva región anónima → memcpy del contenido del segmento → munmap del original → mremap de la copia anónima de vuelta a la dirección original → mprotect para restaurar los permisos originales.text ahora anónimo, desmapear la página del trampolínEl binario es un ELF estático sin intérprete, por lo que el diseño de VMA en tiempo de ejecución es totalmente determinista: tres segmentos PT_LOAD, la pila y el vDSO del kernel.
nasm -f elf64 darkcloak.asm -o darkcloak.o
ld darkcloak.o -o darkcloak
Los objetivos de suplantación se definen en tiempo de compilación en la sección .data. Los valores predeterminados suplantan a 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 suplantar un proceso diferente, actualice estos valores antes de compilar.
./darkcloak
Requiere CAP_SYS_RESOURCE, CAP_SETUID, CAP_SETGID y CAP_SETPCAP en el conjunto permitido. Si CAP_SYS_RESOURCE no está presente, el bloque de suplantación de MM (anonimización de VMA + intercambio de EXE_FILE) se omite por completo. Si CAP_SETPCAP no está presente, la herramienta recurre a PR_SET_KEEPCAPS en lugar de PR_SET_SECUREBITS.
./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 con fines educativos y de investigación. Úselo solo en sistemas de su propiedad o para los que tenga autorización escrita explícita para realizar pruebas.
/proc/$PID/memptrace(PTRACE_ATTACH)prctl(PR_SET_MM_ARG_START/END) → redirige /proc/$PID/cmdlineprctl(PR_SET_MM_ENV_START/END) → redirige /proc/$PID/environprctl(PR_SET_MM_EXE_FILE) → reemplaza mm_struct->exe_filePR_SET_SECUREBITS (si CAP_SETPCAP) o PR_SET_KEEPCAPS (alternativa) para sobrevivir a la caída de UIDsetresuid(1000,1000,1000) o restaurar los originalessetresgid(1000,1000,1000) o restaurar los originalesunshare(CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC)nanosleep(120s) y luego exit