从加密分析到登录验证码爆破
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
从加密分析到登录验证码爆破
前言
在项目中遇到的比较有意思的渗透,同时也算是最简单的一种加密,写出来分享一下
正文
在登录框对抗中,抓包发现参数都进行了加密,首先想到的当然是全局搜加密参数,然后找具体的加密算法,去进行逆向调试
但是可以看到,流量包中进行了全流量加密,也就是说你无法去判断他具体传了哪些参数,不过我们可以全局搜关键词,如encrypt等,来确定他整个系统底层所用的加密逻辑
具体的加密算法如下:
function i(e) {
if ("" === e)
return e;
var t = a.enc.Utf8.parse(e)
, n = a.AES.encrypt(t, a.enc.Utf8.parse("19RMSFORECAST123"), {
mode: a.mode.ECB,
padding: a.pad.Pkcs7
});
return n.ciphertext.toString()
}
function s(e) {
var t = a.enc.Utf8.parse(a.MD5("jQaTs$K6Vnb9#nNp").toString())
, n = a.enc.Utf8.parse(a.MD5("QIBlGu3dwO#7geJm").toString().substr(0, 16));
if ("" === e)
return e;
var i = a.enc.Utf8.parse(e)
, s = a.AES.encrypt(i, t, {
iv: n,
mode: a.mode.CBC,
padding: a.pad.Pkcs7
});
return s.ciphertext.toString().toUpperCase()
}
}
分析代码可知该系统的前端加密算法是Aes-ECB和Aes-CBC加密,且将初始偏移量和密钥硬编码
Aes-ECB:密钥硬编码为 "19RMSFORECAST123",并通过Utf8.parse 转换为 WordArray 对象
Aes-CBC:密钥:由"jQaTs$K6Vnb9#nNp" 的MD5哈希值生成。
IV由"QIBlGu3dwO#7geJm"的 MD5 哈希值生成,并截取前 16 字节
然后根据加密算法编写加解密脚本:
const CryptoJS = require("crypto-js");
// 加密函数(ECB 模式)
function encryptECB(plaintext) {
if (!plaintext) return plaintext;
var key = CryptoJS.enc.Utf8.parse("19RMSFORECAST123");
var encrypted = CryptoJS.AES.encrypt(
CryptoJS.enc.Utf8.parse(plaintext),
key,
{
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}
);
return encrypted.ciphertext.toString(); // 返回十六进制密文
}
// 解密函数(ECB 模式)
function decryptECB(ciphertext) {
if (!ciphertext) return ciphertext;
var key = CryptoJS.enc.Utf8.parse("19RMSFORECAST123");
var decrypted = CryptoJS.AES.decrypt(
{ ciphertext: CryptoJS.enc.Hex.parse(ciphertext) },
key,
{
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}
);
return decrypted.toString(CryptoJS.enc.Utf8); // 返回解密后的明文
}
// 加密函数(CBC 模式)
function encryptCBC(plaintext) {
if (!plaintext) return plaintext;
var key = CryptoJS.enc.Utf8.parse(
CryptoJS.MD5("jQaTs$K6Vnb9#nNp").toString()
);
var iv = CryptoJS.enc.Utf8.parse(
CryptoJS.MD5("QIBlGu3dwO#7geJm").toString().substr(0, 16)
);
var encrypted = CryptoJS.AES.encrypt(
CryptoJS.enc.Utf8.parse(plaintext),
key,
{
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);
return encrypted.ciphertext.toString().toUpperCase();
}
// 解密函数(CBC 模式)
function decryptCBC(ciphertext) {
if (!ciphertext) return ciphertext;
var key = CryptoJS.enc.Utf8.parse(
CryptoJS.MD5("jQaTs$K6Vnb9#nNp").toString()
);
var iv = CryptoJS.enc.Utf8.parse(
CryptoJS.MD5("QIBlGu3dwO#7geJm").toString().substr(0, 16)
);
var decrypted = CryptoJS.AES.decrypt(
{ ciphertext: CryptoJS.enc.Hex.parse(ciphertext) },
key,
{
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);
return decrypted.toString(CryptoJS.enc.Utf8); // 返回解密后的明文
}
// 示例使用
var plaintext ="";
console.log("Original Text: ", plaintext);
// ECB 模式加密/解密
var encryptedECB = encryptECB(plaintext);
console.log("Encrypted (ECB): ", encryptedECB);
console.log("Decrypted (ECB): ", decryptECB(encryptedECB));
// CBC 模式加密/解密
var encryptedCBC = encryptCBC(plaintext);
console.log("Encrypted (CBC): ", encryptedCBC);
console.log("Decrypted (CBC): ", decryptCBC(encryptedCBC));
console.log("Decrypted (CBC): ",decryptCBC(""));
console.log("Decrypted (ECB):",decryptECB(""));
成功对加密流量进行解密:
可以看到,加密中有四个参数,userid,password,mfacode和type,其中mfacode可以进行爆破尝试,type应该是指登录用户的权限,可以尝试进行修改越权,不过后续也是发现并没有该越权漏洞,于是尝试对mfacode进行爆破。
通过脚本生成加密后的密码本,然后使用burp对登录参数中的mfacode进行爆破:
成功爆破并登录
后话
上述系统由于登录使用的三重检验,也就是登录用户名密码+图形验证码+登录验证码才可进行登录,但是对于有些系统,只使用登录用户名+登录验证码即可登录,那么造成的危害就升级为任意用户登录了。
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 forgotten_007 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
攻防演练 | ip溯源反制技战法
2024-08-06
文章目录