|
本帖最后由 神女软件定制 于 2024-12-25 17:04 编辑
刚刚有人发了求助帖:
一个AES加密
https://bbs.125.la/forum.php?mod=viewthread&tid=14844308
(出处: 精易论坛)
[JavaScript] 纯文本查看 复制代码 53:19.539: 匹配请求:[POST https://h7.cbqb.app/api/9B7A9202-2E7E-4E9C-815C-A8927C7774F5
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Authorization: Basic YXBwOjEyMzQ1Ng==
Connection: keep-alive
Content-Length: 942
Content-Type: application/json
Cookie: _c_WBKFRo=h3MiiOnv8kuH0o2EhQtVsksQcVXz5PZuZRPtdDgi; smidV2=202412251500482ba0a135eca1e31755db3641b90f640c00435b469b53cdeb0; .thumbcache_f555418dfeb2767dfd6a1ce2938effe2=pByNw/3yh0l2M0xkB1HOJ0FyXWLIZkTOQd5t/6XN0qwWEP0cp6cO/2x32VqXgbqopljCjk10HZVZKQrCNFzw8g%3D%3D
Host: h7.cbqb.app
Origin: https://h7.cbqb.app
Referer: https://h7.cbqb.app/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0
encrypt-key: ob/ngFS1CoX9E1aigoHYZPL/iRxY5qZ6t8YC5h4fSC22J8hMyN3CCTXyHaDLfmgn6VAS1xoYUw3KjvAA5RI5aQ==
reqid: 3EC8E420-C791-4558-AD59-509FDC7C9EFD
sec-ch-ua: "Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
"+60MTjsKQTPInJ3x7GxWIJzV6bQ6jGSWTP22QHCcrpYLTa6ss4v8EAnfJISRMQfceC2jHlupZ2YocOJ7Me44NSMEZf90FTK5UuZ5pg291Z4gO9HNs7G8qc8hq+V8waJGzKML6CxKvXHKyE1JVlM1xXxvawz29wBVYsnyRIAIkxBjbtgNSaYT8IGe8E/DZGZoBj67gK70Uy1ZBRzJ3MP4PtUvLv/UzGJ+gtYkcZXr3tqIr8+8Vd8YfJksNGNvSuHEEgvYgHX6ZfqQ2oxFmjlKSme107eMdzwGKvE3jMJD3FdRzDrEX8YRIBaGyz9zrQLGjFD5HAVpXxkmB98507sb5u3+GmcQvjrrLDSqQrEZUwe+KevUre9KAItSqzQ+tsMzelbs+1pjnn/qotFDmkqvbf6SNYYewWNxCGJxftpePQ+Inx/2RiAK2EJgMzr+vQ5VSvp8fX6yTzijMlijBtY8jJJfiGAqGIY7yEWAYy/grpYOU+HFOD8NPctge5hAB/PrKqKxG7Zti1VMQjYmBcBy9cMEm/9g/dTqYx9j2STPlsefzZ/FpPsNuE+ZfaiPa/F5725hu2WTgkOlnOuTv3Iri3oyyofMkgGj2S843Z2RfdbnB+Za2yb9Hct+yApCZNlrw9BCYFRSgnqU1Ps2IkZRmbtftOUgZ0qIUMmQg1+b8lPPZaUOvUM1c8XAMwgNp6jIsLw1BB7qRWLu7PbjBIRG7w0mWHhqJK1xd1aLQWYWw/fahYt5xcIX2Am18P1Y9kgde9wJSTyxqLEHint8pON6Og4hR+JTcW6Hgbx1jCf8Rg0hDHyonN0irx11NdcDM9riYTujp6yex7j69bgMB89xMxvGoBwzryPJs19MU2Tiva4XCkQR/NdF+kRkk8pkb+4x+jn1F0fLrlRX1eDP1C3he+5elQLfMXtN+KxK9JC+6qc="]
抓包内容是这样的
直接观察,请求body可能是加密的:
我们给他放进去推理
得到的结果是:[JavaScript] 纯文本查看 复制代码 54:08.059: AES-256-ECB("{"method":"POST","path":"/auth/oauth/token","contentType":"application/json","params":{"grant_type":"password","scope":"all","username":"13512121212","password":"8d969eef6ecad3c29a3a","uid":"b2a383447bdd934e1e49c1adb50ba9582f778dcb9382e9ff4b7ab0c14c20a8b5","name":"Windows","version":"10.0","key":"7E80A170-8099-4BCD-A40F-92B2E9646BBB","code":"zaby"},"timestamp":1735113199380,"uid":"b2a383447bdd934e1e49c1adb50ba9582f778dcb9382e9ff4b7ab0c14c20a8b5","platform":"h5","deviceId":"BpByNw/3yh0l2M0xkB1HOJ0FyXWLIZkTOQd5t/6XN0qwWEP0cp6cO/2x32VqXgbqopljCjk10HZVZKQrCNFzw8g==","token":"Basic YXBwOjEyMzQ1Ng==","reqid":"3EC8E420-C791-4558-AD59-509FDC7C9EFD","requestId":"3EC8E420-C791-4558-AD59-509FDC7C9EFD"}","4H5xhlF4dc2T0iHGFKe87VvuMKlGhKm1","Pkcs7Padding")
其中password好像是某个hash结果,但是直觉上,没有hash结果这么短,我就猜测,可能是某个hash截断了
于是我就使用搜索包含功能,去验证一下:
果然发现对应有一个很长的,于是用这个很长的放进去跑
就是我输入的内容的sha256 hash
然后uid字段好像也是hash,放进去跑:
是这么个情况:00:39.883: SHA-256("Windows_10.0_null_1920_1080_+08:00"),虽然不知道有什么含义,但是确实是这样……
然后,还有一个协议头里面的参数:encrypt-key,看名字,好像是加密key
放进去跑:
疑似一个rsa加密的结果
多试几次对前面请求正文的推理,我们可以发现,每次加密的key都不一样,结合encrypt-key名字,我们可以猜测,是对随机产生的aeskey的rsa
然后我还把那个deviceId参数放进去了,没有出来结果
猜测应该就不是加密
到此:实现0逆向,成功解决网址的4个算法:2个SHA-256,1个AES-256-ECB,1个RSA
————————————————————————————————————————————————
刚刚发现返回内容也是加密的……没注意
使用匹配返回后dump
结果软件判定返回内容256个字节,就会认为是rsa2048:
罗列出了一些rsa2048的公钥,我挨个试了一遍用这些公钥去解密,并没有解密成功……
我就很好奇,为什么,于是去逆向来找原因,
结果发现竟然是一个rsa1024的私钥在解密……
这确实触及到我的知识盲区了,我一直认为RSA的加密解密的长度,只能是块大小。
因为返回内容是256个字节,所以只会列出rsa2048的密钥。
我的代码是这么写的:
struct {
string begin;
string end;
RSA*(*loadFun)(BIO*, RSA**, pem_password_cb*, void*);
CString name;
}arrType[] = {
{("-----BEGIN PUBLIC KEY-----\n"),("\n-----END PUBLIC KEY-----"),PEM_read_bio_RSA_PUBKEY,("公钥PKCS#8")},
{("-----BEGIN RSA PUBLIC KEY-----\n"),("\n-----END RSA PUBLIC KEY-----"),PEM_read_bio_RSAPublicKey,("公钥PKCS#1")},
{("-----BEGIN RSA PRIVATE KEY-----\n"),("\n-----END RSA PRIVATE KEY-----"),PEM_read_bio_RSAPrivateKey,("私钥")}
};
for (auto& type : arrType) {
string key = type.begin + match.str(1) + type.end;
BIO* pBio = BIO_new_mem_buf(key.data(), key.size());
if (pBio) {
RSA* pRsa = type.loadFun(pBio, nullptr, nullptr, nullptr);
BIO_free(pBio);
if (pRsa) {
string strOrigin(pStr, nLen);
if (RSA_size(pRsa) == nLenEncrypted && !setEcho.count(strOrigin)) {//过滤重复后输出
nCount++;
setEcho.insert(strOrigin);
LogToUIFormat(FALSE, ("%d %s:[%s]"), nCount, type.name.GetString(), ToString(strOrigin).GetString());
}
RSA_free(pRsa);
goto end;
break;//跳过后续
}
}
}
加载到那个真正的私钥了,但是RSA_size(pRsa) == nLenEncrypted这段,判定RSA密钥工作长度和密文不一致,没有输出
这确实触及到我的知识盲区了,我一直认为RSA的加密解密的长度,只能是对应的RSA块大小,至少我见过的从来都是如此。
但是没有想到,这个竟然在用一个rsa1024位的key,去解密2048个位……
有了解rsa的可以解惑一下
————————————————————————————————————————————————
✅ C++加密算法推理工具 1.0 - hash系列开放
https://bbs.125.la/forum.php?mod=viewthread&tid=14843543
(出处: 精易论坛)
|
|