
pentest-ai v1.4.0
모든 발견을 입증하는 오픈소스 AI 펜테스터. 머신 오라클이 각 익스플로잇을 재실행하며, 검증된 버그는 직접 재현할 수 있는 증명 캡슐과 함께 제공됩니다.
⚠️ 공격형 도구, 승인된 테스트 전용입니다. 설치 시 AUP 및 이용약관에 동의하는 것으로 간주됩니다. 책임 있는 사용 ↓ 참조
2분이면 충분합니다. API 키도, 자체 타깃도 필요 없습니다
pip install ptai && ptai demo
ptai demo는 번들로 포함된 취약한 앱을 스캔하여 4 findings, 3 oracle-VERIFIED를 출력합니다.
증명 캡슐(replay 3/3)에서 하나를 실시간으로 재생한 다음, 동일한 라우트를
하드닝한 상태로 실행하여 0 findings를 출력합니다.
주목할 점이 두 가지 있습니다. 발견 항목은 도구가 조용해져서가 아니라 취약점의 유무에 따라 나타났다 사라집니다 — 두 실행 사이에 변경된 유일한 것은 수정 사항뿐입니다. 그리고 네 개 중 하나는 후보로 남습니다: SQLi 로그인 우회는 실제이지만, 해당 라우트에서 이를 재증명할 수 있는 오라클이 없어 배지를 받지 못합니다. 그 공백은 제품이 의도대로 작동하는 것이지, 데모의 버그가 아닙니다.
여기서 VERIFIED가 실제로 의미하는 것
대부분의 스캐너는 어떤 것이 취약할 수 있다고 알려주고 분류 작업은 사용자에게 맡깁니다. ptai는 명명된 기계 오라클이 익스플로잇을 재실행하여 N회 중 N회 재현할 때까지 발견 항목을 후보로 취급합니다. 그때서야 VERIFIED를 획득합니다.
세 가지 속성이 이를 단순한 슬로건 이상으로 만듭니다:
LLM은 절대 판정을 내리지 않습니다. 이 규칙은 정책이 아닌 코드로 강제됩니다: 판정을 획득한 오라클을 명명할 수 없는 판정은 거부됩니다. LLM은 실행을 조정하고 결과에 대해 추론합니다. 버그가 실제인지 여부를 결정하지는 않습니다.
모든 오라클에는 반드시 실패해야 하는 대조군이 있습니다. 신뢰된 헤더 우회는 헤더가 있는 상태에서 권한 있는 콘텐츠를 반환하고 없는 상태에서 거부를 반환해야 합니다. 유출된 자격 증명 검사는 실제 비밀번호에 대해 수락되고 의도적으로 손상시킨 쌍둥이에 대해 거부되어야 합니다. 모든 것에 200을 응답하는 엔드포인트는 아무것도 얻지 못합니다. 이것이 "200을 반환했다"는 것을 증명으로 오인하지 않게 하는 장치입니다.
타사 스캐너 출력은 보류됩니다. nuclei, nikto 및 zap 결과는 자체 권한으로 발견 항목이 되지 않습니다. ptai 자체 오라클 중 하나가 독립적으로 재증명할 때까지 검증되지 않은 상태로 유지됩니다.
각 VERIFIED 발견 항목은 휴대용 증명 캡슐로 제공됩니다 — 발견 항목, 이를 재증명하는 레시피, 그리고 영수증.
누구나 라이브 타깃에 대해 ptai replay를 실행하여 오라클이 재확인하는 것을 볼 수 있습니다. ptai를 신뢰할 필요 없이 말입니다. 캡슐은
의도적으로 서명되지 않았습니다: 재생이 신뢰 메커니즘이지, 맹목적으로 받아들여야 하는 서명이 아닙니다.
정직한 수치
| 작동하는 오라클이 있는 취약점 클래스 | 14 |
| 라이브러리의 프로브 수 | 64 |
| VERIFIED를 획득할 수 있는 프로브 수 | 30 |
| 오라클 종류 | 24 |
| 도구 래퍼 수 | 203 |
| …현재 출력을 발견 항목으로 파싱하는 수 | 18 |
| MCP 도구 | 52 |
| 전문 에이전트 | 18 |
| 테스트 | Python 3.10 / 3.12 / 3.14에서 2,729개 |
의도적으로 취약하게 만든 허니팟에서 23개의 발견 항목이 14개 클래스에 걸쳐
100% 정밀도로, 오탐 없이 검증됩니다. 표준 OWASP Juice Shop에서는 2026-08-23 스윕에서 17개의 발견 항목이
검증되었습니다 — 17/116이 아닌 범위 내 HTTP / 검증됨 / 정밀도로 보고합니다. 2026-08-25 Path 1 MCP 세션(MCP 클라이언트가
run_probe를 구동, 오케스트레이터 검증 전에 타깃 사망)은 64개의 범위 내 HTTP 챌린지(20개는 추적하지 않음)에 대해
100% 정밀도로 12개의 검증된 증명을 획득했습니다. OSINT, Web3 및 UI 전용 Juice Shop 키는 설계상 자동화 스코어보드에서 제외됩니다.
이 수치를 주의 깊게 읽으십시오. 공백이 바로 핵심이기 때문입니다. 64개의 프로브가 존재하지만 판정을 획득할 수 있는 것은 30개뿐입니다. 나머지 34개는 정직한 후보를 보고합니다. 203개의 래퍼가 등록되어 있지만 발견 항목으로 전환하는 것은 18개뿐입니다 — 나머지는 실행 후 원시 텍스트를 반환합니다. 오라클 게이트는 정밀도를 구매합니다. 탐지율이 아닙니다: 오탐을 제거할 뿐, 더 많은 버그를 찾지는 않습니다.
허니팟 하네스(tests/honeypot/)와 클린 앱
오탐 제로 게이트(tests/cleanapp/)는 모두 이 저장소에 포함되어
CI에서 실행되므로 스크린샷이 아닌 재현 가능한 결과입니다.
하지 않는 일
보안 도구가 자신을 과장하는 것은 쓸모없는 것보다 나쁘기 때문에, 명확히 밝힙니다.
- 웹 애플리케이션 스캐너입니다. 64개의 프로브와 24개의 오라클 종류 모두 HTTP를 대상으로 합니다. AD, 클라우드, 모바일 및 무선에는 에이전트와 도구 래퍼가 있지만, 그 뒤에는 프로브 라이브러리와 오라클이 없습니다.
- 로컬 권한 상승을 수행할 수 없습니다. 이를 위해서는 이미 소유한 호스트에서 코드 실행이 필요합니다.
ptai는 원격으로 테스트하며 그러한 채널이 없으므로, privesc 에이전트는 오해를 불러일으키는 0 대신
unsupported를 보고합니다. - CVE 스캐너가 아닙니다. 버전-대-CVE 데이터베이스도 익스플로잇 라이브러리도 없습니다. CVE 작업은 유출된 매니페스트에 대한 osv.dev 조회로 제한됩니다.
- 플레이북은 계획만 하지 실행하지 않습니다.
ptai playbook run은 종속성을 해결하고 계획을 출력합니다. 타깃에 대해 실행하는 기능은 아직 연결되지 않았습니다. - 자율적이지 않습니다. 완전 자율 LLM 펜테스트 에이전트는 작업의 21–31%만 종단 간 완료합니다. 인간 지원 설정은 64%에 도달합니다. ptai는 후자의 체제를 위해 설계되었습니다. 실행 중간에 인수하려면 Ctrl+C를 두 번 누르십시오.
위의 모든 것을 포함한 완전한 내부 결함 목록은 조용히 처리되지 않고 공개적으로 추적됩니다. 여기에 잘못된 것이 있으면 이슈를 열어 수정됩니다.
설치
경로 1 — Claude Code, Cursor 또는 Codex에서 구동 (API 키 불필요)
기존 AI 구독이 LLM 역할을 합니다. ptai가 도구를 제공합니다.
pip install ptai
ptai mcp install # MCP 클라이언트를 자동 감지하여 설정 파일 작성
클라이언트를 재시작하면 52개의 도구가 나타납니다. 이 경로에서는 Anthropic 키가 필요 없습니다 — MCP 서버는 설계상 자체 LLM을 호스팅하지 않습니다.
경로 2 — 독립형 CLI
pip install ptai
export ANTHROPIC_API_KEY=sk-... # 또는 OPENAI_API_KEY
ptai start https://target.example.com
# 완전 로컬, 클라우드 없음:
export PENTEST_AI_LLM_PROVIDER=ollama
# 또는 결정적, LLM 완전 없음:
ptai start https://target.example.com --no-llm
비용은 기본적으로 참여당 $10으로 상한이 설정됩니다(PTAI_PRICE_LIMIT).
보안 도구, REST API 및 기타 옵션
ptai tools install --tier core # 또는 recommended / full
ptai tools install nmap nuclei # 또는 이름으로
ptai serve # 대시보드용 HTTP REST + WebSocket
ptai menu # 대화형 런처, LLM 없음
참여 시작 시 플래너는 실행에 필요한 도구를 예측하고 누락된 도구 설치를 한 번 요청합니다. 거부하면 해당 결정이 유지됩니다.
벤치마크
재현 가능하며, git에 있으며, 원시 아티팩트가 포함됩니다. 감사할 수 없는 "98.7% 탐지율"은 없습니다.
| 도구 | 발견 항목 | Critical+High | OWASP 버킷 | FP 비율 |
|---|---|---|---|---|
| ptai | 88 | 46 | 5 | 0% |
| ZAP 2.17.0 | 593 | 0 | 1 | 47% |
| Nuclei 3.8.0 | 1 | 0 | 1 | 0% |
| HexStrike v6.0 | 11 | 0 | 1 | – |
n=1, 단일 평가자, OWASP Juice Shop에 대한 단일 실행. 방법론과 원시 출력은
benchmarks/에 있습니다. 전체 문서는 docs/benchmarks/juice-shop.md에 있습니다.
정직한 해석: ptai는 큐레이션된 프로브 커버리지를 갖춘 SPA 웹 타깃에 강합니다. HexStrike는 더 광범위하며(클라우드, 바이너리, CTF) WordPress와 같은 전통적인 크롤링 가능한 표면에서 ptai를 이길 가능성이 높습니다. Juice Shop은 또한 인터넷에서 가장 많이 문서화된 취약한 앱이므로 LLM과 프로브 작성자 모두 유리한 출발점을 가집니다 — 이것이 바로 비공개 허니팟 수치가 더 낮은 이유이며, 둘 다 게시되는 이유입니다.
CI에 통합하기
- run: pip install ptai
- run: ptai start ${{ vars.STAGING_URL }} --ci --fail-on verified --sarif pentest.sarif
- uses: github/codeql-action/upload-sarif@v3
with: { sarif_file: pentest.sarif }
--fail-on verified는 오라클이 실제로 증명한 발견 항목에서만 빌드를 중단하므로,
스캐너 노이즈로 게이트가 트리거될 수 없습니다. SARIF는 GitHub Code
Scanning에 업로드되고, 발견 항목은 PR 댓글로 게시됩니다. GitLab 및 Jenkins 템플릿은
docs/ci-cd.md에 있습니다.
작동 방식
recon ──▶ auth ──▶ web ──┬──▶ ad
├──▶ cloud ┌──────────────────┐
└──▶ api ──────────▶│ findings DB │
│ scope-guarded │
└────────┬─────────┘
▼
verify (oracles, N/N)
▼
chain ─▶ validate ─▶ detect ─▶ report
md · html · pdf · SARIF · JUnit
18개의 전문 에이전트가 단계를 실행합니다. API 키가 있으면 각 에이전트는 LLM을 사용하여 결과에 대해 추론합니다. 키가 없으면 결정적 도구 루프로 실행됩니다. 단계 순서와 탐지는 두 경우 모두 동일합니다 — 프로브가 버그를 찾고, LLM은 조정만 합니다.
대상 사용자
AppSec 팀 — 인증된 스캔을 모든 PR에 연결하고, 입증된 발견 항목에서만 트리거되는 게이트를 원하는 팀. 컨설턴트 — 보고서가 자동으로 작성되고 클라이언트 엔지니어가 직접 재생할 수 있는 캡슐을 원하는 컨설턴트. 버그 바운티 헌터 — 600개의 "아마도"보다 12개의 입증된 발견 항목을 분류하고 싶은 헌터. Claude Code / Cursor / Codex 사용자 — 추가 API 비용 없이 어시스턴트 뒤에 실제 도구를 원하는 사용자.
함께 작업하기
이 도구는 MIT 라이선스이며 영원히 무료입니다 — 이는 변하지 않습니다.
직접 실행하는 대신 펜테스트 서비스를 받거나, 기록 및 팀 액세스가 포함된 호스팅 워크스페이스를 원한다면 둘 다 **pentestai.xyz**에서 제공됩니다. 제공된 참여의 모든 발견 항목에는 엔지니어가 직접 재생할 수 있는 증명 캡슐이 포함되며, 이는 심각도 등급으로 가득 찬 PDF와는 본질적으로 다른 산출물입니다.
책임 있는 사용
ptai는 지정한 타깃에 대해 실제 네트워크 및 호스트 작업을 실행합니다. 모든 타깃에 대한 명시적 서면 승인을 보유할 책임은 전적으로 사용자에게 있습니다. 소유하지 않은 시스템을 테스트하는 것은 미국 컴퓨터 사기 및 남용법(Computer Fraud and Abuse Act), 영국 컴퓨터 오용법 1990(Computer Misuse Act 1990), GDPR 제32조 및 기타 국가의 동등 법률을 위반할 수 있습니다.
첫 실행 시 AUP 수락을 요청하고 이를 유지합니다. CI에서는
PENTEST_AI_AUP_ACCEPTED=1을 설정하십시오. 범위 외 호스트는
도구 호출 시점에 거부됩니다. 기본적으로 꺼져 있으며 켤 가치가 있는 세 가지 안전장치가 있습니다:
intensity=safe는 상태를 변경하는 프로브를 건너뛰고, respect_rate_limits는
429/Retry-After를 존중하며, strict_scope는 호스트 외 요청을 거부합니다.
대역 외 콜백 (OAST) — 개인정보
블라인드 클래스(블라인드 SSRF/SQLi/XXE, 저장 XSS, SSTI, Log4Shell)는
기본적으로 ProjectDiscovery의 공개 oast.fun으로 라우팅되는 콜백을 통해 탐지됩니다.
각 참여는 로컬에서 새로운 RSA-2048 키페어를 생성합니다. 상호작용 페이로드는 RSA-OAEP-SHA256으로 공개 키에 래핑된 키로 AES-CTR-256 암호화되어 저장되므로 로컬 프로세스만 복호화할 수 있습니다. 그러나 메타데이터는 서버에 노출됩니다: 상호작용 발생 여부, 타깃의 소스 IP, 타임스탬프 및 프로토콜입니다.
PortSwigger는 버그 바운티 규칙에서 공개 협력자 사용을 금지하며, 대규모 프로그램은 점점 더 테스터가 제어하는 콜백 인프라를 요구합니다. 유료 참여의 경우 Interactsh를 자체 호스팅하십시오:
ptai start http://target --oast-server https://oast.example.com --oast-token <T>
ptai start http://target --no-oast # 또는 완전히 비활성화
FAQ
API 키가 필요한가요? MCP 경로에서는 필요 없습니다 — Claude Code / Cursor / Codex 구독이 LLM 역할을 합니다. 독립형 CLI에서만 필요하며, 거기서도 Ollama는 완전 로컬로 실행됩니다.
자율적인가요? 아닙니다. 자율적이라고 주장하지도 않습니다. 프로브가 탐지하고, LLM이 조정하며, 사용자가 결정합니다. Ctrl+C를 두 번 누르면 실행 중간에 인수할 수 있습니다.
프로덕션에 안전한가요? 서면 승인과 위의 세 가지 안전장치를 켠 경우에만 가능합니다.
외부로 통신하나요? 기본적으로 아닙니다. 발견 항목은 사용자 디스크에 유지됩니다.
ptai telemetry enable로 익명 사용 카운터에 옵트인할 수 있습니다(타깃 없음,
발견 항목 없음. 스키마는 engine/telemetry.py에 있음). OAST 콜백은
--oast-server 또는 --no-oast를 전달하지 않는 한 기본적으로
ProjectDiscovery의 oast.fun으로 라우팅됩니다.
Claude에게 해킹을 요청하는 것과 어떻게 다른가요? 큐레이션된 결정적 프로브 라이브러리가 버그를 찾고 기계 오라클이 이를 증명합니다. LLM 단독으로는 실제인지 여부를 알 수 없는 그럴듯한 추측만 제공합니다.
생태계
| 저장소 | 설명 |
|---|---|
| pentest-ai | 이 저장소. CLI + MCP 서버. |
| pentest-ai-agents | 독립형 Claude Code 서브에이전트 파일. 선택 사항. |
스타 기록
기존 인라인 차트(api.star-history.com)는 비어 있습니다: GitHub가 해당 SVG가 의존하던 공개 stargazers API를 제한했습니다. 실시간 시리즈는 star-history.com에 있습니다. README는 대체 호스트를 핫링크하지 않습니다 — 모든 방문자의 브라우저가 해당 SVG를 가져왔을 것이기 때문입니다.
라이선스
MIT. 원하는 대로 사용하십시오.
ptai가 일요일을 아껴줬다면 저장소에 스타를 남겨주세요.