리눅스 정보실

리눅스 서버 해킹 당했을 때 pstree 명령어로 숨은 악성 프로세스 찾는 법

고지존 2025. 9. 5. 16:34

서버 관리자에게 시스템 해킹은 가장 긴급하고 중대한 위협입니다. 공격자는 침투 후 자신의 활동을 숨기기 위해 정상적인 시스템 프로세스인 것처럼 위장한 백도어나 악성 스크립트를 실행합니다. 이때 단순히 ps 명령어로 프로세스 목록만 확인해서는 이상 징후를 놓치기 쉽습니다.

이번 글에서는 리눅스의 강력한 진단 도구인 pstree를 활용하여 프로세스 간의 부모-자식 관계를 분석하고, 교묘하게 숨어있는 악성 프로세스를 효과적으로 탐지하는 실전 방법을 알아보겠습니다.

pstree란 무엇인가? 왜 ps보다 강력한가?

pstree는 이름 그대로 실행 중인 프로세스를 트리(Tree) 구조로 시각화하는 명령어입니다. 모든 프로세스의 시작점인 systemd(또는 init)부터 어떤 프로세스가 다른 프로세스를 파생시켰는지 한눈에 파악할 수 있습니다.

ps aux와 같은 명령어는 모든 프로세스를 평면적인 목록으로 보여주기 때문에 관계를 파악하기 어렵습니다. 하지만 pstree를 사용하면 정상적인 부모-자식 관계에서 벗어난 의심스러운 흐름을 직관적으로 찾아낼 수 있습니다. 예를 들어, 웹서버(httpd) 프로세스가 셸(/bin/bash)을 실행하는 것은 웹쉘 공격의 명백한 증거이며, pstree는 이런 구조를 즉시 드러내 줍니다.

핵심 사용법: 필수 옵션과 함께 사용하기

기본 명령어 pstree만으로도 유용하지만, 아래 옵션을 함께 사용하면 훨씬 더 많은 정보를 얻을 수 있습니다.

 

명령어 확인 결과 값

# 가장 추천하는 조합: PID(-p), 사용자(-u), 전체 인수(-a) 표시
pstree -pau
  • -p (PID): 각 프로세스의 고유 ID(Process ID)를 함께 표시합니다. 의심스러운 프로세스를 특정하여 kill 명령어로 종료할 때 필수입니다.
  • -u (User): 프로세스를 실행한 사용자 계정을 표시합니다. 특히 apachenginx 같은 시스템 계정이 소유하지 않아야 할 프로세스를 실행했다면 해킹을 의심할 수 있습니다.
  • -a (Arguments): 프로세스 실행 시 사용된 전체 명령행 인수를 보여줍니다. 이를 통해 정상적인 프로세스로 위장한 악성 스크립트의 실체를 파악할 수 있습니다.

실전 분석: 정상 상태 vs 해킹 상태 비교

아래는 정상적인 서버와 웹쉘에 감염된 서버의 pstree -u 출력 일부를 비교한 예시입니다.

1. 정상적인 웹서버 상태

sshd(2188)───sshd(3015)───bash(3020)───pstree(4510)
httpd(2380)─┬─httpd(2500,apache)
            ├─httpd(2501,apache)
            ├─httpd(2502,apache)
            └─httpd(2503,apache)

httpd 메인 프로세스가 apache 사용자로 여러 개의 자식 프로세스를 생성하여 웹 요청을 처리하는 정상적인 구조입니다.

2. 웹쉘에 감염된 비정상 상태

httpd(2380)─┬─httpd(2500,apache)
            ├─httpd(3110,apache)───sh(3112)───kworkerds(3115)
            ├─httpd(2502,apache)
            └─httpd(2503,apache)

위 예시에서는 httpd 프로세스(PID 3110)가 셸(sh)을 실행했고, 이 셸이 다시 kworkerds라는 의심스러운 프로세스를 실행했습니다. 이는 전형적인 웹쉘 공격 패턴으로, 공격자가 웹 취약점을 통해 서버에 명령을 내리고 악성코드(주로 암호화폐 채굴기)를 실행한 상황입니다. ps 명령어로는 kworkerds만 단독으로 보여 놓치기 쉽지만, pstree는 이 관계를 명확하게 보여줍니다.

해킹 대응을 위한 심층 점검 절차

pstree로 의심스러운 프로세스를 발견했다면, 다음 단계에 따라 즉시 대응해야 합니다.

  1. 프로세스 정보 상세 확인: lsof 또는 /proc 파일시스템을 이용해 프로세스가 사용 중인 파일과 네트워크 연결을 확인합니다.
    # PID로 열고 있는 파일과 네트워크 포트 확인
    lsof -p [의심스러운_프로세스_PID]
    
    # 어떤 파일이 실행되었는지 확인
    ls -l /proc/[의심스러운_프로세스_PID]/exe
    
  2. 네트워크 연결 분석: netstat 또는 ss 명령어로 외부와 통신하는 C2 서버(공격 서버) IP를 파악합니다.
    # PID와 함께 네트워크 연결 상태 확인
    netstat -antp | grep [의심스러운_프로세스_PID]
    
  3. 악성 프로세스 즉시 차단: kill 명령어로 악성 프로세스를 종료합니다. 관련 부모 프로세스까지 함께 종료하여 재실행을 막는 것이 중요합니다.
    # 먼저 정상 종료 시도
    kill [의심스러운_프로세스_PID]
    
    # 말을 듣지 않으면 강제 종료
    kill -9 [의심스러운_프로세스_PID]
    
  4. 공격 소스 추적 및 제거: 웹쉘이라면 웹 루트 디렉토리에서 최근 변경된 .php, .jsp 파일을 찾고, cron에 등록된 악성 작업이 있는지 확인하여 원인을 제거합니다.

예방이 최선: 근본적인 보안 강화 조치

사후 대응도 중요하지만, 예방은 더 중요합니다. 아래 보안 수칙을 반드시 적용하세요.

  • 최소 권한 원칙: 웹서버 데몬 등 서비스 계정의 셸 로그인을 비활성화하세요 (/sbin/nologin).
  • SSH 보안 강화: 비밀번호 기반 로그인을 비활성화하고 SSH 공개키 인증 방식을 사용하세요. 포트 번호 변경도 도움이 됩니다.
  • 지속적인 패치 관리: 운영체제와 웹 애플리케이션(워드프레스, 제로보드 등)의 보안 패치를 항상 최신 상태로 유지하세요.
  • 자동화된 침입 방지: Fail2ban, ModSecurity와 같은 도구를 설치하여 무차별 대입 공격 및 웹 공격을 실시간으로 차단하세요.
  • 보안 모듈 활성화: 가능하면 SELinuxAppArmor 같은 커널 보안 모듈을 활성화하여 시스템을 더 안전하게 보호하세요.

공격자는 항상 시스템의 약한 고리를 노립니다. pstree는 단순한 명령어처럼 보이지만, 프로세스의 관계를 분석하여 공격의 흐름을 파악하는 강력한 첫걸음입니다. 이 도구를 정기적으로 사용하여 서버의 상태를 점검하는 습관을 들인다면, 해킹 사고의 피해를 최소화하고 서버를 더욱 안전하게 운영할 수 있을 것입니다.