新版寶塔加密數據解密
PanelForensics已經支持,快去基佬站下載吧
最近啊,fic中出現了寶塔,結果PanelForensics居然沒有梭哈,這怎么行??
于是我就一通分析,發現這個版本更新了架構,并且對密碼的加解密是通過調用二進制依賴進行實現的
我這里就以mysql的密碼為例,在新版本中,mysql的密碼主要會出現在3個地方,涉及2個sqlite文件(另外,寶塔的主要數據存儲數據庫default.db的文件路徑也改到了/www/server/panel/data/db/default.db,但其中很多部分都被摘除,另建數據庫保存)
/www/server/panel/data/db/database.db/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.pl和db目錄或許是檢測這個版本較好的方式)




實際上,如果沒有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; // rax
int 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 = 0
idx_iv += 1
else:
key[idx_key] = v4[i]
v8 = 1
idx_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去解密一開始的密文

成功解密

浙公網安備 33010602011771號