ソースコード
# coding: UTF-8
from burp import IBurpExtender
from burp import ITab
from burp import IHttpListener
from burp import IMessageEditorController
from java.awt import Component;
from java.io import PrintWriter;
from java.util import ArrayList;
from java.util import List;
from javax import swing;
from javax.swing.table import AbstractTableModel;
from javax.swing.table import DefaultTableModel;
class BurpExtender(IBurpExtender, ITab, IHttpListener, IMessageEditorController, AbstractTableModel):
def registerExtenderCallbacks(self, callbacks):
self._callbacks = callbacks
self._helpers = callbacks.getHelpers()
# extensionの名前を設定する
callbacks.setExtensionName("Parameter Full Changer")
# メインパネル
self._jPanel = swing.JPanel()
self._jPanel.setLayout(swing.BoxLayout(self._jPanel, swing.BoxLayout.Y_AXIS))
# 設定値テーブル
colmunName = ["SetNo", "stat"]
self._tableModel = DefaultTableModel(colmunName, 0)
self._valueTable = swing.JTable(self._tableModel)
scrollPane = swing.JScrollPane(self._valueTable)
self._jPanel.add(scrollPane)
# ボタンエリア
self._buttonPanel = swing.JPanel()
self._updateToNotYetButton = swing.JButton("Update to [Not Yet]", actionPerformed=self.updateToNotYet)
self._buttonPanel.add(self._updateToNotYetButton)
self._dleteButton = swing.JButton("Delete value set", actionPerformed=self.deleteParam)
self._buttonPanel.add(self._dleteButton)
self._removeParameterButton = swing.JButton("Remove last parameter", actionPerformed=self.removeParameter)
self._buttonPanel.add(self._removeParameterButton)
self._allResetButton = swing.JButton("All reset", actionPerformed=self.allReset)
self._buttonPanel.add(self._allResetButton)
self._jPanel.add(self._buttonPanel)
# 設定値作成エリア
self._makeValuePanel = swing.JPanel()
self._nameLabel = swing.JLabel("Parameter Name")
self._nameField = swing.JTextField(50)
self._resistorButton = swing.JButton("Add", actionPerformed=self.addValue)
self._makeValuePanel.add(self._nameLabel)
self._makeValuePanel.add(self._nameField)
self._makeValuePanel.add(self._resistorButton)
self._jPanel.add(self._makeValuePanel)
# 値リスト入力エリア
self._jTextOut = swing.JTextArea("Set your value list")
self._jScrollPaneOut = swing.JScrollPane(self._jTextOut)
self._jPanel.add(self._jScrollPaneOut)
callbacks.customizeUiComponent(self._jPanel)
callbacks.customizeUiComponent(self._valueTable)
callbacks.customizeUiComponent(self._buttonPanel)
callbacks.customizeUiComponent(self._makeValuePanel)
# BurpのUIにカスタムタブを追加する
callbacks.addSuiteTab(self)
# HTTP listenerとして登録する
callbacks.registerHttpListener(self)
return
def getTabCaption(self):
return "Parameter Full Changer"
def getUiComponent(self):
return self._jPanel
def processHttpMessage(self, toolFlag, messageIsRequest, currentRequest):
# 何も設定していない場合のみ後続処理を実行する
if 0 == self._tableModel.getRowCount():
return
# Requestの場合のみ後続処理を実行する
if not messageIsRequest:
return
# URL が scope に入っている場合のみ後続処理を実行する
if not self._callbacks.isInScope( currentRequest.getUrl() ):
return
# 置換元のパラメータを取得
parameters = self._helpers.analyzeRequest(currentRequest.getRequest()).getParameters()
row = self._tableModel.getRowCount()
targetrow = -1
for i in range (0, row):
# 既に置換済みのパラメータセットをスキップする
if self._tableModel.getValueAt(i, 1) == "[Done]":
continue
# [Done] ではないセットを見つけたら、行位置を格納してループを抜ける
else:
targetrow = i
break
# [Done] ではないセットが見つからず、targetrow が初期値から変更がない場合のみ後続処理を実行する
if targetrow == -1:
return
used = list() # 使用済みパラメータの index を格納する
replaceDone = False
for parameter in parameters:
# パラメータ名が一致する値を置換
for j in range(2, self._tableModel.getColumnCount()):
# 使用済み index ならスキップする
if j in used:
continue
if self._tableModel.getColumnName(j) == parameter.getName():
replaceVal = self._tableModel.getValueAt(targetrow, j)
try:
newParameter = self._helpers.updateParameter(currentRequest.getRequest(), self._helpers.buildParameter(parameter.getName(), replaceVal, parameter.getType()))
except Exception as e:
print(e)
print(type(e))
print("[Parameter Name]" + parameter.getName())
print("[replace value] " + replaceVal)
print("[Parameter Type]" + parameter.getType())
currentRequest.setRequest(newParameter)
replaceDone = True
# 使用済み index としてリストに追加する
used.append(j)
break
# パラメータ置換を利用したセットのステータスを変更
if replaceDone:
self._tableModel.setValueAt("[Done]", targetrow, 1)
return
# Deleteボタン テーブルの選択した行を削除する
def deleteParam(self, event):
return self._tableModel.removeRow(self._valueTable.getSelectedRow())
# all reset ボタン テーブルを初期化し再作成する
def allReset(self, event):
# 列数をデフォルトの2に設定しなおす
# これで3つ目以降の列が削除される
self._tableModel.setColumnCount(2)
# すべての行を削除する
row = self._tableModel.getRowCount()
for i in range (0, row):
self._tableModel.removeRow(0)
# 再描画
self._valueTable.getTableHeader().resizeAndRepaint();
return
# Addボタン 入力された設定値をテーブルに追加する
def addValue(self, event):
name = self._nameField.getText()
values = self._jTextOut.getText().split("
")
if name != "":
# 設定値テーブルの件数より追加するパラメータリストの件数が多ければ
# 設定値テーブルの内容を調整する
while self._tableModel.getRowCount() < len(values):
seqno = self._tableModel.getRowCount() + 1
self._tableModel.addRow([seqno, "[Not Yet]"])
# 新規パラメータリストを追加
self._tableModel.addColumn(name, values)
return
# 全レコード[Not Yet]更新
def updateToNotYet(self, event):
row = self._tableModel.getRowCount()
for i in range (0, row):
self._tableModel.setValueAt("[Not Yet]", i, 1)
return
# パラメータ削除(列削除)ボタン
def removeParameter(self, event):
# 既にデフォルトの2列だったら削除しない
if self._tableModel.getColumnCount() < 3:
return
# 列数の設定を現状から一つ減らすことで列削除を実現する
self._tableModel.setColumnCount(self._tableModel.getColumnCount() - 1)
return