from burp import IBurpExtender, ITab
from java.awt import BorderLayout
from javax.swing import JPanel, JTable, JScrollPane, JTextArea, JSplitPane, JButton, JComboBox
from javax.swing.table import DefaultTableModel
from java.util import Date
from java.text import SimpleDateFormat
from java.net import URL
class BurpExtender(IBurpExtender, ITab):
def registerExtenderCallbacks(self, callbacks):
self.callbacks = callbacks
self.helpers = callbacks.getHelpers()
self.callbacks.setExtensionName("Dir Index Checker (Jython)")
self._request_responses = []
# UI 패널 구성
self._panel = JPanel(BorderLayout())
self._table_model = DefaultTableModel(["URL", "Status", "Indexed", "Time"], 0)
self._table = JTable(self._table_model)
self._panel.add(JScrollPane(self._table), BorderLayout.CENTER)
self._request_viewer = JTextArea()
self._response_viewer = JTextArea()
self._request_viewer.setEditable(False)
self._response_viewer.setEditable(False)
split = JSplitPane(JSplitPane.HORIZONTAL_SPLIT, JScrollPane(self._request_viewer), JScrollPane(self._response_viewer))
split.setDividerLocation(400)
self._panel.add(split, BorderLayout.SOUTH)
self._table.getSelectionModel().addListSelectionListener(lambda e: self.onRowSelect())
# 도메인 선택 드롭다운
self._host_selector = JComboBox()
self._scan_button = JButton("Scan Selected Host", actionPerformed=self.scanSelectedHost)
top_panel = JPanel()
top_panel.add(self._host_selector)
top_panel.add(self._scan_button)
self._panel.add(top_panel, BorderLayout.NORTH)
# 탭 등록
callbacks.addSuiteTab(self)
# 초기 호스트 목록 로딩
self.updateHostList()
def getTabCaption(self):
return "Dir Index Checker"
def getUiComponent(self):
return self._panel
def updateHostList(self):
hosts = set()
for item in self.callbacks.getSiteMap(None):
try:
url = self.helpers.analyzeRequest(item).getUrl()
hosts.add(url.getHost())
except:
continue
self._host_selector.removeAllItems()
for host in sorted(hosts):
self._host_selector.addItem(host)
def scanSelectedHost(self, event):
selected_host = self._host_selector.getSelectedItem()
if selected_host is None:
return
self._table_model.setRowCount(0)
self._request_responses = []
items = self.callbacks.getSiteMap(None)
seen = set()
for item in items:
try:
req_info = self.helpers.analyzeRequest(item)
url = req_info.getUrl()
if not url.getHost() == selected_host:
continue
if not url.getPath().endswith("/"):
continue
if url.toString() in seen:
continue
seen.add(url.toString())
request = self.helpers.buildHttpRequest(url)
service = item.getHttpService()
new_response = self.callbacks.makeHttpRequest(service, request)
analyzed_response = self.helpers.analyzeResponse(new_response.getResponse())
body_offset = analyzed_response.getBodyOffset()
body = self.helpers.bytesToString(new_response.getResponse())[body_offset:].lower()
indexed = "YES" if "index of" in body or "<a href=" in body else "NO"
status = analyzed_response.getStatusCode()
time_str = SimpleDateFormat("HH:mm:ss").format(Date())
self._table_model.addRow([url.toString(), status, indexed, time_str])
self._request_responses.append(new_response)
except Exception as e:
print("Error: %s" % e)
def onRowSelect(self):
row = self._table.getSelectedRow()
if 0 <= row < len(self._request_responses):
rr = self._request_responses[row]
self._request_viewer.setText(self.helpers.bytesToString(rr.getRequest()))
self._response_viewer.setText(self.helpers.bytesToString(rr.getResponse()))