# Step176 로컬 미니 CTF

다섯 문제를 관찰하고 플래그를 제출한 다음, 수정 비교 모드에서 같은 요청의 결과를 비교합니다. 본인 컴퓨터의 루프백 실습용이며 공개 서버에 배포하지 않습니다. 실제 개인정보를 입력하지 마세요. 관리자 권한은 필요하지 않습니다.

## 준비와 시작

압축을 새 디렉터리에 풀고 그 디렉터리로 이동합니다. Python 3을 준비합니다. 아래 버전은 검증한 버전이며 최신 버전이라는 뜻은 아닙니다. 의존성 설치에는 인터넷 연결이 필요하고 설치 후 실습은 외부 서비스 없이 실행합니다.

Linux/macOS:
```sh
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python step176_ctf.py --lang ko --port 8176
```

Windows PowerShell:
```powershell
py -m venv .venv
.venv\Scripts\python.exe -m pip install -r requirements.txt
.venv\Scripts\python.exe step176_ctf.py --lang ko --port 8176
```

브라우저에서 http://127.0.0.1:8176/ 을 엽니다. 서버는 해당 컴퓨터의 127.0.0.1에만 바인딩하며 디버거·자동 재시작은 끕니다. 본인이 실행한 터미널에서 Ctrl+C로 종료합니다. 포트가 사용 중이면 다른 프로세스를 강제 종료하지 말고 `--port 8178` 등 빈 포트를 선택하고 모든 명령의 URL 포트도 맞춥니다.

## 실습 순서

1. 소스의 정답을 읽기 전에 worksheet.ko.md의 다섯 가설을 작성합니다.
2. HTML 주석, robots.txt, 공지사항 응답 헤더, 입장 쿠키, 프로필 번호를 차례로 관찰합니다.
3. 문제 번호와 전체 플래그를 입력해 제출합니다. 형식만 맞는 값은 오답이며 반복 정답은 점수가 늘지 않습니다.
4. `/score`의 점수와 본인의 독립/힌트/해설 후 재현 기록을 구분합니다. 점수는 서버 메모리의 단일 실습 상태로, 재시작하면 초기화됩니다. 여러 참가자를 구분하는 대회 시스템이 아닙니다.
5. 별도 터미널에서 수정 비교를 실행합니다.
```sh
.venv/bin/python step176_ctf.py --mode fixed --role user --lang ko --port 8177
```
Windows에서는 `.venv\Scripts\python.exe` 경로를 사용합니다. 백업·admin=true 쿠키·프로필1 요청은403, 프로필2는200이어야 합니다. 비교 서버를 종료하고 `--role admin`으로 다시 실행하면 관리자용 세 경로는200입니다. 이 역할은 서버 시작 시 정하는 가상의 신원이며 실제 로그인 구현이 아닙니다.

## 자동 재현과 세션 실험

```sh
.venv/bin/python reproduce.py
.venv/bin/python session_demo.py
```
Windows에서는 앞의 Windows Python 경로를 사용합니다. 재현기는 자기 루프백 서버를 만들고 종료합니다. 실행 중인 수동 서버나 다른 서비스를 건드리지 않습니다. 출력 `status: pass`와 각 검사명을 확인합니다. 세션 실험은 네트워크 없는 Flask 테스트 클라이언트로, 서명 쿠키의 내용은 읽을 수 있지만 기존 서명으로 내용을 바꾼 쿠키는 받아들이지 않음을 보입니다.

Flask 기본 세션은 서명된 클라이언트 쿠키이며 서버 측 저장소를 조회하는 세션과 다릅니다. 서명은 암호화가 아니고 권한 검사도 대신하지 않습니다. `curl -I`는 HEAD 요청, `curl -i`는 GET 응답에 헤더도 출력합니다. Windows 명령은 `curl.exe`로 실행합니다.

검증 JSON에 실행 환경, 구성요소 버전, 소스 해시가 있습니다. Windows는 curl.exe를 실제 실행했고 Linux 격리 컨테이너는 Python HTTP로 확인했습니다. macOS와 물리적 휴대전화는 검증하지 않았습니다. 자동 통과가 독립 해결이나 운영 보안 완성을 뜻하지 않습니다.

실습 수업: https://infosec.3001.co.kr/step-176/
