/* * SiteLogger - Log sitemap and findings to database * * Copyright (c) 2017 Luca Carettoni - Doyensec LLC. */ package com.doyensec.sitelogger; import burp.IBurpExtenderCallbacks; import burp.IExtensionHelpers; import burp.IHttpRequestResponse; import burp.IScanIssue; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.MongoClient; import java.io.PrintWriter; import java.net.MalformedURLException; import java.net.URL; import java.net.UnknownHostException; public class SiteLoggerPanel extends javax.swing.JPanel { private final IBurpExtenderCallbacks callbacks; private final IExtensionHelpers helpers; public SiteLoggerPanel(IBurpExtenderCallbacks callbacks, IExtensionHelpers helpers) { initComponents(); this.callbacks = callbacks; this.helpers = helpers; } private void initComponents() { // 4 - Define here the AWT/Swing UI which should contain three text fields (mongohost, mongoport, website) and save button // TODO // *** Highly recommended to use a WYSIWYG editor *** } // Button Event Click - Our code goes here! private void logButtonActionPerformed(java.awt.event.ActionEvent evt) { PrintWriter stdout = new PrintWriter(callbacks.getStdout(), true); PrintWriter stderr = new PrintWriter(callbacks.getStderr(), true); try { // 5 - Connect to the database and create two new collections for storing sitemap and vulns MongoClient mongo = new MongoClient(mongohost.getText(), Integer.parseInt(mongoport.getText())); DB db = mongo.getDB("sitelogger"); URL siteUrl = new URL(website.getText()); DBCollection tableSite = db.getCollection(siteUrl.getHost().replaceAll("\\.", "_") + "_site"); DBCollection tableVuln = db.getCollection(siteUrl.getHost().replaceAll("\\.", "_") + "_vuln"); // 6 - Retrieve the SiteMap content (using Burp's getSiteMap) IHttpRequestResponse[] allReqRes = callbacks.getSiteMap(website.getText()); for (int rc = 0; rc < allReqRes.length; rc++) { // 7 - Save each HTTP request/response to the database BasicDBObject document = new BasicDBObject(); document.put("host", allReqRes[rc].getHost()); document.put("port", allReqRes[rc].getPort()); document.put("protocol", allReqRes[rc].getProtocol()); document.put("URL", allReqRes[rc].getUrl().toString()); document.put("status_code", allReqRes[rc].getStatusCode()); if (allReqRes[rc].getRequest() != null) { document.put("request", helpers.base64Encode(allReqRes[rc].getRequest())); } if (allReqRes[rc].getResponse() != null) { document.put("response", helpers.base64Encode(allReqRes[rc].getResponse())); } tableSite.insert(document); } // 8 - Retrieve all scanner findings (using Burp's getScanIssues) IScanIssue[] allVulns = callbacks.getScanIssues(website.getText()); for (int vc = 0; vc < allVulns.length; vc++) { // 9 - Save each vulnerability report to the database, including HTTP request/response BasicDBObject document = new BasicDBObject(); document.put("type", allVulns[vc].getIssueType()); document.put("name", allVulns[vc].getIssueName()); document.put("detail", allVulns[vc].getIssueDetail()); document.put("severity", allVulns[vc].getSeverity()); document.put("confidence", allVulns[vc].getConfidence()); document.put("host", allVulns[vc].getHost()); document.put("port", allVulns[vc].getPort()); document.put("protocol", allVulns[vc].getProtocol()); document.put("URL", allVulns[vc].getUrl().toString()); if (allVulns[vc].getHttpMessages().length > 1) { if (allVulns[vc].getHttpMessages()[0].getRequest() != null) { document.put("request", helpers.base64Encode(allVulns[vc].getHttpMessages()[0].getRequest())); } if (allVulns[vc].getHttpMessages()[0].getResponse() != null) { document.put("response", helpers.base64Encode(allVulns[vc].getHttpMessages()[0].getResponse())); } } tableVuln.insert(document); } callbacks.issueAlert("Data Saved!"); } catch (UnknownHostException ex) { stderr.println("Mongo DB Connection Error:" + ex.toString()); } catch (MalformedURLException ex) { stderr.println("Malformed URL:" + ex.toString()); } } }