104
Customizing Burp Suite Getting the Most out of Burp Extensions

AppSec USA 2015: Customizing Burp Suite

Embed Size (px)

Citation preview

Page 1: AppSec USA 2015: Customizing Burp Suite

Customizing Burp Suite

Getting the Most out of Burp Extensions

Page 2: AppSec USA 2015: Customizing Burp Suite

August Detlefsen

• Senior Application Security Consultant• Author

[email protected]@codemagihttp://www.codemagi.com/blog

Page 3: AppSec USA 2015: Customizing Burp Suite

Monika Morrow

• Senior Application Security Consultant@ AppSec Consulting

[email protected] @fortytwowho

Page 4: AppSec USA 2015: Customizing Burp Suite

Agenda/Overview

• Extensions• Using the BApp Store• Building Your First Extension• Adding GUI to extensions• Building Scanners• Utilities

Page 5: AppSec USA 2015: Customizing Burp Suite

Burp Suite

• What is Burp? • What are extensions?– What can I do with them? (use cases)

Page 6: AppSec USA 2015: Customizing Burp Suite

What Can I Do With Extensions?

• Passive Scanning• Active Scanning• Alter/append requests• Define Insertion Points for Scanner/Intruder• Create new payload types• Automate Authentication• Much, Much More

Page 7: AppSec USA 2015: Customizing Burp Suite

BApp Store

• What is it? • How do I use it? • A look at some useful extensions– Logger++– WSDL Wizard

Page 8: AppSec USA 2015: Customizing Burp Suite

BApp Store

Page 9: AppSec USA 2015: Customizing Burp Suite

Burp Extension Tab

Page 10: AppSec USA 2015: Customizing Burp Suite

BApp Store

Page 11: AppSec USA 2015: Customizing Burp Suite

Logger++

Page 12: AppSec USA 2015: Customizing Burp Suite

List of Active/Inactive Burp Extensions

Page 13: AppSec USA 2015: Customizing Burp Suite

Logger++ Options

Page 14: AppSec USA 2015: Customizing Burp Suite

Logger++ View Logs

Page 15: AppSec USA 2015: Customizing Burp Suite

Logger++ Item Details

Page 16: AppSec USA 2015: Customizing Burp Suite

Jython Extensions

Page 17: AppSec USA 2015: Customizing Burp Suite

Burp Extensions Settings

Page 18: AppSec USA 2015: Customizing Burp Suite

Burp Extensions Settings

Page 19: AppSec USA 2015: Customizing Burp Suite

One Click Install Jython Extensions

Page 20: AppSec USA 2015: Customizing Burp Suite

WSDL Wizard Installed

Page 21: AppSec USA 2015: Customizing Burp Suite

Installed Burp Extensions

Page 22: AppSec USA 2015: Customizing Burp Suite

WSDL Wizard Usage

Page 23: AppSec USA 2015: Customizing Burp Suite

WSDL Wizard Results

Page 24: AppSec USA 2015: Customizing Burp Suite

Limited Examples

• Proprietary code• One-Offs• No process for updating BApp Store

extensions

Page 25: AppSec USA 2015: Customizing Burp Suite

Loading a Custom Extension

• Java, Python, and Ruby extensions are loaded and managed through a single interface within the Extension tab

Page 26: AppSec USA 2015: Customizing Burp Suite

Loading a Custom Extension

Page 27: AppSec USA 2015: Customizing Burp Suite

Loading a Custom Extension

Page 28: AppSec USA 2015: Customizing Burp Suite

Loading a Custom Extension

Page 29: AppSec USA 2015: Customizing Burp Suite

Loading a Custom Extension

Page 30: AppSec USA 2015: Customizing Burp Suite

Loading a Custom Extension

Page 31: AppSec USA 2015: Customizing Burp Suite

Building Custom Extensions

• Burp Suite Pro v 1.6.x• Current NetBeans IDE (8.0.2)• JDK 8

Page 32: AppSec USA 2015: Customizing Burp Suite

Starting with a Template

• Find a starter project• Some example projects at

https://portswigger.net/burp/extender/ • Today we’ll start with my NetbeansGUI project

found at https://github.com/monikamorrow/ Burp-Suite-Extension-Examples– Which depends on

https://github.com/augustd/burp-suite-utils

Page 33: AppSec USA 2015: Customizing Burp Suite

Starting with a Template

• Clone Burp-Suite-Extension-Examples and burp-suite-utils into your working directory

