Step 128. ★ 프로젝트 — MS2 완전 공략 보고서
Level 2 — 보안 입문과 공격 스킬 기초 | 난이도 ★★★★☆ | 예상 소요 시간 4시간
전제: Step 118~127 — MS2 정찰·침투(vsftpd, distccd 등), john/hashcat, 권한 상승, linPEAS, 후속 침투 체크리스트까지의 여정을 마쳤다.
- 준비물: 지금까지 MS2 랩에서 남긴 모든 기록(스캔 결과, 명령 출력, 스크린샷), Step 127의 체크리스트, 마크다운 에디터. MS2 랩이 없다면 이 챕터의 출력 예시 자료를 채우는 연습으로 진행합니다.
- ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다.
- 이 챕터는 테스트입니다 — 보고서의 뼈대(템플릿)는 드리지만, 내용은 여러분의 공격 기록에서 나와야 합니다.
실무 침투 테스트의 산출물은 쉘이 아닙니다 — 보고서입니다. 고객이 돈을 내고 사는 것은 "뚫었다는 사실"이 아니라 "무엇이, 왜 뚫렸고, 어떻게 고쳐야 하는가"가 담긴 문서입니다. 지금까지 MS2(Metasploitable2)를 상대로 쌓아 온 모든 것 — 정찰, 침투, 크래킹, 권한 상승, 열거 — 을 오늘 하나의 보고서로 엮습니다. 화려한 해킹 장면을 재생하는 시간이 아니라, 여러분의 흔적을 남이 읽고 조치할 수 있는 문서로 만드는 시간입니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- 침투 테스트 보고서의 표준 구조(요약~권고)를 설명할 수 있다
- 공격 경로 하나를 "원인 → 방법 → 획득 권한 → 방어"의 네 칸으로 기술한다
- 명령 출력을 증거로 배치하고, 증거 없는 주장을 쓰지 않는다
- 경영진용 요약과 기술진용 본문의 톤을 구분한다
- 자기 공격을 방어 권고로 번역한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | 마크다운 (Step 89의 문서화 기술), 지금까지의 랩 기록 전부 |
| 오늘의 재료 | Step 118~127의 출력들: nmap, 쉘, john/hashcat, 정찰표, linPEAS |
| 필요한 개념 | 보고서 6단 구조, 증거 중심 서술, 심각도 분류, 독자별 톤 |
| 오늘의 산출물 | MS2-공략-보고서.md — 제출 가능한 수준의 침투 보고서 1부 |
2-1. 보고서의 표준 구조 — 여섯 개의 방
실무 침투 테스트 보고서는 대략 같은 뼈대를 가집니다.
① 요약 (Executive Summary) — 경영진용. 기술 용어 없이 "무슨 일이 가능했는가"
② 범위와 정찰 (Recon) — 대상, 방법, 스캔 결과
③ 침투 경로 (Attack Paths) — 취약점별: 원인 → 방법 → 획득 권한
④ 권한 상승 (Privesc) — 낮은 쉘에서 root까지의 경로
⑤ 증거 (Evidence) — 각 주장을 뒷받침하는 출력·스크린샷
⑥ 권고 사항 (Remediation) — 발견별 수정 방법과 우선순위
각 방의 독자가 다릅니다 — ①은 임원이, ③~⑤는 기술진이, ⑥은 담당자가 읽습니다. 하나의 문서, 세 종류의 독자. 이것이 보고서가 블로그 글과 다른 점입니다.
2-2. 증거 중심 서술 — "주장 뒤에 출력"
보고서 문장의 법칙은 하나입니다 — 증거 없는 주장은 쓰지 않는다. "root를 획득했다"는 주장 뒤에는 id 출력이 따라붙습니다. "서비스가 열려 있다" 뒤에는 nmap 출력이 옵니다. 스크린샷에는 항상 whoami나 id의 결과가 포함되도록 찍는 습관 — 그래야 그 화면이 "누구의, 어느 권한의 화면인지"가 증명됩니다.
여러분이 Step 125~127에서 출력을 파일로 저장하라고 계속 들었던 이유가 오늘 드러납니다. 저장되지 않은 발견은 보고서에 쓸 수 없습니다.
2-3. 심각도 분류 — 모든 발견은 같지 않다
발견한 취약점에는 등급을 매깁니다. 입문 단계의 간단한 기준:
| 등급 | 기준 | MS2의 예 |
|---|---|---|
| 치명(Critical) | 원격에서 바로 시스템 제어 가능 | vsftpd 백도어, distccd RCE |
| 높음(High) | 인증 우회, 권한 상승 직결 | 취약 커널(Dirty COW), 느슨한 SUID |
| 중간(Medium) | 정보 노출, 약한 설정 | 백업 파일 노출, 약한 비밀번호 정책 |
| 낮음(Low) | 모범 사례 위반 수준 | 불필요한 배너 정보 노출 |
등급은 "고치는 순서"이기도 합니다 — ⑥ 권고 사항이 이 등급 순으로 배열됩니다.
2-4. "왜 뚫렸는가"가 품격을 결정한다
명령어 나열은 로그이지 보고서가 아닙니다. 같은 발견이라도 이렇게 갈립니다.
✗ 나쁜 서술: "nc 192.168.56.101 6200을 치니 쉘이 나왔다."
○ 좋은 서술: "vsftpd 2.3.4에는 제작자 몰래 심어진 백도어가 있다.
사용자명에 :)를 붙여 접속하면 6200번 포트에 root 쉘이 열린다.
원인은 공식 배포 파일이 변조된 공급망 사고였고,
이 버전을 업데이트하지 않은 것이 직접적 노출 원인이다."
차이는 인과입니다 — 무엇을 했는가(행위)에 왜 그것이 통했는가(원인)와 무엇이 문제인가(책임 지점)가 붙은 문장만이 고칠 수 있는 문장입니다.
3. 따라 하기
템플릿을 드립니다. 복사해 MS2-공략-보고서.md를 만들고, 여러분의 랩 기록으로 채우세요. 랩이 없는 분은 각 항목이 어떤 자료로 채워지는지 아래의 채우기 안내를 따라가면 됩니다 — 예시로 채워 둔 출력들은 출력 예시라고 표시돼 있으며, 여러분의 실측으로 교체하는 것이 미션입니다.
3-1. ① 요약 — 제일 나중에 쓰는 첫 장
요약은 문서 맨 앞에 있지만 가장 마지막에 씁니다 — 전체가 완성돼야 요약할 수 있으니까요. 뼈대:
# Metasploitable2 침투 테스트 보고서
작성일: ____ | 작성자: ____ | 대상: 192.168.56.101 (사내망 모의 환경)
### 1. 요약
본 테스트에서 대상 시스템에 대해 (N)개의 침투 경로를 확인했으며,
그중 (N)개는 인증 없이 원격에서 시스템 최고 권한(root)에 도달 가능했습니다.
주요 원인은 ① 알려진 취약 버전의 서비스 운영, ② 오래된 커널,
③ 기본·약한 인증 설정입니다.
즉시 조치가 필요한 치명 등급 발견이 (N)건입니다.
채우기 안내: 기술 용어를 쓰지 않는 것이 요약의 규칙입니다. "6200번 포트로 쉘"이 아니라 "외부에서 인증 없이 시스템 전체를 장악할 수 있음"처럼 — 경영진이 읽고 결정할 수 있는 문장으로 번역하는 연습입니다.
3-2. ② 범위와 정찰 — nmap 결과 배치
### 2. 범위와 정찰
- 대상: 192.168.56.101 / 기간: ____ / 방법: 블랙박스(사전 정보 없음)
#### 스캔 결과 (증거: evidence/01-nmap.txt)
여기에 Step 118의 nmap 출력을 붙입니다. 랩 기록이 없다면, 아래는 참고용 출력 예시입니다 — 이런 모양의 자료가 들어간다는 것만 확인하세요.
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 2.3.4
22/tcp open ssh OpenSSH 4.7p1
23/tcp open telnet Linux telnetd
80/tcp open http Apache httpd 2.2.8
3632/tcp open distccd distccd v1
...
읽는 법: 스캔 결과는 "서술"이 아니라 "인용"입니다. 그리고 표 아래에 해석을 한두 줄 붙입니다 — "포트 23(telnet)은 평문 인증 프로토콜로, 그 존재 자체가 관리 부실의 신호"처럼.
3-3. ③ 침투 경로 — 네 칸 서식의 반복
경로 하나당 아래 서식을 그대로 반복합니다. 최소 3개(vsftpd, distccd, + 1개 — IRC 백도어나 rlogin)를 채우는 것이 미션입니다.
### 경로 1: vsftpd 2.3.4 백도어 [치명]
- 취약 원인: 변조된 배포판에 심어진 백도어 — 사용자명에 `:)` 포함 시 6200번에 쉘
- 공격 방법: (사용한 명령과 순서 — 여러분의 기록에서)
- 획득 권한: root 쉘 (아래 증거)
- 증거:
(명령 출력 — 스크린샷에는 반드시 id/whoami 포함)
- 방어 방법: vsftpd 최신판으로 교체, 외부 저장소 패키지의 무결성 검증
채우기 안내: "공격 방법" 칸에는 여러분이 실제로 친 명령 순서를 그대로 적습니다 — 재현 가능성이 보고서의 생명이라, 읽는 사람이 같은 순서로 같은 결과를 얻을 수 있어야 합니다. Step 121의 distccd 쉘, Step 125의 상승 과정이 각각 경로 2, 권한 상승 절의 재료입니다.
3-4. ④ 권한 상승 — Step 125~126의 문서화
### 4. 권한 상승
- 상승 전: daemon (distccd 쉘)
- 정찰 요약: (Step 125 정찰표에서 발견한 것 — 커널 2.6.24, SUID 목록 등)
- 상승 경로: Dirty COW (CVE-2016-5195) / 또는 설정 실수 경로
- 증거: 상승 전후의 id 출력 대비
읽는 법: 전후 대비가 핵심 증거입니다 — uid=1(daemon)에서 uid=0(root)로의 변화가 두 줄로 나란히 있으면, 그것이 권한 상승의 완전한 증명입니다.
3-5. ⑤ 증거 — 보관소 규칙
증거는 본문에 인용하고, 원본은 따로 모읍니다.
evidence/
01-nmap.txt ← 정찰
02-vsftpd-shell.txt ← 경로 1
03-distccd-shell.txt ← 경로 2
04-privesc-id.txt ← 상승 전후
...
채우기 안내: 파일명 규칙은 번호-내용.txt — 번호가 본문의 인용 순서와 일치하게. Step 126~127의 tee 저장 습관이 여기서 값을 합니다.
3-6. ⑥ 권고 사항 — 공격당한 만큼 고칠 줄 알아야
### 6. 권고 사항 (심각도 순)
1. [치명] vsftpd 2.3.4 → 최신판 교체. 배포 파일의 해시 검증 절차 도입.
2. [치명] distccd — 외부 접근 차단 또는 인증 적용. 개발 도구는 운영 서버에서 제거.
3. [높음] 커널 업데이트 — Dirty COW 패치 적용. 지원 종료 OS의 교체 계획 수립.
4. [높음] 불필요 서비스(telnet, rlogin 등) 비활성화.
5. [중간] 비밀번호 정책 강화 — Step 123~124의 크래킹 결과가 근거.
읽는 법: 권고의 근거는 전부 앞 절의 여러분 발견입니다. "비밀번호 정책 강화"라고 쓸 수 있는 것은 여러분이 실제로 john/hashcat으로 그 해시를 깨 봤기 때문입니다 — 공격의 기록이 방어의 논거가 되는 지점입니다.
3-7. 시간 배분 가이드
예상 4시간의 권장 배분: 기록 수집·정리 40분, 경로 서술 90분(3개 × 30분), 권한 상승·증거 정리 50분, 요약·권고 40분, 다듬기 20분. 기록이 부실한 경로에서 시간이 멈추는 것이 정상입니다 — 그 경로는 랩에서 다시 실행해 증거를 새로 따 오세요. 보고서 쓰다가 공격을 다시 하러 가는 것은 부끄러운 일이 아니라 실무의 일상입니다.
4. 미션과 연습문제
미션 — MS2 공략 보고서 1부 완성
- 3절의 템플릿으로
MS2-공략-보고서.md를 만들고 여섯 절을 모두 채웁니다 - 침투 경로 최소 3개를 네 칸 서식(원인→방법→권한→방어)으로 기술합니다
- 모든 주장에 증거(출력 인용 또는 evidence/ 파일 참조)가 붙어 있습니다
- 증거 스크린샷·출력에는
id또는whoami결과가 포함돼 있습니다 - 권고 사항이 심각도 순으로, 각 항목의 근거가 본문 발견과 연결돼 있습니다
- (랩이 없는 경우) 예시 자료로 채운 칸마다
[랩 실행 후 실측으로 교체 예정]표시를 달아, 어느 부분이 미검증인지 투명하게 남깁니다
연습문제
문제 1. 요약(Executive Summary)을 가장 마지막에 쓰는 이유와, 그 절에 기술 용어를 피하는 이유를 각각 말해 보세요.
문제 2. "증거 없는 주장은 쓰지 않는다"는 규칙이 보고서의 신뢰성과 어떻게 연결되는지 설명해 보세요.
문제 3. 심각도 [치명]과 [중간]을 가르는 기준을 여러분의 말로 정리해 보세요.
문제 4. 권고 사항의 각 항목이 반드시 본문의 발견과 연결돼야 하는 이유를, "근거 없는 권고"의 문제점으로 설명해 보세요.
5. 모범 답안과 완료 기준
미션 모범 답안
경로 하나가 완성된 모습의 예시입니다 (출력 부분은 출력 예시 — 여러분의 실측으로 교체할 자리):
### 경로 2: distccd 원격 명령 실행 [치명]
- 취약 원인: distccd(분산 컴파일 서비스)가 인증 없이 외부 명령을 받아들임.
개발용 도구가 운영 서버에 인증·접근제한 없이 노출된 것이 직접 원인.
- 공격 방법:
1. nmap 스캔에서 3632/tcp distccd 확인 (증거 01)
2. NSE 스크립트로 임의 명령 실행 시도
3. 리버스 연결을 열어 쉘 획득
- 획득 권한: daemon (제한된 서비스 계정) → 이후 ④절의 경로로 root
- 증거: evidence/03-distccd-shell.txt
$ id
uid=1(daemon) gid=1(daemon) groups=1(daemon)
- 방어 방법: distccd 서비스 제거 또는 허용 호스트 제한.
개발 도구의 운영 환경 배치 금지 정책 수립.
검증하는 법: ① 여섯 절이 빠짐없이 있는가. ② 경로마다 네 칸(원인·방법·권한·방어)이 채워졌는가 — 한 칸이라도 비면 미완성입니다. ③ 모든 "했다"는 문장에 증거가 붙었는가. ④ 요약을 소리 내어 읽었을 때 기술을 모르는 사람도 위험의 크기를 이해할 수 있는가. ⑤ 스스로 채점 — 구조 완성도, 증거 충실도, 인과 서술, 권고 연결의 네 항목 각 0~2점, 총 6점 이상이면 통과입니다.
연습문제 해답
문제 1 해답. 요약은 전체 내용이 확정된 뒤에야 정확히 쓸 수 있으므로 마지막에 작성합니다 — 건수와 등급이 본문과 어긋나면 신뢰가 무너집니다. 기술 용어를 피하는 이유는 독자가 다르기 때문입니다 — 요약을 읽는 사람은 예산과 결정을 하는 사람이고, 그들에게 필요한 것은 "6200번 포트"가 아니라 "인증 없이 전체 장악 가능"이라는 사업 언어의 번역입니다.
문제 2 해답. 보고서의 독자는 작성자의 실력을 믿고 사는 것이 아니라, 인용된 출력을 보고 스스로 재현·검증할 수 있어야 합니다. 증거가 붙은 주장만이 재현 가능하고, 재현 가능한 보고서만이 "작성자가 떠난 뒤"에도 유효합니다. 증거 없는 주장은 확인할 길이 없어서, 독자 입장에서는 소설과 구분되지 않습니다.
문제 3 해답. 기준은 피해의 직접성과 선행 조건의 유무입니다. 인증 없이 원격에서 곧바로 시스템 제어에 이르면 치명, 로컬 접근이나 다른 조건이 선행돼야 하면 한 등급씩 내려가고, 정보 노출처럼 간접적인 위험은 중간 이하로 봅니다. "이 발견 하나만으로 최악의 사태가 바로 일어나는가"가 가름 질문입니다.
문제 4 해답. 근거 없는 권고는 두 가지 문제를 만듭니다. 첫째, 우선순위를 매길 수 없습니다 — 어떤 권고가 치명 발견을 막는 것인지 모르면 담당자는 어디부터 고칠지 결정할 수 없습니다. 둘째, 신뢰를 깎습니다 — 보고서에 없는 발견에서 나온 권고는 "일반론"으로 읽혀 무시됩니다. 권고가 본문 발견과 연결돼 있으면 "우리가 직접 이 구멍으로 들어갔습니다"라는 한 줄이 곧 권고의 추진력이 됩니다.
완료 기준 체크리스트
- [ ] 보고서의 표준 6단 구조를 설명할 수 있다
- [ ] 경로 서술의 네 칸(원인→방법→권한→방어)을 쓸 수 있다
- [ ] 요약이 기술 용어 없이 사업 언어로 쓰여 있다
- [ ] 모든 주장에 증거(출력 인용 또는 파일 참조)가 붙어 있다
- [ ] 증거에 id/whoami가 포함돼 권한이 증명된다
- [ ] 권고 사항이 심각도 순이고 본문 발견과 연결된다
- [ ] 미션: 제출 가능한 수준의 보고서 1부를 완성했다
6. 흔한 실수와 해결
벽 1. 기록이 없어서 쓸 게 없다
증상: 공격은 했는데 보고서에 넣을 출력이 없습니다.
원인: 그때 저장을 안 했기 때문입니다 — Step 126~127에서 "저장되지 않은 발견은 없던 발견"이라고 배운 그 상황입니다.
해결: 랩이 살아 있다면 다시 실행해 증거를 새로 땁니다 — 재실행은 실무에서도 흔한 일입니다. 그리고 이번에는 tee로 저장하세요. 이 벽의 불편함이 평생 가는 저장 습관을 만듭니다.
벽 2. 명령어 나열로 끝나는 보고서가 된다
증상: 본문이 "쳤다, 나왔다"의 반복입니다.
원인: 2-4절의 "왜 뚫렸는가"가 빠진 것입니다.
해결: 각 경로의 "취약 원인" 칸부터 먼저 쓰세요. 원인 문장이 서면 명령 나열은 그 뒤의 "방법" 칸으로 자연스럽게 들어갑니다. 순서를 바꾸는 것만으로 문서의 격이 올라갑니다.
벽 3. 증거 스크린샷이 "누구 화면인지" 알 수 없다
증상: 쉘 화면 캡처만 덩그러니 있습니다.
원인: 권한 증명이 빠진 캡처입니다.
해결: 캡처 전에 항상 id나 whoami를 치고 그 결과가 보이는 상태로 찍으세요. "root 쉘을 얻었다"의 증거는 프롬프트 색이 아니라 uid=0(root) 한 줄입니다.
벽 4. 요약이 본문의 복사 붙이기가 된다
증상: 요약에 포트 번호와 도구 이름이 가득합니다.
원인: 독자를 잊은 것입니다.
해결: 테스트 — 요약만 떼서 기술을 모르는 사람에게 읽어 보세요. "그래서 뭐가 위험한데?"라는 반응이 나오면 다시 씁니다. 요약의 문장 하나하나는 "무슨 일이 가능했는가, 얼마나 많이, 어디서부터 고치면 되는가" 셋 중 하나에 답해야 합니다.
벽 5. 랩이 없어서 못 한다고 멈춘다
증상: MS2가 없어 보고서가 비어 있습니다.
원인: 이 챕터의 목적을 오해한 것입니다 — 목적은 "MS2를 뚫는 것"이 아니라 "기록을 문서로 엮는 능력"입니다.
해결: 미션 6번의 방식으로 진행하세요 — 예시 자료로 틀을 완성하고, 미검증 칸에 [랩 실행 후 실측으로 교체 예정] 표시를 답니다. 구조를 먼저 완성해 두면, 랩을 만났을 때 증거만 꽂으면 됩니다. 빈칸을 투명하게 표시하는 것도 보고서의 정직함입니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| 보고서 6단 구조 | 요약·정찰·침투 경로·권한 상승·증거·권고 — 독자가 다른 여섯 개의 방 |
| 증거 중심 서술 | 주장 뒤에 출력. 저장되지 않은 발견은 없던 발견 |
| 네 칸 서식 | 원인 → 방법 → 획득 권한 → 방어 — 경로 서술의 뼈대 |
| 심각도 분류 | 피해의 직접성과 선행 조건으로 등급 매기기 — 권고의 순서 |
| 요약의 번역 | 기술 용어를 사업 언어로 — 마지막에 쓰는 첫 장 |
| 정직한 빈칸 | 미검증 항목은 표시하고 남긴다 — 빈칸도 정확한 정보면 문서가 된다 |
오늘의 명령어·도구
| 도구 | 하는 일 |
|---|---|
MS2-공략-보고서.md |
오늘의 산출물 — 6단 구조의 템플릿 |
evidence/번호-내용.txt |
증거 보관소 — 본문 인용 순서와 번호 일치 |
tee (Step 126) |
증거를 만드는 습관의 도구 |
| Step 125 정찰표 | ④ 권한 상승 절의 재료 |
| Step 127 체크리스트 | ⑥ 권고 사항의 원료 (방어용 사본) |
명령어보다 중요한 감각
오늘로 여러분은 Level 2의 긴 여정 — 정찰, 침투, 크래킹, 상승, 열거 — 을 한 권의 문서로 묶었습니다. 쉘은 세션이 끊기면 사라지지만, 보고서는 남습니다. 공격자의 손은 잊히고 문서는 고쳐지는 시스템으로 이어집니다. "뚫을 수 있다"와 "뚫렸음을 증명하고 고치게 할 수 있다"는 다른 단계의 실력이고, 후자가 프로의 정의입니다. 그리고 마지막으로 — 이 보고서의 권고 사항 절이 곧 수비자의 작업 목록이라는 것을 기억하세요. 여러분은 오늘, 공격으로 방어를 썼습니다.
전부 체크되면 Step 128 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.