新版宝塔加密数据解密

news/2024/10/4 9:23:42

宝塔更新了数据存储的方式,PanelForensics会尽快支持

最近啊,fic中出现了宝塔,结果PanelForensics居然没有梭哈,这怎么行??

于是我就一通分析,发现这个版本更新了架构,并且对密码的加解密是通过调用二进制依赖进行实现的

我这里就以mysql的密码为例,在新版本中,mysql的密码主要会出现在3个地方,涉及2个sqlite文件(另外,宝塔的主要数据存储数据库default.db的文件路径也改到了/www/server/panel/data/db/default.db,但其中很多部分都被摘除,另建数据库保存)

  1. /www/server/panel/data/db/database.db
  2. /www/server/panel/data/db/panel.db

一般用户的账号密码(database.db

远程数据库的账号密码(database.db

本地数据库root密码(panel.db

可以看到很明显的特征BT-0x:,后面跟了一段密文

通过不断的跟代码,可以找到python中的解密函数

这里导入了一个模块PluginLoader,可以找到是一个so,也就是说数据的加解密被放到了二进制程序中

可以在db_decrypt中找到解密代码

很明显可以看到key和iv的获取方式

可以看到key就是一眼顶针,取偶数位的字符,得到key为3P+_lN3+jPW6Kgt#

iv的情况就比较复杂,需要先判断是否存在/www/server/panel/data/div.pl文件,如果不存在,还需要从数据库中读取div再写入文件(所以div.pldb目录或许是检测这个版本较好的方式)

实际上,如果没有div.pl,还会有个默认的iv(但是前面无论如何都会保证div.pl存在,所以这里保留的iv4HpOz4pT^4Hh-Lfl应该永远用不上)

很明显可以看到div是加密的,仍需要解密,所以跟进_aes_decrypt_module函数看后续操作

很明显用_get_sgin_key函数获得了解密div所需要的key和iv

根据逻辑来看,就是把v4劈开,分成了key和iv

char *__fastcall Ploader::_get_sgin_key(Ploader *this, char *a2, char *a3)
{char *result; // raxint v4[35]; // [rsp+18h] [rbp-A0h]int v5; // [rsp+A4h] [rbp-14h]int v6; // [rsp+A8h] [rbp-10h]int v7; // [rsp+ACh] [rbp-Ch]int v8; // [rsp+B0h] [rbp-8h]int i; // [rsp+B4h] [rbp-4h]v4[0] = 90;v4[1] = 87;v4[2] = 50;v4[3] = 119;v4[4] = 66;v4[5] = 97;v4[6] = 56;v4[7] = 100;v4[8] = 55;v4[9] = 72;v4[10] = 78;v4[11] = 54;v4[12] = 69;v4[13] = 54;v4[14] = 65;v4[15] = 69;v4[16] = 83;v4[17] = 71;v4[18] = 50;v4[19] = 87;v4[20] = 66;v4[21] = 112;v4[22] = 107;v4[23] = 101;v4[24] = 120;v4[25] = 101;v4[26] = 84;v4[27] = 84;v4[28] = 114;v4[29] = 84;v4[30] = 104;v4[31] = 54;v8 = 0;v7 = 0;v6 = 0;v5 = 32;for ( i = 0; i < v5; ++i ){if ( v8 ){a3[v6] = v4[i];v8 = 0;++v6;}else{a2[v7] = v4[i];v8 = 1;++v7;}}a2[16] = 0;result = a3 + 16;a3[16] = 0;return result;
}

解一下

v4 = [90,87,50,119,66,97,56,100,55,72,78,54,69,54,65,69,83,71,50,87,66,112,107,101,120,101,84,84,114,84,104,54]
v8 = 0
key = [0]*16
iv = [0]*16
idx_key = 0
idx_iv = 0
for i in range(32):if v8 == 1:iv[idx_iv] = v4[i]v8 = 0idx_iv += 1else:key[idx_key] = v4[i]v8 = 1idx_key += 1
print(key)
for v in key:print(chr(v),end='')
print()
print(iv)
for v in iv:print(chr(v),end='')
# key:Z2B87NEAS2BkxTrh
# iv :WwadH66EGWpeeTT6

此时可以解密div

随后可以用解密后的iv去解密一开始的密文

成功解密

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/28983.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

MongoDB索引

MongoDB索引 概述 索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常…

Vue2工程化介绍

Vue2项目[基于vue-cli]工程化 【一】环境搭建06-Vue-cli - 刘清政 - 博客园 (cnblogs.com)安装node 使用npm/cnpm npm换源:npm config set registry https://registry.npmmirror.com 安装vue-cli cnpm install -g @vue/cli# 安装脚手架 cnpm install -g @vue/cli # 切换目录,…

jmeter以命令行模式运行:非GUI界面

* `-n`:表示非GUI模式运行:命令行模式运行jmeter脚本 * `-t`:要执行的jmeter脚本(JMX):a.默认执行当前路径下的脚本,b.或执行指定路径下的脚本 * `-l`:生成结果文件(JTL):a.默认在当前路径下生成JTL文件,b.或在指定路径下生成JTL文件 * `-e`:生成HTML报告 * `-o`…

79. 单词搜索-c++

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。…

mysql约束

1. 概述 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 目的:保证数据库中数据的正确、有效性和完整性。 分类:注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。2. 约束演示 案例需求: 根据需求,完成表结构的创建。需求如下:对应的…

RocketMQ 事件驱动:云时代的事件驱动有啥不同?

本文深入探讨了云时代 EDA 的新内涵及它在云时代再次流行的主要驱动力,包括技术驱动力和商业驱动力,随后重点介绍了 RocketMQ 5.0 推出的子产品 EventBridge,并通过几个云时代事件驱动的典型案例,进一步叙述了云时代事件驱动的常见场景和最佳实践。前言: 从初代开源消息队…

干货!DNS 解析在网络传输中有什么意义?

首先我们先说说什么是DNS解析? DNS解析是将域名解析为对应的IP地址的过程。DNS它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS解析的过程就是寻找哪个IP地址对应你所输入的网址,然后将网页内容返回给用户。DNS解析需要域名服务器来完成,…

PyTorch的安装与使用

本文介绍了热门AI框架PyTorch的conda安装方案,与简单的自动微分示例。并顺带讲解了一下PyTorch开源Github仓库中的两个Issue内容,分别是自动微分的关键词参数输入问题与自动微分参数数量不匹配时的参数返回问题,并包含了这两个Issue的解决方案。技术背景 PyTorch是一个非常常…