LabHub
배우기 러닝패스 코스

cron 이 새벽 세 시에 curl 을 했다 · 남는 자리와 남지 않는 자리 · 실습

남는 자리와 남지 않는 자리를 가른다

LabHub 에서 이어서 보기

이 실습은 VM 에서 돕니다

우분투 24.04 VM 한 대입니다. root 이고 커널 권한이 있어서 감사 규칙을 실제로
올릴 수 있습니다. 실습 파드에는 capability 가 하나도 없어 auditctl 이 아예
동작하지 않기 때문에 이 실습만 VM 으로 돕니다. 처음 뜨는 데 1~2분 걸립니다.

목표

커널 감사 규칙을 직접 걸고, 사건을 일부러 일으키고, 그 기록을 꺼내 읽습니다.
같은 사건을 저널 쪽에서 다시 찾아 두 기록이 무엇을 각각 갖고 있는지 보고,
마지막으로 감시하지 않는 자리를 찾아 그것을 덮습니다.

왜 중요한가

탐지 규칙을 쓰기 전에 답해야 하는 질문이 있습니다 — 그 사건이 애초에 어딘가에
기록되는가. 리눅스에서 커널 감사는 기본으로 거의 아무것도 남기지 않습니다.
규칙을 걸어 둔 경로와 시스콜만 봅니다. 그래서 "로그를 다 모으고 있는데 답이
없다" 는 상황이 생깁니다.

여기서 배우는 것은 명령어가 아니라 범위 감각입니다. 내 규칙이 무엇을 보고
무엇을 안 보는지 말할 수 있으면, 사건이 났을 때 "기록이 없다" 와 "그 자리를 안
보고 있었다" 를 구별할 수 있습니다. 이 둘은 전혀 다른 처방으로 이어집니다.

단계

1. auditctl -s 와 서비스 상태를 /root/det/01-status.txt 에 저장하세요.
2. /etc/cron.d 를 쓰기·속성 변경에 대해 감시하는 규칙을 키 cron_change/etc/audit/rules.d/labhub.rules 에 적고 커널에 올리세요.
3. 64비트 execve 중 실행 파일이 /usr/bin/curl 인 것만 잡는 규칙을 키 outbound_exec 로 같은 파일에 더하고 올리세요.
4. /etc/cron.d/nightly-report 를 만들어 curl 을 부르게 하고, curl 을 손으로 한 번 실행한 뒤 무엇을 했는지 /root/det/04-trigger.txt 에 적으세요.
5. ausearch -k outbound_exec -i 의 마지막 사건을 /root/det/05-evidence.txt 에 저장하고 그 아래에 pid=·exe=·key= 세 값을 적으세요.
6. 저널에서 cron 의 실행 기록을 JSON 으로 뽑아 /root/det/06-cron.json 에 저장하세요. 이 VM 에서 매분 도는 작업(labhub-metrics)의 실행 줄이 들어 있어야 합니다.
7. /usr/local/bin/labhub-helper.sh 를 만들어 실행 비트를 주고, cron_change 키로는 그 기록이 남지 않는다는 것을 확인해 /root/det/07-blindspot.txt 에 명령·결과·이유를 적으세요.
8. /usr/local/bin 을 키 persistence 로 감시하는 규칙을 더해 올리고, 파일을 한 번 더 고쳐 기록이 남는 것을 /root/det/08-closed.txt 에 확인하세요.
9. 이 호스트의 탐지 범위를 /root/det/09-report.md## 무엇이 남는가·## 무엇이 남지 않는가·## 규칙 목록·## 다음에 할 일 네 절로 쓰세요.

참고

단계 9개

  1. 무엇이 켜져 있는지
  2. 예약 작업 디렉터리를 감시한다
  3. 무엇이 실행됐는가
  4. 사건을 일으킨다
  5. 기록을 꺼내 읽는다
  6. 같은 사건을 저널에서
  7. 감시하지 않는 자리
  8. 빈 자리를 덮는다
  9. 탐지 범위를 문서로