Burp Suite · 2026-03-04

Burp Suite 사용자 정의 스캐너 체크(Java) 만들기

Burp Suite에서 Java로 사용자 정의 스캐너 체크를 구현하는 전체 흐름과 핵심 코드, 빌드·배포 및 테스트 절차를 초보자 관점에서 정리한 예제

작성일 : 2026-03-04 ㆍ 작성자 : 관리자
post
목차

소개

Burp Suite의 기본 스캐너로 찾기 힘든 패턴을 탐지하기 위해 사용자 정의 스캐너 체크를 작성할 수 있다. 이 글은 Java로 Burp 확장을 만들어 IScannerCheck를 구현하고, 간단한 취약점 검출 로직을 추가해 Burp Scanner 플러그인 개발 흐름을 이해할 수 있도록 구성했다. 초보자도 따라할 수 있도록 환경 설정, 주요 인터페이스 설명, 코드 예제, 빌드와 배포, 테스트 방법을 순서대로 제시한다.

사전 준비

  • Burp Suite (Community 또는 Professional) 설치
  • JDK 11 이상 설치
  • Maven 또는 Gradle 빌드 도구 (본 예제는 Maven 기준)
  • Burp Extender API (burp-extender-api.jar) — Burp 설치 경로에서 확보
  • IDE (IntelliJ IDEA, Eclipse 등)

확장 구조 개요

사용자 정의 체크는 크게 세 부분으로 나뉜다.

  • IBurpExtender: Burp에 확장을 등록하는 진입점
  • IScannerCheck: 스캐너 체크 로직을 구현하는 인터페이스
  • IScanIssue: 발견한 이슈 정보를 Burp에 전달하기 위한 객체

IBurpExtender 역할

Burp가 확장을 로드할 때 IBurpExtender 설정 메서드인 registerExtenderCallbacks를 호출한다. 여기서 IScannerCheck 구현체를 callbacks.registerScannerCheck로 등록하면 Burp Scanner가 해당 체크를 호출한다.

IScannerCheck와 IScanIssue

IScannerCheck의 doPassiveScan/doActiveScan 메서드에서 요청과 응답을 분석해 취약성을 감지하면 IScanIssue 구현체를 만들어 반환한다. 반환된 IScanIssue는 Burp UI에 이슈로 표시된다.

핵심 코드 예제

아래 예제는 단순한 문자열 패턴("insecure_token")이 응답에 포함되어 있을 때 이슈를 생성하는 최소 구현이다. 코드 예제는 Burp Extender API 타입을 사용한다.

BurpExtender.java

package com.example.burp;

import burp.IBurpExtender;
import burp.IExtensionHelpers;
import burp.IHttpRequestResponse;
import burp.IMessageEditorController;
import burp.IContextMenuFactory;
import burp.IExtensionStateListener;
import burp.IHttpService;
import burp.IRequestInfo;
import burp.IResponseInfo;
import burp.IClient
import burp.IBurpExtenderCallbacks;

public class BurpExtender implements IBurpExtender {
    private IBurpExtenderCallbacks callbacks;
    private IExtensionHelpers helpers;

    @Override
    public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
        this.callbacks = callbacks;
        this.helpers = callbacks.getHelpers();
        callbacks.setExtensionName("Custom Scanner Check");
        callbacks.registerScannerCheck(new SimpleScannerCheck(callbacks, helpers));
    }
}

주의: 위 코드는 설명을 위해 축약되어 있으며 실제로는 불필요한 import를 제거하고 예외 처리를 추가한다.

SimpleScannerCheck.java

package com.example.burp;

import burp.IScannerCheck;
import burp.IScanIssue;
import burp.IHttpRequestResponse;
import burp.IBurpExtenderCallbacks;
import burp.IExtensionHelpers;
import java.util.List;
import java.util.ArrayList;

public class SimpleScannerCheck implements IScannerCheck {
    private IBurpExtenderCallbacks callbacks;
    private IExtensionHelpers helpers;
    private static final byte[] PATTERN = "insecure_token".getBytes();

    public SimpleScannerCheck(IBurpExtenderCallbacks callbacks, IExtensionHelpers helpers) {
        this.callbacks = callbacks;
        this.helpers = helpers;
    }

    @Override
    public List<IScanIssue> doPassiveScan(IHttpRequestResponse baseRequestResponse) {
        List<IScanIssue> issues = new ArrayList<>();
        byte[] resp = baseRequestResponse.getResponse();
        if (resp == null) return null;

        int offset = helpers.indexOf(resp, PATTERN, true, 0, resp.length);
        if (offset != -1) {
            String detail = "응답에 민감한 토큰 문자열이 포함되어 있음.";
            IScanIssue issue = new SimpleScanIssue(
                baseRequestResponse.getHttpService(),
                helpers.analyzeRequest(baseRequestResponse).getUrl(),
                new IHttpRequestResponse[] { baseRequestResponse },
                "노출된 토큰", // issueName
                detail,
                "Information"
            );
            issues.add(issue);
            return issues;
        }
        return null;
    }

