Step 266. Medium 복기 + 재공략 — 풀고 나서 배우는 법

Step 266. Medium 복기 + 재공략 — 풀고 나서 배우는 법

Level 3 — CTF 실전과 공격 스킬 심화 | 난이도 ★★★☆☆ | 예상 소요 시간 4시간

전제: Step 265(HTB Medium 1대 독립 해결)를 마쳤다 — 진척 로그와 root 기록이 오늘의 재료입니다.

  • 준비물: Step 265의 진척 로그, 그 머신의 공식 Write-up과 커뮤니티 Write-up 2~3편, 머신 재부팅이 가능한 HTB VPN 환경.
  • ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. HackTheBox(HTB)는 합법 학습 플랫폼입니다 — 오늘의 재공략도 그 안에서만 합니다.
  • 플랫폼 안내: 이 챕터의 HTB 화면과 출력은 전부 화면 예시입니다. 비교·재공략은 여러분의 환경에서 진행합니다.

머신 한 대의 학습 가치는 root를 찍는 순간이 아니라, 그 다음에 발효됩니다. 혼자 힘으로 뚫은 지금이야말로 남의 풀이를 읽을 수 있는 유일한 시점입니다 — 스포일러의 위험 없이, 내 경로와 남의 경로를 나란히 놓고 비교할 수 있으니까요. 오늘은 Step 265의 머신을 복기하고, 더 빠른 경로로 재공략합니다. "나는 3시간 걸린 것을 남은 10분에 한 이유"가 보이는 날입니다.


1. 학습 목표

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

  • 진척 로그에서 타임라인을 재구성해 "어디서 시간을 썼는가"를 정량화한다
  • 공식·커뮤니티 Write-up을 수동으로 읽지 않고 "왜 저 순서인가"를 추적하며 읽는다
  • 내 풀이와 남의 풀이의 차이를 세 유형(우회, 미지, 비효율)으로 분류한다
  • 더 빠른 대안 경로를 직접 재현해 몸에 이식한다
  • "다음 Medium에서는 이렇게 한다"는 개선점 5개를 루틴 문서에 반영한다

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

오늘의 도구 한눈에 보기

구분 내용
언어·환경 Step 265의 HTB 환경 그대로 + 기록 문서 도구(마크다운 편집기)
오늘의 명령 새로운 명령 없음 — 이미 아는 명령의 "순서와 선택"을 다루는 날
필요한 개념 타임라인 재구성, 차이 분류(우회·미지·비효율), 재공략의 학습 원리
오늘의 산출물 복기 노트 1부 + 재공략 기록 + 개선점 5개(루틴 문서 v2 반영)

2-1. 왜 풀고 나서 다시 보는가 — 복기의 학습 원리

풀기 전에 Write-up을 보면 정답을 베끼는 것이지만, 푼 뒤에 보면 같은 문제의 다른 해법을 배우는 것입니다. 차이는 내가 이미 한 경로가 있다는 점입니다 — 비교가 성립합니다.

복기가 특히 강력한 이유는 오류의 보존 때문입니다. 풀면서 저지른 우회·놓침·불필요한 시도는 기억에서 금방 지워집니다. 하지만 진척 로그에는 남아 있고, Write-up과 대조하면 그 오류가 "남들은 안 하는 행동"으로 선명해집니다. 지워지기 전에 대조하는 것 — 그것이 복기의 타이밍입니다.

2-2. 타임라인 재구성 — 로그를 시간의 지도로

복기의 첫 공정은 진척 로그를 시간 순서의 지도로 펴는 것입니다.

[재구성 예시]
Day 1 (2.5h): 정찰 1h → 경로 스캔 0.5h → 막힘 1h (vhost 미시도)
Day 2 (3h):   vhost 발견 0.5h → API 열거 1h → 자격증명 0.5h → 막힘 1h
Day 3 (2.5h): SSH 진입 0.5h → 상승 함정에 1h 소모 → cron 경로 발견 1h → root

