AI 에이전트 기반 취약점 헌팅 시스템 구축




  • 프레임워크: Claude Agent SDK (Anthropic)
  • 프로토콜: MCP (Model Context Protocol)
  • 대상: 웹 애플리케이션 + 바이너리 (듀얼 도메인)

목차

  1. 시스템 개요 및 목표
  2. 전체 파이프라인 흐름
  3. 에이전트 팀 구성 (8명)
  4. MCP 서버 설계
  5. 웹 취약점 헌팅 상세
  6. 바이너리 취약점 헌팅 상세
  7. 단계별 구축 로드맵 (Step-by-Step)
  8. 프롬프트 에셋 설계
  9. 데이터 스키마 (JSON 구조 정의)
  10. 개발 환경 세팅 가이드
  11. 검증 및 테스트 계획
  12. 리스크 및 대응 방안
  13. 다른 팀과의 연동

1. 시스템 개요 및 목표

미션

웹 애플리케이션 URL 또는 바이너리 파일을 입력하면, 전문 AI 에이전트들이 공격 표면 분석 → 취약점 탐색 → PoC 생성 → 검증 → 보고서 산출까지 자동으로 수행하는 취약점 헌팅 파이프라인 구축.

기존 레드팀과의 차이

  • 레드팀: 킬체인 전체(정찰→공격→횡이동→보고)를 수행
  • 취약점 헌팅팀: 취약점 "발견"에 특화. 더 깊고 더 넓게 파고든다.
    • 웹은 OWASP 전 카테고리를 체계적으로
    • 바이너리는 메모리 커럽션부터 로직 버그까지 정적/동적 분석을 결합하여 탐색

핵심 가치

  • 깊이 (Depth): 단순 스캐너가 놓치는 로직 취약점, 복합 취약점 체인 탐색
  • 넓이 (Breadth): OWASP Top 10 + 바이너리 메모리 커럽션 + 로직 버그 전 범위
  • PoC 품질: 모든 취약점에 재현 가능한 PoC 코드/요청 필수
  • 0-day 지향: 알려진 CVE 매칭뿐 아니라 새로운 취약점 발견 로직 포함

입력과 출력

입력 (웹)

  • 대상 URL / API 엔드포인트
  • 인증 정보 (선택: 쿠키, 토큰, 계정)
  • 스코프 (허용 도메인/경로)

입력 (바이너리)

  • 바이너리 파일 (PE, ELF, DLL, SO, 펌웨어)
  • 또는 SHA256 해시 (VT 다운로드)

출력

  • 발견된 취약점 목록 (심각도별 정렬)
  • 각 취약점별 PoC (HTTP 요청, 스크립트, 입력값)
  • 기술 상세 보고서 (JSON + 텍스트)
  • 개선 권고안
  • CWE/CVE 매핑

2. 전체 파이프라인 흐름

이 팀은 웹과 바이너리를 “동시에” 처리할 수 있는 듀얼 파이프라인 구조다. Hunt Commander가 입력 유형을 판별하여 적절한 파이프라인을 가동한다.

웹 파이프라인

사용자 입력 (URL + 인증 + 스코프)
    |
    v
Hunt Commander (입력 분류, 파이프라인 선택)
    |
    v  [1단계: 표면 매핑]
Web Surface Mapper
- 크롤링, API 엔드포인트 발견, 파라미터 수집
- 입력 벡터(Input Vector) 전수 조사
-> WebSurfaceMap
    |
    v  [2단계: 자동 스캐닝]
Web Vuln Scanner
- OWASP Top 10 자동 스캔
- 퍼징 기반 입력값 주입
- 알려진 패턴 매칭
-> AutoScanResult
    |
    v  [3단계: 심층 수동 분석]
Web Logic Analyst
- 인증/인가 로직 분석
- 비즈니스 로직 취약점
- 복합 취약점 체인 탐색
- 자동 스캐너가 놓친 취약점
-> DeepAnalysisResult
    |
    v  [4단계: PoC 및 보고]
PoC Engineer + Report Writer
-> 취약점 보고서 + PoC

바이너리 파이프라인

사용자 입력 (바이너리 파일 또는 해시)
    |
    v
Hunt Commander
    |
    v  [1단계: 바이너리 정찰]
Binary Surface Mapper
- 파일 유형, 보호 기법(ASLR/DEP/스택카나리) 확인
- 공격 표면 식별 (입력 파싱 함수, 네트워크 핸들러)
-> BinarySurfaceMap
    |
    v  [2단계: 정적 분석]
Binary Vuln Analyst
- Ghidra 디컴파일 기반 취약 패턴 탐색
- 위험 함수 호출 추적 (strcpy, sprintf, memcpy 등)
- 정수 오버플로우, UAF, 힙 오버플로우 패턴
- 포맷 스트링, 커맨드 인젝션
-> StaticVulnResult
    |
    v  [3단계: 동적 분석/퍼징]
Binary Fuzzer (선택, 환경 필요)
- AFL/LibFuzzer 기반 퍼징
- 크래시 분석 및 취약점 변환
-> FuzzResult
    |
    v  [4단계: PoC 및 보고]
PoC Engineer + Report Writer
-> 취약점 보고서 + PoC

듀얼 모드

웹+바이너리가 동시에 입력되면 (예: 웹서버 + 서버 바이너리) 두 파이프라인을 병렬로 실행하고 결과를 교차 분석한다.

  • 웹에서 발견된 입력이 바이너리의 어떤 함수에서 처리되는지 추적
  • 바이너리 취약점이 웹 인터페이스를 통해 트리거 가능한지 검증

3. 에이전트 팀 구성 (8명)

웹 3명 + 바이너리 2명 + 공용 2명 + 지휘 1명 = 총 8명. 웹/바이너리 각 도메인의 전문성이 다르므로 에이전트를 분리한다.

에이전트 #1: Hunt Commander (헌팅 지휘관)

역할: 전체 취약점 헌팅 작전 총괄 모델: claude-opus-4-6

담당 업무

  • 입력 유형 판별 (웹/바이너리/듀얼) 및 파이프라인 선택
  • 스코프 설정 및 검증
  • 에이전트 태스크 할당 및 순서 제어
  • 웹/바이너리 교차 분석 판단
  • 발견된 취약점 중복 제거 및 우선순위 조정
  • 최종 보고서 품질 검증

도구 (Tools)

  • dispatch_task: 에이전트 태스크 위임
  • classify_input: 입력 유형 분류
  • check_scope: 스코프 검증
  • prioritize_findings: 취약점 우선순위 정렬
  • merge_results: 웹+바이너리 결과 병합
  • deduplicate: 중복 취약점 제거

판단 기준

  • 웹 입력 → 웹 파이프라인 (Surface Mapper → Scanner → Logic Analyst)
  • 바이너리 입력 → 바이너리 파이프라인 (Surface Mapper → Analyst → Fuzzer)
  • 듀얼 입력 → 양쪽 병렬 실행 후 교차 분석
  • 자동 스캔 결과가 빈약하면 → Logic Analyst에 추가 분석 지시
  • Critical/High 취약점 발견 시 즉시 PoC 생성 우선

웹 전문 에이전트 (3명)

에이전트 #2: Web Surface Mapper (웹 표면 매퍼)

역할: 웹 애플리케이션의 전체 공격 표면을 매핑 모델: claude-sonnet-4-6

담당 업무
  • 웹 크롤링 및 페이지/엔드포인트 수집
  • API 엔드포인트 발견 (REST, GraphQL, WebSocket)
  • 입력 벡터(Input Vector) 전수 조사:
    • URL 파라미터 (GET)
    • POST 바디 (form, JSON, XML, multipart)
    • HTTP 헤더 (Cookie, Referer, User-Agent, 커스텀)
    • 경로 파라미터 (/api/user/{id})
    • WebSocket 메시지
  • 인증 메커니즘 식별 (JWT, 세션, OAuth, API Key)
  • 기술 스택 탐지 (프레임워크, 서버, WAF)
  • JavaScript 분석 (API 호출, 하드코딩 키, 소스맵)
  • robots.txt, sitemap.xml, .git, .env 등 정보 노출 확인
