카테고리 없음

ㄷㄷㄷㄷ

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