이 지도에서 물어야 할 것은 하나입니다 — "어느 구간이 불필요했는가". 위 예시라면 Day 1의 막힘 1시간(vhost를 그날 했다면 없던 시간)과 Day 3의 함정 1시간이 후보입니다. 모든 구간이 불필요한 것은 아닙니다 — 폐기한 가설의 시간도 학습입니다. 지도의 목적은 자책이 아니라 재배치입니다: 다음에는 그 시간을 어디에 쓸 것인가.

2-3. Write-up을 읽는 법 — 순서를 추적한다

Write-up을 수동으로 읽으면 "아, 그렇게 푸는구나"만 남습니다. 추적하며 읽어야 배움이 남습니다. 문장마다 던질 질문은 이것입니다.

  • 왜 저 사람은 거기를 먼저 봤는가 — 그 판단의 근거가 출력의 어느 줄에 있었는가
  • 나는 그 줄을 봤는가 — 봤는데 넘겼다면 왜 넘겼는가, 못 봤다면 어떤 명령이 빠졌는가
  • 저 단계를 생략할 수 있었던 이유는 무엇인가 — 도구의 옵션인가, 서비스 지식인가, 경험인가

이 질문들에 답하며 읽으면, Write-up은 정답지가 아니라 판단 과정의 공개 녹화가 됩니다. 배우는 것은 결과가 아니라 분기점에서의 선택입니다.

2-4. 차이의 세 유형 — 우회, 미지, 비효율

내 풀이와 남의 풀이의 차이를 발견하면, 셋 중 하나로 분류하세요. 유형마다 처방이 다릅니다.

유형 처방
우회 나는 돌아갔고 남은 직행했다 나: 3개 리스트로 경로 스캔 / 남: 첫 리스트에서 적중 열거 순서 개선
미지 남의 기법/도구를 나는 몰랐다 남: feroxbuster의 필터 옵션 활용 플레이북에 추가
비효율 같은 일을 나는 더 느리게 했다 나: 수동으로 20개 대입 / 남: 스크립트 3줄 자동화 습관

역으로 내가 더 나은 지점도 기록하세요. 실제로 있습니다 — 커뮤니티 Write-up이 놓친 경로를 여러분이 찾았을 수 있고, 그 발견은 실력의 증거이자 남을 가르칠 재료입니다.

2-5. 재공략 — 몸에 이식하는 마지막 공정

읽기만 하면 지식이고, 다시 하면 기술입니다. 머신을 리셋하고 Write-up의 더 빠른 경로를 직접 재현합니다.

재공략의 규칙은 셋입니다. ① 처음부터 끝까지 끊지 않고 통과합니다(목표: 첫 풀이의 1/3 시간). ② 대안 경로를 쓰되, 그 단계가 왜 성립하는지 말로 설명할 수 있어야 합니다. ③ 재공략에서도 막힌 지점이 있으면 그것이 진짜 미흡한 곳입니다 — 읽을 때는 이해했지만 손은 모르는 부분이니, 표시해 두세요.


3. 따라 하기

3-1. 복기 노트 뼈대 만들기

Step 265의 로그 폴더 옆에 review.md를 엽니다.

cd htb/first-medium
touch review.md

뼈대는 다섯 칸입니다.

# 복기: (머신 이름)
### 1. 타임라인 재구성 (로그 → 시간 지도)
### 2. Write-up 비교 (공식 + 커뮤니티 2편)
### 3. 차이 분류 (우회 / 미지 / 비효율 / 내가 나은 점)
### 4. 재공략 기록
### 5. 다음 Medium 개선점 5개

읽는 법: 칸을 먼저 만들고 채우는 이유는, 복기가 "생각나는 대로의 감상"으로 흐르는 것을 막기 위해서입니다. 구조가 있어야 비교가 누락되지 않습니다.

3-2. 타임라인 재구성 — 숫자로 펴기

로그의 날짜별 기록을 시간 항목으로 변환합니다 (화면 예시):

| 구간 | 내 시간 | 주요 행동 |
|------|---------|-----------|
| 정찰 | 1.0h | TCP/UDP 풀스캔, 경로 스캔 |
| 입구 발견 | 2.5h | vhost 발견까지 — 막힘 1h 포함 |
| 침투 | 2.0h | API 열거 → 자격증명 → SSH |
| 상승 | 2.0h | 함정 1h + cron 발견 1h |
| 총계 | 7.5h | |

읽는 법: 합이 로그의 총시간과 맞는지 확인하세요 — 맞지 않으면 기록되지 않은 시간이 있다는 뜻이고, 그것도 정보입니다("무엇을 했는지 기억도 안 나는 시간"). 이 표가 Write-up 비교의 기준선입니다.

3-3. Write-up 비교 — 세 편을 나란히

공식 Write-up 1편과 커뮤니티 Write-up 2편을 고릅니다. 고르는 기준은 "풀이 스타일이 서로 다른 것"입니다 — 같은 스타일 세 편보다 다른 스타일 세 편이 비교 가치가 큽니다.

읽으면서 채우는 표 (화면 예시):

| 단계 | 내 풀이 | 공식 | 커뮤니티A | 커뮤니티B |
|------|---------|------|-----------|-----------|
| 입구 | vhost (Day 2) | vhost | vhost | UDP SNMP 먼저 |
| 자격증명 | JS 분석 | JS 분석 | JS 분석 | SNMP에서 획득 |
| 상승 | cron | cron | SUID(다른 경로!) | cron |

읽는 법: 이 표에서 "모두 같음"인 행은 그 머신의 고정 경로이고, 갈리는 행이 배움의 자리입니다. 위 예시에서 커뮤니티A의 SUID 상승 경로는 여러분이 몰랐던 대안 경로 — 재공략의 대상입니다.

3-4. 차이 분류와 재공략

발견한 차이를 2-4의 유형으로 분류한 뒤, 머신을 리셋하고 재공략합니다 (화면 예시):

# HTB 콘솔에서 Reset Machine → 새 IP 발급 대기
export TARGET=10.10.11.YYY
nmap -sV -p- $TARGET -oN retry_full_tcp.txt

재공략 기록 예시:

[재공략] 목표: 대안 경로(SNMP 입구 + SUID 상승)로 통과, 목표 시간 2.5h
- 정찰: 이번엔 UDP를 첫날에 — SNMP 161/udp 즉시 확인
- 입구: SNMP 커뮤니티 스트링으로 자격증명 획득 (25분)
- 침투: SSH 진입 (10분)
- 상승: SUID 경로 재현 — find로 해당 바이너리 발견, GTFOBins 대조 (35분)
- 결과: 1h 10m. 첫 풀이 7.5h의 1/6.
- 막힘: SUID 바이너리의 옵션 문법에서 15분 — GTFOBins 페이지 북마크 추가

읽는 법: 재공략 시간의 단축은 기억 덕분이니 과대평가하지 마세요. 진짜 수확은 새 경로가 내 손으로 재현됐다는 것과, 재공략에서도 막힌 지점(위의 옵션 문법)이 드러났다는 것입니다.

3-5. 개선점 5개 — 루틴 문서 v2로

복기의 마지막 공정은 "다음 Medium에서는 이렇게 한다" 다섯 줄입니다. 감상이 아니라 행동 규칙으로 씁니다.

[예시 — 여러분의 복기 결과로 쓰세요]
1. 정찰 첫날에 UDP top100까지 마친다 (vhost/UDP는 Day 1 작업이다)
2. vhost 스캔은 TCP 웹 포트 확인 즉시 돌린다 — 경로 스캔보다 먼저
3. sudo -l이 깔끔하면 함정을 의심한다 — 다음 후보를 즉시 병행 탐색
4. GTFOBins는 상승 단계 시작 때 탭으로 열어 둔다
5. 자격증명 발견 시 프로토콜 후보(SSH/폼/API 헤더)를 먼저 분류한다

이 다섯 줄을 Step 252에서 시작한 루틴 문서에 반영해 v2로 만듭니다.

읽는 법: 좋은 개선점의 조건은 "다음 머신에서 실행 가능한가"입니다. "더 꼼꼼히 한다"는 실행 불가라 탈락, "vhost는 Day 1에"는 실행 가능이라 합격입니다. 다음 머신(Step 267) 첫날에 이 다섯 줄을 펴 놓고 시작하세요.


4. 미션과 연습문제

미션 — 복기 노트 완성과 재공략

  1. Step 265 머신의 타임라인을 3-2 형식으로 재구성하고, 총시간과 합이 맞는지 확인하세요.
  2. 공식 + 커뮤니티 Write-up 2편을 2-3의 세 질문(왜 먼저 봤나 / 나는 그 줄을 봤나 / 왜 생략 가능했나)을 던지며 읽고, 3-3의 비교 표를 채우세요.
  3. 차이를 우회·미지·비효율로 분류하고, 내가 더 나은 지점이 있으면 그것도 기록하세요.
  4. 머신을 리셋하고 대안 경로(또는 더 빠른 동일 경로)로 재공략하세요 — 소요 시간과 막힌 지점을 기록합니다.
  5. 개선점 5개를 행동 규칙 형태로 쓰고, 루틴 문서를 v2로 갱신하세요.

연습문제

문제 1. 풀기 전에 Write-up을 보는 것과 푼 뒤에 보는 것의 차이를, "비교의 성립" 관점에서 설명해 보세요.

문제 2. 타임라인 재구성에서 "기록되지 않은 시간"(합이 안 맞는 시간)이 발견됐다면, 그것이 의미하는 바와 대처를 설명해 보세요.

문제 3. 차이의 세 유형(우회·미지·비효율) 중 어느 유형이 플레이북 추가로 이어지고, 어느 유형이 열거 순서 개선으로 이어지는지 쓰고, 처방이 다른 이유를 설명해 보세요.

문제 4. 재공략에서도 막힌 지점이 "진짜 미흡한 곳"이라고 한 이유를 설명해 보세요.


5. 모범 답안과 완료 기준

미션 모범 답안

복기 노트의 완성 형태는 3-1~3-5의 예시를 합친 것입니다. 핵심 요건은 넷입니다 — ① 타임라인의 합계가 로그와 일치, ② 비교 표에 최소 한 행의 "갈림"이 있고 그것이 유형 분류됨, ③ 재공략 기록에 소요 시간과 막힘 지점이 명시됨, ④ 개선점 5개가 전부 실행 가능한 문장(동사로 시작, 조건이 있음).

개선점의 나쁜 예와 좋은 예:

✗ "열거를 더 잘한다"          → 실행 방법이 없음
✓ "웹 포트 확인 즉시 vhost 스캔을 돌린다" → 다음 머신 첫날에 바로 실행 가능
✗ "시간을 줄인다"              → 측정 기준이 없음
✓ "재공략 기준 시간(머신당)을 루틴 문서에 적어 첫 풀이와 비교한다"

검증하는 법: ① review.md에 5개 섹션이 모두 채워졌는가. ② 비교 표에 "내가 더 나은 지점" 판단이 있는가(없음도 정당 — 근거가 있으면). ③ 재공략 소요 시간이 첫 풀이보다 짧은가 — 길면 그 이유가 기록됐는가. ④ 개선점 5개가 Step 267 첫날에 펴 놓을 수 있는 형태인가.

연습문제 해답

문제 1 해답. 풀기 전에 보면 내 경로가 없으므로 Write-up은 유일한 경로가 되고, 배움은 "따라 하기"에 그칩니다 — 분기점마다 "나라면 어디로 갔을까"를 물을 재료가 없습니다. 푼 뒤에는 내 경로라는 대조군이 있어서, 같은 입력(스캔 출력)에서 왜 다른 행동이 나왔는가를 비교할 수 있습니다. 학습은 결과의 차이가 아니라 판단의 차이에서 일어나는데, 그 판단의 차이는 대조군이 있을 때만 보입니다.

문제 2 해답. 합이 안 맞는 시간은 "무엇을 했는지 로그에 없는 시간" — 대개 막힌 채 헤맨 시간이거나, 기록 습관이 무너진 구간입니다. 의미는 둘입니다. ① 그 시간의 시도들이 평가에서 빠져 있으니 타임라인 분석이 실제보다 후해졌을 가능성, ② 다음 머신에서는 그 구간의 기록 습관(쉘 획득 시 한 줄 적기 등)을 강화해야 한다는 처방. 대처는 추정으로 채우지 말고 "미기록"으로 표시하는 것 — 없는 기록을 꾸미면 복기 전체가 오염됩니다.

문제 3 해답. 미지는 플레이북 추가로 이어지고(몰랐던 기법을 문서에 등재), 우회는 열거 순서 개선으로 이어집니다(같은 정보를 더 빨리 얻는 순서로 교체). 처방이 다른 이유는 차이의 성격이 다르기 때문입니다 — 미지는 지식의 구멍이라 채우면 되지만, 우회는 절차의 배열 문제라 지식 추가로는 안 고쳐집니다. 비효율은 둘 사이로, 도구 옵션이나 짧은 자동화로 해결합니다.

문제 4 해답. 첫 풀이의 막힘은 정보 부족 때문일 수 있지만, 재공략의 막힘은 경로를 이미 아는 상태에서의 막힘입니다. 알고도 못 했다는 것은 그 단계가 이해가 아니라 손의 문제 — 문법이 몸에 없거나 도구 조작이 미숙하다는 뜻입니다. 읽을 때 "이해했다"고 느낀 것과 "할 수 있다"의 간극이 드러나는 곳이라, 다음 훈련의 정확한 좌표가 됩니다.

완료 기준 체크리스트

  • [ ] 타임라인을 재구성했고 합계를 로그와 대조했다
  • [ ] Write-up 3편(공식+커뮤니티 2)을 세 질문과 함께 읽었다
  • [ ] 비교 표를 채우고 차이를 우회·미지·비효율로 분류했다
  • [ ] "내가 더 나은 지점"을 검토하고 근거를 남겼다
  • [ ] 머신을 리셋하고 대안/고속 경로로 재공략했다
  • [ ] 재공략 소요 시간과 막힘 지점을 기록했다
  • [ ] 개선점 5개를 실행 가능한 문장으로 썼다
  • [ ] 루틴 문서를 v2로 갱신했다

6. 흔한 실수와 해결

벽 1. "Write-up을 읽으니 내 풀이가 부끄럽다"

증상: 남들은 10분에 한 것을 나는 3시간에 했고, 노트를 쓰는 손이 멈춥니다.
원인: 비교의 방향이 틀렸습니다. 지금 비교해야 할 것은 "남의 지금"이 아니라 "내 어제"입니다. 그리고 그 10분의 Write-up 작성자도 첫 Medium에서는 며칠 걸렸습니다 — 여러분은 그 사람의 백 번째 판을 보고 있습니다.
해결: 복기 노트의 첫 문장을 "첫 풀이는 혼자 힘으로 root까지 갔다"로 고정하세요. 독립 해결과 고속 해결은 다른 기술이고, 전자 없이 후자는 없습니다. 차이는 수치로만 적습니다 — 감정은 분석이 끝난 뒤에 봐도 늦지 않습니다.

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

증상: 세 편이 세 경로라 비교 표가 어질러집니다.
원인: 정상입니다 — Medium은 대안 경로가 있는 경우가 많고, 그것이 그 머신의 가치입니다.
해결: 모든 경로를 다 배우려 하지 말고, 내 경로와 가장 가까운 대안 하나만 골라 재공략하세요. 나머지 경로는 "존재를 안다" 수준으로 표에만 남기면 됩니다. 재공략은 깊이 하나가 넓이 셋을 이깁니다.

