14일차 — ProcWatch를 만들었습니다: 포렌식 및 인시던트 대응을 위한 Linux 프로세스 보안 스캐너

발행: (2026년 3월 1일 오후 03:17 GMT+9)
10 분 소요
원문: Dev.to

Source: Dev.to

(위 링크에 있는 전체 텍스트를 제공해 주시면, 해당 내용을 한국어로 번역해 드리겠습니다.)

이 도구가 필요해진 순간

리눅스 포렌식 CTF를 풀어본 적이 있다면, 그 의식을 알고 있을 겁니다:

  1. 머신에 SSH 접속

  2. 모든 것이 정상으로 보인다

  3. 그리고 다음을 발견합니다:

    • CPU 사용량이 이상하게 느껴진다
    • 네트워크 트래픽이 있다
    • 로그가 맞지 않는다

그래서 고대 의식을 시작합니다:

ps aux | grep -v grep
netstat -tulnp
ls -la /tmp
cat /proc/<pid>/cmdline

스크롤하고, 추측하고, 명령을 다시 실행합니다. 200개가 넘는 프로세스 중 어딘가에 리버스 쉘, 드롭퍼, 혹은 암호화 채굴기가 숨어 있을 수… 그리고 여러분은 수동으로 **“워디 찾기: 인시던트 대응 버전”**을 하고 있는 겁니다.

/dev/shm에 숨은 쉘을 찾느라 40분을 허비한 한 챌린지를 겪고 나서, 나는 깨달았습니다:

나는 사이버 보안 문제를 해결하고 있던 것이 아니다.
나는 가시성 문제를 해결하고 있었다.

그래서 도구를 만들었습니다. 그 도구가 바로 ProcWatch가 되었습니다.

ProcWatch가 실제로 무엇인지

ProcWatch는 Python‑based process‑behavior scanner입니다.

  • 아님 antivirus.
  • 아님 signature detection.

다른 질문을 합니다:

이 시스템의 어떤 프로세스가 공격자와 같이 행동하고 있나요?

The Threat Model

Before writing detections, I mapped how attackers typically behave after gaining Linux access:

StageWhat attackers do
FootholdDrop binaries in /tmp or /dev/shm
ControlSpawn reverse shells
EscalationAbuse SUID or LD_PRELOAD
PersistenceRun scripts via interpreters
MonetizationInstall crypto miners
EvasionDelete binaries after execution

위협 모델

탐지를 작성하기 전에, 공격자가 Linux 접근 권한을 얻은 후 일반적으로 어떻게 행동하는지 매핑했습니다:

단계공격자가 수행하는 작업
Foothold/tmp 또는 /dev/shm에 바이너리 배치
Control역방향 쉘 생성
EscalationSUID 또는 LD_PRELOAD 악용
Persistence인터프리터를 통해 스크립트 실행
Monetization암호화폐 채굴기 설치
Evasion실행 후 바이너리 삭제

Detection 1 — Executable from Writable Directories (CRITICAL)

SUSPICIOUS_LOCATIONS = [
    "/tmp",
    "/dev/shm",
    "/var/tmp",
    "/run/user",
    "/dev/mqueue",
]

악성코드는 쓰기 가능한 디렉터리를 좋아합니다. 그 이유는:

  • 권한이 필요 없으며
  • 거의 모니터링되지 않고
  • 정리하기 쉽기 때문입니다

/dev/shm 은 특히 흥미롭습니다. RAM 기반 저장소라서 시스템을 재부팅하면 증거가 사라집니다. 정상적인 소프트웨어가 여기서 실행되는 경우는 거의 없습니다.

If you see:

/dev/shm/hidden_binary

당신이 찾은 것은 프로그램이 아니라 공격자입니다.

탐지 2 — 의심스러운 인터프리터 사용

SUSPICIOUS_NAMES = ["bash", "sh", "nc", "python", "perl", "ruby", "socat"]

그 자체로는 별 의미가 없지만, 위치나 네트워크 활동과 결합되면 강력해집니다.

  • python3 프로세스는 정상입니다.
  • /tmp에 있는 python3 프로세스가 포트 4444에 연결된 경우는 정상적이지 않습니다.

이는 living‑off‑the‑land라 부르며, 공격자는 정식 도구를 사용해 악성코드를 업로드할 필요가 없습니다.

Detection 3 — 권한 상승 지표

if uids.real != uids.effective:
    # SUID privilege escalation in action

Linux 프로세스는 real UIDeffective UID를 가지고 있습니다. 두 값이 다르면 권한 상승 이벤트를 포착한 것입니다.

