18

JS的秘密-登录验证中aes加密的破解方法

 3 years ago
source link: http://mp.weixin.qq.com/s?__biz=Mzg2NTA4OTI5NA%3D%3D&%3Bmid=2247488458&%3Bidx=1&%3Bsn=d626b23b321fe708b03daad954c8327d
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Ifmy2mI.png!mobile

0x00 前言

最近在对某个客户系统进行测试时,偶然发现系统通过AES算法对用户名和密码进行了加密。

众所周知,前端是使用js对用户名和密码进行的加密然后后端再对其进行解密,js就是JavaScript语言,可以说是目前互联网上最流行的脚本语言。js的用途之广也会带了一些问题,js泄露敏感信息,例如后台路径、管理员信息、手机号、邮箱等等。相信很多人在测试过程中碰到登录界面第一反应是爆破,没有加密的还好,如果碰到了AES或者DES加密就很头疼。今天我们的主题就是通过js获取其中的加密算法并且逐渐实现自动化。

0x01 常见的加密方式

1、线性散列算法MD5 SHA1。

2、对称性加密算法 AES DES。

3、非对称性加密算法 RSA。

在加密方式上一般选择前两种的比较多,很少有使用非对称加密,所以我们一般遇到的加密方式为前两种。

0x02 寻找加密算法

在测试过程中,查看源码时其发现加密算法为AES,如下图:

NfeiAva.png!mobile

不单单是知道了其加密算法为AES,还发现了加密用的密码和偏移量,这样我们就可以自己进行加密。

0x03 加密插件

到这里第一想法是用python写个脚本对字典进行加密然后使用burp suite进行爆破,但是就在这个时候我看到了 c0ny1 大佬的加密传输爆破插件jsEncrypter,链接在最下方。

这里小伙伴们可以自行下载编译,然后把插件加载到burp suite中,如下图:

Bv2ARvb.png!mobile

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 加密测试

然后进行测试,效果如下:

byUZzmq.png!mobile

成功进行加密。

当然在爆破的过程中我们还可以采用更有效率方法,在使用phantomjs.exe运行js且确保burp suite和它连接上时,我们可以选择intruder模块中的加密方式为Invoke Burp extension(插件外援),如下图:

ymqINz.png!mobile

0x06 自动化加密

然后进行爆破。如下图:

rYN7nae.png!mobile

最终实现全自动化。

0x07 结语

AES的加密一共有五种模式分别为CBC、ECB、CFB、OFB、CTR,本次js中AES的加密的工作模式为CBC,其他的工作模式也可用相同方式进行解密。如果有小伙伴们遇到类似情况可以去翻一翻JS说不定有意想不到的惊喜,细心点总会有收获。最后文中所有工具和插件都已打包,关注公众号回复“AES”获取下载地址。

0x08 参考链接

https://github.com/c0ny1/jsEncrypter

Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、系统安全、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。

团队作为“省级等保关键技术实验室”先后与哈工大、齐鲁银行、聊城大学、交通学院等多个高校名企建立联合技术实验室,近三年来在网络安全技术方面开展研发项目60余项,获得各类自主知识产权30余项,省市级科技项目立项20余项,研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。对安全感兴趣的小伙伴可以加入或关注我们。

I7nY3ei.jpg!mobile

2Anmqaz.gif!mobile 我知道你 在看

Zv2aU3.gif!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK