欢迎光临
我们一直在努力

JS逆向日志Day03——腾讯企业邮箱

1.目标:逆向分析“腾讯企业邮箱”密码加密 方式并在Pycharm进行复现

2.加密位置分析

先输入账号密码,打开F12,再发送登录请求通过载荷信息可见,账号是我们输入的账号,下面的密码“123456a”被进行了加密。

载荷中密码的key是p,如果我们全局搜索p,会看见大量资源,杂乱不堪,从中找加密位置无异于大海捞针,所以我们尝试搜索encrypt,该单词译为“加密“,是加密位置高频出现的单词,对比发现,我们需要查找的目标数量大幅减少。

接下来依次分析每一处符合要求的资源,判断其是否有赋值操作,是可疑加密位置,在可疑位置全部打上断点,共找到三处可疑位置。

3.逆向过程

1.锁定加密位置

加密逻辑分析:用户访问网站 –> 服务器返回登陆界面+盐值(密钥)–> 用户输入密码 –> 浏览器用密钥加密密码 –> 浏览器带着加密后的密文密码向服务器发请求 –> 服务器用相同密钥解密

接下来重新输入密码123456a,点击登录按钮发送请求,发现代码在此处断住,可以确定此处是加密位置,删除其他断点。

2.调试过程

先对当前加密位置代码进行分析,发现这个加密参数传入了两个参数,一个是我们之前输入的密码,另一个十位纯数字,应该是时间戳。

为了印证这一猜想,我们看能否用时间戳转换工具对时间进行还原,结果还原成功,时间基本吻合,一般十位纯数字是秒级时间戳,十三位纯数字是毫秒级时间戳,在密码中加入时间戳就像加入动态生成的盐值,把他们进行混合加密可以防止重放攻击,增加安全性。

经过加密后的数据,会走进下面的if判断,由它把这个十六进制的加密数据转换成ASCII文本,使用64个可打印字符来表示数据。

3.复现过程

清楚了加密的基本逻辑,现在开始抠代码补环境,从最终被加密的密码处可知,刚才的if判断对我们的加密结果做了Base64编码,末尾的等号就是Base64编码最明显的特征,所以我们抠代码时不必复制if判断,直接对Res这个加密结果进行Base64编码转换即可。

将加密位置的代码块复制到Node.js环境中并写进函数封装方便调用,并简化一些不必要的操作。

将公钥和RSA对象的定义方法复制过来,并调用函数传入密码和时间戳。

由于时间戳我们可以用python动态生成并将其当参数传入,这里就不再复制时间戳的定义方法。

此时我们需要验证这个公钥是静态还是动态,会不会随机生成。刷新页面,再次查看公钥,可以看出两次公钥完全相同,无需动态获取公钥。

接下来往下溯源encrypt方法和hex2b64(这是一种常见的命名习惯,2是to的谐音,hex是十六进制的英文的前三个字母,表示16进制转Base64编码)方法,发现它们都被定义在一处文件,且和其依赖方法均在同一文件,因此猜测加密方法被单独定义在了一个文件,没有相互导入,可以直接复制整个文件。

注:从第三张图也可看出,此网站采用了PKCS#1 v1.5标准进行padding随机填充,中间会插入随机数跟随我们的参数一起进行加密,这也是为什么我们传入相同参数,每次运行结果却都不相同的原因。

复制整个文件后运行,加密并转换成功,且每次运行结果不同。

赞(0)
未经允许不得转载:171主机测评 » JS逆向日志Day03——腾讯企业邮箱
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址