
수동 정찰 & 공격 표면 매퍼 — 요청 전송 없음
Quick start · Hunt Mode · Workbench · Modes · Exports · vs Burp · Under the hood
PenScope는 Chrome 확장 프로그램입니다. 설치하고 테스트 권한이 있는 사이트를 탐색하면 자동으로 전체 공격 표면을 조용히 매핑합니다. 모든 엔드포인트, 모든 비밀, 모든 잘못 구성된 헤더, 모든 숨겨진 매개변수를 찾아냅니다. 명령을 내리면 실제 세션 쿠키를 사용하여 36가지의 다양한 프로브 공격을 전송하고 어떤 공격이 성공했는지 보고합니다.
아니면 범위를 설정하고 Hunt를 클릭하면 PenScope가 다른 작업을 하는 동안 자동으로 모든 작업을 수행합니다. Critical 및 High 등급의 모든 발견에 대해 HackerOne 형식의 전체 버그 바운티 보고서를 작성합니다. 제출 가능한 초안들이 대기열에 쌓여 있습니다.
이는 "프록시 설정, 세 개의 창을 클릭하며 다니고, 페이로드 목록으로 alt-tab하는" 루틴을 건너뛰고 그냥 사이트를 보고 싶은 버그 바운티 헌터들에게 필수 도구입니다. 또는 완전히 그만두고 도구가 사냥하게 할 수도 있습니다.
모든 것을 읽지만, 지시하기 전까지는 아무것도 보내지 않습니다. 범위를 설정하고, 사냥을 시작하고, 노트북을 닫으세요. Critical 초안과 함께 깨어나십시오.
8단계에 걸친 감사 주도 리팩토링. 주요 추가 사항:
.env 할당, Vault s./b. 접두사 — 추가로 Spring Boot / Rails ActiveRecord / Django DEBUG / ASP.NET YSOD / Express / Apollo / MSSQL 응답 본문 탐지기.alg, iss, sub, aud, exp, iat, role, scope...). 가 미래이고 역할이 관리자 형태일 때 심각도가 상승합니다.전체 단계별 분석은 CHANGES.md에서 확인할 수 있습니다. 마이그레이션 노트는 MIGRATION.md에 있습니다.
확장 프로그램을 고정하세요. 아무 사이트에 방문하세요. **P** 아이콘을 클릭하세요. PenScope가 이미 지켜보고 있었습니다.
---
## 할 수 있는 작업
PenScope는 탭당 60개 이상의 데이터 필드를 캡처합니다. 실제로 의미하는 바는 다음과 같습니다.
**전체 공격 표면을 확인하세요.** JavaScript에서 참조되었지만 실제로는 호출되지 않은 엔드포인트를 포함한 모든 엔드포인트. 소스 맵에 묻힌 API 경로, POST 본문에서 재구성된 GraphQL 작업, 프레임워크 내부 검사에서 추론된 숨겨진 관리자 경로.
**아무도 전달하려고 하지 않은 비밀을 찾으세요.** `.js` 번들에 하드코딩된 API 키. `localStorage`의 JWT. 환경 덤프의 AWS 자격 증명. 응답 본문의 내부 ID. P1 보고서에 들어갈 종류의 것들.
**브라우저에서 36개의 공격 단계를 실행하세요.** 인증 우회, BAC, IDOR, CORS 반영, JWT alg=none, SSTI, XXE, CRLF 주입, 프로토타입 오염, 파라미터 발견, API 버전 다운그레이드. 세 가지 공격 수준 — 신중, 보통, 전체. 사용자 정의 헤더 붙여넣기. 스텔스 모드는 요청 순서를 섞어 WAF를 트리거하지 않습니다.
**개별 발견 사항을 실제 익스플로잇으로 연결하세요.** 메모리의 JWT는 발견 사항입니다. 동일한 JWT에 서명되지 않은 토큰을 허용하는 API 엔드포인트와 디코딩된 역할이 admin인 경우는 체인입니다. PenScope는 보고서 상단에 신뢰도 점수, 재현 명령어 및 다음 단계와 함께 체인을 표시합니다.
**요청을 편집하고 다시 보내세요.** 마우스 오른쪽 버튼 클릭 방식. Repeater가 새 탭에서 전체 창으로 열립니다. 파라미터를 변경하세요. 보내기를 누르세요. 응답을 확인하세요. Diff에 넣어 기준선과 비교하세요.
**삽입 지점으로 퍼징하세요.** 요청 어디에든 `§payload§`를 표시하고, 페이로드 세트를 선택하고(40개의 XSS 문자열, 30개의 SQLi, 28개의 LFI, 18개의 SSTI, 22개의 SSRF, 24개의 명령 주입, ID 1-100, 인증 우회 클래식, 일반적인 사용자 이름), 공격 모드를 선택하고(Sniper / Cluster bomb / Pitchfork / Battering ram), 실시간 결과 테이블을 확인하세요. 이상 행은 별표로 표시됩니다.
**한 번에 다섯 명의 다른 사용자로 테스트하세요.** 인증 컨텍스트를 저장하세요(익명, 사용자 A, 사용자 B, 관리자, 내부). 한 번의 클릭으로 활성 컨텍스트가 전환됩니다. 모든 Repeater 요청, 모든 Intruder 실행, 모든 프로브가 해당 자격 증명을 사용합니다. 그런 다음 **권한 부여 매트릭스**를 실행하세요: PenScope가 모든 엔드포인트 × 모든 컨텍스트를 탐색하고 그리드에 색상을 코딩합니다. 행 간의 불일치가 IDOR / BAC 발견 사항이며 자동으로 표면화됩니다.
**사이트에 실제로 맞는 CSP를 생성하세요.** 페이지가 만든 모든 요청을 탐색하고, 각각을 리소스 유형별로 분류하고, 엄격한 정책을 구축합니다. `default-src 'none'`, `frame-ancestors 'none'`, `upgrade-insecure-requests`를 추가합니다. 인라인 스크립트와 `eval()`을 감지하고 `'unsafe-inline'`을 유지해야 했을 때 경고합니다. 기존 CSP와 차이를 비교합니다 — 녹색은 강화, 빨간색은 약화.
**두 방향으로 Claude와 대화하세요.** `→ Claude`를 클릭하여 전체 스캔을 구조화된 브리핑으로 클립보드에 푸시합니다. Claude에게 다음에 무엇을 테스트할지 물어보세요. Claude는 펜스된 JSON 대기열로 응답합니다. `⟳ Sync from Claude`를 클릭하면 PenScope가 대기열을 구문 분석하고, 각 공격을 라이브 대상에 대해 실행하고, 결과를 체인 분석기로 다시 공급합니다.
**시간 경과에 따른 범위를 추적하세요.** 오늘 사이트 스냅샷을 찍고, 다음 스프린트에 다시 스냅샷을 찍고, 비교를 클릭하세요. PenScope는 어떤 발견 사항이 새로운지, 해결되었는지, 변경되지 않았는지 알려줍니다. 팀 Slack을 위해 차이를 마크다운으로 내보냅니다.
**발견 사항을 규정 준수 컨트롤에 매핑하세요.** 규정 준수 감사를 클릭하세요. 모든 발견 사항은 PCI-DSS v4, NESA UAE IAS, SAMA CSF, DESC ISR, ISO 27001, OWASP Top 10 2021 및 CWE의 특정 컨트롤에 매핑됩니다. SIEM용 JSON 내보내기. 감사관용 PDF 내보내기.
---
## 헌트 모드
팝업 헤더에서 `🎯 Hunt`를 클릭하세요. 새 탭이 열립니다. 하단의 **사전 실행 패널**에 엔진 상태(캡처된 엔드포인트, 비밀, 감지된 기술, 저장된 인증 컨텍스트)가 표시되어 시작을 클릭하기 전에 생산적인 헌트를 위한 충분한 표면이 있는지 알 수 있습니다. 엔드포인트 < 20이면 노란색 경고가 대상 먼저 탐색하거나 새로운 DOM 자동 크롤링 단계에 의존할 것을 제안합니다. 대상 범위(범위 내 경로, 범위 외 경로, 공격 수준, 시간 예산)를 구성하세요. `▶ Start Hunt`를 클릭하세요.
PenScope가 자율적으로:
1. 패시브 정찰을 정리합니다
2. **자동으로 딥 모드 활성화** (CDP 디버거가 자동으로 연결됨 — 사용자 프롬프트 없음)
3. **DOM 자동 크롤링** — 현재 페이지의 모든 `<a href>`, `<form action>`, ``, `[routerLink]`, `[ng-href]`, `[to]`, `[data-href]`를 탐색합니다. 동일 출처 URL로 필터링합니다. 새 URL을 프로브 대기열에 추가합니다. _순수 URL 추출 — 클릭, 탐색, 세션 변경 부작용 없음._
4. 전체 36단계 프로브 파이프라인 + 8개의 스택 인식 공격 팩을 실행합니다
5. 저장된 인증 컨텍스트 전반에 걸쳐 **권한 부여 매트릭스**를 스윕합니다
6. 체인 상관 분석기를 실행하고, 범위 규칙으로 필터링합니다
7. 모든 Critical 및 High 발견 사항에 대해 **완전한 HackerOne 형식 보고서 초안을 작성합니다** — 체인 *및* 개별 고심각도 발견 사항(노출된 비밀, JWT alg=none, 확인된 SSTI/XXE/CRLF). 각 초안에는 제목, CVSS 추정치가 포함된 심각도, 요약, 2단계 curl(인증 없는 프로브 + 차이 비교를 위한 인증 기준선)을 사용한 재현 단계, 발견 사항에 특화된 영향 설명, 스니펫 라이브러리의 제안된 수정 사항 및 참고 자료가 포함됩니다
8. Critical 발견 사항당 Chrome 알림을 발생시킵니다: _"Hunt Mode에서 /api/users에서 Critical IDOR을 발견했습니다 — 보고서 초안 준비 완료"_
9. 호스트별로 `chrome.storage.local`에 초안을 유지합니다(탭 닫기 + 브라우저 재시작에도 유지)
**라이브 탭**은 각 필터 단계를 실시간으로 설명합니다. 범위 필터 전/후 체인 수, 심각도 분포, 무엇이 삭제되었고 그 이유. 헌트가 0개의 보고서로 종료되면 "보고서가 없는 이유?" 진단이 각 필터 지점을 구체적인 제안("Critical+High 필터 해제", "2개 이상의 인증 컨텍스트 저장", "먼저 대상을 더 탐색")과 함께 안내합니다. 헌트가 비어서 끝난 이유를 더 이상 궁금해할 필요가 없습니다.
**기상하면 사전 작성된 현상금 보고서 대기열이 있습니다.** 각 보고서를 읽고, 복사 또는 내보내기를 클릭하고, HackerOne / Bugcrowd / Intigriti 제출에 붙여넣으세요.
이것은 Burp조차 시도하지 않는 워크플로우입니다. Burp의 활성 스캐너는 공격을 실행하지만 여전히 보고서를 직접 작성해야 합니다. PenScope는 스캔 → 익스플로잇 → 보고서 → 제출까지 전체 경로를 소유합니다.
> 범위를 설정하세요. 시작을 누르세요. 노트북을 닫으세요. 초안이 작성된 Critical 보고서 대기열과 함께 기상하세요.
### 품질 관리 — 평판 유지
헌트 모드는 제출 시 평판을 떨어뜨릴 가양성을 적극적으로 필터링합니다:
- **SPA HTML 셸** — Angular/React/Vue 부트스트랩 페이지는 JS가 클라이언트 측에서 인증을 처리하기 때문에 인증된 요청과 인증되지 않은 요청에 동일한 HTML을 반환합니다. 헌트 모드는 이 패턴(경로가 `.html`로 끝남 + `sameBody=true`)을 감지하고 발견 사항을 억제합니다. 실제 API는 여전히 보고됩니다.
- **무해한 Azure SAS 토큰** — 미디어(`image.jpg?sv=...&sp=r&se=...`)에 대한 단기 읽기 전용 SAS URL은 자격 증명 유출이 아닌 합법적인 CDN 전송입니다. 헌트 모드는 `sp=r` + 미디어 파일 확장자 + `se - st < 7 days`를 확인하고 억제합니다. 장기, 쓰기 가능 또는 비미디어 SAS 토큰은 실제 유출로 계속 보고됩니다.
- **해시 프래그먼트 정규화** — `/Dashboard#!/`는 클라이언트 측 경로이지 서버 엔드포인트가 아닙니다. 헌트 모드는 체인 분석 전에 해시 프래그먼트를 제거하여 보고서에 `/Dashboard`(실제 서버 경로)를 표시합니다.
- **모든 curl의 실제 `baseUrl`** — 체인 분석기는 `tab.url`(HTTP/HTTPS만)에서 대상 호스트를 파생시키고, 첫 번째 관찰된 엔드포인트로 폴백합니다. 더 이상 보고서에 `https://target.tld` 플레이스홀더 URL이 없습니다.
- **투명한 진단** — 모든 필터 단계(범위, 심각도, 중복 제거)는 라이브 피드에 전후 개수를 기록합니다. 헌트가 0개의 보고서로 종료되면 피드는 "보고서가 없는 이유?" 블록으로 끝나며, 잠재적인 발견 사항이 삭제된 정확한 지점을 구체적인 다음 단계 제안과 함께 설명합니다.
### 실제 헌트 모드 초안
다음은 정부 LMS에서 4분 만에 헌트 모드가 생성한 실제 초안의 편집된 발췌문입니다.```markdown
# Authentication bypass on sensitive endpoint: /api/DashboardApi/getUsefulLinks
**Severity:** CRITICAL (CVSS estimate: 9.0–10.0)
**Confidence:** 95%
**Target:** https://lms.example.gov/Dashboard
**Discovered:** 2026-05-01T07:31:13.151Z
**Detected by:** PenScope v6.2 Hunt Mode (chain pattern: chain-authbypass)
## Summary
PenScope's probe confirmed that GET /api/DashboardApi/getUsefulLinks returns
the same data whether or not authentication cookies are sent
(auth=200, noauth=200, sameBody=false). The path name strongly suggests this
endpoint should be role-gated — it's returning sensitive data to
unauthenticated callers.
## Steps to reproduce
# Verify unauthenticated access
curl -i "https://lms.example.gov/api/DashboardApi/getUsefulLinks"
# Compare to authenticated baseline (paste your real cookies):
curl -i "https://lms.example.gov/api/DashboardApi/getUsefulLinks" -b "session=..."
## Impact
Successful exploitation enables an attacker to bypass core security controls,
gain unauthorized access to sensitive functionality or data, and pivot to
broader compromise. This is a credible breach path warranting immediate
remediation.
## Suggested fix
Enforce server-side authentication on every endpoint that returns sensitive
data. The fact that PenScope received a 200 with no cookies means the
authorization middleware is missing or disabled for this route.
[ ... full Express/Django/Laravel snippet examples + references ... ]
제출 가능한 버그 바운티 보고서입니다. 다른 작업을 하는 동안 작성되었습니다.
Workbench는 PenScope를 "수동 정찰 도구"에서 "Burp를 열어야 하는 모든 작업"으로 끌어올리는 기능입니다. 팝업 헤더에서 ⌘ Workbench를 클릭하면 전체 창 Chrome 탭이 열리며, 여섯 가지 도구가 스캔 상태를 공유합니다.
변조하고 싶은 요청을 캡처하셨나요? 사이트 맵에서 클릭하세요. 메서드, URL, 헤더, 본문을 포함한 전체 요청이 편집기에 로드됩니다. 원하는 대로 편집하세요. Send (또는 Ctrl+Enter)를 누르세요. 응답은 상태, 크기, 시간 및 요청을 보낸 활성 인증 컨텍스트와 함께 오른쪽에 표시됩니다.
히스토리 레일은 최근 50개의 요청을 유지합니다. 세 개의 버튼으로 현재 요청을 실행 가능한 아티팩트로 변환할 수 있습니다: curl로 복사(터미널 및 보고서용), Intruder로 보내기(동일한 헤더와 본문이 미리 로드됨), 응답을 Diff로 보내기.
아무 요청이나 가져오세요. 퍼징하려는 값을 §...§로 감싸세요. 페이로드 세트를 선택하세요. Start를 누르세요.
내장 페이로드 라이브러리:
또는 직접 목록을 붙여넣으세요. 네 가지 공격 모드: Sniper(한 번에 하나의 위치), Cluster bomb(모든 조합), Pitchfork(위치를 동시에), Battering ram(모든 곳에 동일한 페이로드). 상태 코드나 응답 크기가 기준과 다른 행을 플래그 지정하는 이상 감지 기능이 있는 실시간 결과 테이블.
하드 제한: 공격당 200개 요청. 실수로 바운티 대상을 DoS하지 마세요.
헌터들이 매일 접하는 형식에 대한 왕복 가능 변환:``` Base64 ↔ B64-URL ↔ URL ↔ HTML ↔ Hex ↔ MD5 / SHA-1 / SHA-256 / SHA-512
Plus a dedicated **JWT card**: paste a token, decode the header and payload, edit either, then forge a new one. Two forge modes:
- **alg=none** — 고전적인 JWT 인증 우회 테스트 (서버는 서명되지 않은 토큰을 신뢰함)
- **HS256** — 추측된 약한 비밀키로 서명 (`secret`, `key`, `password`, `jwt-secret` 등이 일반적임)
Output is a single token, ready to copy and paste.
### Diff
Two text panes. Send responses from Repeater with one click. Hit `Compute Diff`. PenScope runs an LCS line-diff and color-codes the result: `+` for added, `−` for removed. Summary count at the top.
This is the IDOR-confirmation killer. "Is the response for User A *the same* as for User B, or did the server actually return User B's data?" Diff tells you in three seconds.
### Site Map
Hierarchical tree of every endpoint PenScope captured, organized by host → path. Method pills (`GET`, `POST`, `DELETE`...). Status code badges per node, color-coded green/yellow/orange/red. Click any path to load it into Repeater.
The full attack surface, in one view, ready to test.
### Auth Contexts + Authorization Matrix
This is the differentiator. Burp doesn't ship this.
Save named auth profiles. Each profile = a name + a set of cookies + a set of headers. Build them by logging in as each user, copying their session cookies + Authorization header, pasting into the editor. Add notes ("paid plan", "read-only role", "internal staff"). One click switches the active context. Every Repeater / Intruder / probe request now fires with those credentials.
Then click `Run authorization matrix`. PenScope hits every endpoint × every context and renders a grid:```
Anonymous User A User B Admin
GET /api/me 401 200 200 200
GET /api/users 401 403 403 200
GET /api/admin 401 403 403 200
DELETE /api/orders/5 405 403 403 ★ 200
PATCH /api/users/42 401 200 ★ 403 200
별표는 컨텍스트가 일치하지 않는 행을 표시합니다. 해당 행은 IDOR 및 BAC 발견 사항이 자동으로 표면화된 것입니다.
일반적인 헌터는 각 엔드포인트를 각 사용자로 수동으로 테스트하고 문서에 노트를 작성하는 데 오후 내내 보냅니다. PenScope는 30초 만에 이 작업을 수행하고 결과를 색상으로 구분합니다.
동일한 데이터 엔진, 세 가지 뷰. 현재 수행 중인 작업에 맞는 것을 선택하세요.
팝업 헤더의 Classic / Red / Blue 알약으로 모드를 전환하세요. 각 탭은 마지막으로 사용한 모드를 기억합니다. 테마 색상이 모드에 따라 변경됩니다.
팝업 헤더에서 Export ▾를 클릭하세요. 열 가지 형식, 두 가지 목적:
마크다운 보고서는 공유를 위해 제작되었습니다 — 모든 자격 증명이 가려지며, 보고서 헤더에 명시적으로 명시됩니다. JSON은 헌팅 파트너와 동기화하기 위해 제작되었습니다 — 모든 자격 증명이 그대로 전송됩니다.
PenScope와 Burp는 같은 문제를 다른 방식으로 해결합니다. PenScope는 브라우저에 있으며, Burp는 MITM 프록시입니다. 둘 다 각자의 장점이 있습니다. 여기 정직한 비교가 있습니다.
PenScope의 장점: 무료, 더 빠른 설정, 브라우저 네이티브 (실제 세션 사용, 인증서 설정 불필요), 체인 상관관계, 방어자 모드 도구, AI 브리지.
Burp의 장점: TLS 수준 가로채기를 통해 요청이 네트워크 스택을 떠나기 전에 보고 수정할 수 있음 — 네이티브 앱 및 웹소켓 밀수에 유용. Collaborator는 블라인드 XXE/SSRF에 대한 대역 외 콜백 인프라를 제공합니다.
웹 앱에서 브라우저로만 버그 바운티를 수행한다면, PenScope는 일상 작업 흐름의 약 95%에서 Burp를 대체합니다. 모바일 앱을 리버스 엔지니어링하거나 씩 클라이언트를 테스트한다면, Burp가 여전히 유용합니다.
PenScope는 명시적인 사용자 작업 없이는 아무것도 전송하지 않습니다. 다음은 없습니다:
아웃바운드 트래픽은 세 가지 경우에만 발생합니다:
npm 패키지 제로. CDN 스크립트 제로. 타사 SDK 제로. 순수 바닐라 JavaScript, MV3 매니페스트, 공급망 공격 표면 제로.
아키텍처, 36개 프로브 공격, 13개 체인 패턴, 파일 맵, 그리고 이 모든 것이 빌드 단계를 필요로 하지 않는 이유.
┌──────────────────────────┐
│ state[tabId] │
│ 60+ fields populated by │
│ webRequest / content / │
│ CDP / probe layers │
└──────────┬───────────────┘
│
┌───────────────────────┼───────────────────────┐
│ │ │
Classic mode Red mode Blue mode renderClassic() renderRed() renderBlue() │ │ │ └───────────────────────┴───────────────────────┘ │ ┌────────────────┴────────────────┐ │ │ Workbench Hunt Mode (Repeater · Intruder · Encoder (autonomous orchestrator · Diff · Site Map · Auth Matrix) drafting H1 reports)
**하나의 엔진, 세 가지 모드, 세 가지 표면.** 데이터 엔진은 모드에 구애받지 않습니다. 모든 상태 필드는 어떤 보기를 사용하든 동일한 방식으로 수집됩니다. 모드는 동일한 데이터에 대한 테마 + 렌더러 선택입니다. Workbench와 Hunt Mode는 독립형 Chrome 탭이며, 백그라운드 메시지 핸들러를 통해 `state[tabId]`를 공유합니다.
CSS 변수 재정의(`body.mode-red`, `body.mode-blue`)는 단일 규칙 선택자를 건드리지 않고 모든 것을 다시 테마화합니다. 이것이 Classic 모드가 바이트 단위로 v5.9 경험과 동일한 이유입니다.
---
## 성능
PenScope는 모든 탭에서 항상 실행됩니다. 기본적으로 약 50개의 알려진 시끄러운 호스트 접미사(비디오 CDN: `googlevideo.com`, 광고 네트워크: `doubleclick.net`, 텔레메트리 엔드포인트: `sentry.io`, 대규모 정적 CDN: `gstatic.com` 등)에 대한 비용이 많이 드는 보강을 단락시킵니다. YouTube에서 분당 수백 개의 `googlevideo.com` 청크 요청은 더 이상 14개의 AUTH_PATTERN 정규식 + 경로-매개변수 감지 + Swagger 조회를 거치지 않습니다. 엔드포인트로 기록되어(사이트 맵에는 계속 포함됨) 나머지 처리는 건너뜁니다.
모든 호스트의 `image`/`media`/`font`/`stylesheet`/`object`/`ping` 리소스 유형에도 동일한 빠른 경로가 적용됩니다. 버그가 `.css` URL 매개변수에 숨어 있는 경우는 거의 없습니다.
콘텐츠 스크립트 DOM 재검사는 `requestIdleCallback`을 통해 실행되며(검사 사이에 최소 15초 간격 적용) 탭이 숨겨져 있으면 완전히 건너뜁니다. MutationObserver는 텍스트 전용 변경(타이머 틱, 문자 데이터 업데이트)을 필터링하여 YouTube의 지속적인 DOM 변화가 3초마다 전체 재검사를 트리거하지 않도록 합니다.
재정의 가능: **Probe 드롭다운의 "시끄러운 호스트에서 전체 캡처"** 체크박스. YouTube/Twitch/Sentry 등을 대상으로 특별히 감사할 때 체크하면 빠른 경로가 우회됩니다.
---
## 45가지 프로브 공격
요청 시 실행됩니다. 세 가지 공격 수준과 강제 계약이 있습니다: **조심** = GET/HEAD/OPTIONS만 사용하며 요청 간 최소 200ms 간격; **중간** = 읽기 형태 작업을 위한 POST 추가(최대 3개 병렬); **전체** = DELETE/PUT/PATCH를 포함한 모든 메서드와 경쟁 조건 버스트(최대 10개 병렬). 사용자 정의 헤더는 모든 요청에 붙여넣어집니다. 은신 모드는 Fisher-Yates로 단계 순서를 섞고 단계 간 지연에 0–80% 지터를 추가합니다. 각 단계의 예상 메서드는 프로브 시작 시 활성 계층에 대해 드라이런 검사되며 차단된 단계는 진단 로그에 나열됩니다.
| # | 공격 | 설명 |
|---|---|---|
| 1 | GraphQL introspection | 스키마, 타입, 쿼리, 뮤테이션 덤프 |
| 2 | Source map 수집 | `.map` 다운로드, 시크릿 + 엔드포인트 추출 |
| 3 | Swagger/OpenAPI 가져오기 | `/swagger.json`, `/openapi.json` 등 |
| 4 | OPTIONS preflight | 모든 API 경로에 CORS preflight |
| 5 | 정찰 경로 프로빙 | `/admin`, `/.env`, `/.git/HEAD`, `/actuator` |
| 6 | API 접두사 접미사 무차별 대입 | `/api/v1/<word>` |
| 7 | 스마트 접미사 무차별 대입 | 은신 셔플된 접두사 × 접미사 |
| 8 | BAC (취약한 접근 제어) | 상태 변경 엔드포인트 인증 없음 |
| 9 | IDOR 자동 테스트 | ID 대체 + 동일 본문 비교 |
| 10 | CORS 반사 테스트 | 자격 증명이 있는 Origin 반사 |
| 11 | 메서드 변조 | GET/POST/PUT/PATCH/DELETE 교체 |
| 12 | 오픈 리다이렉트 프로브 | `?redirect=evil.com` 변형 |
| 13 | 경쟁 조건 프로브 | 멱등성에 민감한 엔드포인트에 대한 동시 요청 |
| 14 | HTTP 매개변수 오염 | `?id=1&id=2` |
| 15 | 서브도메인 열거 | CT 로그 + 관찰된 트래픽에서 |
| 16 | GraphQL 필드 퍼징 | 인트로스펙트된 각 필드를 인증에 대해 프로브 |
| 17 | JWT alg=none 수락 | 서버가 서명되지 않은 토큰을 신뢰합니까? |
| 18 | Host 헤더 주입 | `X-Forwarded-Host` 변형 |
| 19 | 캐시 포이즈닝 | 키 없는 헤더 주입 |
| 20 | IDOR 동일 본문 확인 | ID 간 본문 유사성 |
| 21 | 인증 제거 테스트 | 쿠키 제거, 200 응답 확인 |
| 22 | CSRF 검증 격차 | 토큰 없는 상태 변경 엔드포인트 |
| 23 | gRPC reflection | 노출된 gRPC reflection 서비스 |
| 24 | 압축 오라클 (BREACH) | 휴리스틱, 실제로 악용하지 않음 |
| 25 | WebSocket 하이재킹 | 교차 출처 WS 연결 |
| 26 | 캐시 포이즈닝 프로브 | 헤더 기반 키 없는 입력 |
| 27 | 타이밍 오라클 | 동일 엔드포인트의 타이밍 변동 |
| 28 | COOP/COEP 우회 | 교차 출처 격리 강도 |
| 29 | 스토리지 파티션 | 사이트 간 스토리지 격리 |
| 30 | 스마트 재귀적 발견 | 3단계 프로빙, 이전 응답에서 연결 |
| 31 | 매개변수 발견 | 38개 숨은 매개변수 무차별 대입 (`debug`, `admin`, `_method`, `bypass`...) |
| 32 | SSTI 프로빙 | `{{7*7}}`, `${7*7}`, `<%=7*7%>` |
| 33 | XXE 프로빙 | 외부 엔티티가 있는 XML |
| 34 | CRLF 주입 | 리다이렉트 매개변수의 `%0d%0a` |
| 35 | API 버전 다운그레이드 | 관찰된 각 `/vN/`에 대해 `/v1/`, `/v2/` |
| 36 | 프로토타입 오염 | JSON 본문의 `__proto__` / `constructor.prototype` |
| 37 | SSRF 매개변수 프로빙 | 26개 SSRF 매개변수 이름과 클라우드 메타데이터 페이로드; 반영된 메타데이터 콘텐츠 플래그 |
| 38 | NoSQL 연산자 주입 | JSON ID 필드에 `{"$ne":null}` / `{"$gt":""}` / `{"$exists":true}` |
| 39 | GraphQL 별칭 증폭 | 50-별칭 쿼리 → DoS 증폭 표면 (전체만) |
| 40 | GraphQL 배치 증폭 | 25개 요소 JSON 배열 배치 → DoS 증폭 (전체만) |
| 41 | 캐시 속임수 | `/api/me/avatar.css` 스타일 — 정적 확장자 뒤에 민감한 콘텐츠 캐시 |
| 42 | 서브도메인 인수 | 캡처된 서브도메인의 HEAD 스타일 프로브; GitHub Pages / S3 / Heroku / Netlify / Vercel / Bitbucket / Shopify 인수 시그니처 매칭 |
| 43 | TabNabbing | `rel="noopener"` 없는 교차 출처 `<a target="_blank">` |
| 44 | postMessage 출처 상관관계 | 출처 검사 없는 `addEventListener("message")` 리스너 |
| 45 | Service Worker 범위 남용 | 광범위한 SW 범위 플래그 (특히 `/`) |
추가로 **8개의 스택 인식 공격 팩**이 있으며, Red 모드가 일치하는 프레임워크(Laravel, Spring Boot, Rails, ASP.NET, Django, Next.js, GraphQL, WordPress)를 감지하면 자동으로 실행됩니다. 각 팩은 4-9개의 스택별 테스트를 포함합니다. Spring Boot 팩만으로도 `/actuator/heapdump`, `/actuator/env`, `/jolokia/list`, `/h2-console`을 공격합니다.
---
## 13가지 체인 패턴
개별 발견은 노이즈입니다. 복합 발견은 익스플로잇입니다. PenScope의 체인 분석기는 전체 상태를 탐색하고 여러 신호가 결합되어 악용 가능한 체인을 출력합니다.
1. **민감한 엔드포인트의 인증 우회** — 확인된 인증 부재 + admin/billing/user 경로
2. **파괴적인 BAC** — 경로에 `delete`/`remove`/`purge`가 있는 취약한 엔드포인트
3. **CSRF 취약 GraphQL 뮤테이션** — 확인된 CSRF 부재 + 뮤테이션
4. **노출된 인증 토큰 + 활성 API** — 메모리의 JWT + 일치하는 엔드포인트
5. **민감한 데이터가 있는 확인된 IDOR** — ID 간 동일한 스켈레톤 응답
6. **자격 증명이 있는 CORS 반사** — 전체 SOP 우회
7. **인증 흐름의 오픈 리다이렉트** — OAuth 콜백 경로의 리다이렉트 매개변수
8. **숨겨진 관리자 경로** — 트래픽에서 관찰되지 않은 코드 내 3개 이상의 admin 경로
9. **JWT alg=none 수락** — 서버가 서명되지 않은 토큰을 신뢰
10. **Source map에서 유출된 시크릿** — 하드코딩된 키가 있는 프로덕션 제공 `.map` 파일
11. **WebRTC 내부 IP 유출** — STUN을 통해 노출된 개인 IP
12. **재귀적 프로브 발견 클러스터** — 여러 엔드포인트에서 3개 이상의 민감한 발견
13. **스택 특정 RCE 표면** — 스택 팩이 노출된 actuator/Ignition 등을 발견
각 체인에는 심각도, 요약, 재현 명령, 다음 단계, 신뢰도 점수가 있습니다. `심각도 × 신뢰도`로 정렬됩니다. Red 모드 상단과 모든 Claude 보고서 상단에 렌더링됩니다.
---
## 건강 점수 (Blue 모드)```
score = max(10, 100 − min(90, crit×22 + high×9))
의도적으로 엄격합니다. 치명적 및 높음만 점수에 영향을 줍니다. 중간 및 낮음은 여전히 개수 타일과 상위 5개 수정 사항에 표시되며 — 수정할 가치가 있습니다 — 하지만 점수에는 영향을 미치지 않습니다.
최저점을 10으로 설정하여 심각한 사이트가 "10/100"으로 표시되도록 하고, "0/100"이 아닌 (사용자가 "스캔 실패"와 구분할 수 없게 됨) 방식입니다.
PenScope/ ├── manifest.json MV3 manifest, v6.3.0, "type":"module" service worker ├── popup.html Mode UI shell — three modes, glassmorphism dark theme ├── popup.js Renderers, mode router, weaponize panels, fix snippets, │ compliance, Hunt + Workbench launchers, exports ├── content.js Content script — DOM scanning, secrets, JSON islands, │ tech fingerprints, XSS sinks, postMessage scan │ ├── workbench.html / .js Workbench tab — Repeater / Intruder / Encoder / │ Diff / SiteMap / AuthCtx + AuthMatrix │ ├── hunt.html / .js Hunt Mode tab — autonomous orchestrator │ ├── regex-pack.json 81 secret patterns + 44 response-body patterns │ (loaded by SW at boot, merged into RESP_PATTERNS, │ fetched by content script via getRegexPack message) │ ├── src/ Service worker entry + module tree (Phase 7 migration) │ ├── background.js Entry — webRequest, CDP, probe orchestrator, │ │ chain correlator, message router (~7,000 lines) │ ├── probe/ │ │ └── stack-packs.js STACK_ATTACK_PACKS (8 stacks) — extracted module │ └── (other audit-named files are stubs — see MIGRATION.md) │ ├── fonts/ Local woff2: JetBrains Mono + Plus Jakarta Sans │ (4 + 5 weights, ~590 KB total). Replaces the │ Google Fonts beacon that earlier versions hit on │ every popup open. │ ├── icons/ 16, 48, 128 px PNG ├── CHANGELOG.md Full version history v5.1 → v6.3.0 ├── CHANGES.md v6.3 per-phase fix breakdown ├── MIGRATION.md Phase 7 module-migration map (real vs stub) ├── LICENSE MIT └── README.md You are here
네 개의 이전 참조 파일(`red-attacks.js`, `blue-fixes.js`, `blue-csp.js`, `blue-compliance.js`)은 v6.3에서 제거되었습니다 — 해당 내용은 v6.0부터 이미 `popup.js`/`background.js`에 인라인되었고, 독립 실행 파일은 죽은 코드였습니다. `STACK_ATTACK_PACKS`는 이제 `src/probe/stack-packs.js`에서 실제 ES 모듈 내보내기가 되었습니다.
## 빌드 단계 없음```bash
git clone https://github.com/spider12223/PenScope
# That's it.
No npm install. No webpack. No babel. No TypeScript. No bundler. Pure vanilla JavaScript. popup.html의 <script> 태그는 popup.js를 바로 가리킵니다. 서비스 워커는 background.js를 직접 로드합니다. CSS는 <style>에 인라인됩니다.
MD5 구현은 약 50줄의 인라인 RFC 1321 레퍼런스입니다 (crypto.subtle가 MD5를 노출하지 않기 때문). LCS diff는 약 30줄입니다. JWT 서명은 네이티브 crypto.subtle.sign을 사용합니다. 체인 상관기는 단순한 정규식 + 배열 반복입니다. 이 코드베이스에서 읽는 모든 것이 브라우저에서 정확히 실행되는 것입니다.
200개의 전이적 npm 의존성을 포함한 정찰 도구는 200개의 공급망 공격 표면 패키지를 가지고 있습니다. PenScope는 0개입니다.
버그 신고와 PR을 환영합니다. 몇 가지 제약 사항:
package.json 없음. 작은 유틸리티가 필요하면 20줄을 직접 작성하세요.state[tabId]에 유지. 새로운 전역 저장소를 도입하지 마세요.:focus-visible 윤곽선, ARIA 레이블, ≥4.5:1 대비가 필요합니다.new Function() 사용 금지. MV3 서비스 워커는 동적 코드를 금지합니다. chrome.scripting.executeScript에는 명명된 함수 선언 + args를 사용하세요.MIT. 사용하고, 포크하고, 배포하세요.
PenScope가 중요한 것을 찾아준다면, 이슈를 열고 알려주세요. 전쟁 이야기를 수집합니다.
expAccessibility.getFullAXTree가 민감한 aria-labels를 표시합니다 (admin/sudo/delete/destroy 버튼). Storage.getCookies는 chrome.cookies.getAll이 가져오지 않는 CHIPS 분할 쿠키를 노출합니다.<script type="application/json"> 블록(Next __NEXT_DATA__, Nuxt __NUXT__, Remix __remixContext, Apollo __APOLLO_STATE__)을 정규식 스캔만 하지 않고 엔드포인트 + ID 필드로 파싱합니다.curl 버튼, 행별 unauth 버튼 (쿠키 없이 요청을 재생하여 나란히 결과 표시). 라우트 테이블 뷰로 /users/123, /users/124를 /users/{id}로 접어서 개수 표시. admin.*, api.*, internal.* 서브도메인을 위한 자동 피벗 레일.ffuf -w에 드롭 가능.window.__ps_ctx가 더 이상 프로브 완료 후 사용자의 Authorization 헤더를 페이지 컨텍스트에 유출하지 않습니다. 체인 재현 명령은 기본적으로 세션 쿠키를 수정합니다 (Red 모드에는 실제 값을 위한 옵트인 토글 있음). 프로브 IIFE는 부팅 시 fetch/JSON/Promise/atob/btoa/등을 스냅샷하여 분석 계측 페이지가 전역을 재정의하여 프로브를 가로채는 것을 방지합니다. 로컬 폰트 벤더링 — 팝업 열 시 아웃바운드 요청 제로."type":"module"로 로드됩니다. src/ 디렉토리 트리가 준비되었습니다. STACK_ATTACK_PACKS가 src/probe/stack-packs.js로 추출되었습니다. 나머지 모듈은 추출 경로를 문서화하는 스텁입니다.| 세트 | 개수 | 사용 사례 |
|---|
| XSS | 40 | 반사 테스트, DOM XSS, SVG/iframe 변종 |
| SQLi | 30 | 불리언 블라인드, 오류 기반, 시간 기반, UNION |
| LFI / 경로 탐색 | 28 | 인코딩 변종, Windows + Linux, 로그 중독 |
| SSTI | 18 | Jinja2, Twig, Freemarker, Velocity, Smarty |
| SSRF | 22 | Localhost 변종, AWS/Azure/GCP 메타데이터, gopher/dict |
| 명령 주입 | 24 | Bash, PowerShell, IFS 우회 |
| IDs 1-100 | 100 | IDOR 열거용 |
| 인증 우회 | 25 | 경로 트릭, 역할 상승, SQL 인증 우회 |
| 일반 사용자 이름 | 25 | admin, root, test, support, service... |
| 모드 | 용도 | 화면에 표시되는 내용 |
|---|
| 🟣 | Classic | 익숙한 워크플로, 전체 데이터 | 모든 탭, 모든 세부 정보. 원본 PenScope. |
| 🔴 | Red | 공격적 테스트 | 상단의 익스플로잇 체인 레일과 무기화 버튼 (curl, Nuclei YAML, Burp 요청, H1 보고서 초안, Claude 큐). 감지된 프레임워크(Laravel, Spring Boot, Rails, ASP.NET, Django, Next.js, GraphQL, WordPress)에 스택 인식 공격 팩 자동 발사. 체인 우선, 아래에 고전적인 탭이 접혀 있음. |
| 🔵 | Blue | 방어자 / 보안 검토 | 건강 점수 (0-100, 엄격 — 중요 및 높음만 집계). 심각도 × 용이성 순으로 우선순위가 지정된 상위 5개 수정 사항, 각각 Nginx / Apache / IIS / Express / Django / Laravel / Rails / ASP.NET용 복사-붙여넣기 스니펫 포함. 관찰된 트래픽 CSP 생성기. 7-프레임워크 규정 준수 감사. 스냅샷 및 회귀 비교. 새 비밀 유출 시 Chrome 알림을 통한 지속적 모니터링. |
| 내보내기 | 자격 증명 포함? | 용도 |
|---|
| JSON (full data) | ✅ 예 | 팀 공유 형식. 동일한 대상을 작업하는 두 헌터는 결과를 재현하기 위해 공유된 인증 컨텍스트가 필요합니다. Signal / 암호화 채널을 통해 전송하세요. |
| 📄 Full Report (.md) | ❌ 가려짐 | 바운티 제출, 고객 참여, 팀 외부로 나가는 모든 곳. 인증 헤더 값(Authorization, Cookie, X-API-Key, X-Auth-Token, X-CSRF-Token, X-Amz-Security-Token 등)이 <redacted, N chars>로 대체됨. 포함: 임베디드 Hunt Mode 초안 보고서, 스택 공격 팩 적중, 지속적 모니터 알림, 수정됨으로 표시된 분류 상태. |
| Burp URL list | URL 목록만 | Burp의 대상 범위에 붙여넣거나 ffuf/nuclei에 공급 |
| Param wordlist | 이름만 | 퍼징 사전 — 쿼리 매개변수 + 양식 입력 이름 + 숨겨진 필드 이름 |
| Param wordlist (ffuf) | 이름만 | 동일한 데이터가 param=FUZZ 줄로 ffuf -w에 제공됨 |
| Endpoints (txt) | URL 목록만 | 탭으로 구분된 메서드/상태/경로/호스트/태그/크기 — 관찰 + 발견된 라우트 |
| 📤 HAR Export | 헤더 + 본문 | Chrome DevTools / HAR 뷰어로 가져오거나 동료에게 전달할 수 있는 전체 HAR-1.2 캡처 |
| 🔧 Swagger Spec (.yaml) | URL 목록만 | 관찰된 트래픽에서 재구성된 OpenAPI 3.0 스펙 |
| 🗺️ Source Maps (JSON) | 소스 추출물만 | 파일 트리, 시크릿, 라우트, 환경 변수, 종속성이 포함된 전체 파싱된 소스 맵 |
| ⚔️ Nuclei Templates (.yaml) | 프로브 URL만 | 지속적 스캐닝을 위한 ~/.config/nuclei/custom/에 드롭인 |
| 기능 | PenScope (무료) | Burp Suite Pro ($449/년) |
|---|
| Repeater | ✅ | ✅ |
| Intruder (4가지 공격 모드) | ✅ | ✅ |
| Decoder (B64/URL/Hex/JWT) | ✅ | ✅ |
| Comparer / Diff | ✅ | ✅ |
| Target / Site Map | ✅ | ✅ |
| Active scanner | ✅ (45개 프로브 + 8개 스택 팩) | ✅ |
| Session/auth context handling | ✅ (저장된 프로필 + 매트릭스) | ✅ (규칙 기반) |
| Authorization matrix tester | ✅ (내장) | ❌ (유료 확장) |
| Chain correlation (복합 발견 사항) | ✅ (13가지 패턴) | ❌ |
| Subdomain takeover heuristic | ✅ (8개 서비스 시그니처) | ❌ (유료 확장) |
| GraphQL DoS surface tests (별칭 + 배치) | ✅ | ❌ |
| Per-endpoint unauth replay button | ✅ | ❌ |
| HAR import + export | ✅ (왕복) | ✅ (단방향) |
| IndexedDB diff (클라이언트 상태 누출 포착) | ✅ | ❌ |
| CHIPS partitioned cookie capture | ✅ | ❌ |
| JSON island parser (Next/Nuxt/Remix 수화 데이터) | ✅ | ❌ |
| Compliance mapping (PCI/NESA/SAMA/ISO/OWASP) | ✅ (7개 프레임워크) | ❌ |
| CSP generator from observed traffic | ✅ | ❌ |
| Regression diff (스냅샷 + 비교) | ✅ | ❌ |
| AI integration (Claude 양방향) | ✅ | ❌ |
| Autonomous Hunt Mode (사용자가 자는 동안 H1 보고서 초안 작성) | ✅ | ❌ |
| 설정 시간 | 60초 | ~30분 (프록시 + 인증서 + 브라우저 설정) |
| TLS-level proxy interception | ❌ (브라우저 제한) | ✅ |
| Out-of-band testing (Collaborator) | ❌ (계획됨) | ✅ |
| Extension marketplace | ❌ | ✅ |
| 비용 | $0 | $449 / 사용자 / 년 |
| State | Score |
|---|
| 치명적 0, 높음 0 | 100 (깨끗함) |
| 높음 1 | 91 |
| 높음 3 | 73 |
| 치명적 1 | 78 |
| 치명적 1 + 높음 3 | 51 |
| 치명적 3 | 34 |
| 치명적 5+ | 10 (최저점) |
| 권한 | 이유 |
|---|
webRequest | 모든 요청/응답을 다시 가져오지 않고 캡처 |
webNavigation | SPA pushState/replaceState 라우트 변경 감지 (v6.3+)로, SPA가 교차 출처로 이동할 때 app.com의 엔드포인트가 새 출처의 상태로 새어나가지 않도록 함 |
activeTab | 현재 탭의 URL 읽기 + 콘텐츠 스크립트 메시지 전송 |
scripting | 프로브 러너, 스택 팩, 워크벤치 요청을 페이지 컨텍스트에 주입 |
tabs | 결과를 올바른 탭에 매핑; 새 탭에서 워크벤치 열기 |
cookies | document.cookie로 볼 수 없는 HttpOnly 쿠키 읽기 |
debugger | 딥 모드에 필요 — CDP를 활성화하여 전체 응답 본문, 런타임 검사, 소스 추출, 감사 문제, 접근성 트리, 분할 쿠키 지원 |
notifications | 새 비밀 유출 시 지속적 모니터 알림 |
alarms | 지속적 모니터를 위한 5분 간격 틱 |
storage | SW 재시작 간 상태(session) 및 스냅샷(local) 유지 |
<all_urls> 호스트 권한 | 캡처는 대상에 구애받지 않음; 사용자가 열려 있는 탭을 제어 |