• Open the Burp-Suite-Extension-Examples NetBeans project and expand folders and resolve issues along the way

• Compile the project to resolve remaining issues

Page 34: AppSec USA 2015: Customizing Burp Suite

Open the NetBeans Project

Page 35: AppSec USA 2015: Customizing Burp Suite

Problems already! No problem.

Page 36: AppSec USA 2015: Customizing Burp Suite

Resolve Project Problems

Page 37: AppSec USA 2015: Customizing Burp Suite

Find the Cloned Project

Page 38: AppSec USA 2015: Customizing Burp Suite

….and Repeat. Resolved.

Page 39: AppSec USA 2015: Customizing Burp Suite

Now what!?

Page 40: AppSec USA 2015: Customizing Burp Suite

Invalid Java Version?

Page 41: AppSec USA 2015: Customizing Burp Suite

Select Java Version

Page 42: AppSec USA 2015: Customizing Burp Suite

Resolved!

Page 43: AppSec USA 2015: Customizing Burp Suite

More Problems?

Page 44: AppSec USA 2015: Customizing Burp Suite

Compile to Fix!Building jar: C:\Users\mmorrow\Documents\GitHub\Burp-Suite-Extension-Examples\Example4NetBeansGUI\BurpExtender\dist\BurpExtender-combined.jarjar:BUILD SUCCESSFUL (total time: 1 second)

Page 45: AppSec USA 2015: Customizing Burp Suite

Edit build.xml

<target name="-post-jar"><jar jarfile=

