Step 275. HTB Hard 복기 — 상위 플레이어 Write-up 분석: 결과가 아니라 판단 근거를 읽는다

Step 275. HTB Hard 복기 — 상위 플레이어 Write-up 분석: 결과가 아니라 판단 근거를 읽는다

Level 3 — CTF 실전과 공격 스킬 심화 | 난이도 ★★★★☆ | 예상 소요 시간 2일 (Write-up 3편 분석 + 갭 분석 + 플레이북 개정)

전제: Step 273~274에서 Hard 머신을 1대 이상 도전(완주 여부 무관)하고 공략 로그가 남아 있다.

  • 준비물: 자신의 Hard 공략 로그, 같은 머신의 평가 좋은 Write-up 3편(텍스트) 또는 영상 풀이(ippsec 등), 마크다운 에디터. 이 챕터의 Write-up 인용은 화면 예시(전형적 형태의 재구성)입니다.
  • ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. Hack The Box(hackthebox.com)는 운영자가 공격 연습용으로 공식 개방한 합법 학습 플랫폼입니다 — 공식적으로 퇴출(retired) 처리된 머신의 Write-up만 열람합니다. 활성 머신의 풀이를 미리 보는 것은 플랫폼 규정 위반입니다.
  • 이 챕터는 복기 방법론 챕터입니다. 새 머신을 뚫지 않습니다 — 이미 치른 판에서 상위 플레이어의 사고 순서를 훔칩니다.

Hard를 도전한 뒤 상위 플레이어의 Write-up을 읽으면 대부분 충격을 받습니다. 같은 머신인데 보는 곳이 다릅니다. 여러분이 3일을 태운 구간을 그들은 1시간에 지나가고, 여러분이 아예 인식하지 못한 단서에서 공격을 시작합니다.

차이는 기술 목록이 아니라 판단의 순서입니다. 그들이 "왜 거길 먼저 봤는가", "그 가설을 세운 단서는 무엇이었는가"를 역설계하는 것이 오늘의 일입니다. 기술은 검색하면 되지만, 사고 순서는 Write-up을 해부해야만 얻을 수 있습니다.


1. 학습 목표

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

  • Write-up을 "정답지"가 아니라 "사고 과정의 기록"으로 읽는 분해법을 적용한다
  • 타인의 풀이를 열거 → 발견 → 판단 → 공격의 타임라인으로 재구성한다
  • 내 로그와 병치해 "같은 정보, 다른 결론"이 갈린 지점을 추출한다
  • 상위 플레이어의 판단 근거(단서 → 가설 연결)를 문장으로 복원한다
  • 분석 결과를 내 플레이북의 개정 항목으로 반영한다

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

오늘의 도구 한눈에 보기

구분 내용
언어·환경 마크다운(분석 노트), 웹 브라우저(Write-up·영상 풀이 열람)
오늘의 재료 내 Hard 공략 로그 + 같은 머신 Write-up 3편(0xdf 등) 또는 ippsec 영상
필요한 개념 복기(debrief), 판단 근거, 갭(gap) 분석, 타임라인 병치, 플레이북
오늘의 산출물 비교분석노트.md(갭 3건 이상) + 개정된 플레이북

2-1. Write-up의 함정 — 결과만 보여주는 문서

대부분의 Write-up은 성공한 명령의 순서만 적혀 있습니다. 저자가 실제로는 다섯 가지 가설을 검증하고 네 개를 버렸어도, 문서에는 성공한 하나만 남습니다. 그래서 Write-up을 위에서 아래로 따라 읽으면 "이 사람은 처음부터 답을 알았구나"라는 착각에 빠집니다 — 그리고 착각은 자괴감만 남기고 배움은 없습니다.

읽는 법을 바꿉니다. Write-up의 각 단계에서 멈춰 서서 세 가지를 묻습니다.

  1. 이 시점에 저자가 본 정보는 무엇인가 — 명령의 출력 중 어느 줄이 다음 행동을 부채질했는가.
  2. 같은 정보를 나도 봤는가 — 봤다면 왜 다른 결론을 내렸는가, 못 봤다면 왜 못 봤는가.
  3. 저자는 왜 다른 후보가 아니라 이것을 먼저 검증했는가 — 우선순위의 근거는 무엇인가.

