카테고리 없음

ㄱㄱㄱ

1231. 2025. 3. 26. 14:00
# -*- coding: utf-8 -*-
from burp import IBurpExtender, IHttpListener, ITab
from javax.swing import (JPanel, JButton, JTextField, JLabel, JComboBox,
                         JTable, JScrollPane, JTextArea, KeyStroke, AbstractAction)
from javax.swing.table import DefaultTableModel
from javax.swing import DefaultCellEditor
from java.awt import BorderLayout, FlowLayout, Dimension, Component
from java.awt.event import ActionListener
from javax.swing import BoxLayout

# DELETE 키용 액션 클래스 (Jython 호환)
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("Keyword Highlighter Advanced")
        callbacks.registerHttpListener(self)

        self.init_gui()
        callbacks.addSuiteTab(self)
        print("[+] Keyword Highlighter Advanced loaded.")

    def init_gui(self):
        self.panel = JPanel(BorderLayout())
        self.top_panel = JPanel(FlowLayout())
        self.middle_panel = JPanel(BorderLayout())
        self.bottom_panel = JPanel()
        self.bottom_panel.setLayout(BoxLayout(self.bottom_panel, BoxLayout.Y_AXIS))

        self.scope_selector = JComboBox(["Both", "Request", "Response"])
        self.keyword_field = JTextField(15)
        self.color_selector = JComboBox(["red", "orange", "yellow", "green", "cyan", "blue", "pink", "magenta", "gray"])

        self.add_button = JButton("Add", actionPerformed=self.add_keyword)
        self.delete_button = JButton("Delete Selected", actionPerformed=self.delete_keyword)
        self.clear_info_button = JButton("Clear Info", actionPerformed=self.clear_info_area)

        self.top_panel.add(JLabel("Scope:"))
        self.top_panel.add(self.scope_selector)
        self.top_panel.add(JLabel("Keyword:"))
        self.top_panel.add(self.keyword_field)
        self.top_panel.add(JLabel("Color:"))
        self.top_panel.add(self.color_selector)
        self.top_panel.add(self.add_button)

        self.table_model = DefaultTableModel(["Scope", "Keyword", "Color"], 0)
        self.table = JTable(self.table_model)

        self.table.getColumnModel().getColumn(0).setCellEditor(DefaultCellEditor(JComboBox(["Both", "Request", "Response"])))
        self.table.getColumnModel().getColumn(2).setCellEditor(DefaultCellEditor(JComboBox(["red", "orange", "yellow", "green", "cyan", "blue", "pink", "magenta", "gray"])))

        # DELETE 키 입력 처리
        self.table.getInputMap().put(KeyStroke.getKeyStroke("DELETE"), "delete")
        self.table.getActionMap().put("delete", DeleteAction(self))

        scroll_pane = JScrollPane(self.table)
        scroll_pane.setPreferredSize(Dimension(700, 250))
        self.middle_panel.add(scroll_pane, BorderLayout.CENTER)

        # Info Area + Clear 버튼
        self.info_area = JTextArea(8, 80)
        self.info_area.setEditable(False)
        info_scroll = JScrollPane(self.info_area)
        self.bottom_panel.add(info_scroll)

        button_panel = JPanel(FlowLayout())
        button_panel.add(self.delete_button)
        button_panel.add(self.clear_info_button)
        self.bottom_panel.add(button_panel)

        # 패널 조립
        self.panel.add(self.top_panel, BorderLayout.NORTH)
        self.panel.add(self.middle_panel, BorderLayout.CENTER)
        self.panel.add(self.bottom_panel, BorderLayout.SOUTH)

    def getTabCaption(self):
        return "Keyword Highlighter"

    def getUiComponent(self):
        return self.panel

    def add_keyword(self, event):
        keyword = self.keyword_field.getText().strip()
        color = self.color_selector.getSelectedItem()
        scope = self.scope_selector.getSelectedItem()
        if keyword:
            self.table_model.addRow([scope, keyword, color])

    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 processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
        if toolFlag != self.callbacks.TOOL_PROXY:
            return

        try:
            request_bytes = messageInfo.getRequest()
            request_info = self.helpers.analyzeRequest(messageInfo)
            request_url = str(request_info.getUrl())
            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)
                keyword = self.table_model.getValueAt(row, 1).lower()
                color = 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

            # 서버/세션 관련 헤더 로그 출력
            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" + "\n".join(summary) + "\n\n"
                    self.info_area.append(info)
                else:
                    self.info_area.append("[!] No matching headers found in response.\n\n")

        except Exception as e:
            print("[!] Error: {}".format(str(e)))