Step 307. ★ 프로젝트 — 시험 형식 보고서 템플릿 확정

Step 307. ★ 프로젝트 — 시험 형식 보고서 템플릿 확정

Level 4 — 전문가 | 난이도 ★★★☆☆ | 예상 소요 시간 1일

전제: Step 128(MS2 보고서)과 Step 305~306(머신 4대 + 초안 4부)을 마쳤다. 마크다운 작성에 익숙하다.

  • 준비물: Step 305~306에서 쌓은 보고서 초안 4부, 파이썬 실행 환경, 마크다운 에디터, (선택) pandoc 또는 Obsidian.
  • ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다.
  • 실측 안내: 이 챕터의 검증 스크립트 실행 결과는 집필 환경(Python 3.12.14, Windows)에서 실제 실행한 출력입니다. 시험 보고서의 예시 내용(머신·플래그)은 가공한 예시입니다.
  • 규정 주의: OSCP 보고서 요건은 바뀔 수 있습니다. 응시 전 반드시 공식 시험 가이드에서 증거 규칙을 재확인하세요.

Step 128에서 보고서의 뼈대를, Step 305~306에서 기록하는 습관을 만들었습니다. 오늘은 그 둘을 시험 규격의 최종 템플릿으로 확정합니다. OSCP는 실기가 끝난 뒤 24시간 안에 보고서를 제출해야 하는 시험입니다 — 그 24시간을 "구조 고민"에 쓰는 사람과 "내용 채우기"에만 쓰는 사람의 차이가 합격을 가릅니다. 오늘 템플릿을 만들고, 빠진 것을 잡아 주는 검증 스크립트까지 갖추면, 시험 당일의 보고서는 이미 절반 끝난 상태에서 시작합니다.


1. 학습 목표

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

  • OSCP 보고서 요건(재현 가능 서술, 증거 스크린샷 규칙)을 템플릿 구조로 옮긴다
  • 독립 머신용·AD 세트용 절을 갖춘 마크다운 템플릿을 확정한다
  • 필수 절·증거 키워드·미작성 표시를 검사하는 스크립트를 실행한다
  • 공략과 동시에 템플릿을 채우는 "단계별 기록"을 실제 머신에서 수행한다
  • 마크다운 → PDF 변환 체계를 만든다

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

오늘의 도구 한눈에 보기

구분 내용
언어·환경 마크다운 + 파이썬(검증 스크립트) + PDF 변환 도구(pandoc 또는 Obsidian)
오늘의 명령 python validate_report.py 보고서.md, pandoc 보고서.md -o 보고서.pdf
필요한 개념 재현 가능 서술, 증거 규칙(local/proof + hostname + ip), Step 128의 6단 구조
오늘의 산출물 oscp-report-template.md + validate_report.py + 템플릿으로 쓴 보고서 2부(누적 6부)

2-1. 시험 보고서의 세 가지 요건

시험 가이드가 요구하는 것을 세 줄로 압축하면(세부는 공식 가이드 확인):

① 재현 가능성 — 검토자가 문서만 보고 같은 절차로 침투를 재현할 수 있을 것
② 증거 완결성 — local.txt/proof.txt의 내용 + 그 머신의 식별 정보(hostname, ip)
                가 함께 보이는 스크린샷
③ 코드 표시 — 공개 익스플로잇을 썼다면 원본 출처와 수정한 부분을 명시할 것

Step 128의 6단 구조(요약·정찰·경로·상승·증거·권고)와 무엇이 다른가요? 철학은 같고 강제력이 다릅니다. Step 128은 "좋은 보고서"의 기준이었고, 시험 보고서는 "안 맞추면 감점"되는 규격입니다. 그래서 템플릿으로 고정해 두는 것입니다.

2-2. 템플릿의 설계 — 머신 단위의 반복 블록

시험은 머신이 여러 대이므로 템플릿도 머신 하나 = 블록 하나의 반복 구조로 설계합니다.

# OSCP 시험 보고서            ← 문서 머리: 작성자, OSID, 시험 일시
# 머신 N: [이름] (IP)         ← 이 블록을 머신 수만큼 반복
  ## 요약                     ← 침투 경로 한 문장
  ## 1. 열거                  ← 전체 스캔 + 상세 스캔 출력
  ## 2. 초기 침투             ← 취약점 근거 + 명령 전부
  ## 3. 권한 상승             ← 정찰 발견 + 명령 전부
  ## 4. 증거                  ← local/proof + hostname + ip 캡처
  ## 5. 수정 권고             ← 발견과 1:1 연결
# AD 세트                     ← 세트 전용 블록: 체인 다이어그램 포함
# 부록 A. 도구 목록           ← 금지 도구 미사용 확인
# 부록 B. 익스플로잇 수정 내역 ← 원본 출처와 diff

설계 원칙은 하나 — 시험 당일에 구조를 생각할 일이 없어야 한다. 빈칸 채우기만 남기는 것이 템플릿의 역할입니다.

2-3. 검증 스크립트 — "빠진 것"의 자동 점검

긴 문서에서 "요약을 깜빡했다", "proof 스크린샷 절이 비었다"는 사람이 가장 못 찾는 실수입니다. 그래서 템플릿과 한 세트로, 작성본의 필수 요소를 점검하는 스크립트를 만듭니다. 검사 항목:

  • 필수 절(요약~수정 권고)이 존재하는가
  • 증거 키워드(local.txt, proof.txt, hostname)가 있는가
  • 명령/출력 코드 블록이 충분한가
  • 미작성 표시(빈칸, "붙이기" 같은 자리표시자)가 남아 있지 않은가

24시간의 보고서 마감 직전, 이 스크립트 한 번이 "제출 가능 상태"인지를 알려 줍니다.

2-4. 마크다운 → PDF — 제출 형식의 확보

시험 제출은 PDF입니다. 변환 경로는 두 가지가 표준적입니다.

도구 명령/방법 특징
pandoc pandoc report.md -o report.pdf 스크립트화 가능, 재현성 좋음. 별도 설치 필요
Obsidian 보내기 → PDF 에디터에서 바로 확인하며 변환

집필 환경(윈도우 Git Bash, WSL Ubuntu)에는 pandoc이 설치돼 있지 않았습니다(실측: which pandoc 결과 없음). 여러분 환경도 같은지 먼저 확인하고, 없으면 설치하거나 Obsidian 경로를 택하세요. 중요한 것은 시험 전에 변환을 한 번은 완료해 보는 것 — 첫 PDF 변환을 시험 당일에 하면 이미지 누락 같은 문제를 마감 안에 해결해야 합니다.


3. 따라 하기

3-1. 템플릿 파일 작성

oscp-report-template.md를 만듭니다. 뼈대(집필본과 동일하게 검증된 구조):

# OSCP 시험 보고서

작성자: __________
OSID: __________
시험 일시: ____년 __월 __일

---

# 머신 1: [머신 이름] (10.10.x.x) — 독립 머신, 20점

