# -*- coding: utf-8 -*-
from burp import IBurpExtender, IHttpListener, ITab
from javax.swing import (JPanel, JButton, JTextField, JLabel, JComboBox,
JTable, JScrollPane, JTextArea, JSplitPane,
KeyStroke, AbstractAction, DefaultCellEditor,
BoxLayout, Box)
from javax.swing.table import DefaultTableModel
from javax.swing.border import EmptyBorder
from java.awt import BorderLayout, Dimension, Insets
from java.awt.event import ItemEvent, ItemListener
class DeleteAction(AbstractAction):
def __init__(self, outer):
self.outer = outer
def actionPerformed(self, event):
self.outer.delete_keyword(None)
class HostSelectionListener(ItemListener):
def __init__(self, outer):
self.outer = outer
def itemStateChanged(self, event):
if event.getStateChange() == ItemEvent.SELECTED:
self.outer.refresh_info(None)
class BurpExtender(IBurpExtender, IHttpListener, ITab):
def registerExtenderCallbacks(self, callbacks):
self.callbacks = callbacks
self.helpers = callbacks.getHelpers()
callbacks.setExtensionName("7illight")
callbacks.registerHttpListener(self)
self.domain_headers = {}
self.init_gui()
callbacks.addSuiteTab(self)
print("[+] 7illight extension loaded.")
def init_gui(self):
self.panel = JPanel(BorderLayout())
self.panel.setBorder(EmptyBorder(10, 10, 10, 10)) # 전체 여백
self.scope_selector = JComboBox(["Both", "Request", "Response"])
self.color_selector = JComboBox(["red", "orange", "yellow", "green", "cyan", "blue", "pink", "magenta", "gray"])
self.keyword_field = JTextField(15)
self.add_button = JButton("Add", actionPerformed=self.add_keyword)
self.delete_button = JButton("Delete", actionPerformed=self.delete_keyword)
self.input_panel = JPanel()
self.input_panel.setLayout(BoxLayout(self.input_panel, BoxLayout.X_AXIS))
self.input_panel.setBorder(EmptyBorder(8, 0, 8, 0)) # 위아래 여백
self.input_panel.add(JLabel("Scope"))
self.input_panel.add(self.scope_selector)
self.input_panel.add(Box.createHorizontalStrut(8))
self.input_panel.add(JLabel("Color"))
self.input_panel.add(self.color_selector)
self.input_panel.add(Box.createHorizontalStrut(8))
self.input_panel.add(JLabel("Keyword"))
self.input_panel.add(self.keyword_field)
self.input_panel.add(Box.createHorizontalStrut(8))
self.input_panel.add(self.add_button)
self.input_panel.add(Box.createHorizontalStrut(5))
self.input_panel.add(self.delete_button)
self.table_model = DefaultTableModel(["Scope", "Color", "Keyword"], 0)
self.table = JTable(self.table_model)
self.table.getColumnModel().getColumn(0).setCellEditor(DefaultCellEditor(JComboBox(["Both", "Request", "Response"])))
self.table.getColumnModel().getColumn(1).setCellEditor(DefaultCellEditor(JComboBox(["red", "orange", "yellow", "green", "cyan", "blue", "pink", "magenta", "gray"])))
self.table.getInputMap().put(KeyStroke.getKeyStroke("DELETE"), "delete")
self.table.getActionMap().put("delete", DeleteAction(self))
table_scroll = JScrollPane(self.table)
table_scroll.setPreferredSize(Dimension(500, 300))
self.left_panel = JPanel(BorderLayout())
self.left_panel.add(self.input_panel, BorderLayout.NORTH)
self.left_panel.add(table_scroll, BorderLayout.CENTER)
self.domain_selector = JComboBox()
self.domain_selector.addItemListener(HostSelectionListener(self))
self.refresh_button = JButton("Refresh", actionPerformed=self.refresh_info)
self.clear_button = JButton("Clear", actionPerformed=self.clear_info_area)
domain_select_panel = JPanel()
domain_select_panel.setLayout(BoxLayout(domain_select_panel, BoxLayout.X_AXIS))
domain_select_panel.setBorder(EmptyBorder(5, 0, 5, 0))
domain_select_panel.add(JLabel("Host"))
domain_select_panel.add(Box.createHorizontalStrut(5))
domain_select_panel.add(self.domain_selector)
domain_select_panel.add(Box.createHorizontalStrut(10))
domain_select_panel.add(self.refresh_button)
domain_select_panel.add(Box.createHorizontalStrut(5))
domain_select_panel.add(self.clear_button)
self.info_area = JTextArea(18, 40)
self.info_area.setEditable(False)
self.info_area.setMargin(Insets(6, 6, 6, 6)) # 내부 패딩
info_scroll = JScrollPane(self.info_area)
self.right_panel = JPanel(BorderLayout())
self.right_panel.add(domain_select_panel, BorderLayout.NORTH)
self.right_panel.add(info_scroll, BorderLayout.CENTER)
self.split_pane = JSplitPane(JSplitPane.HORIZONTAL_SPLIT, self.left_panel, self.right_panel)
self.split_pane.setResizeWeight(0.4)
self.split_pane.setDividerLocation(0.4)
self.panel.add(self.split_pane, BorderLayout.CENTER)
def getTabCaption(self):
return "7illight"
def getUiComponent(self):
return self.panel
def add_keyword(self, event):
scope = self.scope_selector.getSelectedItem()
color = self.color_selector.getSelectedItem()
keyword = self.keyword_field.getText().strip()
if keyword:
self.table_model.addRow([scope, color, keyword])
def delete_keyword(self, event):
selected_row = self.table.getSelectedRow()
if selected_row != -1:
self.table_model.removeRow(selected_row)
def clear_info_area(self, event):
self.info_area.setText("")
def refresh_info(self, event):
selected_host = self.domain_selector.getSelectedItem()
if selected_host and selected_host in self.domain_headers:
self.info_area.setText(self.domain_headers[selected_host])
def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
if toolFlag != self.callbacks.TOOL_PROXY:
return
try:
request_bytes = messageInfo.getRequest()
request_info = self.helpers.analyzeRequest(messageInfo)
url = request_info.getUrl()
host = url.getHost()
request_url = str(url)
request_body = request_bytes[request_info.getBodyOffset():].tostring()
request_str = request_url + " " + request_body.decode("utf-8", "ignore")
response_str = ""
headers = []
if messageInfo.getResponse() is not None:
response_bytes = messageInfo.getResponse()
response_info = self.helpers.analyzeResponse(response_bytes)
headers = response_info.getHeaders()
response_body = response_bytes[response_info.getBodyOffset():].tostring()
response_str = response_body.decode("utf-8", "ignore")
request_str = request_str.lower()
response_str = response_str.lower()
for row in range(self.table_model.getRowCount()):
scope = self.table_model.getValueAt(row, 0)
color = self.table_model.getValueAt(row, 1).lower()
keyword = self.table_model.getValueAt(row, 2).lower()
matched = False
if scope == "Request" and keyword in request_str:
matched = True
elif scope == "Response" and keyword in response_str:
matched = True
elif scope == "Both" and (keyword in request_str or keyword in response_str):
matched = True
if matched:
messageInfo.setHighlight(color)
break
if headers:
summary = []
for h in headers:
h_lower = h.lower()
if h_lower.startswith("server") or \
h_lower.startswith("set-cookie") or \
h_lower.startswith("authorization") or \
h_lower.startswith("cookie"):
summary.append(h)
if summary:
info = "[+] Info from response: {}\n".format(request_url)
info += "\n".join(summary) + "\n\n"
self.domain_headers[host] = info
if host not in [self.domain_selector.getItemAt(i) for i in range(self.domain_selector.getItemCount())]:
self.domain_selector.addItem(host)
selected = self.domain_selector.getSelectedItem()
if selected == host:
self.info_area.setText(info)
except Exception as e:
print("[!] Error: {}".format(str(e)))