카테고리 없음

ㅇㅇㅇ

1231. 2025. 3. 26. 16:44
# -*- 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)))