더욱 의심스러운 경우:

root process running from /home/user

루트 프로세스는 /usr/bin에 있어야 하며, 사용자의 다운로드 폴더에 있어서는 안 됩니다.

탐지 4 — 역쉘 및 C2 탐지

SUSPICIOUS_PORTS = [4444, 5555, 7777, 31337]

이 포트들은 역쉘 및 C2 리스너에서 클래식하게 사용됩니다.

ProcWatch는 다음을 구분합니다:

  • LISTEN → 의심스러움
  • ESTABLISHED outbound connection → 거의 확실한 침해

포트 4444로 외부에 연결하는 프로세스는 기본적으로 “다른 누군가가 나를 제어하고 있다.” 라는 깃발을 흔드는 것과 같습니다.

Detection 5 — 암호화폐 채굴기 탐지

키워드 탐지

MINER_KEYWORDS = ["xmrig", "monero", "stratum", "pool"]

행동 기반 탐지

if cpu_usage > 85:   # percent
    # possible miner

Why this matters: modern attackers often 시스템을 파괴하지; they monetize them. Many real breaches are discovered because servers suddenly run at 100 % CPU 24/7.

Detection 6 — 삭제된 실행 파일 트릭

공격자는 보통:

  1. 악성 코드를 실행한다
  2. 파일을 삭제한다

Linux는 메모리에서 프로세스를 계속 유지하므로, 파일은 디스크에서 사라지지만 실행은 계속된다.

Kernel hint:

/proc/<pid>/exe -> binary (deleted)

ProcWatch는 바로 이 상황을 감지한다. 바이너리를 복구할 수도 있다:

cp /proc/<pid>/exe recovered_binary

이는 실제 포렌식 기법이다.

탐지 7 — LD_PRELOAD 인젝션 (고급)

LD_PRELOAD=/tmp/libevil.so

전체 바이너리를 배포하는 대신, 공격자는 시스템 콜을 가로채는 악성 라이브러리를 로드합니다.

  • 파일 숨기기
  • 비밀번호 탈취
  • 인증 위조

이는 많은 사용자 공간 루트킷이 동작하는 방식입니다. 이를 탐지하면 거의 항상 침해가 확인된 것으로 간주됩니다.

CLI

이 도구는 git처럼 느껴지도록 설계했습니다:

procwatch scan          # one‑time scan
procwatch scan -v -j   # verbose JSON output
procwatch watch         # live monitoring
procwatch info          # details about a process
procwatch list          # list all tracked processes

가장 유용한 모드

procwatch watch

새로운 의심스러운 프로세스가 나타날 때만 알림을 보내며, 공격자 활동을 실시간 피드로 제공합니다. 실제 SOC 모니터링 콘솔과 놀라울 정도로 가깝게 느껴집니다.

이것이 CTF에서 도움이 되는 이유

로그인 직후:

procwatch scan -j

이제 시스템 프로세스 상태의 타임스탬프가 포함된 스냅샷을 얻을 수 있어, 악성 프로세스를 몇 분이 아니라 몇 초 만에 찾아낼 수 있습니다.

200개의 프로세스를 조사하시나요? 3개만 보면 됩니다

45분짜리 과제가 5분으로 바뀝니다.

제한 사항

  • 이 도구는 /proc을 통해 사용자 공간에서 작동하므로 커널 루트킷을 탐지할 수 없습니다. 커널 자체가 거짓말을 하면 ProcWatch는 이를 믿게 됩니다.
  • 일부 인터프리터 경고는 오탐일 수 있습니다.
  • 컨테이너는 네임스페이스를 통해 프로세스를 숨깁니다.

앞으로 고려 중인 업그레이드

  • YARA 메모리 스캔
  • eBPF 시스템 콜 모니터링
  • ptrace 탐지

실행하기

pip install psutil
sudo python3 procwatch.py scan -v

스크린샷

ProcWatch 스크린샷 1

ProcWatch 스크린샷 2

(루트는 환경 변수와 연결에 대한 전체 가시성을 제공합니다.)

내가 배운 것

나는 이것을 CTF 워크플로우를 자동화하기 위해 시작했다. 대신 중요한 것을 배웠다:

  • 공격자는 파일을 숨기지 않는다.
  • 그들은 정상 프로세스 안에 행동을 숨긴다.

행동은 훨씬 위조하기 어렵다.

ProcWatch는 조사를 대체하지 않는다—단지 시작해야 할 곳을 직접 비추는 손전등과 같다.

0 조회
Back to Blog

관련 글

더 보기 »