도구 (Tools)
  • web_crawl: 재귀적 웹 크롤링 (링크/폼/JS 추적)
  • api_discover: API 엔드포인트 자동 발견
  • param_extract: URL/바디/헤더에서 파라미터 추출
  • js_analyze: JavaScript 정적 분석 (API 호출, 시크릿)
  • tech_detect: 기술 스택 핑거프린팅
  • auth_detect: 인증 메커니즘 식별
  • graphql_introspect: GraphQL 인트로스펙션 쿼리
  • waf_detect: WAF 탐지 및 식별
  • hidden_content: 숨겨진 파일/디렉토리 탐색

출력 스키마: WebSurfaceMap


에이전트 #3: Web Vuln Scanner (웹 취약점 스캐너)

역할: 자동화된 웹 취약점 스캐닝 (OWASP 전 카테고리) 모델: claude-opus-4-6

담당 업무
  • Surface Mapper가 찾은 모든 입력 벡터에 대해 체계적 테스트
  • OWASP Top 10 (2021) 전 항목 스캔:
카테고리 상세
A01 – Broken Access Control IDOR, 수평/수직 권한 상승, 경로 순회, HTTP 메서드 변경, 강제 브라우징
A02 – Cryptographic Failures 평문 전송(HTTP), 약한 암호화 알고리즘, 하드코딩된 키/시크릿
A03 – Injection SQLi, NoSQL Injection, OS Command Injection, LDAP, XPath, SSTI, Header Injection, ORM Injection
A04 – Insecure Design 레이스 컨디션, 비즈니스 로직 우회, 무제한 리소스 소비
A05 – Security Misconfiguration 기본 크리덴셜, 불필요한 HTTP 메서드, 디버그 모드, 에러 메시지 정보 노출, CORS 오설정, 보안 헤더 누락
A06 – Vulnerable Components 알려진 CVE가 있는 라이브러리/프레임워크 식별
A07 – Auth Failures 브루트포스, 비밀번호 정책 미흡, 세션 고정, JWT 취약점
A08 – Software and Data Integrity 역직렬화 취약점, CI/CD 파이프라인 노출
A09 – Logging & Monitoring 로그 인젝션, 에러 핸들링 미흡
A10 – SSRF 내부 네트워크 접근, 클라우드 메타데이터 접근, 프로토콜 스머글링

추가 항목:

  • XSS (Reflected, Stored, DOM-based)

  • CSRF

  • XXE (XML External Entity)

  • Open Redirect

  • HTTP Request Smuggling

  • WebSocket 취약점

  • GraphQL 특화 취약점

  • 파일 업로드 취약점

  • 각 입력 벡터 × 각 취약점 유형 조합을 체계적으로 테스트

  • 퍼징: 각 파라미터에 변형된 페이로드 자동 주입

도구 (Tools)
  • inject_payload: 지정 파라미터에 페이로드 주입 후 응답 분석
  • sqli_test: SQL Injection 전문 테스트
  • xss_test: XSS 페이로드 테스트
  • ssrf_test: SSRF 페이로드 테스트
  • ssti_test: 서버사이드 템플릿 인젝션 테스트
  • cmdi_test: OS 커맨드 인젝션 테스트
  • idor_test: IDOR 객체 참조 변경 테스트
  • deserial_test: 역직렬화 페이로드 테스트
  • jwt_test: JWT 토큰 변조 테스트
  • nuclei_scan: Nuclei 템플릿 스캔
  • fuzz_param: 파라미터 퍼징
  • compare_response: 응답 비교 분석

출력 스키마: AutoScanResult


에이전트 #4: Web Logic Analyst (웹 로직 분석가)

역할: 자동 스캐너가 놓치는 로직 취약점 및 복합 취약점 체인 발견 모델: claude-opus-4-6

담당 업무

비즈니스 로직 취약점:

  • 결제 로직 우회 (가격 조작, 할인 중복, 수량 조작)
  • 워크플로우 우회 (단계 건너뛰기, 상태 조작)
  • 레이스 컨디션 (동시 요청으로 중복 처리)
  • 기능 남용 (비밀번호 리셋 토큰 예측, 이메일 폭탄)
  • API Rate Limiting 우회

인증/인가 심층 분석:

  • 권한 검사 누락 엔드포인트 찾기
  • JWT 서명 우회 (none, 키 혼동, jwk 주입)
  • OAuth 플로우 취약점 (리다이렉트 조작, 상태 미검증)
  • 세션 관리 취약점 (예측 가능한 세션 ID, 만료 미설정)
  • 2FA 우회

복합 취약점 체인:

  • 단일로는 Low/Info지만 체인하면 Critical이 되는 조합 발견
  • 예: 정보 노출 + SSRF = 내부 네트워크 접근
  • 예: Open Redirect + OAuth = 계정 탈취
  • 예: XSS + CSRF = 관리자 권한 탈취

소스코드 리뷰 (제공 시):

  • 위험 함수 호출 패턴
  • 입력 검증 누락 추적
  • SQL 쿼리 구성 방식
도구 (Tools)
  • auth_bypass_test: 인증 우회 시나리오 테스트
  • authz_test: 인가 검사 누락 탐지
  • race_condition_test: 동시 요청 레이스 컨디션 테스트
  • workflow_test: 멀티스텝 워크플로우 우회 테스트
  • jwt_deep_test: JWT 심층 분석
  • oauth_test: OAuth 플로우 취약점 테스트
  • chain_analyzer: 취약점 체인 가능성 평가
  • source_review: 소스코드 위험 패턴 검색
  • parameter_tampering: 파라미터 변조

출력 스키마: DeepAnalysisResult


바이너리 전문 에이전트 (2명)

에이전트 #5: Binary Surface Mapper (바이너리 표면 매퍼)

역할: 바이너리의 공격 표면 식별 및 보호 기법 분석 모델: claude-sonnet-4-6

담당 업무

보호 기법 확인:

  • ASLR (Address Space Layout Randomization)
  • DEP/NX (Data Execution Prevention)
  • Stack Canary / Stack Guard
  • RELRO (Relocation Read-Only)
  • PIE (Position Independent Executable)
  • CFI (Control Flow Integrity)
  • Safe SEH
  • 포티파이 소스 (_FORTIFY_SOURCE)

공격 표면 식별:

  • 외부 입력을 받는 함수 (파일 파싱, 네트워크 수신, stdin)
  • 파서 함수 (이미지, 문서, 프로토콜 파서)
  • 사용자 데이터가 흐르는 경로 (Taint Flow)
  • 공유 라이브러리 인터페이스

위험 함수 사용 통계:

  • strcpy, strcat, sprintf, gets 등 안전하지 않은 함수
  • memcpy, memmove 경계 검사 누락
  • malloc/free 패턴 (double free, UAF 후보)

바이너리 메타데이터:

  • 컴파일러/버전 식별
  • 디버그 심볼 존재 여부
  • 섹션 정보 및 엔트로피
도구 (Tools)
  • checksec: 보호 기법 확인
  • parse_header: PE/ELF 헤더 상세 파싱
  • ghidra_list_functions: 전체 함수 목록
  • ghidra_get_imports: 임포트 API 분석
  • dangerous_func_scan: 위험 함수 호출 전수 검색
  • input_func_identify: 외부 입력 수신 함수 식별
  • taint_source_identify: Taint 소스 식별
  • compiler_identify: 컴파일러/버전 식별
  • entropy_analysis: 섹션별 엔트로피 분석

출력 스키마: BinarySurfaceMap


에이전트 #6: Binary Vuln Analyst (바이너리 취약점 분석가) ⭐ 핵심

역할: Ghidra 기반 정적 분석으로 바이너리 취약점 발견 모델: claude-opus-4-6

담당 업무

메모리 커럽션 취약점 탐색:

스택 버퍼 오버플로우:

  • strcpy, sprintf 등에 외부 입력이 직접 들어가는 패턴
  • 고정 크기 스택 버퍼에 가변 길이 입력 복사
  • 경계 검사 없는 루프 내 버퍼 쓰기

힙 버퍼 오버플로우:

  • malloc 크기와 실제 쓰기 크기 불일치
  • 정수 오버플로우로 인한 작은 할당 → 큰 쓰기

Use-After-Free (UAF):

  • free 후 포인터를 다시 사용하는 패턴
  • 댕글링 포인터가 다른 할당에 재사용되는 경로

