Skip to content

Instantly share code, notes, and snippets.

@vincd
Created July 16, 2020 09:28
Show Gist options
  • Select an option

  • Save vincd/7c3d4f03e1d7a9e774aaa52e0021fdb2 to your computer and use it in GitHub Desktop.

Select an option

Save vincd/7c3d4f03e1d7a9e774aaa52e0021fdb2 to your computer and use it in GitHub Desktop.
Burp plugin to edit zlib messages
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