Step 306. 열거의 철저함 — "Try Harder"의 실체
Level 4 — 전문가 | 난이도 ★★★☆☆ | 예상 소요 시간 1~2일
전제: Step 305에서 연습 머신 2대와 보고서 초안 훈련을 마쳤다. nmap 기본 사용법(Step 96~117 구간)을 안다.
- 준비물: 연습 머신 계정(HTB/PG), 공격 머신, Step 305의 세 줄 회고들, 새 머신 2대분의 시간.
- ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다.
- 실측 안내: 이 챕터의
nmap비교 출력은 집필 환경(WSL Ubuntu, nmap 7.94SVN)에서 localhost를 대상으로 실제 실행한 결과입니다. 연습 머신 공략 화면은 화면 예시입니다.
OffSec의 모토 "Try Harder"를 오해하면 시험에 집니다. 이 말은 "더 무식하게 시도하라"가 아니라 "더 철저히 열거하라"는 뜻입니다. 시험 머신에서 막히는 원인의 대부분은 새로운 기술의 부재가 아니라 놓친 열거입니다 — 안 본 포트, 안 긁은 디렉터리, 안 읽은 배너, 기본값으로 돌린 스캔. 오늘은 "막혔을 때 어디로 되돌아가는가"를 규칙과 체크리스트로 만들고, 실제로 막히는 연습을 합니다. 기술이 아니라 끈기의 시스템화 — 그것이 오늘의 주제입니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- "Try Harder"의 진짜 의미를 "열거로의 회귀"로 정의할 수 있다
- 전체 포트 스캔과 상위 1000개 스캔의 차이를 실측으로 설명한다
- 나만의 "막혔을 때 체크리스트"를 만들어 실제 공략에 적용한다
- 막힘을 "몇 분에 어떤 체크로 풀었는지" 기록해 약점 지도를 만든다
- 90분 규칙으로 끈기와 효율의 균형점을 지킨다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | 연습 머신(HTB/PG) + 공격 머신 — 그리고 오늘의 실측은 WSL의 nmap |
| 오늘의 명령 | nmap -p-, sudo nmap -sU --top-ports 100, gobuster 대형 워드리스트, vhost 확인 |
| 필요한 개념 | 열거 회귀, 철저함의 체크리스트, 막힘 로그, 90분 규칙 |
| 오늘의 산출물 | 나만의 "막혔을 때 체크리스트" 1부 + 막힘 해결 로그 + 머신 2대(누적 4대) |
2-1. Try Harder의 실체 — 기술이 아니라 가정의 전환
막혔을 때 초보와 숙련자는 다른 가정을 합니다.
✗ 초보의 가정: "내가 모르는 새로운 기술이 필요하다"
→ 구글에서 익스플로잇을 뒤지며 시간 소진
○ 숙련자의 가정: "이미 가진 정보를 덜 봤다"
→ 열거 결과로 되돌아가 빠진 것을 찾는다
OSCP 머신은 "이미 배운 기술"로 설계됩니다. 난이도는 기술의 새로움이 아니라 정보의 숨김 정도로 조절됩니다 — 포트가 비표준 번호에 있거나, 힌트가 파일 주석에 있거나, 두 번째 워드리스트에서야 디렉터리가 나오거나. 그래서 막힘의 해법은 거의 항상 열거로의 회귀입니다.
2-2. 실측 — 상위 1000개 스캔이 놓치는 것
말로만 하지 않고 직접 확인합니다. 집필 환경(WSL Ubuntu, nmap 7.94SVN)에서 localhost를 두 가지로 스캔한 실측 결과입니다.
기본 스캔(상위 1000개 포트만 검사):
nmap 127.0.0.1
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000010s latency).
All 1000 scanned ports on localhost (127.0.0.1) are in ignored states.
Not shown: 1000 closed tcp ports (reset)
Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds
"아무것도 없는 머신"으로 보입니다. 그런데 전체 포트 스캔:
nmap -p- --min-rate 10000 127.0.0.1
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000010s latency).
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE
43463/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 0.32 seconds
43463/tcp에서 열린 서비스가 발견됐습니다. 기본 스캔은 1000개만 봐서 이 포트를 완전히 놓쳤습니다. 시험 머신에서 "아무것도 없다"는 결론이 틀렸던 순간의 대부분이 정확히 이것입니다 — 없는 게 아니라 안 본 것입니다. 0.32초면 65535개 전부를 볼 수 있는데 상위 1000개로 만족할 이유는 없습니다.
2-3. 막혔을 때 체크리스트 — 되돌아갈 곳의 목록
숙련자의 "Try Harder"는 실은 목록 실행입니다. 기본 골격:
□ 전체 TCP 포트를 봤는가? nmap -p- (상위 1000개만 본 건 아닌가)
□ UDP 상위 포트를 봤는가? sudo nmap -sU --top-ports 100
□ 웹이라면 — vhost를 확인했는가? (IP와 도메인 이름으로 각각 접속)
□ 웹이라면 — 더 큰 워드리스트로 디렉터리 스캔을 다시 했는가?
□ 웹이라면 — 파라미터 퍼징(/page.php?id=FUZZ)을 했는가?
□ 서비스 배너를 "검색"까지 했는가? (버전 → searchsploit → 읽기)
□ 발견한 자격증명을 "모든" 서비스에 시도했는가? (SSH/FTP/DB/웹 로그인)
□ 찾은 파일을 "끝까지" 읽었는가? (주석, 백업 파일 .bak/.old, 설정 파일)
□ 권한 상승이라면 — 정찰 자동화 도구 출력을 끝까지 읽었는가?
□ 30분 전의 나에게 묻는다: 뭘 안 봤지?
중요한 것은 이 목록이 고정물이 아니라 성장물이라는 점입니다 — 막힘을 풀 때마다 "나를 구한 체크"가 목록에 추가됩니다.
2-4. 90분 규칙 — 끈기의 적정선
끈기에도 설계가 필요합니다.
막힘 발생
→ 0~90분: 체크리스트를 "처음부터" 순서대로 다시 실행
→ 90분 경과: 힌트 "한 단계"만 본다 (전체 워크스루 금지)
→ 힌트로 풀리면: 그 지점을 막힘 로그에 기록 — "왜 거기서 멈췄는가"
→ 힌트 없이 풀면: "어느 체크가 구했는가"를 로그에 기록
워크스루 전체를 읽는 순간 그 머신은 훈련 가치를 잃습니다 — 시험에 워크스루는 없으니까요. 반대로 4시간을 같은 화면만 보며 태우는 것도 훈련이 아니라 고문입니다. 90분의 전면 재열거 + 한 단계 힌트가 연습기의 최적점입니다.
3. 따라 하기
3-1. 나만의 체크리스트 초판 만들기
2-3의 골격을 복사해 개인 위키에 막혔을때-체크리스트.md를 만듭니다. 여기에 Step 305 회고에서 "나를 구한 열거"를 이미 추가하세요 — 예를 들어 회고에 "SMB 버전 확인을 늦게 했다"가 있었다면 목록에 □ SMB라면 — 익명 열거(enum4linux)를 했는가?가 올라갑니다.
체크리스트는 한 화면에 보이는 분량(15~25개)을 유지하세요. 100개짜리 목록은 실행되지 않습니다.
3-2. 새 머신 2대 공략 — 이번엔 난이도를 올려서
Step 304 목록에서 Easy 후반~Medium 초반 2대를 고릅니다. 오늘의 규칙 하나:
"답이 안 보일 때 새로운 도구를 찾지 않는다 — 체크리스트로 되돌아간다."
공략 중 막힐 때마다 멈추고 체크리스트를 위에서부터 실행합니다. 어느 항목에서 뚫렸는지를 즉시 표시하세요 (화면 예시):
[막힘 1] 47분 — 웹 루트에 아무것도 없음
→ 체크: vhost 미확인 발견. /etc/hosts에 도메인 추가 후 접속
→ 다른 사이트가 열림. 해결: vhost 체크 (소요 6분)
3-3. 막힘 해결 로그 — 약점 지도의 원료
머신당 막힘마다 한 건씩 남깁니다 — 목표는 머신 2대에 로그 4건 이상입니다.
## 막힘 로그 — [머신 이름]
- 시각: 공략 시작 후 __분
- 증상: (무엇이 안 됐는가)
- 구한 체크: (체크리스트 몇 번째 항목)
- 왜 놓쳤나: (습관의 구멍 — 예: "웹이면 vhost부터"가 없었다)
- 체크리스트 개정: (추가/수정한 항목)
"왜 놓쳤나"가 핵심입니다 — 기술이 아니라 습관의 구멍을 적어야 다음 머신에서 같은 구멍에 빠지지 않습니다.
3-4. 체크리스트 개정과 보고서 이어쓰기
두 대가 끝나면 체크리스트를 개정합니다 — 구한 체크는 위로 올리고, 한 번도 안 쓴 항목은 아래로. 그리고 Step 305의 서식으로 보고서 초안을 이어 씁니다(누적 4부).
완성된 체크리스트는 시험 당일의 비상 절차서입니다. 지금부터 시험 전까지 30대의 머신을 지나며 다듬어질 문서이므로, 초판이 거칠어도 괜찮습니다 — 실행되는 목록이 완벽한 목록보다 낫습니다.
4. 미션과 연습문제
미션 — 체크리스트 완성과 적용
- 2-3 골격 + Step 305 회고 반영으로 나만의 체크리스트 초판을 만든다
- Easy 후반~Medium 초반 머신 2대를 공략하며, 막힐 때마다 체크리스트를 위에서부터 실행한다
- 막힘 해결 로그를 머신당 2건 이상(합계 4건 이상) 남긴다 — "왜 놓쳤나" 포함
- 공략 후 체크리스트를 개정한다(항목 순서 조정 + 신규 항목 추가)
- 보고서 초안을 이어 써 누적 4부를 만든다
연습문제
문제 1. "Try Harder"를 "더 무식하게 시도하라"로 오해했을 때 생기는 구체적 손해를 설명해 보세요.
문제 2. 2-2 실측에서 기본 스캔과 전체 스캔의 결과가 어떻게 달랐고, 그것이 시험에서 무엇을 의미하는지 말해 보세요.
문제 3. 막힘 로그에 "구한 체크"뿐 아니라 "왜 놓쳤나"를 적어야 하는 이유는 무엇인가요?
문제 4. 90분 규칙에서 힌트를 "전체 워크스루"가 아니라 "한 단계"만 보라는 이유를, 훈련 가치의 관점에서 설명해 보세요.
5. 모범 답안과 완료 기준
미션 모범 답안
잘 작성된 막힘 로그의 예입니다 (머신 공략 부분은 화면 예시):
## 막힘 로그 — Medium 머신 A
- 시각: 공략 시작 후 63분
- 증상: 웹 80번만 열려 있고 디렉터리 스캔 기본 워드리스트로 빈 결과.
- 구한 체크: 체크리스트 4번 "더 큰 워드리스트로 재스캔"
→ directory-list-2.3-medium.txt로 /backup 발견 → 설정 사본 → DB 자격증명
- 왜 놓쳤나: 첫 스캔 결과를 "없다"로 확정해 버리는 습관.
스캔은 "워드리스트만큼만" 보는 것인데 결과를 절대화했다.
- 체크리스트 개정: 4번 항목에 "기본 워드리스트 음성 = '없다'가 아니라
'이 목록엔 없다'" 주의 문구 추가.
검증하는 법: ① 체크리스트 파일이 존재하고 15~25개 범위인가. ② 로그 4건에 "왜 놓쳤나"가 전부 있는가 — 없으면 기술 메모일 뿐 훈련 로그가 아닙니다. ③ 체크리스트가 개정 전후로 달라졌는가(성장 흔적). ④ 로그의 "구한 체크"가 체크리스트의 실제 항목을 가리키는가. ⑤ 누적 보고서 초안 4부가 같은 서식으로 정리됐는가.
연습문제 해답
문제 1 해답. 세 가지 손해가 생깁니다. 첫째, 시간 배분이 망가집니다 — 무작위 익스플로잇 시도는 하나에 30분씩 쓰면서 정작 5분이면 되는 재열거를 생략합니다. 둘째, 로그가 오염됩니다 — 난사한 공격 흔적이 서비스를 락시키거나(계정 잠금, 크래시) 원래 상태를 알 수 없게 만듭니다. 셋째, 훈련이 안 됩니다 — "운 좋게 뚫린" 경험은 재현 불가라 다음 머신에 이전되지 않습니다. 시험 머신의 난이도는 기술이 아니라 숨김이므로, 무작위 시도는 문제 자체를 오독한 것입니다.
문제 2 해답. 실측에서 기본 스캔(상위 1000개)은 "All 1000 scanned ports … are in ignored states"로 열린 포트를 하나도 보고하지 못했지만, 전체 스캔(-p-)은 43463/tcp의 열린 서비스를 찾았습니다. 시험에서 이것은 "이 머신은 공격면이 없다"는 오판이 곧 0점의 직접 원인이 됨을 의미합니다. 65535개 전체 스캔이 1초 미만이면 되는 환경에서 상위 1000개로 만족하는 것은 선택이 아니라 실수입니다.
문제 3 해답. "구한 체크"는 그 머신 한 대의 답이지만, "왜 놓쳤나"는 모든 다음 머신의 답이기 때문입니다. 예컨대 "/backup을 못 찾았다"는 사실이고, "기본 워드리스트 음성을 절대화하는 습관"은 고쳐야 할 나 자신입니다. 후자가 적힌 로그만이 체크리스트 개정으로 이어지고, 그 개정의 누적이 시험 당일의 속도가 됩니다.
문제 4 해답. 워크스루 전체를 읽으면 남은 단계 전부가 "정답 보고 베끼기"가 되어 그 머신의 훈련 가치가 소멸합니다 — 막힘 이후의 침투·상승 구간은 연습이 되지 않습니다. 반면 힌트 한 단계는 "열거에서 무엇을 놓쳤는가"만 알려 주고, 그 이후는 여전히 내가 풀어야 하므로 머신의 나머지 훈련 가치가 살아 있습니다. 그리고 90분의 전면 재열거를 먼저 강제하는 것은, 힌트를 보기 전에 내 체크리스트가 뚫을 기회를 한 번은 주기 위해서입니다.
완료 기준 체크리스트
- [ ] "Try Harder = 열거로의 회귀"를 내 말로 설명할 수 있다
- [ ]
nmap -p-와 기본 스캔의 차이를 실측 예로 설명할 수 있다 - [ ] 나만의 체크리스트 초판(15~25개)을 만들었다
- [ ] 막힐 때 새 도구가 아니라 체크리스트로 되돌아가는 것을 실행했다
- [ ] 막힘 해결 로그 4건 이상을 "왜 놓쳤나" 포함으로 남겼다
- [ ] 공략 후 체크리스트를 실제로 개정했다
- [ ] 미션: 머신 2대 해결 + 누적 보고서 초안 4부 완성
6. 흔한 실수와 해결
벽 1. 전체 스캔을 "느려서" 건너뛴다
증상: 기본 스캔만 돌리고 "열린 게 3개뿐"이라고 결론 내립니다.
원인: 과거 기억의 속도를 기준으로 삼은 것입니다.
해결: 2-2 실측이 답입니다 — localhost 기준 전체 스캔이 0.32초였습니다. 네트워크를 거치는 연습 머신에서도 --min-rate 조정으로 수 분이면 끝납니다. "느리다"는 핑계로 65535개 중 1000개만 보는 것은 시험에서 매번 도박을 하는 것입니다.
벽 2. UDP를 영영 안 본다
증상: TCP만 스캔하는 습관이 굳어 있습니다.
원인: UDP 스캔이 느리고 귀찮기 때문입니다.
해결: 전체가 아니라 상위 100개만 — sudo nmap -sU --top-ports 100 대상. SNMP(161) 같은 UDP 서비스가 초기 자격증명의 문인 머신이 실제로 있습니다. UDP 100개 스캔을 체크리스트 2번에 고정하세요.
벽 3. "안 되는 것"을 계속 다시 시도한다
증상: 같은 익스플로잇을 옵션만 바꿔 열 번째 실행합니다.
원인: 열거 회귀 대신 시도 반복을 선택한 것입니다 — 이것이 Try Harder의 정확한 오용입니다.
해결: 규칙을 세우세요 — "같은 시도는 두 번까지. 세 번째부터는 체크리스트로." 반복 시도의 10분×10회가 체크리스트 한 바퀴(보통 30분)보다 비쌉니다.
벽 4. 체크리스트가 커져서 실행이 안 된다
증상: 항목이 50개를 넘어 막힐 때마다 다 못 봅니다.
원인: 추가만 하고 정리를 안 한 것입니다.
해결: 머신 3~4대마다 정리일을 가지세요 — 최근 안 쓴 항목은 "보관" 절로 내리고, 실행부는 25개 안쪽으로 유지합니다. 체크리스트는 백과사전이 아니라 비상 절차서입니다.
벽 5. 90분을 못 참고 워크스루를 펼친다
증상: 막힌 지 20분 만에 검색하고, 그 뒤로는 베낍니다.
원인: 불안입니다 — "남들은 다 푸는데"라는.
해결: 막힘 로그를 미리 펴 두세요 — 기록할 자리가 있으면 막힘이 "실패"가 아니라 "수집 중인 데이터"가 됩니다. 그리고 힌트를 볼 때는 딱 다음 한 단계까지만 스크롤하세요. 시험 당일의 24시간은 이 90분들로 만들어집니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| Try Harder의 실체 | "무식하게 시도"가 아니라 "철저히 열거" — 가정의 전환 |
| 열거 회귀 | 막힘 = 새 기술 필요(×), 덜 본 정보 있음(○) → 체크리스트로 귀환 |
| 전체 포트 스캔 | 상위 1000개는 표본일 뿐 — -p-로 65535개 전부 |
| 막힘 해결 로그 | 시각·증상·구한 체크·왜 놓쳤나 — 약점 지도의 원료 |
| 90분 규칙 | 90분 전면 재열거 → 한 단계 힌트 → 로그 기록 |
| 체크리스트의 성장 | 구한 체크를 추가·정렬하며 시험일까지 다듬는 살아있는 문서 |
오늘의 명령어·도구
| 명령 | 용도 |
|---|---|
nmap -p- --min-rate 10000 대상 |
전체 TCP 포트 스캔 — "없다"의 유일한 증명 |
sudo nmap -sU --top-ports 100 대상 |
UDP 상위 100개 — SNMP 등 숨은 문 |
| gobuster + 대형 워드리스트 | "이 목록엔 없다"와 "없다"의 구분 |
vhost 확인 (/etc/hosts 등록 후 접속) |
IP와 이름이 다른 사이트를 가리키는지 |
searchsploit 서비스 버전 |
배너 → 알려진 취약점의 연결 |
막혔을때-체크리스트.md |
오늘 만든 비상 절차서 — 시험까지 함께 갈 문서 |
명령어보다 중요한 감각
OSCP의 벽은 기술의 벽이 아니라 시야의 벽입니다. 답은 이미 화면 어딘가에 출력돼 있고, 못 푸는 동안은 그 출력을 아직 안 봤을 뿐입니다. 그래서 이 시험의 끈기는 의지의 문제가 아니라 절차의 문제입니다 — 되돌아갈 목록이 있고, 기록할 자리가 있고, 멈출 시간이 정해져 있으면, 끈기는 성격이 아니라 시스템이 됩니다. 여러분은 오늘 그 시스템의 초판을 만들었습니다.
전부 체크되면 Step 306 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.