## 요약
(침투 경로 한 문장: "80번 포트 웹의 ___ 취약점으로 쉘을 얻고,
 ___ 설정 오류로 SYSTEM까지 상승했다.")

## 1. 열거
### nmap 전체 포트 스캔
(명령: nmap -p- --min-rate 1000 10.10.x.x — 출력 붙이기)
### 서비스 상세 스캔
(명령: nmap -sC -sV -p [발견 포트] 10.10.x.x — 출력 붙이기)
(서비스마다 한두 줄 해석: 버전, 알려진 취약점 후보)

## 2. 초기 침투
### 취약점과 근거
(무엇이 왜 취약한가 — 추측이 아니라 확인한 근거)
### 공격 과정 (재현 가능하게)
(실행한 명령 전부, 순서대로)
(초기 쉘 증거 스크린샷: whoami + ip a 포함)

## 3. 권한 상승
### 정찰과 발견
### 상승 과정
(실행한 명령 전부, 순서대로)

## 4. 증거
### local.txt
(local.txt 내용 + hostname + ip a가 함께 보이는 스크린샷)
### proof.txt
(proof.txt 내용 + hostname + ip a가 함께 보이는 스크린샷)

## 5. 수정 권고
1. [심각도] (발견별 수정 방법 — 본문 발견과 1:1 연결)

---

# 머신 2: AD 세트 (10.10.x.대역) — 40점

## 요약
(체인 한 문장: "클라이언트의 ___으로 침투해 ___ 자격증명을 탈취하고,
 ___으로 이동해 도메인 컨트롤러를 장악했다.")

## 체인 다이어그램
[클라이언트 IP] --(기법: ___, 자격증명: ___)--> [중간 서버 IP] --> [DC IP]

## 1. 첫 머신 침투
## 2. 도메인 정보 수집
## 3. 자격증명 탈취와 측면 이동
## 4. 도메인 관리자 권한 획득
## 5. 세트 내 각 머신의 증거
## 6. 수정 권고

---

# 부록 A. 사용한 도구 목록
(도구명 — 용도 — 금지 도구 제한 준수 여부 한 줄)

# 부록 B. 참고한 익스플로잇 코드의 수정 내역
(원본 출처, 수정한 부분을 diff로)

이 템플릿 전체를 집필 환경에서 파일로 만들어 검증에 사용했습니다 — 여러분도 이 뼈대를 그대로 복사해 시작하되, 쓰다 보면 나만의 절(예: "권한 상승 후속 정찰")이 생깁니다. 그것이 템플릿이 내 것이 되는 과정입니다.

3-2. 검증 스크립트 작성

validate_report.py를 만듭니다. 전체 코드(실측 실행된 버전):

# OSCP 보고서 템플릿/작성본 검증 스크립트
# 용도: 작성 중인 보고서(마크다운)가 시험 형식의 필수 요소를 갖췄는지 점검한다.
# 실행: python validate_report.py <보고서.md>
import re
import sys
from pathlib import Path

# 머신 블록 안에 반드시 있어야 할 절(독립 머신 기준)
REQUIRED_SECTIONS = ["요약", "1. 열거", "2. 초기 침투", "3. 권한 상승", "4. 증거", "5. 수정 권고"]
# 증거 절에서 확인할 키워드
EVIDENCE_KEYWORDS = ["local.txt", "proof.txt", "hostname"]
# 남아 있으면 안 되는 미작성 표시
PLACEHOLDERS = ["붙이기", "____", "TODO", "채우기"]


def check(path: Path) -> int:
    text = path.read_text(encoding="utf-8")
    fails = 0

    print(f"검사 대상: {path.name} ({len(text.splitlines())}줄)\n")

    for sec in REQUIRED_SECTIONS:
        ok = re.search(rf"^##\s.*{re.escape(sec)}", text, re.MULTILINE) is not None
        print(f"[{'PASS' if ok else 'FAIL'}] 필수 절 존재: {sec}")
        fails += 0 if ok else 1

    for kw in EVIDENCE_KEYWORDS:
        ok = kw in text
        print(f"[{'PASS' if ok else 'FAIL'}] 증거 키워드 포함: {kw}")
        fails += 0 if ok else 1

    code_blocks = len(re.findall(r"^```", text, re.MULTILINE)) // 2
    ok = code_blocks >= 3
    print(f"[{'PASS' if ok else 'FAIL'}] 명령/출력 코드 블록 3개 이상: {code_blocks}개")
    fails += 0 if ok else 1

    for ph in PLACEHOLDERS:
        found = ph in text
        print(f"[{'FAIL' if found else 'PASS'}] 미작성 표시 없음: '{ph}'"
              + ("  ← 발견됨" if found else ""))
        fails += 1 if found else 0

    print(f"\n결과: {'통과' if fails == 0 else f'{fails}건 보완 필요'}")
    return fails


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("사용법: python validate_report.py <보고서.md>")
        sys.exit(2)
    p = Path(sys.argv[1])
    if not p.exists():
        print(f"파일 없음: {p}")
        sys.exit(2)
    sys.exit(0 if check(p) == 0 else 1)

읽는 법: 세 그룹의 검사 — ① 필수 절 6개를 정규식 ^## .*절이름으로 찾고 ② 증거 키워드 3개의 존재를 확인하고 ③ 자리표시자가 남았으면 FAIL. 종료 코드도 설계돼 있습니다 — 통과 0, 보완 필요 1, 인자/파일 오류 2. 나중에 PDF 변환 전에 자동으로 돌리는 파이프라인의 부품이 되도록 한 것입니다.

3-3. 실측 — 스크립트 실행 결과

집필 환경에서 두 파일로 실제 실행한 결과입니다.

빈 템플릿(oscp_report_template.md, 117줄)에 대한 실행 — 자리표시자를 정확히 잡아냅니다:

검사 대상: oscp_report_template.md (117줄)

[PASS] 필수 절 존재: 요약
[PASS] 필수 절 존재: 1. 열거
[PASS] 필수 절 존재: 2. 초기 침투
[PASS] 필수 절 존재: 3. 권한 상승
[PASS] 필수 절 존재: 4. 증거
[PASS] 필수 절 존재: 5. 수정 권고
[PASS] 증거 키워드 포함: local.txt
[PASS] 증거 키워드 포함: proof.txt
[PASS] 증거 키워드 포함: hostname
[PASS] 명령/출력 코드 블록 3개 이상: 5개
[FAIL] 미작성 표시 없음: '붙이기'  ← 발견됨
[FAIL] 미작성 표시 없음: '____'  ← 발견됨
[PASS] 미작성 표시 없음: 'TODO'
[PASS] 미작성 표시 없음: '채우기'

결과: 2건 보완 필요
(종료 코드 1)

작성 완료된 샘플 보고서(85줄)에 대한 실행:

검사 대상: report_sample_filled.md (85줄)

[PASS] 필수 절 존재: 요약
(…중략…)
[PASS] 명령/출력 코드 블록 3개 이상: 4개
[PASS] 미작성 표시 없음: '붙이기'
[PASS] 미작성 표시 없음: '____'
[PASS] 미작성 표시 없음: 'TODO'
[PASS] 미작성 표시 없음: '채우기'

결과: 통과
(종료 코드 0)

읽는 법: 템플릿 원본이 FAIL나는 것은 스크립트가 정상이라는 뜻입니다 — "구조는 갖췄지만 아직 빈칸"이라는 상태를 정확히 표현합니다. 시험 당일에 여러분의 완성본이 "결과: 통과"를 띄우면 제출 가능 상태입니다.

3-4. 연습 머신 2대 — 공략과 동시에 채우기

Step 306에 이어 머신 2대를 더 공략합니다(누적 6대). 이번의 규칙은 하나입니다.

"다 풀고 쓰는 것"이 아니라 "단계마다 템플릿을 채운다"

열거가 끝나면 즉시 ## 1. 열거에 출력을 붙이고, 쉘을 얻으면 즉시 ## 2를 채웁니다. 기록이 공략 속도를 늦추는 느낌은 정상입니다 — 그리고 그 지연은 누적 6~8대쯤에서 10분 이내로 줄어듭니다. 그것이 이 훈련의 수확입니다.

3-5. 재현성 검토와 PDF 변환

공략 완료 후, 문서만 따로 떼어 스스로 채점합니다 — "이 문서만 보고 재현할 수 있는가?" 빠진 명령과 스크린샷을 보완하고, 검증 스크립트를 돌리고, PDF로 변환해 봅니다.

python validate_report.py lame-report.md
pandoc lame-report.md -o lame-report.pdf   # pandoc 설치된 경우

PDF를 열어 이미지(증거 캡처)가 실제로 박혔는지 눈으로 확인하세요 — 마크다운의 이미지 경로가 상대 경로면 변환 시 빠지는 일이 잦습니다. 시험 전에 이 파이프라인 전체(작성→검증→변환→눈 검사)를 최소 2회 완주하는 것이 오늘의 미션 조건입니다.


4. 미션과 연습문제

미션 — 템플릿 확정과 실전 적용

  1. 3-1의 뼈대로 oscp-report-template.md를 만든다
  2. 3-2의 validate_report.py를 만들고, 빈 템플릿에 FAIL, 채운 보고서에 PASS가 나오는 것을 직접 확인한다
  3. 연습 머신 2대를 "공략과 동시에" 템플릿으로 기록해 보고서 2부를 완성한다(누적 6부)
  4. 완성본에 검증 스크립트를 돌려 "통과"를 확인한다
  5. 마크다운 → PDF 변환을 완주하고, PDF를 열어 증거 이미지가 박혔는지 눈으로 확인한다

연습문제

문제 1. 시험 보고서가 Step 128의 보고서와 철학은 같지만 "규격"으로서 다른 점은 무엇인가요?

문제 2. 템플릿을 "머신 하나 = 블록 하나"의 반복 구조로 설계하는 이유는 무엇인가요?

문제 3. 검증 스크립트가 빈 템플릿에서 FAIL를 내는 것이 왜 "정상 동작의 증거"인지 설명해 보세요.

문제 4. 첫 PDF 변환을 시험 당일이 아니라 연습 때 해 봐야 하는 이유를, 구체적 사고 시나리오 하나와 함께 말해 보세요.


5. 모범 답안과 완료 기준

미션 모범 답안

미션의 완료 상태: ① 템플릿 파일이 존재하고 모든 절이 빈칸 안내를 갖춤 ② 스크립트가 템플릿엔 보완 필요(FAIL), 완성본엔 통과(PASS)를 출력 ③ 머신 2대의 보고서가 템플릿 서식 그대로 작성됨 ④ PDF 변환 완주.

검증하는 법: ① 템플릿의 머신 블록을 복사해 붙이면 그대로 다음 머신 서식이 되는가 — 반복 구조인가. ② 스크립트 출력에서 FAIL이 하나라도 있으면 그 항목을 고치고 재실행했는가. ③ 완성본 2부의 ## 4. 증거에 hostname+ip가 보이는 캡처가 있는가. ④ PDF에서 이미지가 빠지지 않았는가. ⑤ 공략 중 기록의 시간 지연이 체감 30분을 넘었다면 — 다음 머신에서 단계 직후 기록을 더 작게 쪼개세요(쉘 획득 직후 3분 등).

연습문제 해답

문제 1 해답. Step 128의 구조는 "좋은 보고서"의 권장 기준이었지만, 시험 보고서는 요건을 어기면 감점되는 채점 규격입니다. 철학 — 증거 중심, 재현 가능 서술, 발견과 권고의 연결 — 은 같고, 다른 것은 강제력입니다. 그래서 시험용은 구조를 매번 설계하는 것이 아니라 템플릿으로 고정해, 당일의 24시간을 구조 고민이 아니라 내용 채우기에만 쓰게 합니다.

문제 2 해답. 시험은 머신이 여러 대이고, 머신마다 같은 정보(요약~증거~권고)가 요구되기 때문입니다. 반복 구조로 만들면 두 가지가 보장됩니다 — 어떤 머신도 절이 빠지지 않고, 채점관이 머신 간을 이동하며 같은 위치에서 같은 정보를 찾을 수 있습니다. 문서의 일관성은 곧 채점의 용이성이고, 채점의 용이성은 점수입니다.

문제 3 해답. 템플릿은 의도적으로 "구조는 있고 내용은 빈칸"인 상태이므로, 정상적인 검증기라면 그 상태를 FAIL로 보고해야 합니다 — 빈칸을 통과시키는 검증기는 시험 당일 빈칸이 섞인 완성본도 통과시켜 신뢰를 잃습니다. 반대로 채운 보고서에서 PASS가 나오므로 검사가 과하지도 않음이 확인됩니다. "FAIL과 PASS 양쪽을 다 낼 수 있는가"가 검증 도구의 검증입니다.

문제 4 해답. 시나리오: 보고서 마감 2시간 전 첫 pandoc 실행 — 이미지 14장이 상대 경로라 전부 빠진 PDF가 나오고, 경로를 고치다 마감을 넘깁니다. 변환은 "되겠지"가 아니라 파이프라인입니다 — 작성→검증→변환→눈 검사의 네 칸이 전부 검증돼야 당일에 변수가 없습니다. 연습의 PDF 완주 2회는 이 사고를 연습실로 옮겨 오는 절차입니다.

완료 기준 체크리스트

  • [ ] 시험 보고서의 세 요건(재현·증거·코드 표시)을 설명할 수 있다
  • [ ] 머신 단위 반복 구조의 템플릿을 확정했다
  • [ ] 검증 스크립트가 FAIL/PASS 양쪽을 내는 것을 직접 확인했다
  • [ ] 머신 2대를 공략과 동시에 템플릿으로 기록했다(누적 6부)
  • [ ] 완성본이 검증 스크립트 "통과"를 받았다
  • [ ] 마크다운 → PDF 변환을 완주하고 이미지를 눈으로 확인했다
  • [ ] 미션: 템플릿 + 스크립트 + 보고서 2부 + PDF 완주

6. 흔한 실수와 해결

벽 1. 스크립트 실행 시 파일 없음 또는 사용법 메시지가 뜬다

증상: 사용법: python validate_report.py <보고서.md>만 출력되고 종료됩니다(종료 코드 2).
원인: 인자 없이 실행했거나, 경로가 틀렸습니다 — 파일명의 한글·공백이 의심 지점입니다.
해결: 파일이 있는 폴더에서 실행하고, 이름에 공백이 있으면 따옴표로 감싸세요 — python validate_report.py "내 보고서.md".

벽 2. 구조는 맞는데 "미작성 표시 없음"에서 FAIL가 난다

증상: [FAIL] 미작성 표시 없음: '____' ← 발견됨.
원인: 작성하다 남은 자리표시자가 있습니다 — 본인 눈에는 스캔됐던 것을 스크립트가 잡은 것입니다.
해결: 이것이 스크립트를 쓰는 이유입니다. 편집기에서 해당 문자열로 검색해 전부 채우세요. 그리고 템플릿의 자리표시자 표기(예: ____)를 통일해 두면 검색이 빠릅니다.

벽 3. pandoc이 없다 — command not found

증상: pandoc: command not found(윈도우에서는 "’pandoc’은(는) 내부 또는 외부 명령…"류).
원인: pandoc은 기본 설치 도구가 아닙니다 — 집필 환경에서도 설치돼 있지 않았습니다.
해결: ① 공식 배포처에서 설치하거나 ② Obsidian의 PDF보내기를 씁니다. 어느 쪽이든 연습 때 경로를 확정하세요. 변환 도구 결정을 시험 주간으로 미루는 것이 진짜 위험입니다.

벽 4. 기록이 공략 속도를 늦춰 둘 다 엉망이 된다

증상: 기록하느라 흐름이 끊기고, 공략에 몰두하느라 기록이 밀립니다.
원인: 정상입니다 — 이 지연이 훈련 대상 그 자체입니다.
해결: 지연을 더 작게 쪼개세요 — "절 단위"가 아니라 "명령 단위"로: 중요 명령의 출력이 나오는 즉시 문서에 붙이는 것을 습관화합니다. 누적 6~8대부터 체감 지연이 10분 이내로 줍니다. 지금 느린 것은 실력 부족이 아니라 근육 형성 중이라는 뜻입니다.

벽 5. PDF에서 증거 이미지가 빠진다

증상: 마크다운에선 보이던 캡처가 PDF에서 깨집니다.
원인: 이미지 경로(상대 경로)가 변환 시점의 작업 폴더와 어긋났기 때문입니다.
해결: 보고서와 이미지를 한 폴더 구조로 고정하세요(예: report/ 아래 images/). 변환 명령은 그 폴더에서 실행하고, 변환 후 PDF를 열어 이미지가 박혔는지 반드시 눈으로 확인합니다 — "변환됐다"와 "완성됐다"는 다른 단계입니다.


7. 정리

오늘의 개념

개념 한 줄 설명
시험 보고서 3요건 재현 가능 서술 · 증거 완결(local/proof+hostname+ip) · 익스플로잇 출처 표시
머신 블록 반복 구조 머신 하나 = 블록 하나 — 어떤 머신도 절이 빠지지 않게
검증 스크립트 필수 절·증거 키워드·자리표시자 자동 점검 — FAIL/PASS 양방향 확인
단계별 기록 "다 풀고 쓰기"가 아니라 "단계마다 채우기" — 지연은 6~8대에서 줄어듦
제출 파이프라인 작성 → 검증 → PDF 변환 → 눈 검사 — 시험 전 완주 필수

오늘의 명령어·도구

도구 하는 일
oscp-report-template.md 확정된 시험 형식 템플릿 — 머신 블록 반복 구조
python validate_report.py 보고서.md 필수 요소 자동 점검 — 통과 0 / 보완 필요 1
pandoc 보고서.md -o 보고서.pdf 제출 형식 변환(미설치 시 Obsidian 경로)
Step 128의 6단 구조 오늘 템플릿의 철학적 원형
Step 305의 증거 폴더 증거 절의 공급처

명령어보다 중요한 감각

시험 당일의 24시간은 연습 때 만든 구조만큼만 길어집니다. 템플릿이 있으면 보고서는 "쓰는 일"에서 "채우는 일"이 되고, 검증 스크립트가 있으면 제출 직전의 불안이 "결과: 통과" 한 줄로 끝납니다. 오늘 확정한 것은 문서 양식이 아니라 시험장에서의 시간 배분입니다. 그리고 이 템플릿은 시험이 끝나도 남습니다 — 실무 침투 테스트의 보고서가 요구하는 것이 정확히 같은 세 가지, 재현과 증거와 출처니까요.


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