Skip to content

Commit a9592cf

Browse files
committed
Initial.
0 parents  commit a9592cf

4 files changed

Lines changed: 108 additions & 0 deletions

File tree

BappDescription.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<p>This extension allows execution of a custom Python script on each HTTP
2+
request and response processed by Burp.</p>
3+
<p>To use, type or paste a Python script into the &quot;Script&quot; tab, and use Burp in
4+
the normal way. The script will be executed for each HTTP request and response.
5+
The following variables are defined in the context of the script:</p>
6+
<ul>
7+
<li>extender</li>
8+
<li>callbacks</li>
9+
<li>helpers</li>
10+
<li>toolFlag</li>
11+
<li>messageIsRequest</li>
12+
<li>messageInfo</li>
13+
</ul>

BappManifest.bmf

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Uuid: eb563ada801346e6bdb7a7d7c5c52583
2+
ExtensionType: 2
3+
Name: Python Scripter
4+
ScreenVersion: 1.0
5+
SerialVersion: 1
6+
MinPlatformVersion: 0
7+
ProOnly: False
8+
Author: Marcin Wielgoszewski
9+
ShortDescription: Allows execution of a custom Python script on each HTTP request and response.
10+
EntryPoint: burpscript.py

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Sourced from gist: https://gist.github.com/mwielgoszewski/7026954

burpscript.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
from java.awt import Font
2+
from javax.swing import JScrollPane, JTextPane
3+
from javax.swing.text import SimpleAttributeSet
4+
5+
from burp import IBurpExtender, IExtensionStateListener, IHttpListener, ITab
6+
7+
import base64
8+
import traceback
9+
10+
11+
class BurpExtender(IBurpExtender, IExtensionStateListener, IHttpListener, ITab):
12+
def registerExtenderCallbacks(self, callbacks):
13+
self.callbacks = callbacks
14+
self.helpers = callbacks.helpers
15+
16+
self.scriptpane = JTextPane()
17+
self.scriptpane.setFont(Font('Monospaced', Font.PLAIN, 11))
18+
19+
self.scrollpane = JScrollPane()
20+
self.scrollpane.setViewportView(self.scriptpane)
21+
22+
self._code = compile('', '<string>', 'exec')
23+
self._script = ''
24+
25+
script = callbacks.loadExtensionSetting('script')
26+
27+
if script:
28+
script = base64.b64decode(script)
29+
30+
self.scriptpane.document.insertString(
31+
self.scriptpane.document.length,
32+
script,
33+
SimpleAttributeSet())
34+
35+
self._script = script
36+
self._code = compile(script, '<string>', 'exec')
37+
38+
callbacks.registerExtensionStateListener(self)
39+
callbacks.registerHttpListener(self)
40+
callbacks.customizeUiComponent(self.getUiComponent())
41+
callbacks.addSuiteTab(self)
42+
43+
self.scriptpane.requestFocus()
44+
45+
def extensionUnloaded(self):
46+
try:
47+
self.callbacks.saveExtensionSetting(
48+
'script', base64.b64encode(self._script))
49+
except Exception:
50+
traceback.print_exc(file=self.callbacks.getStderr())
51+
return
52+
53+
def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
54+
try:
55+
globals_ = {}
56+
locals_ = {'extender': self,
57+
'callbacks': self.callbacks,
58+
'helpers': self.helpers,
59+
'toolFlag': toolFlag,
60+
'messageIsRequest': messageIsRequest,
61+
'messageInfo': messageInfo
62+
}
63+
exec(self.script, globals_, locals_)
64+
except Exception:
65+
traceback.print_exc(file=self.callbacks.getStderr())
66+
return
67+
68+
def getTabCaption(self):
69+
return 'Script'
70+
71+
def getUiComponent(self):
72+
return self.scrollpane
73+
74+
@property
75+
def script(self):
76+
end = self.scriptpane.document.length
77+
_script = self.scriptpane.document.getText(0, end)
78+
79+
if _script == self._script:
80+
return self._code
81+
82+
self._script = _script
83+
self._code = compile(_script, '<string>', 'exec')
84+
return self._code

0 commit comments

Comments
 (0)