# -*- 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)
from javax.swing.table import DefaultTableModel
from java.awt import BorderLayout, FlowLayout, Dimension
from java.awt.event import ActionListener
class DeleteAction(AbstractAction):
def __init__(self, outer):
self.outer = outer
def actionPerformed(self, event):
self.outer.delete_keyword(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 = {} # Host별 헤더 저장
self.init_gui()
callbacks.addSuiteTab(self)
print("[+] 7illight extension loaded.")
def init_gui(self):
self.panel = JPanel(BorderLayout())
# --- 입력 영역: Scope / Color / Keyword + 버튼들 ---
self.input_panel = JPanel(FlowLayout(FlowLayout.LEFT))
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.add(JLabel("Scope"))
self.input_panel.add(self.scope_selector)
self.input_panel.add(JLabel("Color"))
self.input_panel.add(self.color_selector)
self.input_panel.add(JLabel("Keyword"))
self.input_panel.add(self.keyword_field)
self.input_panel.add(self.add_button)
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)
# --- Info 영역 및 도메인 선택기 (우측) ---
self.domain_selector = JComboBox()
self.refresh_button = JButton("Refresh", actionPerformed=self.refresh_info)
self.clear_button = JButton("Clear", actionPerformed=self.clear_info_area)
domain_select_panel = JPanel(FlowLayout(FlowLayout.LEFT))
domain_select_panel.add(JLabel("Host"))
domain_select_panel.add(self.domain_selector)
domain_select_panel.add(self.refresh_button)
domain_select_panel.add(self.clear_button)
self.info_area = JTextArea(18, 40)
self.info_area.setEditable(False)
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.5)
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)
print("[+] Highlight applied: '{}' in {} -> {}".format(keyword, scope, color))
break
# --- Host 기준 헤더 저장 및 표시 ---
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
# 콤보박스에 host가 없으면 추가
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)))