Double Free:

  • 동일 포인터를 두 번 free하는 경로

정수 오버플로우:

  • 크기 계산에서 곱셈/덧셈 오버플로우
  • 부호 있는/없는 정수 혼합 비교
  • 크기 검증 후 타입 캐스팅으로 검증 우회

포맷 스트링:

  • printf(user_input) 패턴 (포맷 지정자 없이)
  • syslog, fprintf 등에서도 동일 패턴

Off-by-one:

  • 루프 경계 조건 오류 (<= vs <)
  • null 종결자 미포함 크기 계산

로직 취약점 탐색:

커맨드 인젝션:

  • system(), popen(), exec*()에 사용자 입력 전달
  • 쉘 메타문자 필터링 누락

경로 순회:

  • 파일 경로 구성 시 …/ 필터링 누락
  • 경로 정규화(canonicalize) 누락

인증/인가 우회:

  • 인증 검사 분기에서 우회 가능한 조건
  • 하드코딩된 백도어 크리덴셜

암호화 약점:

  • 하드코딩된 키
  • 약한 알고리즘 (DES, RC4, MD5)
  • 랜덤 시드 예측 가능 (time(0))

정보 노출:

  • 디버그 출력/로그에 민감 정보
  • 에러 메시지에 내부 경로/스택 트레이스

분석 방법론:

  1. Surface Mapper가 식별한 입력 함수부터 시작
  2. 입력 데이터의 흐름을 따라가며 (Taint Tracking) 위험 함수까지 추적
  3. 각 위험 지점에서 경계 검사/검증 로직 존재 여부 확인
  4. 검증이 없거나 우회 가능하면 취약점으로 판정
  5. 취약점 트리거 입력(PoC 입력값) 추론
도구 (Tools)
  • ghidra_decompile: 함수 디컴파일
  • ghidra_get_xrefs: 교차 참조 조회
  • ghidra_get_function: 함수 상세 정보
  • ghidra_get_bytes: 원시 바이트 조회
  • ghidra_search_memory: 메모리 패턴 검색
  • trace_data_flow: 데이터 흐름 추적
  • check_bounds: 경계 검사 존재 여부 확인
  • find_vuln_pattern: 취약 패턴 매칭
  • calc_stack_layout: 스택 프레임 레이아웃 계산
  • calc_heap_layout: 힙 할당 패턴 분석

능동적 탐색 로직:

  1. 위험 함수(strcpy 등) 호출 사이트 전수 목록화
  2. 각 호출 사이트로부터 역방향 Taint 추적 → 외부 입력 연결 확인
  3. 연결된 경우 → 경계 검사 확인 → 없으면 취약점
  4. malloc/free 쌍 분석 → UAF/Double Free 후보
  5. 정수 연산 분석 → 오버플로우 후보
  6. 각 취약점에 대해 트리거 조건 및 입력값 추론

출력 스키마: StaticVulnResult


공용 에이전트 (2명)

에이전트 #7: PoC Engineer (PoC 엔지니어)

역할: 발견된 취약점에 대한 재현 가능한 PoC 생성 모델: claude-opus-4-6

담당 업무

웹 취약점 PoC:

  • HTTP 요청 (curl 명령, Python requests 코드)
  • 자동화 스크립트 (연속 요청, 조건부 분기)
  • XSS 페이로드 (필터 우회 포함)
  • SQLi 페이로드 (데이터 추출까지)
  • SSRF 체인 (내부 서비스 접근 증명)

바이너리 취약점 PoC:

  • 크래시 입력값 (트리거 파일, 네트워크 패킷)
  • 익스플로잇 스크립트 (Python pwntools)
  • 스택 오버플로우: RIP 제어 증명 입력
  • 힙 오버플로우: 힙 레이아웃 조작 입력
  • 포맷 스트링: 메모리 읽기/쓰기 증명

복합 체인 PoC:

  • 다단계 공격 시나리오 스크립트
  • 단계별 요청/입력 순서 문서화

PoC 품질 기준:

  • 독립 실행 가능 (외부 의존성 최소화)
  • 재현율 100% (동일 환경에서 항상 성공)
  • 무해한 증명 (calc.exe, id, alert(1) 수준)
  • 예상 결과 명시
도구 (Tools)
  • generate_web_poc: 웹 취약점 PoC HTTP 요청/스크립트 생성
  • generate_binary_poc: 바이너리 취약점 PoC 입력/스크립트 생성
  • generate_chain_poc: 복합 취약점 체인 PoC 생성
  • verify_poc_web: 웹 PoC 실행 및 검증
  • verify_poc_binary: 바이너리 PoC 실행 및 검증
  • craft_payload: 커스텀 페이로드 제작
  • encode_payload: 페이로드 인코딩

출력 스키마: PoCResult


에이전트 #8: Report Writer (보고서 작성기)

역할: 전체 헌팅 결과를 종합 보고서로 산출 모델: claude-sonnet-4-6

담당 업무
  • 경영진용 요약 (Executive Summary)
  • 기술 상세 보고서 (취약점별 기술 설명 + PoC)
  • 개선 권고안 (취약점별 구체적 수정 방법)
  • CWE/CVE 매핑
  • CVSS 점수 산출
  • 통계 대시보드 데이터 (심각도 분포, 카테고리 분포)
도구 (Tools)
  • compile_findings: 발견 결과 통합
  • map_cwe: CWE ID 매핑
  • calc_cvss: CVSS v3.1 점수 계산
  • generate_remediation: 개선 권고안 생성
  • format_json: JSON 보고서 생성
  • format_markdown: 마크다운 보고서 생성
  • generate_statistics: 통계 데이터 생성

출력 스키마: VulnHuntReport


4. MCP 서버 설계

총 6개의 MCP 서버.

MCP 서버 #1: web-recon-mcp (웹 정찰 서버) – 외부 MCP

전송 방식: stdio

도구 목록:

web_crawl            : 재귀 크롤링 (링크, 폼, JS 소스 추적)
api_discover         : REST/GraphQL/WebSocket 엔드포인트 발견
param_extract        : 파라미터 전수 수집
js_analyze           : JS 정적 분석 (API 호출, 하드코딩 키, 소스맵)
tech_detect          : 기술 스택 핑거프린팅
auth_detect          : 인증 메커니즘 식별
graphql_introspect   : GraphQL 스키마 인트로스펙션
waf_detect           : WAF 탐지
hidden_content       : 숨겨진 파일/디렉토리 탐색 (feroxbuster 방식)
screenshot_web       : 웹페이지 스크린샷

의존 도구/라이브러리:

  • httpx, beautifulsoup4, playwright (JS 렌더링)
  • feroxbuster/gobuster (디렉토리 스캔)

MCP 서버 #2: web-attack-mcp (웹 공격 테스트 서버) – 혼합

전송 방식: 인프로세스 + stdio (Nuclei 등 외부)

도구 목록:

inject_payload       : HTTP 요청에 페이로드 주입 후 응답 분석
sqli_test            : SQL Injection 테스트 스위트
xss_test             : XSS 테스트 스위트
ssrf_test            : SSRF 테스트 스위트
ssti_test            : Server-Side Template Injection 테스트
cmdi_test            : OS Command Injection 테스트
xxe_test             : XML External Entity 테스트
idor_test            : IDOR 테스트 (ID 변경, 다른 사용자 리소스)
deserial_test        : 역직렬화 테스트
jwt_test             : JWT 변조 테스트
csrf_test            : CSRF 토큰 검증 테스트
upload_test          : 파일 업로드 취약점 테스트
redirect_test        : Open Redirect 테스트
cors_test            : CORS 오설정 테스트
nuclei_scan          : Nuclei 템플릿 스캔
fuzz_param           : 파라미터 퍼징 (특수문자, 경계값)
compare_response     : 응답 비교 (길이, 시간, 상태코드, 바디)
auth_bypass_test     : 인증 우회 시나리오
authz_test           : 인가 검사 누락 탐지
race_condition_test  : 레이스 컨디션 (동시 요청)
workflow_test        : 멀티스텝 워크플로우 우회
jwt_deep_test        : JWT 심층 분석
oauth_test           : OAuth 플로우 취약점
chain_analyzer       : 취약점 체인 가능성 평가
parameter_tampering  : 파라미터 변조 (타입, 부호, 범위)

