Step 274. HTB Hard 도전 2 — 기술 부채 상환: 모르는 것을 목록으로 만들어 갚는다
Level 3 — CTF 실전과 공격 스킬 심화 | 난이도 ★★★★★ | 예상 소요 시간 2일 (부채 상환 반나절 × 3 + 재도전 1일)
전제: Step 273(HTB Hard 도전 1)의 가설 관리표와 공략 로그가 남아 있다.
- 준비물: Step 273의 공략 로그, 마크다운 에디터, 파이썬 3(장부 집계기용), Hack The Box 계정, 새 Hard 머신 1대. 이 챕터의 HTB 공략 장면은 화면 예시, 파이썬 집계기 실행은 실측(2026-09-09, Python 3.12)으로 표시했습니다.
- ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. Hack The Box(
hackthebox.com)는 운영자가 공격 연습용으로 공식 개방한 합법 학습 플랫폼입니다 — 이 플랫폼의 머신 외에는 오늘의 기술을 쓰지 않습니다. - 이 챕터는 훈련 방법론 챕터입니다. 새로운 공격 기법보다 "모르는 것을 다루는 시스템"을 만드는 것이 목표입니다.
첫 Hard 도전(Step 273)이 끝났다면, 완주했든 막혔든 여러분의 손에는 귀중한 것이 하나 남아 있습니다 — 내 지식 지도의 빈칸 목록입니다. 몰라서 넘어간 프로토콜, 처음 본 프레임워크, 출력이 안 읽혔던 도구. 이 빈칸들이 바로 기술 부채(technical debt)입니다.
실력은 도전의 횟수가 아니라 "도전 → 공백 발견 → 학습 → 재도전" 루프의 회전수에서 자랍니다. 오늘은 그 루프의 두 번째 바퀴입니다 — 첫 Hard의 빈칸을 장부로 만들어 반나절씩 갚고, 다른 유형의 Hard로 재도전합니다. 이번엔 저번보다 멀리 가는 것, 그것만이 목표입니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- 공략 로그에서 "몰라서 못한 것"을
[모름]태그로 추출한다 - 기술 부채 장부를 만들어 항목별 상태(미상환/상환 중/상환 완료)를 관리한다
- 모르는 기술 하나를 반나절 안에 "실전에서 쓸 수준"으로 학습하는 절차를 수행한다
- 첫 Hard와 다른 유형의 머신을 골라 약점이 아닌 강점 확장을 검증한다
- 두 번의 Hard 공략을 단계별로 비교해 진전을 수치로 확인한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | 마크다운(로그·장부), 파이썬 3(집계기), Hack The Box Hard 머신 |
| 오늘의 명령 | 전부 복습 + 학습 단계의 공식 문서·HackTricks 열람 |
| 필요한 개념 | 기술 부채(technical debt), 부채 장부, 반나절 학습 단위, 재도전 루프 |
| 오늘의 산출물 | 기술부채장부.md(3건 이상 상환) + 두 번째 Hard 공략 로그 |
2-1. 기술 부채 — 모른 채 넘어간 것에는 이자가 붙는다
소프트웨어 공학에서 기술 부채는 "빨리 가려고 미뤄둔 올바른 구현"입니다. 침투 학습에서도 같은 일이 일어납니다 — Hard 머신에서 모르는 기술을 만나면 우회하거나 힌트를 보고 넘어가는데, 그렇게 넘어간 지식은 다음 머신에서 이자를 붙여 돌아옵니다. 같은 프로토콜이 다른 얼굴로 다시 등장하고, 그때마다 같은 자리에서 멈춥니다.
부채의 무서운 점은 보이지 않는다는 것입니다. "그냥 그 머신이 어려웠다"로 기억되면 빈칸은 영원히 빈칸입니다. 그래서 이 챕터의 첫 번째 규칙은 — 모르는 것을 만나는 즉시 장부에 적는다. 장부에 적힌 부채는 갚을 수 있고, 적히지 않은 부채는 평생 따라다닙니다.
2-2. 부채 장부의 설계 — 번호, 분야, 발견 맥락, 상태
장부 항목은 네 칸으로 충분합니다.
DEBT-002 | 분야: 웹 | 상태: 미상환 → 상환 중 → 상환 완료
- 발견: Hard 머신 A, 443/tcp SAML 로그인 화면에서 정지 (Step 273 로그 1:10)
- 내용: SAML 인증 흐름과 흔한 취약점(XML 서명 래핑 등)
- 학습 계획: 공식 문서 개요 1h → HackTricks SAML 절 1h → 미니 실습 2h
여기서 가장 중요한 칸은 발견 맥락입니다. "SAML 공부하기"라고만 적으면 학습이 끝없이 넓어지지만, "머신 A의 로그인 화면에서 멈췄다"가 붙으면 학습 범위가 "로그인 우회에 필요한 만큼"으로 좁혀집니다. 부채 상환의 목표는 그 기술의 전문가가 되는 것이 아니라 다음 공략에서 같은 자리를 통과하는 것입니다.
2-3. 반나절 학습 단위 — 문서, 치트시트, 미니 실습
항목 하나당 반나절(4시간) 을 상한으로 둡니다. 순서는 고정입니다.
- 공식 문서 개요(1시간): 그 기술이 무엇을 위해 존재하는지, 정상 흐름이 어떻게 생겼는지. 정상을 모르면 비정상(취약점)을 알아볼 수 없습니다.
- 공격자 관점 치트시트(1시간): HackTricks, PayloadsAllTheThings 같은 정리본에서 "이 기술이 뚫리는 전형적 패턴"만 훑습니다. 전부 외우지 않습니다 — 패턴의 이름과 징후만.
- 미니 실습(2시간): 실제로 손이 움직여야 장부에서 지워집니다. 관련 THM 룸, HTB Academy 모듈, 또는 직접 띄운 도커 환경에서 해당 기법을 한 번 성공시킵니다.
반나절이 지나도 감이 안 오면? 그 항목은 상환 중으로 남기고 다음 항목으로 넘어갑니다. 모르는 채로 부딪히는 것도 전략입니다 — 실전에서 다시 만났을 때의 절박함이 최고의 교사인 경우가 있습니다.
2-4. 재도전 머신 선정 — 같은 유형을 피한다
두 번째 Hard는 첫 번째와 다른 유형을 고릅니다. 첫 대가 AD(Active Directory) 계열이었다면 이번엔 웹 중심이나 리눅스를, 웹이었다면 리버싱 요소가 있는 것을. 같은 유형을 다시 하면 부채 상환의 효과를 측정할 수 없습니다 — 원래 알던 것으로 풀었는지, 새로 갚은 것으로 풀었는지 구분이 안 되니까요.
3. 따라 하기
3-1. 공략 로그에서 부채 추출 — 장부 집계기
먼저 Step 273의 로그를 열고, "몰라서 멈췄던 순간"마다 [모름] 분야: 내용 태그를 붙여 과거형으로 복원합니다. 로그가 길면 눈이 빠지니, 태그를 수집해 장부로 만들어 주는 작은 집계기를 씁니다.
입력 (tmp_test/debt_ledger.py의 핵심 부분):
def parse_log(path):
"""공략 로그에서 '[모름] 분야: 내용' 형식의 줄을 추출한다."""
debts = []
pat = re.compile(r"\[모름\]\s*([^:]+):\s*(.+)")
for i, line in enumerate(Path(path).read_text(encoding="utf-8").splitlines(), 1):
m = pat.search(line)
if m:
debts.append({"field": m.group(1).strip(),
"what": m.group(2).strip(), "state": "미상환"})
return debts
입력 (로그 발췌 — 예시 재료):
# Hard 머신 A 공략 로그 (발췌)
0:40 389번 LDAP 익명 바인드 됨. 근데 다음이 뭐지 [모름] AD: LDAP 쿼리로 사용자 목록 뽑는 문법
1:10 443 웹은 SAML 로그인. SAML이 뭔지부터 모르겠다 [모름] 웹: SAML 인증 흐름과 흔한 취약점
2:30 certipy 돌려봤는데 출력 해석 불가 [모름] AD CS: 인증서 템플릿 오설정 공격(ESC1~8)
출력 (2026-09-09 실측, Python 3.12):
번호 분야 상태 내용
----------------------------------------------------------------
DEBT-001 AD 미상환 LDAP 쿼리로 사용자 목록 뽑는 문법
DEBT-002 웹 미상환 SAML 인증 흐름과 흔한 취약점
DEBT-003 AD CS 미상환 인증서 템플릿 오설정 공격(ESC1~8)
----------------------------------------------------------------
총 3건 | 미상환 3건
읽는 법: "어려운 머신이었다"는 막연한 기억이 세 줄의 구체적 부채가 됐습니다. 이제 갚을 대상이 이름을 가졌습니다. 여러분의 실제 로그에서는 항목 수가 다릅니다 — 3건이든 10건이든 정상입니다.
왜 스크립트인가: 수동으로도 할 수 있지만, 장부 작성이 명령 한 번이면 재도전 루프를 돌 때마다 마찰 없이 반복할 수 있습니다. 훈련 시스템은 자동화될수록 오래 갑니다.
3-2. 부채 한 건 갚기 — DEBT-001의 반나절
DEBT-001(LDAP 쿼리 문법)을 예로 상환 절차를 밟아 봅니다.
- 1시간차: LDAP이 무엇인지 — 디렉터리 서비스, 트리 구조,
dn·ou·cn의 의미를 공식 문서 수준에서 파악합니다. - 2시간차: HackTricks의 AD 열거 절에서 익명 바인드 후 사용자 목록을 뽑는 전형 쿼리
(&(objectClass=user))같은 패턴을 수집합니다. - 3~4시간차: THM의 AD 관련 룸이나 HTB Academy 모듈에서
ldapsearch로 직접 쿼리를 날려 사용자 목록을 얻습니다.
화면 예시 (미니 실습의 성공 장면 — 여러분의 환경에서 직접 확인하세요):
$ ldapsearch -x -H ldap://10.10.11.x -b "dc=corp,dc=local" "(objectClass=user)" sAMAccountName
# ... (중략) ...
sAMAccountName: administrator
sAMAccountName: svc_backup
sAMAccountName: j.smith
읽는 법: "목록을 얻었다"는 결과보다 중요한 것은 — 다음 공략에서 익명 바인드가 되는 순간, 여러분의 손이 자동으로 이 쿼리를 치게 된다는 것입니다. 그게 상환 완료의 정의입니다. 장부에서 상태를 상환 완료로 바꿉니다.
3-3. 두 번째 Hard 공략 — 보완 지식이 쓰이는 순간을 표시한다
새 Hard 머신을 고르고 Step 273의 가설 관리표 방식 그대로 공략합니다. 단, 이번엔 규칙이 하나 추가됩니다 — 상환한 지식이 실전에서 쓰일 때마다 로그에 [상환] 태그를 붙입니다.
화면 예시 (두 번째 Hard 로그의 발췌):
# Hard 머신 B 공략 로그 (발췌)
0:15 389/tcp LDAP 열림 — 익명 바인드 시도
0:20 [상환 DEBT-001] ldapsearch로 사용자 14명 목록 확보 — 막힘 없이 통과!
0:45 목록에서 서비스 계정 발견, AS-REP roasting 후보로 표시
...
3:10 user 쉘 확보. 첫 대에서는 여기까지 2일 걸렸는데 3시간.
읽는 법: [상환] 태그가 루프의 회전 증거입니다. 부채를 갚는 행위가 추상적인 "공부"가 아니라 측정 가능한 진전으로 바뀌는 순간입니다.
3-4. 두 대 비교 — 단계별 진전표
공략이 끝나면(또는 타임박스가 끝나면) 두 머신을 단계별로 나란히 놓습니다.
| 단계 | 첫 Hard (머신 A) | 두 번째 Hard (머신 B) |
|------|--------------------|------------------------|
| 정찰~공격 표면 파악 | 4시간 | 1시간 |
| 첫 유의미한 발견 | 1일차 말 | 0:45 |
| 첫 쉘 | 미도달 | 3:10 |
| 권한 상승 진입 | 미도달 | 진행 중 |
읽는 법: 완주 여부보다 각 단계의 도달 시각을 비교하세요. "첫 발견까지 1일 → 45분"은 부채 상환이 만든 차이입니다. 이 표가 다음 부채 목록의 우선순위를 정합니다 — 이번에도 오래 걸린 단계가 다음 루프의 학습 대상입니다.
4. 미션과 연습문제
미션 — 부채 3건 상환과 재도전
- Step 273의 공략 로그 전체에
[모름] 분야: 내용태그를 복원하고, 집계기로 부채 목록을 만듭니다. - 각 부채에 학습 계획(문서 1h + 치트시트 1h + 미니 실습 2h)을 붙여
기술부채장부.md를 완성합니다. - 부채 3건 이상을 반나절 단위로 상환하고 상태를 갱신합니다 — 미니 실습 성공 장면을 증거로 남깁니다.
- 첫 Hard와 다른 유형의 Hard 머신을 골라 가설 관리표로 공략하고,
[상환]태그가 붙은 순간을 기록합니다. - 두 대의 단계별 비교표를 작성하고, 다음 루프에서 갚을 부채 후보를 정합니다.
연습문제
문제 1. 기술 부채의 "이자"가 침투 학습에서 구체적으로 어떤 형태로 나타나는지 설명해 보세요.
문제 2. 부채 장부의 "발견 맥락" 칸이 학습 범위를 좁혀 주는 이유는 무엇인가요?
문제 3. 반나절 학습 단위에서 "공식 문서 → 치트시트 → 미니 실습" 순서를 고정하는 이유를 각 단계의 역할과 함께 설명해 보세요.
문제 4. 재도전 머신을 첫 대와 다른 유형으로 고르는 이유는 무엇인가요? 같은 유형을 골랐을 때 생기는 측정 오류를 설명해 보세요.
5. 모범 답안과 완료 기준
미션 모범 답안
재도전의 완주 여부는 채점 대상이 아닙니다. 검증 기준으로 확인하세요.
- 장부의 존재:
[모름]태그에서 시작해 번호·분야·발견 맥락·상태가 갖춰진 장부가 있는가. - 상환의 증거: 상환 완료로 표시된 항목마다 미니 실습의 성공 화면이나 명령 기록이 붙어 있는가 — "읽었다"는 상환이 아니라 "해냈다"가 상환입니다.
[상환]태그의 등장: 두 번째 공략 로그에 상환 지식이 쓰인 순간이 최소 1회 기록돼 있는가.- 비교표의 정직성: 단계별 비교가 기분이 아니라 시각으로 돼 있는가. 두 번째 대가 더 막혔어도, 그 사실이 적혀 있으면 성공입니다 — 그게 다음 부채의 발견이니까요.
연습문제 해답
문제 1 해답. 같은 기술이 다른 머신에서 다른 얼굴로 다시 등장할 때마다 같은 자리에서 멈추는 형태로 나타납니다. LDAP을 모른 채 넘기면, 다음 AD 머신의 389번 포트에서도, 그다음 머신의 사용자 열거 단계에서도 매번 같은 벽을 만납니다. 부채는 사라지지 않고 반복 청구됩니다 — 그래서 "그 머신이 어려웠다"로 넘기지 않고 장부에 적어 갚아야 합니다.
문제 2 해답. 발견 맥락은 "이 기술의 어디까지가 필요한가"의 경계선이기 때문입니다. "SAML 공부"는 범위가 무한하지만, "머신 A의 로그인 화면 통과"가 필요 조건이면 학습 목표가 "로그인 흐름 이해 + 흔한 우회 패턴"으로 좁혀집니다. 부채 상환의 목표는 전문가가 되는 것이 아니라 같은 자리를 다시는 안 막히는 것이므로, 맥락이 없는 학습은 끝이 없고 맥락이 있는 학습은 완료 조건이 있습니다.
문제 3 해답. 공식 문서는 정상 흐름을 줍니다 — 정상을 모르면 비정상(취약점)을 알아볼 수 없습니다. 치트시트는 공격 패턴의 이름과 징후를 줍니다 — 실전에서 "이거 그 패턴이다"를 인식하는 감각입니다. 미니 실습은 손의 기억을 줍니다 — 읽은 것은 검색하면 되지만, 성공시켜 본 것만이 실전의 압박 속에서도 나옵니다. 순서가 뒤집히면 실습에서 만나는 모든 현상을 해석할 프레임이 없어 헤맵니다.
문제 4 해답. 부채 상환의 효과를 측정할 수 없기 때문입니다. 같은 유형을 다시 하면 진전이 "원래 알던 것" 덕인지 "새로 갚은 것" 덕인지 분리가 안 됩니다 — 변수가 하나여야 실험이 성립합니다. 다른 유형의 머신에서 막힘 없이 통과한 단계가 있다면, 그것은 순수하게 상환의 성과로 기록할 수 있습니다.
완료 기준 체크리스트
- [ ] Step 273 로그에서
[모름]태그로 부채 목록을 추출했다 - [ ] 번호·분야·발견 맥락·상태를 갖춘
기술부채장부.md를 만들었다 - [ ] 부채 3건 이상을 반나절 단위 학습으로 상환 완료 표시했다
- [ ] 각 상환 완료 항목에 미니 실습 성공 증거가 붙어 있다
- [ ] 첫 대와 다른 유형의 Hard 머신을 공략하고 로그를 남겼다
- [ ] 로그에
[상환]태그가 1회 이상 등장한다 - [ ] 두 대의 단계별 비교표를 작성했다
6. 흔한 실수와 해결
벽 1. 집계기를 돌렸더니 FileNotFoundError가 떠요
증상 (2026-09-09 실측):
FileNotFoundError: [Errno 2] No such file or directory: 'no_such_file.md'
원인: 스크립트를 실행한 위치와 로그 파일의 위치가 다릅니다. 파이썬은 명령을 실행한 디렉터리 기준으로 상대 경로를 찾습니다.
해결: 로그 파일의 절대 경로를 넘기거나, 로그가 있는 디렉터리로 이동해 실행하세요. ls로 파일명 철자부터 확인하는 것이 가장 빠릅니다 — 파일명의 한글·공백 오타가 이 에러의 가장 흔한 실제 원인입니다.
벽 2. 부채가 너무 많아서 (10건 넘게) 엄두가 안 나요
증상: 첫 Hard 로그를 태깅했더니 모르는 것 투성이입니다.
원인: 정상입니다 — 첫 Hard는 원래 그렇게 보여야 맞습니다. 문제는 부채 수가 아니라 우선순위의 부재입니다.
해결: "다음 머신에서 다시 만날 확률" 순으로 정렬하세요. AD 기초(LDAP, Kerberos)처럼 Hard 전반에 반복 등장하는 것이 상위입니다. 이번 루프에서 갚는 것은 3건이면 충분합니다 — 나머지는 장부에 살아 있으니 잊히지 않습니다.
벽 3. 반나절로는 어림도 없는 부채가 있어요 (예: "커널 익스플로잇")
증상: 4시간으로는 입문도 못 할 것 같은 거대 주제가 장부에 잡힙니다.
원인: 부채의 분해가 안 됐습니다. "커널 익스플로잇"은 기술이 아니라 학문 분야입니다.
해결: 발견 맥락으로 쪼개세요 — 그 머신에서 실제로 필요했던 것은 "커널 익스플로잇" 전체가 아니라 "이 커널 버전의 알려진 CVE를 찾아 PoC를 돌리는 절차"였을 겁니다. 장부 항목은 반나절에 끝나는 크기로 다시 적어야 돌아갑니다.
벽 4. 상환하다 보니 공부만 하고 머신은 안 하게 돼요
증상: "준비가 더 필요하다"며 재도전이 계속 미뤄집니다.
원인: 소재 원문이 지적하는 그 함정입니다 — 공백 메우기를 무한 연기하는 것은 불안의 회피이지 전략이 아닙니다.
해결: 규칙을 숫자로 고정하세요 — 부채 3건, 각 반나절이 끝나면 무조건 재도전 머신을 켭니다. 모르는 채로 부딪혀서 장부에 새 항목이 쌓이는 것도 루프의 정상 작동입니다. 완벽한 준비는 없고, 준비와 실전의 교대만이 있습니다.
벽 5. 두 번째 Hard가 첫 번째보다 더 막혀요
증상: 부채를 갚고 갔는데 오히려 성적이 나쁩니다.
원인: 머신마다 요구하는 부채의 종목이 다릅니다. 웹 부채를 갚고 AD 머신을 만나면 상환분이 안 쓰입니다 — 실력 퇴보가 아니라 종목 불일치입니다.
해결: 비교표를 단계별로 다시 읽으세요. "이번에도 오래 걸린 단계"가 이번 루프가 발견한 새 부채입니다. 그리고 총량으로도 봅니다 — 장부의 미상환 수가 도전마다 줄고 있다면, 루프는 돌고 있는 것입니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| 기술 부채 | 모른 채 넘어간 지식 — 다음 머신에서 이자를 붙여 재등장 |
| 부채 장부 | [모름] 태그에서 시작해 번호·분야·맥락·상태를 관리하는 목록 |
| 발견 맥락 | 학습 범위를 "다음 통과에 필요한 만큼"으로 좁혀 주는 경계선 |
| 반나절 학습 단위 | 문서 1h(정상) → 치트시트 1h(패턴) → 미니 실습 2h(손) |
[상환] 태그 |
갚은 지식이 실전에서 쓰인 순간의 기록 — 루프의 회전 증거 |
| 재도전 루프 | 도전 → 공백 발견 → 학습 → 재도전. 실력은 회전수에서 자란다 |
오늘의 도구
| 도구·명령 | 하는 일 |
|---|---|
[모름] 분야: 내용 |
로그에 부채를 남기는 태그 — 추출의 원료 |
debt_ledger.py (예제 스크립트) |
태그를 모아 장부 표로 출력 |
| 공식 문서 → HackTricks → 미니 실습 | 반나절 상환의 고정 순서 |
| 단계별 비교표 | 두 도전의 진전을 시각으로 비교하는 도구 |
명령어보다 중요한 감각
Hard를 두 번 도전해 보면 압니다 — 실력자와 초보의 차이는 아는 것의 양이 아니라 모르는 것을 만났을 때의 시스템입니다. 막히는 것은 누구에게나 일어나고, 장부에 적혀서 갚아지는지 잊혀서 반복 청구되는지가 갈림길입니다.
첫 Hard가 빈칸 지도를 줬다면, 오늘은 그 지도를 채우는 채무 관리 시스템을 얻었습니다. 이 루프가 몸에 붙으면 Hard는 더 이상 벽이 아니라 다음 학습 목록을 뽑아 주는 기계가 됩니다.
전부 체크되면 Step 274 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.