이 세 질문이 Write-up을 정답지에서 사고 과정의 표본으로 바꿉니다.

한 가지 더 — 세 질문의 답을 로그 옆에 적으면서 읽으세요. 머리로만 답하는 읽기는 세 번째 단계쯤에서 흐지부지됩니다. Write-up 한 편의 분석에 1~2시간이 걸리는 것이 정상이고, 그 시간이 이 챕터의 본체입니다.

2-2. 영상 풀이가 텍스트보다 나은 이유

소재의 지적 그대로입니다 — 텍스트 Write-up은 결과를, ippsec 같은 영상 풀이는 과정을 보여줍니다. 영상에는 실패한 시도, 출력을 읽다가 멈칫하는 순간, "이건 아닌데"라며 돌아서는 장면이 그대로 남아 있습니다.

학습 효율의 차이는 여기서 나옵니다. 텍스트에서 여러분이 추론해야 하는 "버려진 가설"을 영상은 직접 보여줍니다. Hard급 복기라면 이상적인 조합은 — 텍스트 2편(정제된 경로와 설명) + 영상 1편(시행착오 포함 사고 과정)입니다.

영상도 보는 법이 있습니다. 2배속으로 흘려보지 말고, 저자가 멈칫하는 순간마다 일시정지하세요 — "지금 화면의 정보만 보고 나라면 다음에 무엇을 치겠는가"를 먼저 적고 재생을 누릅니다. 저자의 다음 명령과 내 예상이 갈리는 지점이 곧 갭입니다. 영상 47분을 이렇게 보면 두 시간이 걸리지만, 그 두 시간이 실전 수십 시간을 아낍니다.

2-3. 갭 분석 — "나는 3일, 저 사람은 1시간"의 구조

갭 분석의 산출물은 서식이 정해져 있습니다. 세 칸입니다.

갭 1 | 구간: 공격 표면 파악
- 상위 플레이어: nmap 결과의 5985/tcp(WinRM)를 보고 "AD 계열, 자격증명이 열쇠"라고 즉시 판단
- 나: 같은 줄을 봤으나 "나중에 보자"로 표시만 하고 웹부터 탐색 (3일 소모 구간의 시작)
- 판단 근거의 차이: WinRM+LDAP+Kerberos 조합이 "도메인 환경"을 의미한다는 패턴 지식의 유무

핵심은 마지막 칸입니다. 갭의 원인은 거의 항상 세 종류 중 하나입니다 — 패턴 지식(그 조합이 무엇을 의미하는지), 우선순위 기준(무엇을 먼저 검증하는지), 도구 숙련(같은 정보를 뽑는 속도). 원인이 분류되면 처방이 정해집니다 — 패턴 지식은 Step 274의 부채 장부로, 우선순위는 플레이북 개정으로, 도구 숙련은 반복 훈련으로.

갭 서식에서 주의할 것 하나 — "나" 칸은 미화 없이 적습니다. "3일 헤맸다"를 "경로 탐색에 시간을 투자했다"로 순화하는 순간, 원인 분류가 부정확해지고 처방이 어긋납니다. 갭 분석의 독자는 미래의 여러분 한 명뿐입니다 — 그 독자에게는 정직이 최고의 친절입니다.

2-4. 플레이북 — 훔친 것이 사는 곳

분석으로 끝나면 감상문입니다. 훔친 사고 순서는 플레이북(나만의 공략 절차서)에 항목으로 들어가야 다음 판에서 발동합니다. 개정의 단위는 "체크 항목"입니다 — "nmap 결과에서 88/389/445/5985 조합을 보면 AD로 판정하고 자격증명 사냥부터 시작한다"처럼, 조건과 행동이 한 문장으로 묶인 형태입니다.