"dist/BurpExtender-combined.jar"><zipfileset src="${dist.jar}" /><zipgroupfileset dir="dist/lib" includes="*.jar”excludes="META-INF/*"/></jar>

</target>

Page 46: AppSec USA 2015: Customizing Burp Suite

Test!

Page 47: AppSec USA 2015: Customizing Burp Suite

Let's Write Some Code

• Start new class BurpExtender• Import BurpGUIExtender• Implement BurpGUIExtender's abstract

functions– init()– processSelectedMessage()

Page 48: AppSec USA 2015: Customizing Burp Suite

BurpExtenderpackage burp;import com.monikamorrow.burp.BurpGUIExtender;

public class BurpExtender extends BurpGUIExtender { ... }

Page 49: AppSec USA 2015: Customizing Burp Suite

BurpExtenderpublic class BurpExtender extends BurpGUIExtender {

public void init() { mPluginName = "MYPROJECT"; mUsageStatement = "Usage statement for " + mPluginName; }

}

Page 50: AppSec USA 2015: Customizing Burp Suite

BurpExtenderpublic class BurpExtender extends BurpGUIExtender

protected IHttpRequestResponse processSelectedMessage( IHttpRequestResponse messageInfo, boolean isRequest) { ... return messageInfo; }}

Page 51: AppSec USA 2015: Customizing Burp Suite

BurpExtender{if(isRequest) { mStdOut.println( "processSelectedMessage triggered for request"); messageInfo.setComment("Request processed");} else { mStdOut.println( "processSelectedMessage triggered for response"); messageInfo.setComment( messageInfo.getComment() + "/Response processed");} return messageInfo;}

Page 52: AppSec USA 2015: Customizing Burp Suite

What's Available?

• Mix and match– BurpGUIExtender– BurpSuiteTab• ToolsScopeComponent• UrlScopeComponent

– BaseExtender– PassiveScan– ….and more

Page 53: AppSec USA 2015: Customizing Burp Suite

GUI Components

• Configuration of options• Enable only what you want• Autosave

Page 54: AppSec USA 2015: Customizing Burp Suite

How to Add?

mTab = new BurpSuiteTab (mPluginName, mCallbacks);mTab.add(toolsScope);mTab.add(urlScope);mTab.add(myJPanel);mCallbacks.customizeUiComponent(mTab);mCallbacks.addSuiteTab(mTab);

Page 55: AppSec USA 2015: Customizing Burp Suite

How to Get Settings?urlScope.processAllRequests();

toolsScope.isToolSelected(toolFlag);

Page 56: AppSec USA 2015: Customizing Burp Suite

Passive Scanning• Search responses for problematic values• Built-in passive scans– Credit card numbers– Known passwords– Missing headers

Building a Passive Scanner

Page 57: AppSec USA 2015: Customizing Burp Suite

Passive Scanning – Room for Improvement• Error Messages• Software Version Numbers

Building a Passive Scanner

Page 58: AppSec USA 2015: Customizing Burp Suite

Implement the IScannerCheck interfacepublic class PassiveScan implements IScannerCheck {

@Override public List<IScanIssue> doPassiveScan(

IHttpRequestResponse baseRequestResponse) { … }

@Override public List<IScanIssue> doActiveScan(

IHttpRequestResponse baseRequestResponse, IScannerInsertionPoint insertionPoint) { … }

@Override public int consolidateDuplicateIssues(

IScanIssue existingIssue, IScanIssue newIssue) { … }

Building a Passive Scanner

Page 59: AppSec USA 2015: Customizing Burp Suite

Register the extension as a custom scanner@Overrideprotected void initialize() { callbacks.registerScannerCheck(this);}

Building a Passive Scanner

Page 60: AppSec USA 2015: Customizing Burp Suite

IScannerCheck.doPassiveScan()for (MatchRule rule : rules) {

Matcher matcher = rule.getPattern().matcher(response);

while (matcher.find()) {matches.add(

new ScannerMatch(matcher.start(), matcher.end(), group,

rule));

Building a Passive Scanner

Page 61: AppSec USA 2015: Customizing Burp Suite

IScannerCheck.doPassiveScan()if (!matches.isEmpty()) {

Collections.sort(matches);

List<int[]> startStop = new ArrayList<int[]>(1);

for (ScannerMatch match : matches) {startStop.add(new int[]{match.getStart(), match.getEnd()

});

Building a Passive Scanner

Page 62: AppSec USA 2015: Customizing Burp Suite

IScannerCheck.doPassiveScan()return new ScanIssue(

baseRequestResponse.getHttpService(),

helpers.analyzeRequest(baseRequestResponse).getUrl(),

new IHttpRequestResponse[] {callbacks.applyMarkers(

baseRequestResponse, null, startStop)}, issueName, issueDetail, ScanIssueSeverity.MEDIUM, ScanIssueConfidence.FIRM

Building a Passive Scanner

Page 63: AppSec USA 2015: Customizing Burp Suite

IScannerCheck.consolidateDuplicateIssues()@Overridepublic int consolidateDuplicateIssues(

IScanIssue existingIssue, IScanIssue newIssue) {

if (existingIssue.getIssueDetail().equals(newIssue.getIssueDetail())) {

return -1; //It is a duplicate

} else { return 0; //This is a new issue}

Building a Passive Scanner

Page 64: AppSec USA 2015: Customizing Burp Suite

Extending from PassiveScan@Overrideprotected void initPassiveScan() {

//set the extension NameextensionName = "Error Message Checks";

//create match rulesaddMatchRule(

new MatchRule(PHP_ON_LINE, 0, "PHP"));addMatchRule(

new MatchRule(PHP_HTML_ON_LINE, 0, "PHP"));…

Building a Passive Scanner

Page 65: AppSec USA 2015: Customizing Burp Suite

Extending from PassiveScan@Overrideprotected ScanIssue getScanIssue(

IHttpRequestResponse baseRequestResponse, List<ScannerMatch> matches, List<int[]> startStop) {

return new ScanIssue(baseRequestResponse, helpers,callbacks, startStop, getIssueName(), getIssueDetail(matches), ScanIssueSeverity.MEDIUM.getName(), ScanIssueConfidence.FIRM.getName());

Building a Passive Scanner

Page 66: AppSec USA 2015: Customizing Burp Suite

Active Scanning• Issue requests containing attacks • Look for indication of success in response• Built-In Active Scans– XSS– SQL Injection– Path Traversal– etc

Building an Active Scanner

Page 67: AppSec USA 2015: Customizing Burp Suite

IScannerCheck.doActiveScan()@Overridepublic List<IScanIssue> doActiveScan(

IHttpRequestResponse baseRequestResponse, IScannerInsertionPoint insertionPoint) {

for (MatchRule rule : rules) { // compile a request containing our // injection test in the insertion point byte[] testBytes = rule.getTest(); byte[] checkRequest =

insertionPoint.buildRequest(testBytes);

Building an Active Scanner

Page 68: AppSec USA 2015: Customizing Burp Suite

IScannerCheck.doActiveScan()// issue the requestIHttpRequestResponse checkRequestResponse =

callbacks.makeHttpRequest( httpService, checkRequest);

//get the responseString response = helpers.bytesToString(

checkRequestResponse.getResponse());

Building an Active Scanner

Page 69: AppSec USA 2015: Customizing Burp Suite

IScannerCheck.doActiveScan()// get the offsets of the payload // within the request, for in-UI highlightingList<int[]> requestHighlights =

new ArrayList<int[]>(1);requestHighlights.add(

insertionPoint.getPayloadOffsets(testBytes));

Building an Active Scanner

Page 70: AppSec USA 2015: Customizing Burp Suite

Extending from ActiveScan@Overrideprotected void initActiveScan() { //set the extension Name extensionName = "Server Side Javascript Injection checks"; //create match rules addMatchRule(

new MatchRule("response.end('success')", SUCCESS, 0, "response.end")); addMatchRule(

new MatchRule("1995';return(true);var%20foo='bar", TRUE, 0, "string"));

Building an Active Scanner

Page 71: AppSec USA 2015: Customizing Burp Suite

Insertion Points • Locations of parameters in request • Contain data the server will act upon

Building an Active Scanner

Page 72: AppSec USA 2015: Customizing Burp Suite

Defining Insertion Points

Page 73: AppSec USA 2015: Customizing Burp Suite

Defining Insertion Points

Page 74: AppSec USA 2015: Customizing Burp Suite

Defining Insertion Points• Implement IScannerInsertionPointProvider– getInsertionPoints()

• Register as an insertion point provider:

callbacks.registerScannerInsertionPointProvider(this)

;

Defining Insertion Points

Page 75: AppSec USA 2015: Customizing Burp Suite

BurpExtender.getInsertionPoints()@Overridepublic List<IScannerInsertionPoint> getInsertionPoints(

IHttpRequestResponse baseRR) { byte[] request = baseRR.getRequest(); String requestAsString =

new String(request);

GWTParser parser = new GWTParser(); parser.parse(requestAsString);

Defining Insertion Points

Page 76: AppSec USA 2015: Customizing Burp Suite

BurpExtender.getInsertionPoints()for (int[] offset : insertionPointOffsets) {IScannerInsertionPoint point = helpers.makeScannerInsertionPoint(

"GWT", request, offset[0] - bodyStart, offset[1] - bodyStart);

insertionPoints.add(point);

}return insertionPoints;

Defining Insertion Points

Page 77: AppSec USA 2015: Customizing Burp Suite

Defining Insertion Points

Page 78: AppSec USA 2015: Customizing Burp Suite

Viewing Insertion Points• Add menu option to send request to Intruder

• Implement IContextMenuFactory– createMenuItems()

• Register as a menu factorycallbacks.registerContextMenuFactory(this);

Defining Insertion Points

Page 79: AppSec USA 2015: Customizing Burp Suite

BurpExtender.createMenuItems()@Overridepublic List<JMenuItem> createMenuItems(

IContextMenuInvocation invocation) { //get selected requests from //the invocation IHttpRequestResponse[] ihrrs =

invocation.getSelectedMessages();

Defining Insertion Points

Page 80: AppSec USA 2015: Customizing Burp Suite

BurpExtender.createMenuItems()//create clickable menu itemJMenuItem item = new JMenuItem(

"Send GWT request(s) to Intruder");item.addActionListener(new MenuItemListener(ihrrs));

//return a Collection of menu itemsList<JMenuItem> menuItems =

new ArrayList<JMenuItem>();menuItems.add(item); return menuItems;

Defining Insertion Points

Page 81: AppSec USA 2015: Customizing Burp Suite

MenuItemListenerclass MenuItemListener implements ActionListener { private IHttpRequestResponse[] ihrrs; public MenuItemListener(

IHttpRequestResponse[] ihrrs) {this.ihrrs = ihrrs;

} public void actionPerformed(ActionEvent ae) {

sendGWTToIntruder(ihrrs); }}

Defining Insertion Points

Page 82: AppSec USA 2015: Customizing Burp Suite

BurpExtender.sendGWTToIntruder()public void sendGWTToIntruder(IHttpRequestResponse[] ihrrs) { for (IHttpRequestResponse baseRR : ihrrs) {

IHttpService service = baseRR.getHttpService();

// parse the request (not shown)

if (isGWTRequest) {// Send GWT request to Intrudercallbacks.sendToIntruder(

service.getHost(), service.getPort(),

service.getProtocol().equals("https"), request, insertionPointOffsets);

Defining Insertion Points

Page 83: AppSec USA 2015: Customizing Burp Suite

BurpExtender.sendGWTToIntruder()

baseRR.setComment("GWT: " +

parser.getServiceMethod() + " " + baseRR.getComment()

);

Defining Insertion Points

Page 84: AppSec USA 2015: Customizing Burp Suite

Defining Insertion Points

Page 85: AppSec USA 2015: Customizing Burp Suite

Defining Insertion Points

Page 86: AppSec USA 2015: Customizing Burp Suite

Modifying Requests• Add custom headers• Add signatures• CSRF tokens

Modifying Requests

Page 87: AppSec USA 2015: Customizing Burp Suite

Modifying Requests• Implement IHttpListener

processHttpMessage()

• Register as an HTTP Listenercallbacks.registerHttpListener(this);

Modifying Requests

Page 88: AppSec USA 2015: Customizing Burp Suite

@Overridepublic void processHttpMessage(

int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {

if (messageIsRequest && callbacks.TOOL_SCANNER == toolFlag) {

BurpExtender.processHttpMessage()Modifying a Request

Page 89: AppSec USA 2015: Customizing Burp Suite

//see if the request contains a CSRF_TOKENbyte[] scannerRequest =

messageInfo.getRequest();String requestString =

helpers.bytesToString(scannerRequest);

Matcher matcher =TOKEN_PATTERN.matcher(requestString);

if (matcher.find()) { getFreshToken();

BurpExtender.processHttpMessage()Modifying a Request

Page 90: AppSec USA 2015: Customizing Burp Suite

byte[] request = helpers.buildHttpRequest(FORM_URL);

// issue the request and get the responsebyte[] response = callbacks.makeHttpRequest(

DOMAIN_NAME, 443, true, request);

getFreshToken()Modifying a Request

Page 91: AppSec USA 2015: Customizing Burp Suite

String responseString = helpers.bytesToString(response);

Matcher matcher = TOKEN_INPUT_PATTERN.matcher(responseString)

;

if (matcher.find()) return matcher.group(1);

getFreshToken()Modifying a Request

Page 92: AppSec USA 2015: Customizing Burp Suite

String token = getFreshToken(); if (token != null) { requestString = matcher.replaceAll(

"name=\"CSRF_TOKEN\" value=\" + token);} messageInfo.setRequest(

requestString.getBytes());

BurpExtender.processHttpMessage()Modifying a Request

Page 93: AppSec USA 2015: Customizing Burp Suite

Debugging• callbacks.printOutput(String)• callbacks.printError(String)

Utilities

Page 94: AppSec USA 2015: Customizing Burp Suite

Utilities

Page 95: AppSec USA 2015: Customizing Burp Suite

Debugging – Stack Traces• Exception.printStackTrace()• Get the error OutputStream

• Print a stack trace to the stream

Utilities

Page 96: AppSec USA 2015: Customizing Burp Suite

Utilities

Page 97: AppSec USA 2015: Customizing Burp Suite

Bringing it all Together

• BApp Store Challenges• Base Classes• Passive Scanning• GUI Building

Page 98: AppSec USA 2015: Customizing Burp Suite

Using Base Classes• com.codemagi.burp.BaseExtender– com.codemagi.burp.PassiveScan• com.monikamorrow.burp.BurpSuiteTab

Bringing it all Together

Page 99: AppSec USA 2015: Customizing Burp Suite

Bringing it all TogetherGUI Building

Page 100: AppSec USA 2015: Customizing Burp Suite

Passive Scanning@Overrideprotected void initPassiveScan() { //set the extension Name extensionName = "Software Version Checks"; //create a component rulesTable = new RuleTableComponent(this, callbacks); //add component to Burp GUI mTab = new BurpSuiteTab(extensionName, callbacks); mTab.addComponent(rulesTable);}

Bringing it all Together

Page 101: AppSec USA 2015: Customizing Burp Suite

Bringing it all TogetherSolving BApp Store Challenges

Page 102: AppSec USA 2015: Customizing Burp Suite

Get the Code• Burp Suite Utils:– https://github.com/augustd/burp-suite-utils

• Burp Suite Extension Examples: – https://github.com/monikamorrow/Burp-Suite-Extension-Exam

ples

• Software Version Checks– https://github.com/augustd/burp-suite-software-version-checks

• GWT Scan– https://github.com/augustd/burp-suite-gwt-scan

Page 103: AppSec USA 2015: Customizing Burp Suite

Get the Extensions

• Software Version Checks• GWT Scan

Also See: • Error Message Checks• Session Timeout Test

Available in the Bapp Store

Page 104: AppSec USA 2015: Customizing Burp Suite

Thank You!

August Detlefsen

[email protected]@codemagi

Monika Morrow

mmorrow@ appsecconsulting.com@fortytwowho