最近在公众号发现有小伙伴在使用nodejs调用加密脚本对密码进行加密暴力破解。于是打算给Burp插件jsEncrypter添加nodejs版本的server脚本。目前已经更新该脚本到项目中,感兴趣的小伙伴可以去试试效果。

Node.js版server脚本代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/**
* author: c0ny1
* date: 2018-4-14
* file: nodejs_server.js
*/
var http = require('http');
var querystring = require('querystring');
var host = '127.0.0.1'; //地址
var port = '1664'; //端口
//require('your_encrypte_script.js'); /*引入实现加密的js文件*/
require('./sha384.js');
// 处理函数
function js_encrypt(payload){
var newpayload;
/**********在这里编写调用加密函数进行加密的代码************/
var pwdhash=CryptoJS.SHA384(payload);
newpayload = pwdhash.toString();
/**********************************************************/
return newpayload;
}
var server = http.createServer(function(request,response){
if(request.method === 'POST'){
var postData = '';
request.on('data',function(params){
postData += params;
});
request.on('end',function(){
var dataString = postData.toString();
var dataObj = querystring.parse(dataString);
var payload = dataObj.payload;
var encrypt_payload = js_encrypt(payload);
console.log('[+] ' + payload + ':' + encrypt_payload);
response.statusCode = 200;
response.write(encrypt_payload);
response.end();
});
}else{
response.statusCode = 200;
response.write("^_^\n\rhello jsEncrypter!");
response.end();
}
});
server.listen(port, host, function () {
console.log("[!] ^_^");
console.log("[*] nodejs server start!");
console.log("[+] address: http://"+host+":"+port);
});

nodejs版server脚本使用

nodejs版本的server脚本和phantomjs版本基本一样,不过nodejs版本的使用需要多一个步骤。下面我们搭建起jsEncrypter项目自带的实验环境,并通过演示md5加密传输来说明脚本如何使用。

1.修改调用需要调用的加密脚本

在加密脚本的末尾加入两行代码。代码格式如下:

1
2
global.function = function //将需要调用的函数或对象编程全局
exports.function = function //使用export来暴露接口,不然nodejs无法找到我们的加密方法

我们查看例子中的页面源码,可知前端引入md5.js实现对数据的加密,所以我们把md5.js保存到本地。然后再看看前端调用加密函数的代码是什么?

图1-寻找加密脚本文件

所以我们在md5.js结尾加入这两行代码。

图2-添加代码到加密脚本文件末尾

2.编写调用脚本

在nodejs_server.js中引入加密脚本,并在js_encrypt方法中编写调用加密函数进行加密。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
......
......
......
require('./md5.js'); /*引入实现加密的js文件*/
// 处理函数
function js_encrypt(payload){
var newpayload;
/**********在这里编写调用加密函数进行加密的代码************/
newpayload = hex_md5(payload);
/**********************************************************/
return newpayload;
}
......
......
......

3.执行脚本

1
node nodejs_server.js

图3-加密效果

最后补充一点,测试环境中sha384加密例子有点特殊。sha384前端调用加密函数的代码为

1
en_password = CryptoJS.SHA384(password);

所以在sha384.js结尾应加入这两行代码

1
2
global.CryptoJS = CryptoJS;
exports.CryptoJS = CryptoJS;

而不是

1
2
global.CryptoJS = SHA384;
exports.CryptoJS = SHA384;

总结

nodejs版本的server在使用过程需要修改原加密脚本,比phantomjs版本号稍微繁琐一点。大家看自己的习惯吧,萝卜青菜各有所爱!