플레이북에는 버전을 매기세요. 이번 복기로 v2가 v3이 되는 식입니다. 버전이 올라가는 것 자체가 복기 루프의 회전 증거이고, 나중에 v1을 다시 펼쳐 보면 여러분의 사고가 얼마나 성장했는지가 문서로 남습니다.


3. 따라 하기

3-1. Write-up 수집 — 무엇을 골라야 하는가

도전한 Hard 머신(퇴출 처리된 것)의 Write-up을 3편 고릅니다. 선정 기준:

  • 평가가 좋을 것: HTB 포럼의 공식 Write-up 스레드, 0xdf의 블로그(0xdf.gitlab.io)처럼 검증된 저자.
  • 성향이 다를 것: 정규 루트(intended)와 우회 루트(unintended), 텍스트와 영상이 섞이면 비교의 각도가 생깁니다.
  • 같은 머신일 것: 다른 머신의 훌륭한 Write-up은 참고서일 뿐, 여러분 로그와의 병치 재료가 못 됩니다.

화면 예시 (수집 목록):

머신 A Write-up 수집:
1. 0xdf 블로그 — 텍스트, 정규 루트, 단계별 설명 상세
2. HTB 포럼 공식 스레드 상위글 — 텍스트, 다른 진입 경로
3. ippsec 영상 (youtube.com/@ippsec) — 47분, 시행착오 포함

3-2. 풀이의 타임라인 분해 — 단계를 뜯는다

첫 번째 Write-up을 열고, 풀이를 네 종류의 단계로 분해합니다 — 열거(정보 수집), 발견(유의미한 단서 인식), 판단(가설 선택), 공격(실행). 각 단계에 "근거가 된 출력 한 줄"을 꼭 붙입니다.

화면 예시 (분해 결과의 일부):

[0xdf 풀이 분해 — 머신 A]
1. 열거: nmap -sCV → 88, 389, 443, 5985 열림
2. 판단: "AD 머신" 확정 → 웹(443)보다 디렉터리 열거를 먼저. 근거: 88(Kerberos) 존재
3. 열거: LDAP 익명 바인드 → 사용자 목록 쿼리. 근거: 389/tcp open
4. 발견: 서비스 계정 svc_backup의 description 필드에 문자열 "B@ckup2023!" ← 결정적 단서
5. 판단: description에 비밀번호가 들어가는 것은 AD의 고전적 실수. 근거: 패턴 지식
6. 공격: 해당 자격증명으로 WinRM 접속 → user 쉘

읽는 법: 6번의 명령이 아니라 5번의 판단이 배워야 할 것입니다. description 필드는 여러분도 열거했다면 봤을 출력입니다 — 그것을 "실수의 고전 패턴"으로 인식한 순간이 갭의 정체입니다.

3-3. 내 로그와 병치 — 갭 세 건을 뽑는다

내 공략 로그를 옆에 놓고 같은 시간축에서 비교합니다.

화면 예시 (병치 노트):

| 시점 | 상위 플레이어 | 나 |
|------|----------------|-----|
| 정찰 직후 | "AD 확정, 자격증명 사냥 개시" | 웹(443) 디렉터리 탐색부터 (3일 구간 진입) |
| LDAP 열거 | description까지 전 필드 정독 | sAMAccountName만 보고 종료 — description 미확인 |
| 막힘 대응 | 30분 내 가설 교체, 로그에 근거 기록 | 같은 익스플로잇 변형 반복 (2일) |

여기서 갭을 뽑습니다. 기준은 하나 — "나는 3일 걸린 걸 저 사람은 1시간에 한 이유"가 문장으로 써지는 것부터. 3건을 넘기면 처방이 흩어지니, 가장 시간 손실이 컸던 순서로 3건만 정합니다.

3-4. 판단 근거 복원 — 단서에서 가설까지의 다리

갭마다 "그들이 그 가설을 세운 단서"를 문장으로 복원합니다.

화면 예시:

갭 1의 판단 근거 복원:
단서: nmap 출력의 "88/tcp open kerberos" 한 줄
가설: "이 머신은 도메인 컨트롤러이거나 도메인 가입 머신이다"
행동: 웹보다 자격증명 열거 우선
복원 문장: "88번이 열린 시점에 AD로 판정하면, 공격 표면의 우선순위 전체가 재정렬된다.
         다음 Hard에서 포트 조합만으로 머신 계열을 먼저 판정한다."

이 복원 문장이 플레이북에 들어갈 원료입니다. "0xdf는 천재"라는 결론이 아니라, 재현 가능한 조건-행동 규칙으로 바꾸는 작업입니다.

3-5. 플레이북 개정 — 훔친 것을 심는다

복원 문장들을 플레이북의 체크 항목으로 변환합니다.

플레이북 v3 개정 사항 (머신 A 복기 반영):
+ [정찰] 포트 조합으로 머신 계열 선판정: 88/389/445/5985 → AD, 자격증명 사냥 우선
+ [열거] AD 사용자 객체는 description, info 필드까지 전 필드 정독 (고전적 비밀번호 실수)
+ [판단] 같은 익스플로잇 변형 3회 실패 = 가설 폐기 신호. 로그에 근거 적고 교체

: 다음 판에서 이 항목들이 생각나는 것이 아니라 절차상 다음 줄에 있는 것이어야 합니다. 훔친 사고는 체크리스트가 될 때만 압박 속에서도 발동합니다.


4. 미션과 연습문제

미션 — Write-up 3편 분석과 플레이북 개정

  1. 도전한 Hard 머신(퇴출 처리된 것)의 Write-up 3편을 수집합니다 — 텍스트 2 + 영상 1 조합을 권장합니다.
  2. 각 풀이를 열거 → 발견 → 판단 → 공격 단계로 분해하고, 각 단계에 "근거가 된 출력 한 줄"을 붙입니다.
  3. 내 로그와 병치해 시간 손실이 컸던 순서로 갭 3건을 추출합니다 — 2-3의 세 칸 서식 사용.
  4. 갭마다 판단 근거 복원 문장을 작성합니다(단서 → 가설 → 행동).
  5. 복원 문장을 조건-행동 한 문장의 체크 항목으로 바꿔 플레이북을 개정하고, 버전을 올립니다.

연습문제

문제 1. Write-up을 위에서 아래로 따라 읽기만 하면 생기는 착각은 무엇이며, 왜 생기나요?

문제 2. 영상 풀이가 텍스트 Write-up보다 복기에 유리한 지점은 무엇인가요? 그래도 텍스트를 함께 봐야 하는 이유는 무엇인가요?

문제 3. 갭 분석에서 원인을 "패턴 지식 / 우선순위 기준 / 도구 숙련"의 세 종류로 분류하는 이유는 무엇인가요?

문제 4. 복원 문장을 그대로 외우지 않고 플레이북의 "조건-행동" 항목으로 변환해야 하는 이유는 무엇인가요?


5. 모범 답안과 완료 기준

미션 모범 답안

검증 기준으로 확인하세요.

  1. 분해의 입자도: 타임라인의 각 단계에 "근거가 된 출력 한 줄"이 붙어 있는가 — 명령만 나열한 분해는 미완성입니다.
  2. 갭의 정직성: 갭 서식의 "나" 칸이 미화 없이 적혀 있는가 — "3일 헤맸다"가 숨겨지지 않아야 처방이 정확합니다.
  3. 복원 문장의 재현성: 단서 → 가설 → 행동이 이어져서, 다른 사람이 읽고 같은 상황에서 같은 판단을 재현할 수 있는가.
  4. 개정의 발동 가능성: 플레이북 신규 항목이 조건-행동 한 문장인가 — "AD를 잘 알자"(나쁨)가 아니라 "88/389/445/5985 조합이면 자격증명 사냥 우선"(좋음) 수준인가.

연습문제 해답

