
Инструмент для маскировки идентичности процессов Linux, который подменяет comm, argv, cmdline, environ, путь exe и VMA с помощью 11-фазного конвейера prctl, чтобы выдать себя за другой процесс.
Маскировка идентичности Linux-процесса
DARKCLOAK объединяет манипуляции всеми видимыми из пространства пользователя источниками идентичности в последовательный конвейер из 11 фаз, который постепенно преобразует процесс, пока он не станет неотличим от выдаваемого за него процесса для инструментов мониторинга пространства пользователя. Насколько нам известно, ни один опубликованный инструмент не сочетает одновременную манипуляцию всеми видимыми из пространства пользователя источниками идентичности.
Полное техническое описание доступно в блоге RAZOR.
task_struct->comm: через PR_SET_NAMEargv[0]: через прямую перезапись стека/proc/$PID/cmdline): через PR_SET_MM_ARG_START/END/proc/$PID/environ): через PR_SET_MM_ENV_START/END/proc/$PID/exe): через PR_SET_MM_EXE_FILE/proc/$PID/maps): заменяются анонимной памятьюunshareКонвейер выполняется в строгом порядке, определяемом зависимостями между манипулируемыми подсистемами ядра:
_start, чтобы разрешить PHT и получить диапазоны виртуальных адресов всех трёх сегментов PT_LOADgetresuid / getresgid для сохранения исходных UID и GID для последующего восстановленияsetresuid(0,0,0), если любой из трёх UID равен 0capget/capsetprctl(PR_SET_NAME) → перезаписывает task_struct->comm[rsp+8] → перезаписывает argv[0]prctl(PR_SET_DUMPABLE, 0) → блокирует доступ к и из непривилегированных процессовPR_SET_MM_EXE_FILE завершается с ошибкой EBUSY, пока какой-либо VMA всё ещё привязан к исходному бинарнику. Поскольку сегмент .text нельзя отобразить обратно, пока RIP находится внутри него, анонимизация выполняется из временной анонимной страницы:
mmap)mm_start→mm_end) и метаданные сегментовmprotect).textPT_LOAD: mmap свежего анонимного региона → memcpy содержимого сегмента → munmap оригинала → mremap анонимной копии обратно на исходный адрес → mprotect для восстановления исходных прав.text, отобразить обратно страницу трамплинаБинарник — это статический ELF без интерпретатора, поэтому расположение VMA во время выполнения полностью детерминировано: три сегмента PT_LOAD, стек и vDSO ядра.
nasm -f elf64 darkcloak.asm -o darkcloak.o
ld darkcloak.o -o darkcloak
Цели маскировки определяются во время компиляции в секции .data. По умолчанию выдаётся за 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, ...
Чтобы выдать себя за другой процесс, обновите эти значения перед сборкой.
./darkcloak
Требует CAP_SYS_RESOURCE, CAP_SETUID, CAP_SETGID и CAP_SETPCAP в разрешённом наборе. Если CAP_SYS_RESOURCE отсутствует, блок подмены MM (анонимизация VMA + замена EXE_FILE) полностью пропускается. Если CAP_SETPCAP отсутствует, инструмент переключается с PR_SET_SECUREBITS на 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
Опубликовано исключительно в образовательных и исследовательских целях. Используйте только на системах, которыми вы владеете или на тестирование которых у вас есть явное письменное разрешение.
/proc/$PID/memptrace(PTRACE_ATTACH)prctl(PR_SET_MM_ARG_START/END) → перенаправляет /proc/$PID/cmdlineprctl(PR_SET_MM_ENV_START/END) → перенаправляет /proc/$PID/environprctl(PR_SET_MM_EXE_FILE) → заменяет mm_struct->exe_filePR_SET_SECUREBITS (если есть CAP_SETPCAP) или PR_SET_KEEPCAPS (запасной вариант), чтобы пережить понижение UIDsetresuid(1000,1000,1000) или восстановление исходных значенийsetresgid(1000,1000,1000) или восстановление исходных значенийunshare(CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC)nanosleep(120s), затем exit