记录学习前端JS逆向算法。
遇到一个网站,使用了webpack
输入账号密码后,发现密码被加密了。
此时尝试定位该加密算法,并正向爆破。
当前登录的请求接口是/prod-api/auth/login
此时全局搜索该接口
成功找到该接口文件
打开该js文件,通过分析js函数,可知2727行
的r函数
作用是登录请求,2719行
的o函数
作用是加密。
此时设置断点,观察数值变化
r
函数中的t
是用户名admin
,e
是明文密码123456
。
此时下一步
密码e
通过2728行
的函数调用,传递到了加密函数o
。
加密函数o
中,t
是明文密码,e
是密钥,密钥是2021123456789012
加密后123456
的密文是wzGWkli7/KSZszgljZhEng==
通过分析发现,此处的加解密算法的对象名是a
,通过调用对象a
下的属性,实现的加密。
将这段加密的函数,复制到我们的js文件中
此时尝试去找到a
在哪声明的。
通过分析,发现a
在2717行
被声明
并且对象a
的值,是由s
调用了n
中的3452
模块。
此时我们要找到n
,看n
是在哪出现的,我们并把它给拿出来。
因此设置断点直接跟过去。
此时找到了n
的声明。
我们将这段声明n
函数的代码复制到js文件中,即把分发器复制到js代码中。
并在外部声明一个用于接收分发器值的变量
通过定位追踪
我们将o
值,赋值给用户接收分发器函数返回值的变量。
即在分发器代码的末尾处进行赋值。
此时分发器确定了,这个时候要找分发器调用了哪些webpack的模块。
通过前面的分析可知,分发器调用的第一个webpack的模块是3452
。
此时全局搜索3452
是在哪个js文件下。
此时找到了3452
模块,而3452
模块又调用了大量的其他模块,因此我们要一一定位。
通过分析后发现,所有的模块和3452
模块都是处于同一个js文件中的。
此时创建一个modules.js
文件,用于管理这些模块。
将该存放模块的js代码,全部复制粘贴到本地的modules.js
文件中。
并设置全局变量进行调用
即var window = global;
并在encrypt.js
文件中导入该模块js文件。
并调用加密函数,查看加密结果。
执行代码后,报错,提示n
未被定义。
报错的原因是因为,此时分发器的模块调用的结果,并未赋值给n
,而是我最开始设置的变量flag
,此flag
接收了分发器的返回结果。因此我们要把n
改成flag
。
修改后,再次运行
123456
在本地加密的结果和在前端加密的结果值是一样的。
![test][link26]
此时尝试重复并多次加密明文。
使用nodejs
,按行读写passwords.txt
并将密码的密文并输出到encrypt_passwors.txt
中。
1 | const readline = require('readline'); |
实际上此处的加解密就是一个AES算法ECB模式的加解密。
用python很容易就能实现加解密。
但是我主要是想通过模块化的方式的调用,来实现加解密。
1 | import base64 |
尝试去使用webpack的模块解密aes的加密密文,找了半天也没找到调用了哪些webpack的模块,因此解密失败了,太fw了。