渗透测试之AES加密参数与踩坑记录

admin 2024年7月19日00:30:31评论40 views字数 3469阅读11分33秒阅读模式

文章正文

介绍:又一次公司的测内网系统项目的出现了流量加密,于是进行前端调试 js 逆向后对其流量反解密进行渗透(一次简单记录分享,大佬勿喷)

登录系统后,查看了历史数据包,基本上都是/api/xxx/xxx?params=加密数据这样的接口,所以就怀疑系统对流量做了加密,于是在前端调试开始找加密代码

渗透测试之AES加密参数与踩坑记录
# 其中一个数据包展示
GET /api/foidisplay/mzhyxyhhxjbxx/getBqCountBy?params=%2BkrOw%2Fizxq2qXvIYnwWiEoShthvEcp%2F%2Brera6frw9lbc9k8B4aEDqui9BIDQLuR5I3zAOCIaIykTiQmZxaGjXA%3D%3D HTTP/1.1
Host: target.com
Authorization: Bearer 7c28172e-e9a9-404d-899a-e5b720f3a90e

首先F12在下图处(当时的图找不到了)添加一个接口为断点,当系统访问到这个接口时就会触发断点,这时我们就可以开始进行断点调试开始找加密代码

渗透测试之AES加密参数与踩坑记录


还有 2 种方法是:
1、找加密关键字,如加密参数为params这个参数,但是搜索出来很多,一个个排查太多了不现实。
2、直接搜索加密关键字encrypt,也可以搜索出来 js 加密代码。
这次比较幸运直接搜关键字encrypt就直接搜索了出来,知道了是使用了 AES 加密,但是这时还不知道使用的keyiv是哪个,于是在此加密代码下添加断点。断到这段代码后,e 是明文参数,n 是密钥,c 是 iv。
这里的keyiv就是取数据包中的Authorization参数后 16 位字符串对明文进行加密。

渗透测试之AES加密参数与踩坑记录
# 使用AES加密,通过传入的参数 e(待加密数据),n(密钥),c(初始化向量)来实现加密过程,模式为 CBC,填充方式为 ZeroPadding,最后将加密后的结果以 Base64 编码返回。
function w(e, n, c){
var t = g, a = y;
  n &&(t = v.enc.Utf8.parse(n),
        a = v.enc.Utf8.parse(c));
var u = v.enc.Utf8.parse(e)
, r = v.AES.encrypt(u, t,{
      iv: a,
      mode: v.mode.CBC,
      padding: v.pad.ZeroPadding
});
return v.enc.Base64.stringify(r.ciphertext)

知道了用得何种加密后,我们就能开始使用 python 或者其他的语言来进行模拟加密,笔者喜欢用 python,上代码

from Crypto.Cipherimport AES
import base64,json
from urllib.parse import unquote,quote,urlencode

# 0填充
def zero_pad(data, block_size):
# 计算需要填充的字节数
padding_length =(block_size - len(data)% block_size)% block_size
# 使用零字节填充
return data + b'�'* padding_length

# 加密
def encrypt(data, key, iv):
cipher = AES.new(key.encode(), AES.MODE_CBC, iv.encode())
padded_message = zero_pad(data.encode(), AES.block_size)
ciphertext = cipher.encrypt(padded_message)
return base64.b64encode(ciphertext).decode('utf-8')

# 移除填充
def zero_unpad(data):
last_nonzero_byte = len(data)-1
while last_nonzero_byte >=0and data[last_nonzero_byte]==0:
last_nonzero_byte -=1
# 截取去除填充的数据
return data[:last_nonzero_byte +1]

# 解密
def decrypt(data, key, iv):
cipher = AES.new(key.encode(), AES.MODE_CBC, iv.encode())
decrypted_text = cipher.decrypt(base64.decodebytes(data.encode()))
return zero_unpad(decrypted_text).decode('utf-8')

if __name__ =='__main__':
Authorization="Bearer 580ea5db-2205-4f13-b17f-17740feb4513"
key = iv =Authorization[-16:]
while1:
params= unquote(input("输入加密的params值:"))
data = decrypt(params,key,iv)
print("明文params:"+ decrypt(params,key,iv))
data = json.loads(data)
print(urlencode(data))
json = input("输入明文:")
print("密文params:"+ quote(encrypt(json,key,iv)))
# %2BkrOw%2Fizxq2qXvIYnwWiEoShthvEcp%2F%2Brera6frw9lbc9k8B4aEDqui9BIDQLuR5I3zAOCIaIykTiQmZxaGjXA%3D%3D
# {"bqmc":"","bqtx":"","sfqy":"","currentPage":1,"pageSize":9}

渗透测试之AES加密参数与踩坑记录


通过对比抓包得到的加密字符串,发现是一致的,那么就可以确定了该加解密脚本是正常的,就可以开始利用此脚本进行辅助渗透了。
附上最后的成果,用 sqlmap 找到了一个高危 sql 注入。

渗透测试之AES加密参数与踩坑记录

踩坑记录

记录一

刚知道了是使用 AES 加密后,开心的去找 gpt 一顿输出来一个 python 加解密脚本,上面是系统生成的密文,下面是笔者用 python 脚本模拟生成的密文,可以发现在后面的一小段部分是不一样的。

渗透测试之AES加密参数与踩坑记录


于是又再一次去断点调试看看是不是系统进行了别的操作。分析过后并未发现改变的有哪一种操作。

渗透测试之AES加密参数与踩坑记录


然后去询问大佬,看看是哪一步出错了,把 2 个生成的密文发了给他,得出的结论是 2 个密文 AES 加密使用的填充方法不一样
系统密文使用的是 Zero Padding 填充,python 脚本使用的是 PKCS#5 / PKCS#7 填充,因此可以断定是 padding 的问题,导致加密后的密文不一致。

  1. 1. PKCS#5 / PKCS#7 填充:
    这是最常见的填充方式,它在最后一个块需要填充时,将填充的字节都设置为填充的字节数。例如,如果需要填充 4 个字节,则填充的字节都为 4(即 x04x04x04x04)。
  2. 2. Zero Padding 填充:
    这种方式是在最后一个块的末尾添加零字节,直到块的长度达到块大小(通常是 16 字节)。

    渗透测试之AES加密参数与踩坑记录

     

    渗透测试之AES加密参数与踩坑记录
        # 经过百度后是padding的问题,填充方式python默认的不是zeropadding,加一部分就OK了
    def zero_pad(data, block_size):
     # 计算需要填充的字节数
     padding_length = (block_size - len(data) % block_size) % block_size
    # 使用零字节填充
       return data + b'�' * padding_length

记录二

在上面添加的 XHR 断点调试后,经过了一段时间调试前端代码,但还是找不到加密代码出来,废了不少时间,后来直接搜索 encrypt 后直接就搜索出来了,但是有几段的加密代码,经过添加断点才确定了。

渗透测试之AES加密参数与踩坑记录


前端调试总结:
1、先全局搜索加密关键字,如本次的 params 参数
2、全局搜索 encrypt/decrypt,幸运的话可以一步找出来
3、添加 XHR 断点,一步步进行前端调试寻找代码(比较慢,但也是最稳的办法)

 

 

原文始发于微信公众号(Z2O安全攻防):渗透测试之AES加密参数与踩坑记录

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月19日00:30:31
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   渗透测试之AES加密参数与踩坑记录https://cn-sec.com/archives/2971868.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息