Created
July 16, 2020 09:28
-
-
Save vincd/7c3d4f03e1d7a9e774aaa52e0021fdb2 to your computer and use it in GitHub Desktop.
Burp plugin to edit zlib messages
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from burp import IBurpExtender | |
| from burp import IMessageEditorTabFactory | |
| from burp import IMessageEditorTab | |
| from burp import IParameter | |
| from burp import IHttpRequestResponse | |
| import java.io | |
| import java.util.zip | |
| import org.python.util | |
| import sys | |
| import pprint | |
| import zlib | |
| import java.io.ByteArrayOutputStream | |
| import java.io.ByteArrayInputStream | |
| import java.io.ObjectInputStream | |
| import java.io.ObjectOutput | |
| import java.io.ObjectOutputStream | |
| import org.python.util.PythonObjectInputStream | |
| import java.lang.RuntimeException | |
| # import external Jars | |
| from os import listdir | |
| from os.path import join | |
| # extends_jars = lambda path: [join(path, jar) for jar in listdir(path) if jar.endswith(".jar")] | |
| # sys.path.extend(extends_jars(sys.path[-1])) | |
| # import com.thoughtworks.xstream.XStream | |
| # import com.thoughtworks.xstream.io.xml.DomDriver | |
| class BurpExtender(IBurpExtender, IMessageEditorTabFactory): | |
| # | |
| # implement IBurpExtender | |
| # | |
| def registerExtenderCallbacks(self, callbacks): | |
| # keep a reference to our callbacks object | |
| self._callbacks = callbacks | |
| # obtain an extension helpers object | |
| self._helpers = callbacks.getHelpers() | |
| # set our extension name | |
| callbacks.setExtensionName("Zlib editor") | |
| # register ourselves as a message editor tab factory | |
| callbacks.registerMessageEditorTabFactory(self) | |
| return | |
| # | |
| # implement IMessageEditorTabFactory | |
| # | |
| def createNewInstance(self, controller, editable): | |
| # create a new instance of our custom editor tab | |
| return ZlibInputTab(self, controller, editable) | |
| # | |
| # class implementing IMessageEditorTab | |
| # | |
| class ZlibInputTab(IMessageEditorTab): | |
| def __init__(self, extender, controller, editable): | |
| self._extender = extender | |
| self._editable = editable | |
| # create an instance of Burp's text editor, to display our deserialized data | |
| self._txtInput = extender._callbacks.createTextEditor() | |
| self._txtInput.setEditable(False) | |
| return | |
| # | |
| # implement IMessageEditorTab | |
| # | |
| def getTabCaption(self): | |
| return "Zlib editor" | |
| def getUiComponent(self): | |
| return self._txtInput.getComponent() | |
| def isEnabled(self, content, isRequest): | |
| # enable this tab for requests containing a data parameter | |
| return True | |
| def setMessage(self, content, isRequest): | |
| #print "SET MESSAGE" | |
| if (content is None): | |
| print "content none" | |
| # clear our display | |
| self._txtInput.setText(None) | |
| self._txtInput.setEditable(False) | |
| else: | |
| # retrieve the data parameter | |
| requestinfo = self._extender._helpers.analyzeRequest(content) | |
| bodyoffset = requestinfo.getBodyOffset() | |
| payload_serialized_deflate = content[bodyoffset:] | |
| payload_serialized_inflate = zlib.decompress(payload_serialized_deflate) | |
| # deserialize the parameter value | |
| self._txtInput.setText(payload_serialized_inflate) | |
| self._txtInput.setEditable(True) | |
| # remember the displayed content | |
| self._currentMessage = content | |
| return | |
| def getMessage(self): | |
| #print "GET MESSAGE" | |
| # determine whether the user modified the deserialized data | |
| if (self._txtInput.isTextModified()): | |
| # reserialize the data | |
| text = self._txtInput.getText() | |
| payload_serialized_deflate = zlib.compress(text) | |
| content = self._currentMessage | |
| requestinfo = self._extender._helpers.analyzeRequest(content) | |
| bodyoffset = requestinfo.getBodyOffset() | |
| r = self._extender._helpers.analyzeRequest(self._currentMessage) | |
| return self._extender._helpers.buildHttpMessage(r.getHeaders(), payload_serialized_deflate) | |
| else: | |
| return self._currentMessage | |
| def isModified(self): | |
| return self._txtInput.isTextModified() | |
| def getSelectedData(self): | |
| return self._txtInput.getSelectedText() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment