
Linux 지속성 탐지, 헌팅 및 아티팩트 수집 스크립트
persisthunt.sh는 Linux 지속성 기술과 일반적으로 연관된 표적화된 지속성 관련 아티팩트를 수집하고 의심스러운 패턴을 강조하여 조사 속도를 높이는 데 도움을 줍니다.
이 스크립트는 잘 알려진 Linux 지속성 메커니즘 전반에 걸쳐 지속성 탐지, 위협 헌팅 및 아티팩트 수집을 지원합니다. 발견 사항은 신뢰도와 심각도에 따라 세 가지 수준 - High, Low, Informational로 분류됩니다. 예를 들어 /tmp/, /home/, /dev/tcp, curl을 참조하는 의심스러운 자동 실행 항목이나 활성 바인드/리버스 셸 탐지가 포함됩니다.
이 도구는 방어자가 탐지 로직과 키워드를 추가하거나 제거하여 자신의 환경에 맞게 사용자 정의할 수 있는 유연한 기반으로 설계되었습니다. 출력이 클 수 있고 환경별 분석이 필요할 수 있지만, LLM 또는 AI 에이전트를 사용한 검토 및 요약에도 적합합니다.
루트 사용자로 실행하고 출력을 파일로 리디렉션합니다
sudo persisthunt.sh > output.log
SSH를 통해 원격 호스트에서 실행합니다
ssh [email protected] 'bash -s' < persisthunt.sh > output.log 2>&1
=== [HIGH] Active reverse shell ===
bob 3889906 0.0 0.0 2800 1848 pts/2 S+ 06:38 0:00 sh -i
=== [HIGH] Active bind shell ===
LISTEN 0 1 0.0.0.0:4444 0.0.0.0:* users:(("python3",pid=3891687,fd=3))
bob 3891687 0.7 0.3 19540 12320 pts/3 S+ 06:41 0:00 python3 -c exec("""import socket as s,subprocess as sp;s1=s.socket(s.AF_INET,s.SOCK_STREAM);s1.setsockopt(s.SOL_SOCKET,s.SO_REUSEADDR, 1);s1.bind(("0.0.0.0",4444));s1.listen(1);c,a=s1.accept(); while True: d=c.recv(1024).decode();p=sp.Popen(d,shell=True,stdout=sp.PIPE,stderr=sp.PIPE,stdin=sp.PIPE);c.sendall(p.stdout.read()+p.stderr.read())""")
=== [HIGH] eBPF programs with raw network sockets (possible BPFdoor persistence) ===
PID: 3903559, Executable: bpfdoorpoc, Stack trace: /proc/3903559/stack:[<0>] packet_recvmsg+0x6e/0x5c0
=== [LOW] Recent ELF binary in tmp/home/hidden dirs ===
/var/tmp/.test
| 신뢰도 | 기법 | 설명 |
|---|
| High | AT 작업 지속성 | 합법적인 'at' 작업은 드물며, /var/spool/at의 예상치 못한 항목은 매우 의심스럽습니다. |
| High | 의심스러운 키워드를 참조하는 Cron 항목 | curl/wget/nc/ncat/socat 또는 /tmp, /var/tmp, /dev/shm, /home 같은 경로나 숨김 파일을 참조하는 Cron 파일. |
| High | 활성 바인드 셸 | 네트워크 소켓에서 수신 대기 중인 인터프리터 프로세스(bash/sh/zsh/dash/ksh/python*/perl/nc/ncat/socat)를 탐지합니다(바인드 셸). |
| High | 활성 리버스 셸 | stdin과 stdout이 소켓으로 리디렉션되어 리버스 셸을 나타내는 프로세스를 탐지합니다. |
| High | eBPF raw 네트워크 소켓을 사용한 지속성 | BPFdoor와 같은 루트킷은 지속적인 백도어를 위해 raw 네트워크 소켓을 사용하는 eBPF 프로그램을 활용합니다. 더 읽기 |
| High | 의심스러운 키워드를 참조하는 Systemd 서비스/타이머 | systemd 경로(~/.config/systemd/user/ 아래의 사용자 유닛 포함)에서 .service 및 .timer 파일을 검색하여 의심스러운 키워드를 찾습니다. |
| High | 의심스러운 키워드를 참조하는 Init/rc.local/profile 스크립트 | 지속성 경로에서 의심스러운 키워드나 네트워크/도구를 참조하는 Init 스크립트 및 rc.local/profile 파일. |
| High | 의심스러운 키워드를 참조하는 MOTD 스크립트 | 의심스러운 키워드나 지속성 도구를 참조하는 MOTD 스크립트. |
| High | 의심스러운 키워드를 참조하는 셸 프로파일 | 의심스러운 명령이나 경로를 포함하는 셸 프로파일(/etc/profile, /etc/profile.d, ~/.bashrc, ~/.profile 등). |
| High | 의심스러운 키워드를 참조하는 D-BUS 서비스 파일 | */dbus-1/* 경로에서 발견된 의심스러운 키워드를 참조하는 D-BUS 서비스 파일 |
| High | 의심스러운 키워드를 참조하는 NetworkManager 디스패처 스크립트 | */NetworkManager/dispatcher.d/* 경로에서 발견된 의심스러운 키워드를 참조하는 NetworkManager 디스패처 스크립트 |
| High | tmp/home/숨김 디렉터리의 숨겨진 ELF 실행 파일 | /tmp, /var/tmp, /home, /dev/shm에서 점(.)으로 시작하는 이름을 가진 숨겨진 dotfile 중 ELF 실행 파일인 것. |
| High | 실행 중인 프로세스 | 의심스러운 키워드를 참조하는 실행 중인 프로세스 |
| High | SUID/SGID/전체 쓰기 가능 ELF 바이너리 | SUID 또는 SGID 비트가 설정된 전체 쓰기 가능 파일 중 ELF 바이너리인 것(잠재적 권한 상승/백도어). |
| High | /proc에서 탐지된 숨겨진 프로세스(루트킷 가능성) | /proc PID를 열거하고 ps 출력과 비교하여 루트킷(예: Diamorphine)이 숨긴 프로세스를 찾습니다. 공격자가 PID를 숨기기 위해 ps를 백도어하는 방법에 대한 참고 사항도 포함합니다. |
| High | 바인드 마운트 트릭을 사용한 숨겨진 프로세스 | /proc/ 위에 바인드되는 마운트(예: mount -o bind mydir /proc/1234)를 탐지합니다. 이는 ps에서 프로세스 항목을 숨길 수 있습니다. |
| High | 시스템 전체에 구성된 LD_PRELOAD | 루트킷이 지속성을 위해 악용할 수 있는 /etc/ld.so.preload의 존재 또는 수정. |
| Low | capabilities가 설정된 파일 | POSIX capabilities가 설정된 시스템의 파일(getcap 기준) — 신뢰도가 낮은 지표이지만 확인할 가치가 있음. |
| Low | tmp/home/숨김 디렉터리의 최근 ELF 바이너리 | /tmp, /var/tmp, /dev/shm, /home에서 최근(7일 이내) 수정되거나 생성된 실행 가능한 ELF 바이너리 — 신뢰도가 낮은 지표. |
| Low | Git config 또는 hooks 파일 | 지속성을 위해 악용될 수 있는 샘플이 아닌 git config 또는 hooks 파일(예: .git/config 또는 .git/hooks/*). |
| Low | APT Hooks | APT Hooks는 지속성을 위해 악용될 수 있습니다. |
| Low | Yum/DNF 플러그인 | 의심스러운 키워드를 참조하는 Yum/DNF 플러그인 |
| Low | 의심스러운 콘텐츠가 포함된 .pth 파일(Python 지속성) | Python 모듈 가져오기 시 실행되는 import, os.system, exec()와 같은 실행된 임포트 또는 호출을 포함하는 .pth 파일. |
| Low | udev 규칙 | RUN 키가 있는 Udev 규칙(지속성 가능성) |
| Low | PAM 모듈 | 지속성을 위해 악용될 수 있는 pam_exec를 참조하는 PAM 모듈 |
| Low | 시스템 바이너리 하이재킹 | /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin/에서 최근 수정된 바이너리 파일 |
| Informational | 모든 cron 항목(수동 검토) | 수동 검토를 위해 모든 cron 관련 파일과 해당 (주석이 아닌) 내용을 출력합니다. |
| Informational | 모든 셸 프로파일(수동 검토) | 수동 검사를 위해 모든 시스템 및 사용자 셸 프로파일 파일의 내용을 출력합니다. |
| Informational | 모든 init.d 및 rc.local 스크립트(수동 검토) | 수동 검사를 위해 init.d 및 rc.local 스크립트를 출력합니다. |
| Informational | 모든 MOTD 파일(수동 검토) | 수동 검토를 위해 MOTD 및 update-motd.d 스크립트/파일을 출력합니다. |
| Informational | 최근(7일) ELF 바이너리(수동 검토) | 수동 검토를 위해 최근 실행 가능한 ELF 파일(7일)을 나열합니다. |
| Informational | 홈 디렉터리의 모든 dotfile 나열(수동 검토) | 수동 검토를 위해 사용자 홈 디렉터리의 dotfile을 열거합니다. |
| Informational | 홈 디렉터리의 SSH authorized keys(수동 검토) | 수동 검사를 위해 /root 및 /home에서 비어 있지 않은 authorized_keys 파일을 출력합니다. |
| Informational | 로컬 사용자 및 그룹(수동 검토) | 수동 검토를 위해 getent를 통해 로컬 사용자 및 그룹을 나열합니다. |
| Informational | 마운트(수동 검토) | 수동 검사를 위해 현재 마운트를 출력합니다. |
| Informational | 활성 네트워크 연결(수동 검토) | 수동 검토를 위해 활성 네트워크 연결(ss -tunap)을 표시합니다. |
| Informational | Systemd 서비스(수동 검토) | 실행 중인 systemd 서비스(systemctl list-units --type=service --state=running)를 나열합니다. |
| Informational | D-BUS 서비스 파일(수동 검토) | 검토를 위해 dbus-1 디렉터리에서 D-BUS 서비스 파일을 찾습니다. |
| Informational | NetworkManager 디스패처 스크립트 | NetworkManager-dispatcher는 네트워크 변경 시 스크립트를 실행합니다. 잠재적 지속성을 위해 NetworkManager 아래의 dispatcher.d 실행 스크립트를 확인하세요. |
| Informational | 컨테이너 이미지 및 실행 중인 컨테이너 | Docker, Podman 및 Containerd로 모든 컨테이너 이미지와 실행 중인 컨테이너를 나열합니다. |
| Informational | 설치된 패키지 | dpkg/rpm/dnf로 설치된 모든 패키지를 나열합니다. |
| Informational | 로드된 커널 모듈 | 로드된 모든 커널 모듈을 나열합니다. |