利用Python编写具有加密和解密功能的Burp插件 (上)
在这篇文章中,我将将为读者介绍如何利用Python语言为Burp创建处理加密插件时所需的相关技巧。在这里,我们将举例说明如何为Burp插件添加一个新的选项卡,用以对应用的通信数据进行加解密处理。这样一来,我们不仅可以在运行中修改payload,还可以使用Repeater选项卡(以及其他选项卡)。实际上,在测试移动和胖客户端应用程序时,我就使用过类似的插件。
相关代码可以从下列地址下载:
https://github.com/parsiya/Parsia-Code/tree/master/python-burp-crypto
Echocrypt
此前,我曾经使用Go语言编写了一个简单的客户端/服务器应用程序。其中,客户端使用的是AES-CFB,以硬编码的密钥/IV对示例文本进行加密。我们知道,AES-CFB可以将AES密码转换为流密码。每隔五秒,密文就被编码为base64形式,并通过localhost:8080端口上的代理,将其发送到POST请求体中规定的服务器。
默认情况下,echo服务器会侦听localhost:9090端口(当然,我们也可以通过serverAddr和serverPort进行相应的修改)。它将尝试对payload执行相应的解码和解密处理。如果解密成功,则服务器将在响应中返回payload,否则,返回错误消息。
其中,main.go可以通过下列地址下载:
https://github.com/parsiya/Parsia-Code/blob/master/python-burp-crypto/echocrypt/main.go
搭建实验环境
本实验是在Windows10虚拟机中进行的。不过,凡是支持Go语言应用程序的平台,都可以顺利完成该实验。
运行Burp,并在localhost:8080端口设置代理侦听器。这里使用的是Burp的默认侦听器。
将过滤器(filter)设置为Show All,这样就可以在Burp Listener选项卡中查看流量数据了。
“Show All”过滤器
将main.go复制GoPath目录,并通过go run main.go运行它。
运行main.go
返回Burp,这时就可以看到流量数据了。
Burp中看到的流量数据
同时,Burp Repeater也能正常使用了。
Burp Repeater中显示的样本请求的响应
模板
这里使用的是一个臭名昭着的Burp示例,下载地址为https://github.com/PortSwigger/example-custom-editor-tab。该插件能够查找含有名为data的参数的请求,并对其进行base64解码,然后显示到一个新选项卡中。本文中,我们将沿用相同的处理方式,同时,还会添加AES加密/解密功能。
为了适应进展程度和插件中使用的技术,我已为该插件和helper模块创建了多个不同的版本。其中,我们将0-decoder作为起点,然后,根据文章内容的进展,逐步升级完善。所有的修改,我都用Parsia:做了标记。
注意:
· 每次修改插件时,可以通过“Loaded”复选框完成相应的卸载和重新加载过程。这样,就不用删除和添加插件了。
· 从其他步骤中切换到该插件时,必须卸载之前的插件。
Base64解码器
下面,让我们从一个修改过的自定义编辑器选项卡开始入手,用它充当我们的模板。它只是对内容部分进行Base64解码,然后将其存储到一个名为Decrypted的新选项卡中。相关的文件,读者可以从0-decoder目录中找到。
library.py
现在,我们先来创建一些helper模块,对于这些模块,我在前一篇名为Python Utility Modules for Burp Extensions的文章中进行了详细的解释。Burp Exceptions会被加载到Burp的“Folder for loading modules”选项指定的文件夹下面(具体参见Extender > Options)。当然,我们也可以将其设置为Jython所在的文件夹。
配置Extender
helper函数的代码虽然很短,却非常有用:
# 0-decoder/library.py
# getInfo processes the request/response and returns info
def getInfo(content, isRequest, helpers):
if isRequest:
return helpers.analyzeRequest(content)
else:
return helpers.analyzeResponse(content)
# getBody returns the body of a request/response
def getBody(content, isRequest, helpers):
info = getInfo(content, isRequest, helpers)
return content[info.getBodyOffset():]
# setBody replaces the body of request/response with newBody and returns the result
# should I check for sizes or does Python automatically increase the array size?
def setBody(newBody, content, isRequest, helpers):
info = getInfo(content, isRequest, helpers)
content[info.getBodyOffset():] = newBody
return content
# decode64 decodes a base64 encoded byte array and returns another byte array
def decode64(encoded, helpers):
return helpers.base64Decode(encoded)
在这篇文章中,我将将为读者介绍如何利用Python语言为Burp创建处理加密插件时所需的相关技巧。在这里,我们将举例说明如何为Burp插件添加一个新的选项卡,用以对应用的通信数据进行加解密处理。这样一来,我们不仅可以在运行中修改payload,还可以使用Repeater选项卡(以及其他选项卡)。实际上,在测试移动和胖客户端应用程序时,我就使用过类似的插件。
相关代码可以从下列地址下载:
https://github.com/parsiya/Parsia-Code/tree/master/python-burp-crypto
Echocrypt
此前,我曾经使用Go语言编写了一个简单的客户端/服务器应用程序。其中,客户端使用的是AES-CFB,以硬编码的密钥/IV对示例文本进行加密。我们知道,AES-CFB可以将AES密码转换为流密码。每隔五秒,密文就被编码为base64形式,并通过localhost:8080端口上的代理,将其发送到POST请求体中规定的服务器。
默认情况下,echo服务器会侦听localhost:9090端口(当然,我们也可以通过serverAddr和serverPort进行相应的修改)。它将尝试对payload执行相应的解码和解密处理。如果解密成功,则服务器将在响应中返回payload,否则,返回错误消息。
其中,main.go可以通过下列地址下载: copyright 无奈人生
https://github.com/parsiya/Parsia-Code/blob/master/python-burp-crypto/echocrypt/main.go
搭建实验环境
本实验是在Windows10虚拟机中进行的。不过,凡是支持Go语言应用程序的平台,都可以顺利完成该实验。
运行Burp,并在localhost:8080端口设置代理侦听器。这里使用的是Burp的默认侦听器。
将过滤器(filter)设置为Show All,这样就可以在Burp Listener选项卡中查看流量数据了。
“Show All”过滤器
将main.go复制GoPath目录,并通过go run main.go运行它。
运行main.go
返回Burp,这时就可以看到流量数据了。
www.wnhack.com
Burp中看到的流量数据
同时,Burp Repeater也能正常使用了。
Burp Repeater中显示的样本请求的响应
模板
这里使用的是一个臭名昭着的Burp示例,下载地址为https://github.com/PortSwigger/example-custom-editor-tab。该插件能够查找含有名为data的参数的请求,并对其进行base64解码,然后显示到一个新选项卡中。本文中,我们将沿用相同的处理方式,同时,还会添加AES加密/解密功能。
为了适应进展程度和插件中使用的技术,我已为该插件和helper模块创建了多个不同的版本。其中,我们将0-decoder作为起点,然后,根据文章内容的进展,逐步升级完善。所有的修改,我都用Parsia:做了标记。
注意:
· 每次修改插件时,可以通过“Loaded”复选框完成相应的卸载和重新加载过程。这样,就不用删除和添加插件了。
· 从其他步骤中切换到该插件时,必须卸载之前的插件。
Base64解码器
下面,让我们从一个修改过的自定义编辑器选项卡开始入手,用它充当我们的模板。它只是对内容部分进行Base64解码,然后将其存储到一个名为Decrypted的新选项卡中。相关的文件,读者可以从0-decoder目录中找到。 copyright 无奈人生
library.py
现在,我们先来创建一些helper模块,对于这些模块,我在前一篇名为Python Utility Modules for Burp Extensions的文章中进行了详细的解释。Burp Exceptions会被加载到Burp的“Folder for loading modules”选项指定的文件夹下面(具体参见Extender > Options)。当然,我们也可以将其设置为Jython所在的文件夹。
配置Extender
helper函数的代码虽然很短,却非常有用:
# 0-decoder/library.py
# getInfo processes the request/response and returns info
def getInfo(content, isRequest, helpers):
if isRequest:
return helpers.analyzeRequest(content)
else:
return helpers.analyzeResponse(content)
# getBody returns the body of a request/response
def getBody(content, isRequest, helpers):
info = getInfo(content, isRequest, helpers)
return content[info.getBodyOffset():]
# setBody replaces the body of request/response with newBody and returns the result
# should I check for sizes or does Python automatically increase the array size?
def setBody(newBody, content, isRequest, helpers):
info = getInfo(content, isRequest, helpers)
content[info.getBodyOffset():] = newBody
return content
# decode64 decodes a base64 encoded byte array and returns another byte array
def decode64(encoded, helpers):
return helpers.base64Decode(encoded)
copyright 无奈人生