Burp 확장: 커스텀 페이로드 생성기 만들기
Burp 확장 개발 예제를 통해 커스텀 페이로드 발행 Burp 연동, Java 기반 확장 구현과 테스트 절차를 초보자 관점에서 자세히 풀어낸 설명
목차
소개
Burp Suite는 웹 보안 테스트에서 널리 쓰이는 도구다. 기본 기능만으로도 강력하지만, 특정 목적에 맞춘 페이로드를 자동으로 만들고 발행하려면 확장이 필요하다. 이 글은 Burp Extender 환경에서 동작하는 간단한 커스텀 페이로드 생성기를 만드는 과정을 단계별로 설명한다. 처음 접하는 사람도 이해할 수 있도록 개념과 코드, 테스트 절차를 함께 다룬다.
개념 정리
왜 커스텀 페이로드가 필요한가
스캐너나 인트루더 기본 페이로드로는 특정 규칙이나 변형을 모두 다루기 어렵다. 예를 들어 인증 우회, 특수 인코딩, 조합형 페이로드가 필요할 때가 있다. 커스텀 페이로드 생성기는 이러한 요구를 충족시킨다. Burp 내부 API를 사용하면 GUI에 통합하거나 컨텍스트 메뉴로 연동할 수 있다.
구성 요소
- Burp Extender: Burp와 연동되는 Java 클래스
- 페이로드 생성기 모듈: 규칙 기반 또는 조합 기반 생성 로직
- 컨텍스트 메뉴/탭: 사용자와 상호작용하는 인터페이스
사전 준비
개발 환경
- Java 8 이상
- Burp Suite (Community 또는 Pro)
- burpsuite_vX.jar (Burp Extender API 포함 jar)
- 빌드 도구: IDE 또는 Maven/Gradle
실제 구현
아래 예제는 Burp Extender 인터페이스를 구현해 메뉴를 추가하고 선택한 요청에 대해 커스텀 페이로드 목록을 생성해 인트루더로 보내는 기본 흐름을 담고 있다. 코드는 핵심만 담아 초보자가 흐름을 이해하기 쉽도록 구성했다.
package com.example.burp;
import burp.IBurpExtender;
import burp.IContextMenuFactory;
import burp.IContextMenuInvocation;
import burp.IBurpExtenderCallbacks;
import burp.IHttpRequestResponse;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
public class BurpExtender implements IBurpExtender, IContextMenuFactory {
private IBurpExtenderCallbacks callbacks;
@Override
public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
this.callbacks = callbacks;
callbacks.setExtensionName("Custom Payload Generator");
callbacks.registerContextMenuFactory(this);
}
@Override
public List createMenuItems(IContextMenuInvocation invocation) {
JMenuItem menuItem = new JMenuItem("Send to Custom Payload Generator");
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
IHttpRequestResponse[] messages = invocation.getSelectedMessages();
if (messages != null && messages.length > 0) {
PayloadWindow.show(callbacks, messages[0]);
}
}
});
List menu = new ArrayList();
menu.add(menuItem);
return menu;
}
}
위 클래스는 Burp에 메뉴를 추가한다. 다음으로 페이로드를 생성하고 인트루더 혹은 다른 모듈로 전송하는 창을 만든다.
package com.example.burp;
import burp.IBurpExtenderCallbacks;
import burp.IHttpRequestResponse;
import javax.swing.*;
import java.awt.*;
import java.util.List;
import java.util.ArrayList;
public class PayloadWindow extends JFrame {
private IBurpExtenderCallbacks callbacks;
private IHttpRequestResponse message;
private PayloadWindow(IBurpExtenderCallbacks callbacks, IHttpRequestResponse message) {
this.callbacks = callbacks;
this.message = message;
setTitle("Custom Payload Generator");
setSize(600, 400);
initUI();
}
private void initUI() {
JPanel panel = new JPanel(new BorderLayout());
JTextArea ruleArea = new JTextArea();
ruleArea.setText("prefix=admin&suffix=%s\ncount=10");
panel.add(new JScrollPane(ruleArea), BorderLayout.CENTER);
JButton genButton = new JButton("Generate");
genButton.addActionListener(e -> {
String rules = ruleArea.getText();
List payloads = PayloadGenerator.generate(rules);
// 여기서 callbacks를 통해 인트루더로 전송하거나 파일로 저장 가능
JOptionPane.showMessageDialog(this, "Generated " + payloads.size() + " payloads");
});
panel.add(genButton, BorderLayout.SOUTH);
add(panel);
}
public static void show(IBurpExtenderCallbacks callbacks, IHttpRequestResponse message) {
PayloadWindow w = new PayloadWindow(callbacks, message);
w.setVisible(true);
}
}
package com.example.burp;
import java.util.ArrayList;
import java.util.List;
public class PayloadGenerator {
public static List generate(String rules) {
List out = new ArrayList();
// 간단한 규칙 파싱 예: prefix=*,suffix=%s,count=N
String prefix = "";
String suffix = "%s";
int count = 10;
for (String line : rules.split("\\n")) {
if (line.startsWith("prefix=")) prefix = line.substring(7);
if (line.startsWith("suffix=")) suffix = line.substring(7);
if (line.startsWith("count=")) count = Integer.parseInt(line.substring(6));
}
for (int i = 0; i < count; i++) {
out.add(prefix + String.valueOf(i) + suffix);
}
return out;
}
}
코드 설명
첫 번째 클래스는 Burp에 컨텍스트 메뉴를 등록한다. 사용자는 요청을 우클릭해 생성기 창을 띄울 수 있다. 두 번째 클래스는 간단한 Swing 창이다. 규칙을 입력받고 Generate 버튼으로 페이로드를 만든다. 세 번째 클래스는 규칙을 파싱해 실제 페이로드 리스트를 만든다. 이 구조를 확장하면 인코딩, 변형, 조합 규칙을 추가할 수 있다.
테스트와 검증
- Burp Extender에서 JAR을 로드하고 확장명이 정상 표시되는지 확인한다.
- 요청을 우클릭해 "Send to Custom Payload Generator" 메뉴가 보이는지 확인한다.
- 생성 창에서 규칙을 입력하고 Generate를 눌러 페이로드 수를 확인한다.
- 실제 인트루더로 전송하거나 HTTP 요청에 삽입해 동작을 검증한다.
확장 아이디어
- 정규식 기반 치환
- 외부 데이터 소스(CSV, API) 연동
- 동적 인코딩(UTF-8, URL, Base64 등)
- 스레드 안전한 대용량 페이로드 생성
마무리
이 글은 Burp 확장 개발 예제 차원에서 간단한 커스텀 페이로드 발행 Burp 연동 방법을 다뤘다. 핵심은 Burp Extender API를 통해 메뉴와 UI를 연결하고, 페이로드 생성 로직을 모듈화하는 것이다. 이후 필요에 따라 규칙 엔진을 고도화하면 실무에서 유용하게 활용할 수 있다.