
Linux 프로세스 신원 위장 도구로, 11단계 prctl 파이프라인을 통해 comm, argv, cmdline, environ, exe 경로, VMA를 스푸핑하여 다른 프로세스로 위장합니다.
Linux 프로세스 신원 은폐
DARKCLOAK은 사용자 공간에서 보이는 모든 신원 소스에 대한 조작을 11단계 순차 파이프라인으로 연결하여, 프로세스가 사용자 공간 모니터링 도구에 대해 가장된 프로세스와 구별할 수 없게 될 때까지 점진적으로 변환합니다. 우리가 아는 한, 사용자 공간에서 보이는 모든 신원 소스를 동시에 조작하는 것을 결합한 공개된 도구는 없습니다.
전체 기술 문서는 RAZOR 블로그에서 확인할 수 있습니다.
task_struct->comm: PR_SET_NAME을 통해argv[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_LOAD 세그먼트 모두의 가상 주소 범위를 얻습니다getresuid / getresgid로 원래 UID와 GID를 저장하여 나중에 복원합니다setresuid(0,0,0)capget/capset을 통해 허용 집합을 유효 및 상속 집합으로 복사합니다prctl(PR_SET_NAME) → task_struct->comm 덮어쓰기[rsp+8]에서 스택 직접 쓰기 → argv[0] 덮어쓰기prctl(PR_SET_DUMPABLE, 0) → 비특권 프로세스의 /proc/$PID/mem 접근 및 차단PR_SET_MM_EXE_FILE은 VMA가 원본 바이너리에 의해 여전히 백업되어 있는 동안 EBUSY로 실패합니다. RIP가 .text 세그먼트 내부에 있는 동안에는 해당 세그먼트를 언맵할 수 없으므로, 익명화는 임시 익명 페이지에서 실행됩니다:
mmap)mm_start→mm_end)와 세그먼트 메타데이터를 해당 페이지에 복사mprotect).text를 떠남PT_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
교육 및 연구 목적으로만 공개되었습니다. 소유하고 있거나 테스트에 대한 명시적 서면 승인을 받은 시스템에서만 사용하십시오.
ptrace(PTRACE_ATTACH)prctl(PR_SET_MM_ARG_START/END) → /proc/$PID/cmdline 리다이렉트prctl(PR_SET_MM_ENV_START/END) → /proc/$PID/environ 리다이렉트prctl(PR_SET_MM_EXE_FILE) → mm_struct->exe_file 대체PR_SET_SECUREBITS(CAP_SETPCAP이 있는 경우) 또는 PR_SET_KEEPCAPS(대체)setresuid(1000,1000,1000) 또는 원래 값 복원setresgid(1000,1000,1000) 또는 원래 값 복원unshare(CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC)nanosleep(120s) 후 exit