의존 도구/라이브러리:

  • httpx (비동기 HTTP), nuclei
  • jwt 라이브러리, pyjwt
  • 커스텀 페이로드 DB

MCP 서버 #3: ghidra-mcp (Ghidra 역공학 서버) – 외부 MCP

전송 방식: stdio 참고: 다른 팀들과 공유

도구 목록:

ghidra_headless_analyze, ghidra_decompile, ghidra_get_function,
ghidra_list_functions, ghidra_get_xrefs, ghidra_get_imports,
ghidra_get_exports, ghidra_list_strings, ghidra_get_bytes,
ghidra_get_segments, ghidra_search_memory

MCP 서버 #4: binary-analysis-mcp (바이너리 분석 서버) – 인프로세스

전송 방식: 인프로세스

도구 목록:

checksec             : 보호 기법 확인 (ASLR, DEP, Canary, RELRO, PIE)
dangerous_func_scan  : 위험 함수 호출 전수 검색
input_func_identify  : 외부 입력 수신 함수 식별
trace_data_flow      : 데이터 흐름 추적 (Taint Source → Sink)
check_bounds         : 경계 검사 존재 여부 분석
find_vuln_pattern    : 커스텀 취약 패턴 규칙 매칭
calc_stack_layout    : 스택 프레임 레이아웃 계산
calc_heap_layout     : 힙 할당/해제 패턴 분석
compiler_identify    : 컴파일러/최적화 수준 식별
parse_header         : PE/ELF 헤더 상세 파싱
entropy_analysis     : 섹션별 엔트로피

의존 라이브러리:

  • pefile, pyelftools, capstone, pwntools

MCP 서버 #5: fuzzing-mcp (퍼징 서버) – 외부 MCP

전송 방식: stdio (격리 환경)

도구 목록:

setup_fuzzer         : AFL++/LibFuzzer 환경 설정
run_fuzz_campaign    : 퍼징 캠페인 실행 (타임아웃 지정)
analyze_crash        : 크래시 입력 분석 (중복 제거, 최소화)
triage_crash         : 크래시 심각도 분류 (exploitable/non-exploitable)
minimize_input       : 크래시 입력 최소화
generate_harness     : 퍼징 하네스 코드 자동 생성 (선택)

의존 도구:

  • AFL++ 또는 LibFuzzer
  • GDB + exploitable 플러그인
  • Docker (격리 퍼징 환경)

MCP 서버 #6: poc-report-mcp (PoC/보고서 서버) – 인프로세스

전송 방식: 인프로세스

도구 목록:

generate_web_poc     : 웹 PoC 생성 (curl/Python)
generate_binary_poc  : 바이너리 PoC 생성 (Python pwntools)
generate_chain_poc   : 체인 PoC 생성
verify_poc_web       : 웹 PoC 검증 (실제 요청 전송)
verify_poc_binary    : 바이너리 PoC 검증 (샌드박스)
craft_payload        : 커스텀 페이로드 생성
encode_payload       : 인코딩/변환
compile_findings     : 결과 통합
map_cwe              : CWE 매핑
calc_cvss            : CVSS 점수 계산
generate_remediation : 권고안 생성
format_json          : JSON 보고서
format_markdown      : 마크다운 보고서

5. 웹 취약점 헌팅 상세

5.1 입력 벡터 × 취약점 매트릭스

스캐너는 다음 매트릭스를 체계적으로 순회한다. (모든 입력 벡터에 모든 관련 취약점 테스트를 수행)

입력 벡터:

GET 파라미터, POST 바디(form/json/xml), HTTP 헤더(Cookie/Referer/UA),
경로 파라미터, 파일 업로드, WebSocket 메시지, GraphQL 변수

테스트 매핑:

입력 벡터 테스트 항목
GET/POST 파라미터 SQLi, XSS, SSTI, CMDi, SSRF, LFI, 정수 조작
HTTP 헤더 SQLi, XSS, CRLF 인젝션, 로그 인젝션
경로 파라미터 경로 순회, IDOR
파일 업로드 웹셸, XSS(SVG), XXE, 경로 조작, 사이즈 DoS
WebSocket 인젝션, 인증 우회, 메시지 변조
GraphQL 인트로스펙션, 배치 공격, 깊은 중첩, 인가 우회

5.2 페이로드 전략

각 취약점 유형별 다단계 페이로드 전략:

SQLi 페이로드 레벨:

