
Strumento Linux per l'occultamento dell'identità dei processi che falsifica comm, argv, cmdline, environ, percorso exe e VMA tramite una pipeline prctl a 11 fasi per impersonare un altro processo.
Occultamento dell'identità dei processi su Linux
DARKCLOAK concatena la manipolazione di tutte le sorgenti di identità visibili nello spazio utente in una pipeline sequenziale a 11 fasi che trasforma progressivamente un processo finché non diventa indistinguibile da quello impersonato per gli strumenti di monitoraggio dello spazio utente. Per quanto ne sappiamo, nessuno strumento pubblicato combina la manipolazione simultanea di tutte le sorgenti di identità visibili nello spazio utente.
Il resoconto tecnico completo è disponibile sul blog RAZOR.
task_struct->comm: tramite PR_SET_NAMEargv[0]: tramite sovrascrittura diretta dello stack/proc/$PID/cmdline): tramite PR_SET_MM_ARG_START/END/proc/$PID/environ): tramite PR_SET_MM_ENV_START/END/proc/$PID/exe): tramite PR_SET_MM_EXE_FILE/proc/$PID/maps): sostituite con memoria anonimaunshareLa pipeline viene eseguita in un ordine rigoroso definito dalle dipendenze tra i sottosistemi del kernel manipolati:
_start per risolvere la PHT e ottenere gli intervalli di indirizzi virtuali di tutti e tre i segmenti PT_LOADgetresuid / getresgid per memorizzare gli UID e GID originali per il successivo ripristinosetresuid(0,0,0) se uno dei tre UID è 0capget/capsetprctl(PR_SET_NAME) → sovrascrive task_struct->comm[rsp+8] → sovrascrive argv[0]prctl(PR_SET_DUMPABLE, 0) → blocca l'accesso a e da processi non privilegiatiPR_SET_MM_EXE_FILE fallisce con EBUSY finché una qualsiasi VMA è ancora supportata dal binario originale. Poiché il segmento .text non può essere smappato mentre RIP è al suo interno, l'anonimizzazione viene eseguita da una pagina anonima temporanea:
mmap)mm_start→mm_end) e i metadati dei segmenti al suo internomprotect).textPT_LOAD: mmap di una nuova regione anonima → memcpy del contenuto del segmento → munmap dell'originale → mremap della copia anonima all'indirizzo originale → mprotect per ripristinare i permessi originali.text ora anonimo, smappa la pagina trampolinoIl binario è un ELF statico senza interprete, quindi il layout delle VMA a runtime è completamente deterministico: tre segmenti PT_LOAD, lo stack e il vDSO del kernel.
nasm -f elf64 darkcloak.asm -o darkcloak.o
ld darkcloak.o -o darkcloak
Gli obiettivi della falsificazione sono definiti in fase di compilazione nella sezione .data. I valori predefiniti impersonano 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, ...
Per impersonare un processo diverso, aggiorna questi valori prima della compilazione.
./darkcloak
Richiede CAP_SYS_RESOURCE, CAP_SETUID, CAP_SETGID e CAP_SETPCAP nel set permesso. Se CAP_SYS_RESOURCE è assente, il blocco di falsificazione MM (anonimizzazione delle VMA + scambio EXE_FILE) viene saltato completamente. Se CAP_SETPCAP è assente, lo strumento passa da PR_SET_SECUREBITS a 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
Pubblicato esclusivamente per scopi educativi e di ricerca. Utilizzare solo su sistemi di propria proprietà o per i quali si dispone di esplicita autorizzazione scritta per i test.
/proc/$PID/memptrace(PTRACE_ATTACH)prctl(PR_SET_MM_ARG_START/END) → reindirizza /proc/$PID/cmdlineprctl(PR_SET_MM_ENV_START/END) → reindirizza /proc/$PID/environprctl(PR_SET_MM_EXE_FILE) → sostituisce mm_struct->exe_filePR_SET_SECUREBITS (se CAP_SETPCAP) o PR_SET_KEEPCAPS (fallback) per sopravvivere alla riduzione degli UIDsetresuid(1000,1000,1000) o ripristino degli originalisetresgid(1000,1000,1000) o ripristino degli originaliunshare(CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC)nanosleep(120s) poi exit