    @Override
    public List<IScanIssue> doActiveScan(IHttpRequestResponse baseRequestResponse, IScannerInsertionPoint insertionPoint) {
        return null; // 본 예제는 패시브 스캔만 설명
    }

    @Override
    public int consolidateDuplicateIssues(IScanIssue existingIssue, IScanIssue newIssue) {
        return 0; // 0: 별도 표시, -1: 기존 것으로 대체, 1: 새 것으로 대체
    }
}

SimpleScanIssue.java

package com.example.burp;

import burp.IScanIssue;
import burp.IHttpRequestResponse;
import burp.IHttpService;
import java.net.URL;

public class SimpleScanIssue implements IScanIssue {
    private IHttpService httpService;
    private URL url;
    private IHttpRequestResponse[] httpMessages;
    private String name;
    private String detail;
    private String severity;

    public SimpleScanIssue(IHttpService httpService, URL url, IHttpRequestResponse[] httpMessages, String name, String detail, String severity) {
        this.httpService = httpService;
        this.url = url;
        this.httpMessages = httpMessages;
        this.name = name;
        this.detail = detail;
        this.severity = severity;
    }

    @Override public URL getUrl() { return url; }
    @Override public String getIssueName() { return name; }
    @Override public int getIssueType() { return 0; }
    @Override public String getSeverity() { return severity; }
    @Override public String getConfidence() { return "Certain"; }
    @Override public String getIssueBackground() { return null; }
    @Override public String getRemediationBackground() { return null; }
    @Override public String getIssueDetail() { return detail; }
    @Override public String getRemediationDetail() { return null; }
    @Override public IHttpRequestResponse[] getHttpMessages() { return httpMessages; }
    @Override public IHttpService getHttpService() { return httpService; }
}

빌드 및 배포

Maven을 사용하면 burp-extender-api.jar를 dependencies로 추가하고 패키징 후 .jar 파일을 Burp Extender에서 로드하면 된다. 중요한 점은 확장 JAR가 Burp API와 동일한 클래스 로더에서 실행되므로 API 버전이 맞아야 한다.

Maven 기본 흐름

  • pom.xml에 burp-extender-api.jar를 system scope로 추가하거나 로컬 레포에 설치
  • mvn package로 fat-jar를 만들거나 필요한 클래스만 포함한 JAR 생성
  • Burp Suite -> Extender -> Extensions -> Add에서 생성한 JAR 파일 추가
<dependency>
  <groupId>burp</groupId>
  <artifactId>burp-extender-api</artifactId>
  <version>1.0</version>
  <scope>system</scope>
  <systemPath>${project.basedir}/lib/burp-extender-api.jar</systemPath>
</dependency>

테스트 및 검증

확장 로드 후, Burp의 Scanner 또는 Target 창에서 테스트 요청을 보낸 뒤 Scanner가 자동으로 패시브 검사를 수행하는지 확인한다. 탐지 조건을 테스트하려면 간단한 웹 서버(예: 로컬 Flask/Express)에서 응답 본문에 "insecure_token"을 삽입해 놓고 Burp로 요청을 보내 보면 이슈가 생성되는 것을 확인할 수 있다.

고도화 아이디어

  • 정규식 매칭, 컨텍스트 기반 탐지, 응답 헤더 분석 등 검사 로직 확장
  • doActiveScan 구현으로 페이로드를 주입해 액티브 탐지 추가
  • 발견한 이슈에 대한 스냅샷, 재현 요청, 취약성 등급 결정 로직 추가
  • 설정 UI를 제공하려면 callbacks.createSuiteTab 또는 Extension settings 사용

마무리

이 글에서는 Burp 사용자 정의 체크 Java 개발의 전체 흐름을 다뤘다. 핵심은 IBurpExtender에서 IScannerCheck를 등록하고, doPassiveScan/doActiveScan에서 응답을 분석해 IScanIssue를 반환하는 구조를 이해하는 것이다. 실제 서비스에 적용할 때는 성능과 오탐 최소화, 취약점 재현 정보 제공에 신경 쓰면 도움이 된다. 추가로 Burp 확장 Java 예제를 다양하게 만들어 보면서 Burp Scanner 플러그인 개발 역량을 키우길 권한다.

Burp 사용자 정의 체크 Java Burp Scanner 플러그인 개발 Burp 확장 Java 예제 Burp Suite 확장 IScannerCheck 구현 Burp Extender Java 취약점 스캐너 확장 Java 보안테스트 플러그인