Step 127. 후속 침투(Post-Exploitation) 체크리스트 — 쉘 다음의 시작

Step 127. 후속 침투(Post-Exploitation) 체크리스트 — 쉘 다음의 시작

Level 2 — 보안 입문과 공격 스킬 기초 | 난이도 ★★★☆☆ | 예상 소요 시간 2시간 30분

전제: Step 125의 수동 정찰, Step 126의 linPEAS까지 마쳤다. 개념 챕터 — 새 명령 실습은 최소이고, 지금까지의 명령을 "목록"으로 엮는 것이 본편입니다.

  • 준비물: 여러분의 위키(Step 89에서 만든 개인 문서), 그리고 Step 125~126의 정찰 메모. 오늘의 산출물은 코드가 아니라 문서 한 부입니다.
  • ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다.

쉘을 얻는 순간이 끝이 아니라 시작입니다 — 이 말은 이제 귀에 익었을 것입니다. 그런데 "시작"이 정확히 무엇인지 미리 정해 두지 않으면, 현장에서는 반드시 중요한 것을 놓칩니다. 긴장한 사람의 기억력은 믿을 것이 못 되고, 침투 세션은 언제 끊길지 모릅니다. 그래서 프로는 체크리스트를 만들어 기계적으로 돌립니다. 오늘은 여러분만의 후속 침투(post-exploitation) 체크리스트 v1을 완성하는 날입니다 — 이 문서는 앞으로의 모든 침투 실습과 Step 272까지 계속 자라날 살아 있는 문서입니다.


1. 학습 목표

이 챕터를 끝내면 다음을 할 수 있습니다:

  • 쉘 획득 직후 수집해야 할 정보의 항목들을 분류해 말할 수 있다
  • 각 항목에 대응하는 명령을 체크리스트 형태로 정리한다
  • "없는 결과"와 "못 보는 결과"의 의미를 해석한다
  • 공격자의 수집 목록을 방어자의 점검 목록으로 뒤집을 수 있다
  • 체크리스트를 실행해 보며 갱신하는 플레이북 습관을 시작한다

2. 배경 지식 — 오늘의 도구와 개념

오늘의 도구 한눈에 보기

구분 내용
언어·환경 리눅스 셸 지식 + 마크다운 문서화 (Step 89의 위키)
오늘의 재료 Step 125~126의 명령들을 "분류된 목록"으로 재배열
필요한 개념 후속 침투(post-exploitation), 증거 관리, 지속성(persistence)의 개념, 흔적
오늘의 산출물 개인 후속 침투 체크리스트 v1 (post-ex.md)

2-1. 왜 체크리스트인가 — 조종사의 교훈

비행기 조종사는 수천 시간을 비행하고도 이착륙마다 체크리스트를 읽습니다. "기억을 믿지 말고 목록을 믿어라" — 전문가의 세계에서는 체크리스트가 실력의 일부입니다. 침투 테스트도 같습니다. 쉘을 얻은 흥분 상태에서 "뭐부터 하더라"를 기억에 맡기면, 정작 그 세션에서만 얻을 수 있는 정보(실행 중인 프로세스, 현재 네트워크 연결)를 놓치고 세션이 끊깁니다. 기회는 한 번이고, 목록은 영원합니다.

실무에서 이 수집물의 행선지는 정해져 있습니다 — 보고서(Step 128). 지금 모으는 한 줄 한 줄이 나중에 "증거" 절의 재료가 됩니다. 수집 없는 보고서는 소설이 됩니다.

2-2. 수집 항목의 다섯 가지 분류

후속 침투에서 모을 정보를 다섯 바구니로 나누면 이렇습니다. Step 125~126에서 하나씩 만났던 명령들입니다 — 오늘은 이들을 한 장의 목록으로 엮습니다.

① 시스템 신원 — 이 기계는 무엇인가: uname -a(커널), /etc/os-release(OS), hostname, uptime. 커널 버전은 Step 125에서 봤듯 익스플로잇 검색의 열쇠입니다.

② 계정과 권한 — 나는 누구이고 누가 있는가: id, /etc/passwd(로그인 가능 계정), sudo -l, who·w(지금 활동 중인 사람), last(최근 접속 기록).

③ 네트워크 — 이 기계는 어디와 연결돼 있는가: ip a(주소), ss -tlnp 또는 netstat -antp(열린 귀), arp -a(이웃 기계). Step 126에서 봤듯 내부 전용 포트가 여기서 나옵니다. 그리고 "이 기계가 지금 다른 기계와 대화 중인가"는 피벗(거점 삼아 내부로 더 들어가기)의 실마리입니다.

④ 저장된 비밀 — 파일 속에 남은 열쇠들: ~/.bash_history(이전 명령 이력), 설정 파일의 비밀번호(grep -r "password" /etc), 홈 폴더 탐색, SSH 키(~/.ssh/). 사람은 편의를 위해 비밀을 파일에 남기고, 그것이 공격자의 보물 상자입니다.

⑤ 상승의 실마리 — Step 125~126의 전부: SUID 목록, cron, 쓰기 가능 파일, linPEAS 후보. 이미 배웠으니 체크리스트에는 링크처럼 얹기만 하면 됩니다.

2-3. 지속성과 흔적 — 알되, 함부로 쓰지 말 것

체크리스트에는 두 가지 개념이 더 붙습니다.

지속성(persistence) — 세션이 끊겨도 다시 들어올 수 있게 뒷문을 남기는 기법들(계정 추가, cron에 역접속 심기 등)의 총칭입니다. 실무 침투 테스트에서는 계약으로 허용된 경우에만, 그리고 테스트 종료 후 반드시 제거합니다. 입문 단계의 여러분은 "공격자가 이런 자리에 뒷문을 남긴다"는 것을 방어자의 눈으로 알아 두면 충분합니다 — 그래야 점검할 곳을 아니까요.

흔적 — 여러분이 친 명령은 로그와 history에 남습니다. 공격 쪽에서는 "흔적이 남는다"를 아는 것이, 방어 쪽에서는 "흔적을 어디서 찾는가"를 아는 것이 됩니다. Step 126에서 .bash_history가 비어 있는 것을 "흔적 관리 습관의 단서"로 읽었던 그 감각의 연장입니다. 입문 과정에서 흔적 지우기 기법 자체는 다루지 않습니다 — 내 랩의 로그를 지우면 배울 재료가 사라집니다.

2-4. 방어자로 뒤집어 읽기

이 챕터의 모든 수집 항목은 뒤집으면 점검 항목입니다. 공격자가 /etc/passwd에서 로그인 가능 계정을 본다면, 방어자는 "꼭 필요한 계정만 쉘을 가졌는가"를 점검합니다. 공격자가 쓰기 가능한 cron 스크립트를 찾는다면, 방어자는 같은 명령으로 미리 찾아 고칩니다. 하나의 체크리스트, 두 개의 직업 — 이 과의 모든 지식이 그렇듯이.


3. 따라 하기

오늘의 "따라 하기"는 체크리스트 문서를 실제로 만드는 과정입니다. Step 125~126의 실측 출력을 재료로 씁니다.

3-1. 문서 뼈대 만들기

위키에 post-ex.md를 만들고 다섯 바구니의 뼈대를 씁니다.

# 나의 후속 침투 체크리스트 v1 (2026-09-09)

### ① 시스템 신원
- [ ] uname -a        → 커널 버전 (익스플로잇 검색용)
- [ ] cat /etc/os-release
- [ ] hostname && uptime

### ② 계정과 권한
- [ ] id
- [ ] cat /etc/passwd → 쉘이 있는 계정 표시
- [ ] sudo -l
- [ ] who && w && last | head

### ③ 네트워크
- [ ] ip a
- [ ] ss -tlnp  (없으면 netstat -antp)
- [ ] arp -a

