├── README.md └── main_release.py /README.md: -------------------------------------------------------------------------------- 1 | # Burp Sub Domains Extractor 2 | 3 | A very simple, straightforward extension to export sub domains from Burp using a context menu option. 4 | 5 | ![](http://g.recordit.co/qnpcbcsJH6.gif) 6 | 7 | Unbestowed to many, Burp has amazing passive gathering capabilities that allows to easily discover sub domains related to a target you're assessing. These often only come up after browsing and using the target features extensively. Some of them are only linked - i.e. are not necessarily requested, which make them even more interesting for recon purposes. 8 | 9 | ## Install 10 | 11 | 1. Make sure you have Jython configured under Extender -> Options -> Python Environment. For further instructions, check PortSwigger official instructions at their [support page](https://support.portswigger.net/customer/portal/articles/1965930-how-to-install-an-extension-in-burp-suite). 12 | 2. `git clone git@github.com:Regala/burp-subdomains.git` 13 | 3. Import [main_release.py](main_release.py) in Extender - Extender -> Extensions -> Add -> Select Python -> Select [main_release.py](main_release.py) 14 | 15 | 16 | -------------------------------------------------------------------------------- /main_release.py: -------------------------------------------------------------------------------- 1 | try: 2 | from burp import IBurpExtender 3 | from burp import IScannerCheck 4 | from burp import IExtensionStateListener 5 | from burp import ITab 6 | from burp import IMessageEditor 7 | from burp import IContextMenuFactory 8 | from burp import IContextMenuInvocation 9 | from burp import IHttpRequestResponse 10 | from java.io import PrintWriter, File, FileWriter 11 | from java.lang import Runnable 12 | from javax.swing import (JTable, JScrollPane, JSplitPane, JButton, JPanel, 13 | JTextField, JLabel, SwingConstants, JDialog, Box, 14 | JCheckBox, JMenuItem, SwingUtilities, JOptionPane, 15 | BoxLayout, JPopupMenu, JFileChooser, JTextPane) 16 | 17 | from javax.swing.border import EmptyBorder 18 | from javax.swing.table import AbstractTableModel 19 | from java.awt import (GridLayout, BorderLayout, FlowLayout, Dimension, Point, Toolkit) 20 | from java.awt.datatransfer import (Clipboard, ClipboardOwner, StringSelection, Transferable) 21 | from java.net import URL, MalformedURLException 22 | from java.util import ArrayList 23 | 24 | from threading import Thread, Event 25 | 26 | from urlparse import urlparse 27 | 28 | import sys 29 | import os 30 | import socket 31 | import time 32 | import json 33 | 34 | except ImportError as e: 35 | print e 36 | print "Failed to load dependencies. This issue maybe caused by using an unstable Jython version." 37 | 38 | VERSION = '1.0' 39 | 40 | 41 | class BurpExtender(IBurpExtender, ITab, ClipboardOwner): 42 | def registerExtenderCallbacks(self, callbacks): 43 | print "Loading..." 44 | 45 | self._callbacks = callbacks 46 | self._callbacks.setExtensionName('Subdomain Extractor') 47 | self._helpers = callbacks.getHelpers() 48 | 49 | self.scannerMenu = ScannerMenu(self) 50 | callbacks.registerContextMenuFactory(self.scannerMenu) 51 | print "Subdomain Extractor custom menu loaded" 52 | 53 | 54 | class ScannerMenu(IContextMenuFactory): 55 | def __init__(self, scannerInstance): 56 | self.scannerInstance = scannerInstance 57 | 58 | def createMenuItems(self, contextMenuInvocation): 59 | self.contextMenuInvocation = contextMenuInvocation 60 | sendToSSLScanner = JMenuItem( 61 | "Copy sub domains", actionPerformed=self.getSentUrl) 62 | menuItems = ArrayList() 63 | menuItems.add(sendToSSLScanner) 64 | return menuItems 65 | 66 | def getSentUrl(self, event): 67 | subs = set() 68 | for selectedMessage in self.contextMenuInvocation.getSelectedMessages(): 69 | if (selectedMessage.getHttpService() != None): 70 | try: 71 | url = self.scannerInstance._helpers.analyzeRequest( 72 | selectedMessage.getHttpService(), 73 | selectedMessage.getRequest()).getUrl() 74 | 75 | subDomain = urlparse(url.toString()).hostname 76 | subs.add(subDomain) 77 | except: 78 | self.scannerInstance._callbacks.issueAlert( 79 | "Cannot get URL from the currently selected message " + 80 | str(sys.exc_info()[0]) + " " + str(sys.exc_info()[1])) 81 | else: 82 | self.scannerInstance._callbacks.issueAlert( 83 | "The selected request is null.") 84 | 85 | subs = sorted(subs) 86 | clipboardContent = "" 87 | for s in subs: 88 | clipboardContent = clipboardContent + s + "\n" 89 | 90 | if clipboardContent != "": 91 | clipboardContent = clipboardContent[:-1] # remove last \n 92 | Toolkit.getDefaultToolkit().getSystemClipboard().setContents(StringSelection(clipboardContent), None) 93 | 94 | --------------------------------------------------------------------------------