开局一个框,用户名密码一通瞎填,抓包一看,请求包和响应包全是加密文本。换几处功能点接着测也是加密内容,如下图所示。



就这?能难住俺们安服仔?安服仔们一般都是万金油,啥都会一点。
这一般需要在前端调试,跟一遍流程,寻找它的加密和解密逻辑,所以还是要需要一点点不入流的js逆向技能滴。
F12 打开 Chrome 开发者工具,看一下网络请求的情况。下面是可以看到 login 时的载荷是加密字段,盲猜应该是 AES 。


分析login 时的加密是怎么形成的,一般有两种下断点方式,一是点击启动器,点进第一个发起程序,下断点。二是添加XHR断点,在这里可以直接添加 login 字段,当浏览器发起请求时如果匹配到URL中有login这个字段,就会在这里断下来。
下好断点拦截到请求后,就需要观察和跟进它的函数调用堆栈,在它的调用堆栈中找到一个临界点,即经过某个函数或某几个函数,明文变成密文(密文变成明文),那么我们需要找点加密解密点,应该就在此中间。寻找的过程需要不断观察和下断点取消断点,循环往复,直到缩小范围。
断点


除了不断下断点一步步跟踪代码执行逻辑的这种方式外,也可以直接搜索关键词,比如:encrypt、decrypt、hexdigest 等等。



在一波搜索和不断调试后,终于找到加密和解密的逻辑了。这个站点加解密逻辑很low,只用上了AES对称加密,而且密钥还是固定的。
它的逻辑是:正常明文数据包经过AES加密(密钥固定)后发送。收到密文的响应包进行AES解密,再将解密后的数据交给相关 js 进行处理。

上图定位到了他加密函数的位置,使用的是 AES CBC模式,PKCS7 填充方式,密钥key是:1234567890adbcde , 偏移量iv是:1234567890hjlkew,去到AES在线加密网站测试抓到的明文是否能正常加密解密。非常nice,一发即中



经过对比,确认了上述的分析是正确的。但是在渗透测试中,需要频繁的抓包改包,与之相应的就需要不断对payload和测试数据包进行加密解密,如果纯手工加解密,不得累瘫了。
下面介绍一个俺们团队老大写的burpsuite插件burpy,专门用来高效处理Web站点流量加解密。
项目地址:
https://github.com/mr-m0nst3r/Burpy
详细的使用说明请看项目readme 和大佬博客:
https://m0nst3r.me/pentest/%E9%AB%98%E6%95%88%E5%A4%84%E7%90%86H5%E7%AB%99%E7%82%B9%E6%B5%81%E9%87%8F%E5%8A%A0%E8%A7%A3%E5%AF%86.html``
在Releases页面下好burpy插件的jar包,并安装。安装就不多说了吧,有手就行咯。

编写burpy python脚本需要一个叫 Burpy 的类,在类中,一般要实现encrypt、decrypt这两个函数。burpy 正常加载burpy脚本后,会把他俩注册到 Extensions 中

下面是针对此站点编写的burpy脚本,具体逻辑很看python代码。
from Crypto.Cipher import AES
import base64
# 密钥(key), 密斯偏移量(iv) CBC模式加密
BLOCK_SIZE = 16 # Bytes
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \
chr(BLOCK_SIZE - len(s) % BLOCK_SIZE)
unpad = lambda s: s[:-ord(s[len(s) - 1:])]
vi = '1234567890hjlkew'
key = '1234567890adbcde'
class Burpy:
def __init__(self):
self.body = None
def decrypt(self, header, body):
# 处理响应包
if body.startswith("\""):
self.body = body.split("\"")[1]
try:
decrypt_result = AES_Decrypt(self.body)
except Exception as e:
decrypt_result = "解密失败!请排查"
return header, decrypt_result
# 处理请求包
else:
try:
decrypt_result = AES_Decrypt(body)
except Exception as e:
decrypt_result = "解密失败!请排查"
return header, decrypt_result
def encrypt(self, header, body):
encrypt_result = AES_Encrypt(body)
return header, encrypt_result
def AES_Encrypt(data):
data = pad(data)
# 字符串补位
cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8'))
encryptedbytes = cipher.encrypt(data.encode('utf8'))
# 加密后得到的是bytes类型的数据,使用Base64进行编码,返回byte字符串
encodestrs = base64.b64encode(encryptedbytes)
# 对byte字符串按utf-8进行解码,并返回
return encodestrs.decode('utf8')
def AES_Decrypt(data):
data = data.encode('utf8')
encodebytes = base64.decodebytes(data)
# 将加密数据转换位bytes类型数据
cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8'))
text_decrypted = cipher.decrypt(encodebytes)
# 去补位
text_decrypted = unpad(text_decrypted)
text_decrypted = text_decrypted.decode('utf8')
return text_decrypted
if __name__ == '__main__':
test = Burpy()
header = "123"
body = "0aux2+M61DiN0AdGyZHHJK++KM80JGxIUkWzZEqeQ1vBjwNlysToUObFBmEgqZIG9ctczczJratDObvp1JrQR+69CU92y9UXEW3VfC+oLRUfstUivu7kSqSBYDr5+JUNP7AEOU6lcZehj+uOV6tdT9SADnQnBOlTB2qn592xv78="
a, b = test.decrypt(header, body)
print(a)
print(b)
使用效果
原始数据包样子

使用 burpy 进行加密解密

进过这一番折腾后,加密变成了明文,接下来的渗透测试就是如履平地、一马平川哈哈哈。
网络安全学习资源分享:
给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,请看下方扫描即可前往获取




被折叠的 条评论
为什么被折叠?