### ④ 저장된 비밀
- [ ] cat ~/.bash_history
- [ ] cat /home/*/.bash_history 2>/dev/null
- [ ] grep -r "password" /etc 2>/dev/null | head
- [ ] ls -la ~/.ssh/

### ⑤ 상승의 실마리 (Step 125~126 정찰표 링크)
- [ ] find / -perm /4000 -type f 2>/dev/null
- [ ] cat /etc/crontab && crontab -l
- [ ] find / -writable -type f 2>/dev/null | head
- [ ] linPEAS 결과의 빨강/노랑 재검토

읽는 법: 각 항목 옆에 "왜 수집하는가"가 적혀 있는 것에 주목하세요. 이유 없는 명령은 잊히고, 이유 있는 명령은 남습니다.

3-2. 실제로 돌려 보며 검증하기

체크리스트는 쓰는 것으로 끝나지 않습니다 — 실제로 한 바퀴 돌려 봐야 빈 곳이 보입니다. 여러분의 리눅스에서 위 목록을 위에서부터 실행해 보세요. Step 125~126에서 이미 실측한 명령들이라 출력을 예측할 수 있을 것입니다.

돌리면서 만나게 될 장면들 (2026-09-09 WSL 실측 재현):

$ crontab -l
no crontab for root

$ cat /root/.bash_history
cat: /root/.bash_history: No such file or directory

$ netstat -antp
bash: netstat: command not found

읽는 법: 세 가지 "빈 결과"입니다. 개인 크론 없음, 이력 파일 없음, 명령 자체 없음. 초보는 여기서 "실패했다"고 생각하고, 프로는 체크리스트의 주석란에 해석을 적습니다 — "이 환경에는 netstat이 없다 → ss를 쓴다", "이력 없음 → 사용자가 흔적 관리를 하거나 새 환경". 체크리스트는 실행할 때마다 이런 주석으로 살이 붙습니다.

3-3. "못 보는 것"의 목록도 적기

낮은 권한의 쉘에서는 아예 못 보는 것들이 있습니다. Step 125 실측에서 www-data로는 /etc/shadowPermission denied였습니다. 체크리스트에 이런 줄을 추가하세요:

### ⑥ 상승 후에 다시 볼 것 (낮은 권한에서는 안 됨)
- [ ] cat /etc/shadow        → 상승 후 비밀번호 해시 확보
- [ ] netstat -antp 의 프로세스명 → 일부는 root만 보임

: 열거는 한 번으로 끝나지 않습니다. 상승 전 목록과 상승 후 목록이 따로 있습니다. 권한이 바뀌면 보이는 세계가 바뀌므로, root를 얻은 순간 체크리스트의 이 섹션을 다시 돌립니다.

3-4. 별표 제도 — 유용했던 것을 표시하기

체크리스트를 실제 랩(MS2, Bandit, Natas)에서 사용할 때마다, 그날 진짜 수확을 준 명령에 별표(★)를 붙이세요. 몇 달 뒤 별표의 분포가 여러분만의 "핵심 명령 순위"가 됩니다. 책이나 남의 목록은 출발점일 뿐, 별표가 붙은 목록이 여러분의 것입니다.

3-5. 방어용 사본 만들기

문서를 복사해 post-ex-defense.md를 만들고, 각 항목을 질문으로 바꿉니다.

# 점검 체크리스트 (방어용)
- [ ] 로그인 가능한 계정이 꼭 필요한 것뿐인가? (/etc/passwd의 쉘 칸)
- [ ] SUID 목록에 이상한 손님이 없는가? (기준선 대조)
- [ ] cron이 실행하는 스크립트의 쓰기 권한이 닫혀 있는가?
- [ ] 설정 파일에 비밀번호가 박혀 있지 않은가?
- [ ] 계정별 이력·로그가 정상적으로 기록되고 있는가?

읽는 법: 같은 명령, 다른 질문. 공격자가 "쓸 것을 찾는" 목록이 방어자에게는 "고칠 것을 찾는" 목록입니다. Step 128 보고서의 "권고 사항" 절이 바로 이 방어용 목록에서 나옵니다.


4. 미션과 연습문제

미션 — 후속 침투 체크리스트 v1 완성과 첫 순회

  1. 3-1의 뼈대를 기반으로 여러분만의 post-ex.md를 완성합니다 — 항목 추가·삭제·재배열 자유
  2. 여러분의 리눅스에서 전 항목을 한 바퀴 실행하고, 각 항목 옆에 실제 결과 요약과 해석을 적습니다
  3. "상승 후에 다시 볼 것" 섹션을 만들어 3개 이상 적습니다
  4. 방어용 사본을 만들어 질문 5개 이상을 배치합니다
  5. 다음 랩 실습(Step 128의 MS2 보고서 작업 등)에서 이 체크리스트를 실제로 사용하고, 써 본 뒤 한 곳 이상을 갱신합니다 — 사용하지 않은 목록은 목록이 아닙니다

연습문제

문제 1. 쉘 획득 직후 "기억"이 아니라 "체크리스트"에 의존해야 하는 이유를 두 가지 들어 보세요.

문제 2. crontab -lno crontab for root를 출력했을 때, 이 결과에서 읽을 수 있는 정보와 그것을 체크리스트에 남기는 방법을 말해 보세요.

문제 3. "상승 전 체크리스트"와 "상승 후 체크리스트"를 나누는 이유를 /etc/shadow의 예로 설명해 보세요.

문제 4. 공격용 수집 목록이 방어용 점검 목록으로 뒤집히는 원리를, SUID 항목 하나를 골라 양쪽 문장으로 써 보세요.


5. 모범 답안과 완료 기준

미션 모범 답안

완성된 체크리스트는 3절의 뼈대에 세 가지 살이 붙은 모습이어야 합니다.

### ② 계정과 권한  (실행 메모 예시)
- [x] id → uid=0(root). 실험 환경은 root 시작이라 상승 검증 연습은 랩에서 ★
- [x] cat /etc/passwd → bash 쉘 계정: root뿐. 서버라면 사용자 계정이 여기 보임
- [x] sudo -l → (ALL : ALL) ALL. 낮은 계정이면 NOPASSWD 행부터 찾을 것

### ⑥ 상승 후에 다시 볼 것
- [ ] cat /etc/shadow → 해시 확보 (Step 123의 john 재료)
- [ ] ls -la /root/ → root의 홈은 root만 들어감
- [ ] 전체 프로세스 명령행 → ps aux의 일부 칸은 root만 보임

검증하는 법: ① 모든 항목에 "왜 수집하는가"가 적혀 있는가. ② 한 바퀴 실행의 흔적(결과 요약 또는 주석)이 있는가. ③ "빈 결과"에도 해석이 붙어 있는가. ④ 방어용 사본이 별도 파일로 존재하는가. ⑤ 실제 사용 후 갱신 흔적(별표, 추가 항목, 순서 변경)이 있는가 — v1이 영원히 v1으로 남아 있다면 그것은 쓰지 않았다는 뜻입니다.

연습문제 해답

문제 1 해답. 첫째, 긴장·흥분 상태의 기억은 빠뜨립니다 — 수백 시간의 조종사도 체크리스트를 읽는 이유입니다. 둘째, 침투 세션은 언제 끊길지 모릅니다 — 세션 한 번에 다시 못 보는 정보(현재 연결, 실행 프로세스)가 있으므로, 목록 순서대로 기계적으로 수집해야 "놓친 것"이 생기지 않습니다. 덤으로, 기록된 수집물이 곧 보고서의 증거가 됩니다.

문제 2 해답. "이 계정에는 개인 크론이 없다"는 사실 자체가 정보입니다 — 이 경로로는 지속성·상승 실마리가 없다는 판정이고, 방어 관점에서는 점검 완료 항목이 됩니다. 체크리스트에는 결과를 지우지 말고 → 없음 (이 경로는 무효)처럼 해석을 덧붙여 남깁니다. 빈 결과를 기록하는 목록만이 "내가 뭘 확인한 건지"를 나중에 증명해 줍니다.

문제 3 해답. 권한이 다르면 보이는 파일이 다르기 때문입니다. /etc/shadow는 root만 읽을 수 있어서(Step 125의 www-data 실험에서 Permission denied), 낮은 권한에서 아무리 쳐도 실패합니다. 그래서 "지금 할 것"과 "상승 후 다시 볼 것"을 나누면, 상승에 성공한 순간 헤매지 않고 두 번째 목록을 바로 돌릴 수 있습니다. 상승은 끝이 아니라 두 번째 열거의 시작 신호입니다.

문제 4 해답. 공격 문장: "SUID 목록에서 GTFOBins에 있는 이상한 이름을 찾아 권한 상승에 이용한다." 방어 문장: "SUID 목록을 기준선과 주기적으로 대조해, 새로 생기거나 이상한 SUID 파일을 찾아 제거한다." 같은 명령(find / -perm /4000)을 돌리되, 공격자는 "쓸 것"을, 방어자는 "고칠 것"을 찾습니다 — 하나의 체크리스트, 두 개의 직업입니다.

완료 기준 체크리스트

  • [ ] 수집 항목의 다섯 분류(신원·계정·네트워크·비밀·상승)를 말할 수 있다
  • [ ] 각 항목의 대응 명령을 체크리스트로 정리했다
  • [ ] "빈 결과"와 "못 보는 결과"의 차이를 해석할 수 있다
  • [ ] 상승 전/후 체크리스트를 나누는 이유를 안다
  • [ ] 지속성·흔적 개념을 방어 관점 포함으로 설명할 수 있다
  • [ ] 공격용 목록을 방어용 질문 목록으로 뒤집을 수 있다
  • [ ] 미션: post-ex.md v1 완성과 첫 순회 실행을 끝냈다

6. 흔한 실수와 해결

벽 1. 체크리스트를 만들고 실행을 안 한다

증상: 문서는 예쁘게 완성됐는데 실제 랩에서 쓴 흔적이 없습니다.

원인: "만드는 것"을 목표로 착각한 것입니다. 체크리스트의 완성은 사용 후 갱신입니다.

해결: 다음 랩 실습 때 문서를 옆에 열어 두고 한 줄씩 지워 가며(체크하며) 진행하세요. 그리고 끝나면 반드시 한 곳을 고칩니다 — 순서를 바꾸거나, 주석을 달거나. 갱신되지 않는 체크리스트는 장식입니다.

벽 2. 남의 거대한 목록을 그대로 베낀다

증상: 인터넷의 수백 항목짜리 목록을 통째로 가져왔더니 못 쓰겠습니다.

원인: 각 항목의 "왜"를 모르는 명령은 실행할 수 없습니다. 목록의 크기가 아니라 이해의 깊이가 실력입니다.

해결: 이 챕터의 20여 개로 시작하세요. 여러분이 직접 실행해 보고 별표를 붙인 목록 20개가, 베낀 목록 200개보다 강합니다. 새 명령은 배울 때마다 "왜"와 함께 한 줄씩 추가하면 됩니다 — 이 문서는 Step 272까지 자랍니다.

벽 3. netstat 같은 명령이 없어서 당황한다

증상 (실측 형태): bash: netstat: command not found.

원인: 시스템마다 설치된 도구가 다릅니다. 오래된 시스템에는 새 명령이, 새 시스템에는 옛 명령이 없을 수 있습니다.

해결: 당황하지 말고 체크리스트에 대체 명령을 병기하세요 — ss -tlnp (없으면 netstat -antp)처럼. "명령이 없다"는 것 자체가 그 시스템에 대한 정보이며, 다음 항목으로 넘어가면 됩니다.

벽 4. 수집만 하고 저장을 안 해서 세션 종료 후 남는 게 없다

증상: 열심히 쳤는데 터미널을 닫으니 증거가 없습니다.

원인: 출력을 파일로 남기는 습관이 아직 없는 것입니다.

해결: Step 126의 tee를 기본값으로 만드세요 — 중요한 명령은 명령 | tee -a evidence.txt. 침투 테스트에서 저장되지 않은 발견은 없던 발견입니다. 보고서(Step 128)는 이 파일들로 씁니다.

벽 5. 지속성·흔적 항목을 호기심에 내 랩 밖에서 시험한다

증상: "뒷문이 정말 되나" 궁금해집니다.

원인: 궁금증은 좋은 것이지만 방향이 위험합니다.

해결: 경계를 기억하세요 — 입문 단계에서 지속성 기법은 내 랩에서, 개념 확인 수준으로, 끝나면 즉시 제거가 원칙입니다. 그리고 방어용 사본에 "공격자가 뒷문을 심는 자리"로 기록하는 것이 이 호기심의 올바른 행선지입니다. 알되, 함부로 쓰지 않는 것 — 그것이 이 과의 윤리입니다.


7. 정리

오늘의 개념

개념 한 줄 설명
후속 침투(post-exploitation) 쉘 획득 이후의 정보 수집·판정 단계 — 끝이 아니라 시작
체크리스트 기억 대신 목록을 돌리는 프로의 방식 — 쓸수록 갱신되는 산 문서
다섯 바구니 시스템 신원 / 계정과 권한 / 네트워크 / 저장된 비밀 / 상승 실마리
빈 결과의 정보성 없음·거부·command not found도 전부 해석할 단서
상승 후 재열거 권한이 바뀌면 보이는 세계가 바뀐다 — 두 번째 목록
지속성·흔적 알되 함부로 쓰지 않는 개념 — 방어자의 점검 자리로 기억
방어용 사본 같은 명령을 "고칠 것 찾기" 질문으로 뒤집은 목록

오늘의 명령어

명령 하는 일
hostname / uptime 기계 이름과 가동 시간
last | head 최근 접속 기록
ip a / arp -a 내 주소와 이웃 기계
ls -la ~/.ssh/ SSH 키·인증 정보 확인
명령 | tee -a evidence.txt 수집물을 증거 파일에 누적 저장
(그 외) Step 125~126의 정찰 명령 전부가 이 목록의 구성원

명령어보다 중요한 감각

오늘 여러분은 새 명령을 하나도 배우지 않았는데, 어쩌면 가장 실무적인 챕터를 지났습니다. 실력은 아는 명령의 수가 아니라 빠뜨리지 않는 체계에서 나옵니다. 쉘 앞의 흥분한 사람을 구하는 것은 기억이 아니라 목록이고, 그 목록은 쓸 때마다 별표와 주석으로 살이 붙어 여러분만의 무기가 됩니다. 그리고 그 무기를 뒤집은 방어용 사본 — 공격자의 발자취를 따라가며 문단속을 하는 목록 — 이 두 권의 문서가 앞으로 여러분의 모든 실습과 함께 자랄 것입니다. 목록을 믿되, 목록을 키우는 것은 여러분의 실행뿐입니다.


전부 체크되면 Step 127 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.