문제 1 해답. "저자는 처음부터 답을 알았다"는 착각입니다. Write-up은 성공한 경로만 남긴 정제본이라, 저자가 실제로 검증하고 버린 가설들이 문서에서 삭제되기 때문에 생깁니다. 이 착각을 깨는 장치가 세 질문입니다 — 이 시점에 본 정보는 무엇인가, 나도 봤는가, 왜 이것을 먼저 검증했는가. 이 질문들은 문서에 없는 "버려진 가설"을 추론으로 복원하게 만듭니다.

문제 2 해답. 영상은 버려진 가설과 시행착오를 직접 보여줍니다 — 텍스트에서 추론해야 할 사고 과정이 화면에 그대로 있습니다. 다만 영상은 정보 밀도가 낮고(47분의 영상에 정제된 경로는 10페이지 분량), 나중에 검색·인용하기 어렵습니다. 그래서 조합이 정답입니다 — 텍스트로 정제된 경로와 명령을 확보하고, 영상으로 사고 과정의 질감을 흡수합니다.

문제 3 해답. 처방이 종류마다 다르기 때문입니다. 패턴 지식의 부족은 Step 274의 부채 장부로 상환하고, 우선순위 기준의 부재는 플레이북 개정으로 고치고, 도구 숙련은 반복 훈련으로만 해결됩니다. 원인 분류 없이 "더 열심히"라는 처방은 셋 중 아무것도 고치지 못합니다. 분류는 갭을 행동으로 번역하는 번역기입니다.

문제 4 해답. 실전의 압박 속에서는 외운 문장이 아니라 절차상 다음 줄만 발동하기 때문입니다. "0xdf는 description을 봤다"는 지식은 다음 판의 포트 스캔 앞에서 떠오르지 않지만, "AD 사용자 객체는 전 필드 정독"이 열거 체크리스트의 한 줄로 있으면 순서가 오면 자동 실행됩니다. 훔친 사고가 자산이 되려면 지식이 아니라 절차로 변해야 합니다.

완료 기준 체크리스트

  • [ ] 같은 머신의 Write-up 3편(텍스트·영상 혼합)을 수집했다
  • [ ] 각 풀이를 열거/발견/판단/공격 단계로 분해하고 근거 출력을 붙였다
  • [ ] 내 로그와의 병치에서 갭 3건을 세 칸 서식으로 추출했다
  • [ ] 갭마다 단서 → 가설 → 행동의 복원 문장을 작성했다
  • [ ] 갭의 원인을 패턴 지식/우선순위/도구 숙련으로 분류했다
  • [ ] 플레이북에 조건-행동 형태의 신규 항목을 추가하고 버전을 올렸다

6. 흔한 실수와 해결

벽 1. 활성 머신의 Write-up을 찾아버렸어요

증상: 도전 중인 머신의 풀이가 검색에 걸립니다.

원인: 활성(active) 머신의 풀이 공유는 HTB 규정 위반이라 공식적으로는 없어야 하지만, 비공식 유출이 존재합니다.

해결: 열람하지 마세요. 복기는 "내가 먼저 부딪힌 뒤"에만 작동하는 훈련입니다 — 답을 본 뇌는 부딪힘을 재현할 수 없고, 그 판의 갭 분석은 전부 무효가 됩니다. 복기 대상은 퇴출(retired) 머신으로 한정하세요. 도전 중이라면 그 머신이 퇴출될 때까지 로그를 묻어 두는 것도 전략입니다.

벽 2. Write-up이 너무 깔끔해서 비교가 안 돼요

증상: 제 풀이는 구덩이인데 Write-up은 직선이라 "비교"가 아니라 "감상"이 됩니다.

원인: 텍스트 Write-up의 구조적 한계입니다 — 2-1의 함정 그대로입니다.

해결: 두 가지 장치를 쓰세요. ① 영상 풀이(ippsec)로 같은 머신의 시행착오를 봅니다 — 그들도 헤맨다는 것이 확인되면 비교가 가능해집니다. ② "역방향 읽기" — Write-up의 각 단계에서 눈을 감고 "이 출력만 보고 나라면 다음에 뭘 했을까"를 먼저 쓴 뒤 다음 단락을 읽습니다. 정답을 미리 보지 않는 순간, 갭이 선명해집니다.