벽 3. "재공략이 첫 풀이보다 오래 걸렸다"

증상: 대안 경로로 했는데 3시간을 썼습니다.
원인: 대안 경로의 기법이 낯설어서입니다 — 첫 풀이 때 익숙한 길로 간 이유가 있었던 것입니다.
해결: 실패가 아니라 측정입니다. 그 낯선 기법이야말로 이번 복기의 핵심 수확이니, 막힌 정확한 지점(명령? 문법? 개념?)을 기록하고 같은 경로를 한 번 더 통과하세요. 두 번째 통과 시간이야말로 진짜 재공략 시간입니다.

벽 4. "개선점이 ‘더 열심히’ 계열로만 나온다"

증상: 개선점이 "더 꼼꼼히", "더 빨리" 같은 다짐으로 채워집니다.
원인: 차이 분류를 건너뛰고 결론부터 쓰려 해서입니다. 다짐은 원인 분석이 없는 처방입니다.
해결: 개선점은 반드시 비교 표의 한 행에서 파생시키세요 — "표의 이 행에서 나는 X를 했고 남은 Y를 했다, 다음부터는 Y를 한다"의 형식입니다. 표에 없는 개선점은 근거 없는 개선점입니다.

벽 5. "복기에 하루를 다 쓰고 정작 재공략을 못 했다"

증상: 읽고 정리하다 시간이 갔습니다.
원인: 복기 노트를 완결된 문서로 쓰려 해서입니다. 복기 노트는 작업대이지 출판물이 아닙니다.
해결: 시간 배분을 미리 정하세요 — 타임라인 30분, Write-up 비교 60분, 분류 20분, 재공략 90분, 개선점 20분 정도가 균형입니다. 문장이 거칠어도 재공략을 생략하면 안 됩니다 — 읽기는 눈의 복습, 재공략은 손의 복습이고, 후자가 빠지면 복기의 절반이 사라집니다.


7. 정리

오늘의 개념

개념 한 줄 설명
복기 푼 뒤에 내 경로와 남의 경로를 대조하는 학습 공정
타임라인 재구성 진척 로그를 시간 지도로 펴 불필요 구간을 찾는 작업
우회 / 미지 / 비효율 풀이 차이의 세 유형 — 처방이 각각 다르다
추적 읽기 Write-up에서 "왜 거기를 먼저 봤는가"를 따라가는 읽기
재공략 대안 경로를 직접 재현해 손에 이식하는 마지막 공정
개선점 5개 다음 머신에서 실행 가능한 행동 규칙 형태의 교훈

오늘의 명령어·도구

명령 하는 일
cd htb/first-medium && touch review.md 복기 노트 시작
HTB 콘솔의 Reset Machine 재공략용 머신 초기화
nmap -sV -p- $TARGET -oN retry_full_tcp.txt 재공략 정찰 (기록은 계속된다)
공식 Write-up + 커뮤니티 2편 비교 재료 — 스타일이 다른 것으로

명령어보다 중요한 감각

오늘 한 일의 본질은 "같은 문제를 두 번 푸는 것"이 아니라, 한 번의 경험을 두 번의 학습으로 만드는 것입니다. 첫 풀이가 실력을 측정했다면, 복기는 실력을 교정했습니다. 그리고 재공략은 교정이 손에 들어왔는지 검증했습니다.

개선점 다섯 줄을 펴 놓으세요. 그 다섯 줄이 없는 다음 머신은 오늘을 반복할 뿐이고, 있는 다음 머신은 오늘 위에 쌓입니다. 실력은 푼 대수가 아니라 쌓인 층수로 자랍니다 — 다음 챕터, 두 번째 Medium에서 그 층이 보일 것입니다.


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