L1: 기본 탐지 (', ", --, ;, OR 1=1)
L2: 에러 기반 (extractvalue, updatexml)
L3: 블라인드 (AND 1=1 vs AND 1=2 응답 차이)
L4: 타임 기반 (SLEEP, WAITFOR, pg_sleep)
L5: Union 기반 (컬럼 수 추정 → 데이터 추출)
L6: WAF 우회 (인코딩, 주석, 대소문자, 이중 인코딩)

XSS 페이로드 레벨:

L1: 기본 (<script>alert(1)</script>)
L2: 이벤트 핸들러 (<img onerror=alert(1)>)
L3: 인코딩 우회 (HTML entity, Unicode)
L4: DOM 기반 (location.hash, document.referrer)
L5: 뮤테이션 XSS (mXSS)
L6: WAF 우회 (태그 변형, 속성 변형)

SSRF 페이로드:

L1: 기본 (http://127.0.0.1, http://localhost)
L2: IP 변형 (0x7f000001, 2130706433, 017700000001)
L3: DNS Rebinding
L4: 프로토콜 (file://, gopher://, dict://)
L5: 클라우드 메타데이터 (169.254.169.254)
L6: URL 파서 차이 악용 (@, #, 이중 인코딩)

5.3 응답 분석 기법

취약점 판정을 위한 응답 분석:

  • 상태코드 변화: 200→500 = 에러 유발 확인
  • 응답 시간 변화: 5초 이상 지연 = Time-based 확인
  • 응답 길이 변화: True/False 조건별 차이 = Blind 확인
  • 응답 바디 패턴: 에러 메시지, 스택 트레이스, SQL 구문
  • 반사(Reflection) 확인: 입력값이 응답에 포함
  • 외부 콜백 확인: OOB DNS/HTTP 콜백

6. 바이너리 취약점 헌팅 상세

6.1 취약 패턴 데이터베이스

Binary Vuln Analyst가 사용하는 패턴 규칙:

패턴 1: 스택 버퍼 오버플로우

조건: 고정 크기 스택 버퍼 + 외부 입력 복사 + 경계 검사 없음
탐색: strcpy(stack_buf, external_input) 패턴
검증: stack_buf의 크기 vs 입력 최대 크기 비교

패턴 2: 힙 버퍼 오버플로우

조건: malloc(size) 후 memcpy(buf, data, bigger_size)
탐색: malloc → memcpy 쌍에서 크기 불일치
검증: 크기 계산 로직에서 오버플로우 가능성

패턴 3: 정수 오버플로우

조건: size = width * height * bpp (곱셈 오버플로우)
탐색: 크기 계산에 곱셈/덧셈 + 이후 malloc에 사용
검증: 오버플로우 시 작은 값이 되어 작은 할당 → 큰 쓰기

패턴 4: Use-After-Free

조건: free(ptr) 후 경로에 따라 ptr 재사용
탐색: free 호출 후 동일 변수가 역참조되는 코드 경로
검증: 조건 분기에 의해 free 경로와 사용 경로가 분리 가능한지

패턴 5: 포맷 스트링

조건: printf(user_data) — 포맷 지정자 없이 직접 사용
탐색: printf 계열 함수의 첫 번째 인자가 변수인 경우
검증: 해당 변수가 외부 입력으로부터 도달 가능한지

패턴 6: 커맨드 인젝션

조건: system(cmd) 또는 popen(cmd) 에 외부 입력 포함
탐색: system/popen/exec* 호출의 인자가 문자열 조합
검증: 쉘 메타문자 필터링 여부

6.2 Taint Tracking 전략

Binary Vuln Analyst의 핵심 분석 기법:

1단계 – Taint 소스 식별

- recv(), read(), fread(), fgets(), scanf() 등 입력 함수
- 명령행 인자 (argv)
- 환경 변수 (getenv)
- 파일 내용 (설정 파일, 입력 파일)

2단계 – Taint 전파 추적 (함수 간)

- 리턴값 추적: result = parse_header(input) → result도 tainted
- 포인터 추적: ptr = input + offset → ptr도 tainted
- 구조체 멤버: struct.field = input → struct.field tainted
- 전역 변수: global_buf = input → 다른 함수에서도 tainted

3단계 – Taint 싱크 확인

Tainted 데이터가 다음 위험 함수에 도달하는지 확인:

- 버퍼 복사: strcpy, memcpy, sprintf (크기 인자 없음)
- 포맷 출력: printf, syslog, fprintf (첫 인자가 tainted)
- 명령 실행: system, popen, exec* (인자가 tainted)
- 메모리 할당: malloc, calloc (크기가 tainted 연산 결과)
- 파일 접근: fopen, open (경로가 tainted)

4단계 – 경로 조건 분석

- taint 소스 → 싱크 경로에 있는 조건 분기
- 어떤 입력값이면 취약 경로를 타는지 추론
- 이것이 PoC 입력값의 기초가 됨

6.3 퍼징 연동 (선택)

정적 분석으로 발견한 후보를 동적 퍼징으로 확인:

  1. Binary Vuln Analyst가 취약 후보 함수 식별
  2. Hunt Commander가 퍼징 필요 여부 판단
  3. Binary Fuzzer가 하네스 생성 (취약 함수를 직접 호출하는 래퍼)
  4. AFL++/LibFuzzer로 퍼징 캠페인 실행 (시간 제한)
  5. 크래시 입력 수집 → 분석 → 취약점 확정
  6. PoC Engineer에게 크래시 입력 전달

7. 단계별 구축 로드맵 (Step-by-Step)

전체 기간: 약 14~16주 (1인 개발 기준)

웹+바이너리 듀얼 도메인이라 범위가 넓음.


PHASE 1: 기반 인프라 구축 (1~2주차)

Step 1.1 – 프로젝트 초기화

디렉토리 구조:

vulnhunt-agents/
├── agents/
│   ├── __init__.py
│   ├── hunt_commander.py
│   ├── web_surface_mapper.py
│   ├── web_vuln_scanner.py
│   ├── web_logic_analyst.py
│   ├── binary_surface_mapper.py
│   ├── binary_vuln_analyst.py
│   ├── poc_engineer.py
│   └── report_writer.py
├── mcp_servers/
│   ├── web_recon_mcp/
│   ├── web_attack_mcp/
│   ├── ghidra_mcp/           # 공유
│   ├── binary_analysis_mcp.py
│   ├── fuzzing_mcp/
│   └── poc_report_mcp.py
├── prompts/
│   ├── hunt_commander.md
│   ├── web_surface_mapper.md
│   ├── web_vuln_scanner.md
│   ├── web_logic_analyst.md
│   ├── binary_surface_mapper.md
│   ├── binary_vuln_analyst.md
│   ├── poc_engineer.md
│   └── report_writer.md
├── payloads/                  # 페이로드 DB
│   ├── sqli/
│   ├── xss/
│   ├── ssrf/
│   ├── ssti/
│   └── ...
├── patterns/                  # 바이너리 취약 패턴 규칙
│   ├── stack_overflow.yaml
│   ├── heap_overflow.yaml
│   ├── uaf.yaml
│   ├── format_string.yaml
│   └── ...
├── schemas/
├── tests/
│   ├── web_targets/           # 취약 웹 앱 (Docker)
│   ├── binary_targets/        # 취약 바이너리 샘플
│   └── test_*.py
├── config.yaml
└── main.py

Step 1.2 – 외부 도구 설치

  • Nuclei, feroxbuster, httpx
  • Ghidra Headless
  • AFL++ (바이너리 퍼징)
  • Docker (테스트 환경)

Step 1.3 – 테스트 타겟 준비

웹:

  • DVWA, Juice Shop, WebGoat (Docker)

바이너리: 의도적 취약 바이너리 컴파일

  • stack_overflow_example.c (strcpy 취약)
  • heap_overflow_example.c (malloc 크기 불일치)
  • format_string_example.c (printf 취약)
  • cmd_injection_example.c (system 취약)

PHASE 2: MCP 서버 개발 (3~6주차)

Step 2.1 – web-recon-mcp 구현 (1주)

  • 웹 크롤러 (링크, 폼, JS 추적)
  • API 엔드포인트 발견 (REST, GraphQL)
  • 파라미터 수집기
  • JS 분석기
  • 기술 스택/WAF 탐지

Step 2.2 – web-attack-mcp 구현 (2주, 핵심)

  • 페이로드 DB 구축 (SQLi, XSS, SSRF, SSTI, CMDi 등)
  • 각 취약점 유형별 테스트 도구 구현
  • 응답 분석 엔진 (상태코드, 시간, 길이, 패턴)
  • Nuclei 래퍼
  • 인증/인가 테스트 도구
  • 레이스 컨디션 테스트 (동시 요청)

Step 2.3 – ghidra-mcp (공유, 기존 것 재사용) (0.5주)

Step 2.4 – binary-analysis-mcp 구현 (1주)

  • checksec 래퍼
  • 위험 함수 스캔 도구
  • 데이터 흐름 추적 도구
  • 경계 검사 분석 도구
  • 취약 패턴 매칭 엔진
  • 스택/힙 레이아웃 분석

Step 2.5 – fuzzing-mcp 구현 (0.5주)

  • AFL++ 래퍼 (설정, 실행, 크래시 수집)
  • 크래시 분석/분류
  • 하네스 생성 보조

Step 2.6 – poc-report-mcp 구현 (0.5주)

  • PoC 생성 도구 (웹/바이너리)
  • CWE 매핑, CVSS 계산
  • 보고서 생성

PHASE 3: 에이전트 개발 (7~12주차)

Step 3.1 – Web Surface Mapper 에이전트 (0.5주)

  • 크롤링 전략 프롬프트
  • 입력 벡터 분류 프롬프트
  • 테스트: DVWA, Juice Shop 대상 표면 매핑

Step 3.2 – Web Vuln Scanner 에이전트 (2.5주, 핵심)

  • OWASP 전 카테고리 테스트 로직 프롬프트
  • 입력 벡터 × 취약점 매트릭스 순회 프롬프트
  • 페이로드 레벨 에스컬레이션 프롬프트
  • 응답 분석 판정 기준 프롬프트
  • 환각 방지: 실제 응답 근거 없이 취약점 보고 금지
  • 테스트: DVWA의 각 취약점 탐지 확인

Step 3.3 – Web Logic Analyst 에이전트 (1.5주)

  • 비즈니스 로직 분석 프롬프트
  • 인증/인가 심층 테스트 프롬프트
  • 취약점 체인 발견 프롬프트
  • 테스트: Juice Shop의 로직 취약점

Step 3.4 – Binary Surface Mapper 에이전트 (0.5주)

  • 보호 기법 분석 프롬프트
  • 공격 표면 식별 프롬프트
  • 테스트: 취약 바이너리 샘플

Step 3.5 – Binary Vuln Analyst 에이전트 (2주, 핵심)

  • 6가지 취약 패턴 탐색 프롬프트
  • Taint Tracking 전략 프롬프트
  • 능동적 탐색: 위험 함수 → 역추적 → 입력 연결 확인
  • 환각 방지: 코드 근거 필수, 실존 함수/주소만
  • 테스트: 의도적 취약 바이너리로 탐지 확인

Step 3.6 – PoC Engineer 에이전트 (1주)

  • 웹/바이너리 PoC 생성 프롬프트
  • PoC 품질 기준 프롬프트
  • 검증 루프 (생성 → 실행 → 확인 → 수정)

Step 3.7 – Report Writer 에이전트 (0.5주)

  • 보고서 템플릿 및 품질 프롬프트
  • CVSS 산출 프롬프트

Step 3.8 – Hunt Commander 에이전트 (1주)

  • 듀얼 파이프라인 오케스트레이션
  • 입력 분류 및 적절한 파이프라인 선택
  • 교차 분석 판단 (웹+바이너리 연결)
  • 전체 통합 테스트

PHASE 4: 통합 및 최적화 (13~14주차)

Step 4.1 – End-to-End 통합 테스트

웹: 1단계: DVWA (기본 취약점) 2단계: Juice Shop (로직 취약점) 3단계: WebGoat (교육용 고급 취약점)

바이너리: 1단계: 의도적 취약 바이너리 (단일 취약점) 2단계: 복합 취약 바이너리 (다중 취약점) 3단계: 실제 CVE가 있는 오픈소스 바이너리 (선택)

듀얼: 취약 웹서버 + 서버 바이너리 동시 분석

Step 4.2 – 최적화

  • 토큰 사용량 프로파일링
  • 병렬 테스트 가능 구간 식별
  • 캐싱 (동일 엔드포인트 중복 요청 방지)
  • 비용 추적 및 제한

PHASE 5: 문서화 (15~16주차)

  • Step 5.1 – 사용 매뉴얼
  • Step 5.2 – 페이로드 DB 확장 가이드
  • Step 5.3 – 바이너리 패턴 규칙 추가 가이드

8. 프롬프트 에셋 설계

8.1 Web Vuln Scanner 시스템 프롬프트 (핵심 – 초안)

당신은 시니어 웹 애플리케이션 보안 테스터로, 버그바운티 Top 100 랭커입니다. Surface Mapper가 찾은 모든 입력 벡터에 대해 체계적으로 취약점을 테스트합니다.

테스트 방법론

각 입력 벡터(파라미터)에 대해 다음 순서로 테스트하세요:

  1. 정상 요청 기준값(Baseline) 확보

    • 정상 파라미터 값으로 요청 → 응답 기록 (상태코드, 길이, 시간)
  2. 인젝션 테스트 (입력 벡터 유형에 따라)

    • 문자열 파라미터 → SQLi, XSS, SSTI, CMDi 순으로 페이로드 주입
    • 숫자 파라미터 → 정수 조작 (음수, 0, 큰 값), SQLi
    • URL/경로 파라미터 → SSRF, 경로 순회
    • 파일 파라미터 → 업로드 취약점
    • JSON 필드 → 타입 변경, 추가 필드, 중첩 인젝션
  3. 응답 분석 (매 요청마다)

    • 상태코드 변화: 200→500 = 에러 유발 (잠재 취약점)
    • 응답 시간: 5초+ 지연 = Time-based 후보
    • 응답 길이 차이: Boolean 조건별 = Blind 후보
    • 응답 바디: 에러 메시지, SQL 구문, 스택 트레이스 = 정보 노출
    • 입력 반사: 입력값이 응답에 포함 = XSS 후보
  4. 확인 및 에스컬레이션

    • 후보 발견 시 → 더 정교한 페이로드로 확인
    • SQLi 후보 → Union/Blind로 데이터 추출 시도
    • XSS 후보 → 실제 스크립트 실행 확인
    • SSRF 후보 → 내부 서비스/메타데이터 접근 시도

근거 요구사항

  • 모든 취약점 보고에 반드시 원본 요청(Request)과 응답(Response)을 근거로 포함하세요.
  • 정상 응답 vs 변조 응답의 차이를 명확히 설명하세요.
  • "취약점이 있을 것 같다"는 추측 금지. 실제 응답 차이가 관찰된 것만 보고하세요.
  • False Positive를 줄이세요: 의심스러우면 추가 페이로드로 확인 후 보고하세요.

WAF 우회

WAF가 탐지되면:

  • 인코딩 변형: URL 이중 인코딩, Unicode, HTML 엔티티
  • 대소문자 변형: SeLeCt, uNiOn
  • 주석 삽입: /**/SELECT, –\nSELECT
  • 연산자 변형: OR → ||, AND → &&
  • 함수 변형: substr → mid, ascii → ord

8.2 Binary Vuln Analyst 시스템 프롬프트 (핵심 – 초안)

당신은 시니어 바이너리 보안 연구원으로, CVE를 다수 발견한 경력이 있습니다. Ghidra 디컴파일 결과를 분석하여 메모리 커럽션 및 로직 취약점을 발견합니다.

분석 방법론: Taint-driven Vulnerability Hunting

1단계 – Taint 소스 식별

Surface Mapper가 찾은 외부 입력 함수(recv, read, fread 등)를 확인하세요. 이 함수들이 반환하는 데이터가 tainted 데이터입니다.

2단계 – Taint 전파 추적

tainted 데이터가 어떤 함수들을 거치며 어디로 흘러가는지 추적하세요.

  • 함수 리턴값 추적: result = process(tainted) → result도 tainted
  • 포인터 연산 추적: ptr = tainted_buf + offset → ptr도 tainted
  • 구조체/전역 변수 추적

3단계 – Taint 싱크 확인

tainted 데이터가 다음 위험 함수에 도달하는지 확인하세요:

  • 버퍼 복사: strcpy, strcat, memcpy, sprintf (크기 인자 없음)
  • 포맷 출력: printf, syslog, fprintf (첫 인자가 tainted)
  • 명령 실행: system, popen, exec* (인자가 tainted)
  • 메모리 할당: malloc, calloc (크기가 tainted 연산 결과)
  • 파일 접근: fopen, open (경로가 tainted)

4단계 – 경계 검사 확인

tainted 데이터 → 싱크 경로 사이에 경계 검사가 있는지 확인하세요:

  • strlen(input) < sizeof(buffer) 같은 검사 → 안전
  • 검사가 없거나 우회 가능하면 → 취약점

5단계 – PoC 입력 추론

취약점을 트리거하는 입력 조건을 추론하세요:

  • 어떤 크기의 입력이면 오버플로우가 발생하는지
  • 어떤 값이면 조건 분기를 우회하는지
  • 정확한 바이트 수, 패딩, 리턴 주소 오프셋 등

근거 요구사항

  • 모든 취약점에 코드 주소, 함수명, 디컴파일 코드 라인을 근거로 제시하세요.
  • taint 경로를 함수 호출 체인으로 명시하세요: recv() at 0x401000 → parse_header() at 0x401200 → strcpy() at 0x401350
  • 경계 검사 부재를 증명하세요 (검사가 "없다"는 것도 근거 필요).
  • 실존하지 않는 함수/주소 만들어내지 마세요.

8.3 PoC Engineer 시스템 프롬프트 (초안)

당신은 익스플로잇 개발자입니다. 발견된 취약점에 대해 재현 가능한 PoC를 만듭니다.

PoC 품질 기준 (필수)

  1. 재현 가능: 동일 환경에서 누가 실행해도 동일 결과
  2. 독립 실행: 외부 의존성 최소화 (Python 표준 라이브러리 우선)
  3. 무해한 증명: 파괴적 페이로드 금지
    • 웹: alert(1), document.domain 수준
    • 바이너리: 크래시 증명 또는 calc.exe/id 실행 수준
    • SQLi: 버전 조회 또는 사용자 테이블 목록 수준
  4. 예상 결과 명시: 실행 시 어떤 응답/결과가 나오는지 설명
  5. 재현 단계: 1, 2, 3 순서로 명확한 단계 제시

웹 PoC 형식

  • curl 명령 (간단한 경우)
  • Python requests 스크립트 (복잡한 경우)
  • 인증이 필요하면 인증 절차 포함

바이너리 PoC 형식

  • 크래시 입력 파일 (hex dump)
  • Python pwntools 스크립트 (익스플로잇)
  • 실행 환경 요구사항 명시 (OS, 라이브러리)

9. 데이터 스키마 (JSON 구조 정의)

9.1 WebSurfaceMap

{
  "target": {
    "base_url": "string",
    "scope": ["string (허용 도메인/경로)"]
  },
  "pages": [
    {
      "url": "string",
      "method": "GET | POST | PUT | DELETE",
      "status_code": "number",
      "content_type": "string",
      "parameters": [
        {
          "name": "string",
          "location": "query | body | header | path | cookie",
          "type": "string | number | boolean | file | json | xml",
          "sample_value": "string",
          "required": "boolean"
        }
      ],
      "forms": [
        {
          "action": "string",
          "method": "string",
          "fields": ["string"]
        }
      ]
    }
  ],
  "api_endpoints": [
    {
      "url": "string",
      "method": "string",
      "content_type": "string",
      "auth_required": "boolean",
      "parameters": ["Parameter 객체"]
    }
  ],
  "technologies": [
    {
      "name": "string",
      "version": "string | null",
      "category": "string"
    }
  ],
  "authentication": {
    "type": "session | jwt | oauth | api_key | basic | none",
    "details": "string"
  },
  "waf_detected": {
    "present": "boolean",
    "name": "string | null"
  },
  "information_leaks": [
    {
      "type": "source_map | git | env | debug | backup",
      "url": "string",
      "details": "string"
    }
  ],
  "summary": {
    "total_pages": "number",
    "total_api_endpoints": "number",
    "total_parameters": "number",
    "total_forms": "number",
    "input_vectors_by_type": {
      "query": "number",
      "body": "number",
      "header": "number",
      "path": "number",
      "file": "number"
    }
  }
}

9.2 BinarySurfaceMap

{
  "binary_info": {
    "filename": "string",
    "file_type": "string",
    "architecture": "string",
    "compiler": "string | null",
    "stripped": "boolean"
  },
  "protections": {
    "aslr": "boolean",
    "dep_nx": "boolean",
    "stack_canary": "boolean",
    "relro": "none | partial | full",
    "pie": "boolean",
    "cfi": "boolean",
    "fortify_source": "boolean",
    "safe_seh": "boolean | null (Windows only)"
  },
  "attack_surface": {
    "input_functions": [
      {
        "function_name": "string",
        "address": "string (hex)",
        "input_type": "network | file | stdin | argv | env",
        "called_from": ["string"]
      }
    ],
    "dangerous_function_calls": [
      {
        "function": "string (예: strcpy)",
        "category": "buffer_copy | format | exec | memory | file",
        "call_address": "string (hex)",
        "caller_function": "string",
        "risk_level": "high | medium | low"
      }
    ],
    "total_functions": "number",
    "dangerous_call_count": "number"
  }
}

9.3 VulnFinding (개별 취약점, 웹/바이너리 공용)

{
  "id": "string (UUID)",
  "domain": "web | binary",
  "title": "string",
  "type": "sqli | xss | ssrf | ssti | cmdi | idor | stack_overflow | heap_overflow | uaf | format_string | integer_overflow | ...",
  "severity": "critical | high | medium | low | info",
  "cvss_score": "number (0.0-10.0)",
  "cvss_vector": "string",
  "cwe_id": "string (예: CWE-89)",
  "cwe_name": "string",
  "cve_id": "string | null",
  "location": {
    "web": {
      "url": "string | null",
      "method": "string | null",
      "parameter": "string | null",
      "parameter_location": "string | null"
    },
    "binary": {
      "function_name": "string | null",
      "function_address": "string | null",
      "vulnerable_line": "string | null"
    }
  },
  "description": "string",
  "evidence": {
    "web": {
      "request": "string | null (원본 HTTP 요청)",
      "response_excerpt": "string | null",
      "baseline_comparison": "string | null (정상 vs 변조 차이)",
      "payload_used": "string | null"
    },
    "binary": {
      "taint_path": "string | null (함수 호출 체인)",
      "vulnerable_code": "string | null (디컴파일 코드)",
      "missing_check": "string | null (누락된 검증)",
      "trigger_condition": "string | null"
    },
    "reasoning": "string"
  },
  "poc": {
    "type": "curl | python_script | input_file | pwntools_script",
    "code": "string",
    "expected_result": "string",
    "reproduction_steps": ["string"],
    "verified": "boolean"
  },
  "remediation": {
    "recommendation": "string",
    "code_fix_example": "string | null",
    "references": ["string (URL)"]
  },
  "chain_potential": {
    "can_chain": "boolean",
    "chain_with": ["string (다른 취약점 ID)"],
    "chain_impact": "string | null"
  }
}

9.4 VulnHuntReport (최종 보고서)

{
  "report_metadata": {
    "report_id": "string (UUID)",
    "generated_at": "string (ISO 8601)",
    "hunt_duration_seconds": "number",
    "total_cost_usd": "number",
    "target_type": "web | binary | dual"
  },
  "executive_summary": {
    "overall_risk": "critical | high | medium | low",
    "total_findings": "number",
    "by_severity": {
      "critical": "number",
      "high": "number",
      "medium": "number",
      "low": "number",
      "info": "number"
    },
    "key_findings": ["string (핵심 3~5개)"],
    "top_recommendations": ["string"]
  },
  "web_surface_map": "WebSurfaceMap | null",
  "binary_surface_map": "BinarySurfaceMap | null",
  "findings": ["VulnFinding 배열"],
  "vulnerability_chains": [
    {
      "chain_id": "string",
      "steps": ["string (취약점 ID 순서)"],
      "combined_impact": "string",
      "combined_severity": "string"
    }
  ],
  "coverage": {
    "web_owasp_coverage": {
      "A01_broken_access_control": "tested | not_applicable",
      "A02_cryptographic_failures": "tested | not_applicable",
      "A03_injection": "tested | not_applicable",
      "A04_insecure_design": "tested | not_applicable",
      "A05_misconfiguration": "tested | not_applicable",
      "A06_vulnerable_components": "tested | not_applicable",
      "A07_auth_failures": "tested | not_applicable",
      "A08_integrity_failures": "tested | not_applicable",
      "A09_logging_monitoring": "tested | not_applicable",
      "A10_ssrf": "tested | not_applicable"
    },
    "binary_pattern_coverage": {
      "stack_overflow": "tested | not_applicable",
      "heap_overflow": "tested | not_applicable",
      "use_after_free": "tested | not_applicable",
      "double_free": "tested | not_applicable",
      "integer_overflow": "tested | not_applicable",
      "format_string": "tested | not_applicable",
      "command_injection": "tested | not_applicable",
      "path_traversal": "tested | not_applicable"
    }
  },
  "remediation_plan": [
    {
      "priority": "number (1=최우선)",
      "finding_id": "string",
      "finding_title": "string",
      "recommendation": "string",
      "effort": "low | medium | high"
    }
  ]
}

10. 개발 환경 세팅 가이드

필수 소프트웨어

  • Python 3.10+
  • Ghidra 11.x + Java 17+
  • Nuclei (최신)
  • feroxbuster 또는 gobuster
  • AFL++ (바이너리 퍼징, 선택)
  • Docker / Docker Compose (테스트 환경)

Python 패키지 (requirements.txt)

claude-agent-sdk
httpx[http2]           # 비동기 HTTP (HTTP/2 지원)
beautifulsoup4
playwright             # JS 렌더링 크롤링
pefile
pyelftools
capstone               # 디스어셈블러
pwntools               # 바이너리 PoC
jsonschema
pyyaml
jinja2
nuclei                 # Nuclei Python 래퍼
pyjwt                  # JWT 분석

환경 변수

ANTHROPIC_API_KEY=sk-ant-...
GHIDRA_INSTALL_DIR=/path/to/ghidra
NUCLEI_PATH=/usr/local/bin/nuclei
NUCLEI_TEMPLATES_DIR=/path/to/nuclei-templates
AFL_PATH=/usr/local/bin/afl-fuzz (선택)

config.yaml

anthropic:
  api_key: ${ANTHROPIC_API_KEY}
  max_budget_usd: 15.0

agents:
  hunt_commander:
    model: claude-opus-4-6
  web_surface_mapper:
    model: claude-sonnet-4-6
  web_vuln_scanner:
    model: claude-opus-4-6
    max_payloads_per_param: 50
    timeout_per_request_ms: 10000
  web_logic_analyst:
    model: claude-opus-4-6
  binary_surface_mapper:
    model: claude-sonnet-4-6
  binary_vuln_analyst:
    model: claude-opus-4-6
    max_taint_depth: 10
    max_functions_to_analyze: 100
  poc_engineer:
    model: claude-opus-4-6
  report_writer:
    model: claude-sonnet-4-6

web:
  crawl_depth: 3
  max_pages: 500
  request_delay_ms: 100
  concurrent_requests: 10
  user_agent: "VulnHuntAgent/1.0"

binary:
  ghidra_timeout: 600
  fuzz_duration_seconds: 3600
  max_crash_inputs: 100

11. 검증 및 테스트 계획

11.1 웹 테스트

DVWA (Damn Vulnerable Web Application)

기대 탐지 목록:

  • SQL Injection (에러/블라인드/타임)
  • XSS (반사/저장)
  • Command Injection
  • File Inclusion (LFI/RFI)
  • File Upload
  • CSRF
  • Brute Force

평가: 탐지율 90% 이상 (각 난이도별)

Juice Shop (OWASP)

기대 탐지 목록:

  • 다양한 XSS
  • SQLi/NoSQLi
  • Broken Access Control (IDOR, 관리자 접근)
  • 로직 취약점 (0원 결제, 쿠폰 남용)
  • JWT 취약점
  • XXE
  • SSRF

평가: Challenge 해결률 70% 이상


11.2 바이너리 테스트

의도적 취약 바이너리

  • stack_overflow.c: strcpy 스택 오버플로우 → 탐지 + 오프셋 계산
  • heap_overflow.c: malloc 크기 불일치 → 탐지 + 조건 추론
  • format_string.c: printf(argv[1]) → 탐지 + 읽기/쓰기 PoC
  • cmd_inject.c: system(user_input) → 탐지 + 페이로드
  • integer_overflow.c: 크기 계산 오버플로우 → 탐지
  • uaf.c: free 후 사용 → 탐지 + 조건 추론

평가: 6/6 탐지 목표

실제 CVE 바이너리 (선택)

  • 알려진 CVE가 있는 오픈소스 바이너리 구버전
  • 해당 CVE 재발견 여부 확인

11.3 핵심 품질 지표

  • True Positive Rate: 알려진 취약점 탐지율 (목표 85%+)
  • False Positive Rate: 오탐률 (목표 15% 미만)
  • PoC 재현율: PoC 실행 시 실제 성공률 (목표 95%+)

바이너리

  • 취약 패턴 탐지율: (목표 80%+)
  • Taint 경로 정확도: (목표 90%+)
  • 크래시 입력 유효성: (목표 80%+)

12. 리스크 및 대응 방안

리스크 1: False Positive 과다

원인: LLM이 응답 차이를 과대 해석하여 취약점으로 오판

대응:

  • 근거 요구사항 강화: 실제 요청/응답 차이 필수
  • 확인 테스트 필수: 후보 발견 → 추가 페이로드로 확인 → 보고
  • PoC 검증 게이트: PoC 재현 실패 시 보고에서 제외

리스크 2: 토큰 한도 초과

원인: 대규모 웹 (수백 개 엔드포인트), 대규모 바이너리 (수천 개 함수)

대응:

  • 웹: 페이지 수 제한, 파라미터 우선순위 필터링
  • 바이너리: 위험 함수 호출 사이트만 우선 분석
  • 청킹: 일정 단위로 나누어 분석

리스크 3: WAF/보호 기법에 의한 탐지 방해

원인: WAF가 페이로드 차단, ASLR/Canary가 익스플로잇 방해

대응:

  • 웹: WAF 우회 페이로드 레벨 에스컬레이션
  • 바이너리: 보호 기법 존재 여부를 보고서에 명시, 우회 방안 제안

리스크 4: 인증 필요 영역 미탐색

원인: 인증 토큰 만료, 세션 유지 실패

대응:

  • 인증 자동 갱신 로직
  • 세션 상태 모니터링
  • 인증 실패 시 재로그인

리스크 5: 타겟 서비스 가용성 영향

원인: 대량 요청으로 서비스 부하

대응:

  • 요청 간 딜레이 설정 (config.yaml)
  • 동시 요청 수 제한
  • 에러율 모니터링 → 임계값 초과 시 자동 감속

리스크 6: 바이너리 Taint Tracking 정확도

원인: LLM 기반 추적은 정적 분석 도구 대비 정확도 낮을 수 있음

대응:

  • 보수적 판정: 확실한 경로만 취약점 보고, 불확실하면 "후보"로 분류
  • 퍼징 교차 검증: 정적 분석 후보를 동적 퍼징으로 확인
  • 경로별 신뢰도 점수 부여

13. 다른 팀과의 연동

레드팀 연동

취약점 헌팅팀이 발견한 취약점 목록 + PoC를 레드팀의 Exploit Operator에게 직접 전달하여 공격 실행.

  • 입력: VulnHuntReport.findings
  • 출력: 레드팀 ExploitResult

악성코드 분석 팀 연동

바이너리 취약점 분석 시 ghidra-mcp 공유. 악성코드 내부의 취약점(백도어 내 버그 등) 발견 시나리오도 가능.


공격무기 빌더 연동

취약점 헌팅팀이 바이너리에서 발견한 취약점을 활용하는 익스플로잇 코드를 공격무기 빌더가 빌드.


4팀 통합 워크플로우

[취약점 헌팅팀] 웹/바이너리 취약점 발견
    |
    v
[레드팀] 취약점 기반 공격 시뮬레이션
    |
    v
[악성코드 분석팀] 공격 중 발견한 악성코드 분석
    |
    v
[공격무기 빌더] APT 도구 재빌드 → 레드팀 재사용
    |
    v
종합 보고서 → 블루팀 방어 훈련

부록: 핵심 코드 스켈레톤 (main.py)

# main.py - 취약점 헌팅 에이전트 진입점

import asyncio
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions, AgentDefinition

async def hunt_vulnerabilities(
    target: str,                  # URL 또는 바이너리 경로
    target_type: str = "auto",    # "web" | "binary" | "dual" | "auto"
    auth_config: dict = None,     # 웹 인증 정보
    scope: list = None,           # 허용 범위
):
    # MCP 서버 생성 (생략)
    # ...

    options = ClaudeAgentOptions(
        agents={
            "hunt-commander": AgentDefinition(
                description="취약점 헌팅 작전 총괄",
                prompt=load_prompt("prompts/hunt_commander.md"),
                tools=["dispatch_task", "classify_input", "check_scope",
                       "prioritize_findings", "merge_results"],
                model="opus",
            ),
            # 웹 에이전트 3명
            "web-surface-mapper": AgentDefinition(
                description="웹 공격 표면 매핑",
                prompt=load_prompt("prompts/web_surface_mapper.md"),
                tools=[web_recon_srv.tools],
                model="sonnet",
            ),
            "web-vuln-scanner": AgentDefinition(
                description="OWASP 전 카테고리 자동 스캐닝",
                prompt=load_prompt("prompts/web_vuln_scanner.md"),
                tools=[web_attack_srv.tools],
                model="opus",
            ),
            "web-logic-analyst": AgentDefinition(
                description="로직 취약점 및 체인 분석",
                prompt=load_prompt("prompts/web_logic_analyst.md"),
                tools=[web_attack_srv.tools],
                model="opus",
            ),
            # 바이너리 에이전트 2명
            "binary-surface-mapper": AgentDefinition(
                description="바이너리 공격 표면 분석",
                prompt=load_prompt("prompts/binary_surface_mapper.md"),
                tools=[ghidra_srv.tools, binary_srv.tools],
                model="sonnet",
            ),
            "binary-vuln-analyst": AgentDefinition(
                description="바이너리 취약점 정적 분석",
                prompt=load_prompt("prompts/binary_vuln_analyst.md"),
                tools=[ghidra_srv.tools, binary_srv.tools],
                model="opus",
            ),
            # 공용 에이전트 2명
            "poc-engineer": AgentDefinition(
                description="PoC 생성 및 검증",
                prompt=load_prompt("prompts/poc_engineer.md"),
                tools=[poc_report_srv.tools],
                model="opus",
            ),
            "report-writer": AgentDefinition(
                description="종합 보고서 생성",
                prompt=load_prompt("prompts/report_writer.md"),
                tools=[poc_report_srv.tools],
                model="sonnet",
            ),
        },
        max_budget_usd=15.0,
    )

    async with ClaudeSDKClient(options=options) as client:
        query = f"타겟: {target}\n타입: {target_type}\n"
        if auth_config:
            query += f"인증: {json.dumps(auth_config)}\n"
        if scope:
            query += f"스코프: {json.dumps(scope)}\n"
        query += "취약점을 찾아주세요."

        await client.query(query)
        result = []
        async for msg in client.receive_response():
            result.append(msg)
        return result

if __name__ == "__main__":
    import sys
    target = sys.argv[1]
    result = asyncio.run(hunt_vulnerabilities(target))
    print(result)

Posted in

댓글 남기기

Celebrities-K에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기