카테고리 없음

ㅎㅎ

1231. 2025. 4. 15. 14:01
from burp import IBurpExtender, ITab
from java.awt import BorderLayout
from javax.swing import JPanel, JTable, JScrollPane, JTextArea, JSplitPane, JButton, JComboBox
from javax.swing.table import DefaultTableModel
from java.util import Date
from java.text import SimpleDateFormat
from java.net import URL

class BurpExtender(IBurpExtender, ITab):

    def registerExtenderCallbacks(self, callbacks):
        self.callbacks = callbacks
        self.helpers = callbacks.getHelpers()
        self.callbacks.setExtensionName("Dir Index Checker (Jython)")

        self._request_responses = []

        # UI 패널 구성
        self._panel = JPanel(BorderLayout())
        self._table_model = DefaultTableModel(["URL", "Status", "Indexed", "Time"], 0)
        self._table = JTable(self._table_model)
        self._panel.add(JScrollPane(self._table), BorderLayout.CENTER)

        self._request_viewer = JTextArea()
        self._response_viewer = JTextArea()
        self._request_viewer.setEditable(False)
        self._response_viewer.setEditable(False)
        split = JSplitPane(JSplitPane.HORIZONTAL_SPLIT, JScrollPane(self._request_viewer), JScrollPane(self._response_viewer))
        split.setDividerLocation(400)
        self._panel.add(split, BorderLayout.SOUTH)

        self._table.getSelectionModel().addListSelectionListener(lambda e: self.onRowSelect())

        # 도메인 선택 드롭다운
        self._host_selector = JComboBox()
        self._scan_button = JButton("Scan Selected Host", actionPerformed=self.scanSelectedHost)

        top_panel = JPanel()
        top_panel.add(self._host_selector)
        top_panel.add(self._scan_button)
        self._panel.add(top_panel, BorderLayout.NORTH)

        # 탭 등록
        callbacks.addSuiteTab(self)

        # 초기 호스트 목록 로딩
        self.updateHostList()

    def getTabCaption(self):
        return "Dir Index Checker"

    def getUiComponent(self):
        return self._panel

    def updateHostList(self):
        hosts = set()
        for item in self.callbacks.getSiteMap(None):
            try:
                url = self.helpers.analyzeRequest(item).getUrl()
                hosts.add(url.getHost())
            except:
                continue
        self._host_selector.removeAllItems()
        for host in sorted(hosts):
            self._host_selector.addItem(host)

    def scanSelectedHost(self, event):
        selected_host = self._host_selector.getSelectedItem()
        if selected_host is None:
            return

        self._table_model.setRowCount(0)
        self._request_responses = []

        items = self.callbacks.getSiteMap(None)
        seen = set()

        for item in items:
            try:
                req_info = self.helpers.analyzeRequest(item)
                url = req_info.getUrl()

                if not url.getHost() == selected_host:
                    continue
                if not url.getPath().endswith("/"):
                    continue
                if url.toString() in seen:
                    continue

                seen.add(url.toString())
                request = self.helpers.buildHttpRequest(url)
                service = item.getHttpService()
                new_response = self.callbacks.makeHttpRequest(service, request)
                analyzed_response = self.helpers.analyzeResponse(new_response.getResponse())

                body_offset = analyzed_response.getBodyOffset()
                body = self.helpers.bytesToString(new_response.getResponse())[body_offset:].lower()

                indexed = "YES" if "index of" in body or "<a href=" in body else "NO"
                status = analyzed_response.getStatusCode()
                time_str = SimpleDateFormat("HH:mm:ss").format(Date())

                self._table_model.addRow([url.toString(), status, indexed, time_str])
                self._request_responses.append(new_response)

            except Exception as e:
                print("Error: %s" % e)

    def onRowSelect(self):
        row = self._table.getSelectedRow()
        if 0 <= row < len(self._request_responses):
            rr = self._request_responses[row]
            self._request_viewer.setText(self.helpers.bytesToString(rr.getRequest()))
            self._response_viewer.setText(self.helpers.bytesToString(rr.getResponse()))