|
0x00 前言
最近在对某个客户系统进行测试时,偶然发现系统通过AES算法对用户名和密码进行了加密。
众所周知,前端是使用js对用户名和密码进行的加密然后后端再对其进行解密,js就是JavaScript语言,可以说是目前互联网上最流行的脚本语言。js的用途之广也会带了一些问题,js泄露敏感信息,例如后台路径、管理员信息、手机号、邮箱等等。相信很多人在测试过程中碰到登录界面第一反应是爆破,没有加密的还好,如果碰到了AES或者DES加密就很头疼。今天我们的主题就是通过js获取其中的加密算法并且逐渐实现自动化。
0x01 常见的加密方式
1、线性散列算法MD5 SHA1。
2、对称性加密算法 AES DES。
3、非对称性加密算法 RSA。
在加密方式上一般选择前两种的比较多,很少有使用非对称加密,所以我们一般遇到的加密方式为前两种。
0x02 寻找加密算法
在测试过程中,查看源码时其发现加密算法为AES,如下图:
不单单是知道了其加密算法为AES,还发现了加密用的密码和偏移量,这样我们就可以自己进行加密。
0x03 加密插件
到这里第一想法是用python写个脚本对字典进行加密然后使用burp suite进行爆破,但是就在这个时候我看到了 c0ny1 大佬的加密传输爆破插件jsEncrypter,链接在最下方。
这里小伙伴们可以自行下载编译,然后把插件加载到burp suite中,如下图:
0x04 增加AES
这里加载成功后,使用phantomjs.exe运行然后连接就可实现快速加密,但是美中不足的是c0ny1 大佬并没有写AES的加密算法所以这里需要自己动手进行操作,这里c0ny1 大佬给了我们一个固定的模板
- /**
- * author: c0ny1
- * date: 2017-12-16
- * last update: 2020-03-03
- */
- var fs = require('fs');
- var webserver = require('webserver');
- server = webserver.create();
- var logfile = 'jsEncrypter.log';
- var host = '127.0.0.1';
- var port = '1664';
- /* 1.在这引入实现加密所有js文件,注意引入顺序和网页一致 */
- //var wasSuccessful = phantom.injectJs('crypto-js.js');/* 引入实现加密的js文件*/
- // loadScript("script-2.js");
- // loadScript("script-n.js");
- /**********************************************/
- function loadScript(scriptName) {
- var isSuccess = phantom.injectJs(scriptName);
- if(isSuccess){
- console.log("[*] load " + scriptName + " successful")
- }else{
- console.log("[!] load " + scriptName + " fail")
- console.log("[*] phantomjs server exit");
- phantom.exit();
- }
- }
- // var key = CryptoJS.enc.Utf8.parse("PBLUREBUWNXCXHRQ"); //16位
- // var iv = CryptoJS.enc.Utf8.parse("1234567812345678");
- function jsEncrypt(burp_payload){
- var new_payload;
- /* 2.在这里编写调用加密函数进行加密的代码,并把结果赋值给new_payload */
- // 编辑 加密函数的位置
- /*********************************************************/
- return new_payload;
- }
复制代码 这里展示一小部分
其中主要的内容在于加密函数的代码,和引入加密的js文件。而且我们上面在js文件中找到了AES的密码和偏移量所以我们可以直接进行修改
- var wasSuccessful = phantom.injectJs('crypto-js.js');
复制代码 引用的加密文件这里是通用的(从sha512加密的文件中借用一下"crypto-js.js")。
- function jsEncrypt(burp_payload){`
- `var new_payload;`
- `/* 2.在这里编写调用加密函数进行加密的代码,并把结果赋值给new_payload */`
- `// 编辑 加密函数的位置`
- `const key = CryptoJS.enc.Utf8.parse("ihaierForTodoKey"); //16位`
- `const iv = CryptoJS.enc.Utf8.parse("ihaierForTodo_Iv");`
- `const srcs = CryptoJS.enc.Utf8.parse(burp_payload);`
- `encrypted = CryptoJS.AES.encrypt(srcs, key, {`
- `iv: iv,`
- `mode: CryptoJS.mode.CBC,`
- `padding: CryptoJS.pad.Pkcs7`
- `});`
- new_payload =decodeURIComponent(CryptoJS.enc.Base64.stringify(encrypted.ciphertext));
- /*********************************************************/
- return new_payload;
- `}`
复制代码 这里多加了base64加密,需要hex的话可以去掉base64。
当然其他的加密算法通用,如下:
base 64:
- var wasSuccessful = phantom.injectJs('base64.js');/*引入实现加密的js文件*/
- // 处理函数
- function js_encrypt(payload){
- var newpayload;
- /**********在这里编写调用加密函数进行加密的代码************/
- var b = new Base64();
- newpayload = b.encode(payload);
- /**********************************************************/
- return newpayload;
- }
复制代码 DES:
- var wasSuccessful = phantom.injectJs('des.js');/*引入实现加密的js文件*/
- // 处理函数
- function js_encrypt(payload){
- var newpayload;
- /**********在这里编写调用加密函数进行加密的代码************/
- //var b = new Base64();
- newpayload = strEnc(payload,"key","para0","para1");
- /**********************************************************/
- return newpayload;
- }
复制代码 sha512:
- var wasSuccessful = phantom.injectJs('crypto-js.js');/*引入实现加密的js文件*/
- // 处理函数
- function js_encrypt(payload){
- var newpayload;
- /**********在这里编写调用加密函数进行加密的代码************/
- newpayload = CryptoJS.SHA512(payload);
- /**********************************************************/
- return newpayload;
- }
复制代码 0x05 加密测试
然后进行测试,效果如下:
成功进行加密。
当然在爆破的过程中我们还可以采用更有效率方法,在使用phantomjs.exe运行js且确保burp suite和它连接上时,我们可以选择intruder模块中的加密方式为Invoke Burp extension(插件外援),如下图:
0x06 自动化加密
然后进行爆破。如下图:
最终实现全自动化。
0x07 结语
AES的加密一共有五种模式分别为CBC、ECB、CFB、OFB、CTR,本次js中AES的加密的工作模式为CBC,其他的工作模式也可用相同方式进行解密。如果有小伙伴们遇到类似情况可以去翻一翻JS说不定有意想不到的惊喜,细心点总会有收获。最后文中所有工具和插件都已打包,关注公众号回复“AES”获取下载地址。
0x08 参考链接
https://github.com/c0ny1/jsEncrypter
|
|