벽 3. 갭이 3건이 아니라 30건 나와요

증상: 병치를 하다 보니 모든 구간이 갭입니다.

원인: Hard 복기에서는 정상입니다 — 그들과 우리의 차이가 원래 그 정도입니다. 문제는 처방 불가능한 목록의 크기입니다.

해결: 시간 손실로 정렬하세요. "이 갭이 없었다면 며칠이 절약됐는가"를 로그 시각으로 계산해 상위 3건만 이번 플레이북 개정에 넣습니다. 나머지는 Step 274의 부채 장부로 넘기면 됩니다 — 갭 분석과 부채 장부는 같은 창고의 두 선반입니다.

벽 4. Write-up마다 경로가 달라서 뭘 배워야 할지 모르겠어요

증상: 3편이 3개의 다른 루트를 탑니다.

원인: Hard에는 정규 루트와 우회 루트가 공존하는 경우가 많습니다. 오히려 잘된 수집입니다.

해결: 경로의 내용이 아니라 경로의 선택 근거를 비교하세요. "같은 열거 결과에서 A는 웹을, B는 LDAP을 먼저 두드렸다 — 각자의 근거는?" 이 비교가 나오면 어느 루트든 배울 것이 생깁니다. 그리고 정규 루트 1편은 반드시 포함하세요 — 설계자의 의도가 다음 머신의 힌트 감각을 길러 줍니다.

벽 5. 분석은 했는데 다음 머신에서 안 떠올라요

증상: 개정한 플레이북 항목이 실전에서 발동하지 않습니다.

원인: 플레이북이 절차의 흐름 안에 없는 경우가 대부분입니다 — 문서 말미의 "배운 점" 란에 있으면 절대 안 읽힙니다.

해결: 항목의 위치를 점검하세요. "88/389/445/5985 조합 판정"은 정찰 체크리스트의 포트 스캔 다음 줄에 있어야 발동합니다. 훔친 사고는 문장으로 존재하는 게 아니라, 절차의 순서로 존재할 때만 실전에서 나옵니다.


7. 정리

오늘의 개념

개념 한 줄 설명
Write-up의 함정 성공 경로만 남은 정제본 — 버려진 가설은 추론으로 복원해야 한다
세 질문 읽기 본 정보는 무엇인가 / 나도 봤는가 / 왜 이것을 먼저 검증했는가
갭 분석 내 로그와의 병치에서 시간 손실 상위 3건을 세 칸 서식으로 추출
판단 근거 복원 단서 → 가설 → 행동을 문장으로 재구성하는 작업
원인 3분류 패턴 지식(장부로) / 우선순위(플레이북으로) / 도구 숙련(반복으로)
플레이북 훔친 사고가 조건-행동 항목으로 사는 곳 — 절차의 순서가 생명

오늘의 도구

도구·서식 하는 일
0xdf 블로그, HTB 포럼, ippsec 영상 검증된 상위 플레이어 풀이의 공급원
타임라인 분해 풀이를 열거/발견/판단/공격으로 뜯고 근거 출력 부착
갭 분석 세 칸 상위 플레이어 / 나 / 판단 근거의 차이
복원 문장 → 체크 항목 감상을 절차로 번역하는 변환기

명령어보다 중요한 감각

복기가 끝났을 때 남아야 할 것은 "저 사람은 대단하다"가 아니라 "다음 판의 첫 30분이 달라졌다"입니다. 상위 플레이어와의 차이는 재능이 아니라 누적된 판단 규칙의 수이고, 그 규칙은 훔칠 수 있고, 훔친 것은 플레이북에 심어야 여러분의 것이 됩니다.

그리고 기억하세요 — Write-up을 쓰는 그 사람들도 첫 Hard에서는 3일을 헤맸습니다. 차이가 벌어진 것은 그날 이후, 판을 펼쳐 보는 습관이 있었는가의 문제입니다. 오늘 그 습관이 여러분의 것이 됐습니다.


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