是不是可以破解密码呢?
今日突然想到pg_filedump是不是也能破解密码?要想破解密码,先要了解一下pg_authid表。
postgres=#SELECTrolname,rolpasswordFROMpg_authid;rolname
rolpassword---------------------------+-------------------------------------pg_monitor
pg_read_all_settings
pg_read_all_stats
pg_stat_scan_tables
pg_read_server_files
pg_write_server_files
pg_execute_server_program
pg_signal_backend
postgres
mdaaa05cda6ba25fcaaa3b5test
mddbabeaa66b2
目前我的环境使用的是md5加密。
先从源代码中找出要挖掘的文件号。
此处显示挖掘文件。文件比较特殊,它不在任何数据库下,而是在global文件夹下,因此需要指定路径为global/
[postgres
centos8pgdata]$pg_filedump-Doid,name,bool,bool,bool,bool,bool,bool,bool,int,text,~./global/
grepCOPY:COPY:10postgresttttttt-1\N\NCOPY:pg_monitorftfffff-1\N\NCOPY:pg_read_all_settingsftfffff-1\N\NCOPY:pg_read_all_statsftfffff-1\N\NCOPY:pg_stat_scan_tablesftfffff-1\N\NCOPY:pg_read_server_filesftfffff-1\N\NCOPY:pg_write_server_filesftfffff-1\N\NCOPY:pg_execute_server_programftfffff-1\N\NCOPY:pg_signal_backendftfffff-1\N\NCOPY:10postgresttttttt-1mdaaa05cda6ba25fcaaa3b5\NCOPY:testttfftff-1\N\NCOPY:testttfftff-1mddbabeaa66b2\N
不久我们就挖出了加密密码。但加密后的密码无法登录到数据库。
[postgres
centos8~]$psql-h..56.-Upostgres-dpostgres-WPassword:-02-:32:11.UTC[]FATAL:passwordauthenticationfailedforuser"postgres"-02-:32:11.UTC[]DETAIL

assworddoesnotmatchforuser"postgres".Connectionmatchedpg_hba.confline91:"hostallall0.0.0.0/0md5"psql:error:FATAL:passwordauthenticationfailedforuser"postgres"
PostgreSQL的密码不是对密码值进行默认散列,而是使用(密码+Slat)来散列。test用户密码是Sqlite,让我们来计算它。
[postgres
centos8pgdata]$echo-n"Sqlite"
md5sumafcd6ce5eec8fef1c54b-
我们会发现,计算出的md5值与挖掘出的md5值不同。添加slat值后再来测试一下。
[postgres
centos8pgdata]$echo-n"Sqlitetest"
md5sum81dbabeaa66b2-
可以看到这次和我们挖掘的密码值一样了。所以PostgreSQL的slat其实就是用户名。我的postgres的密码也是Sqlite,加上Slat可以看到和我们挖掘的数据一致。
[postgres
centos8pgdata]$echo-n"Sqlitepostgres"
md5sum95aaa05cda6ba25fcaaa3b5-
既然我们知道加密的md5值,要反推明文的密码,实际上是很困难的,尤其是加了slat之后。
为什么用slat破解比较困难,因为每个用户都有自己的用户名,然后每个用户的H函数(H函数就是要破解的哈希函数)就不一样了。您必须为每一位用户生成不同的彩虹表。因此解码非常困难。
但您可以想象,超级管理员的slat总是postgres,因此仍然有可能被破解。在网络上,我们发现了一种破解的网站,尝试未能成功。
但是我在stackoverflow.