是不是可以破解密码呢?
今日突然想到pg_filedump是不是也能破解密码?要想破解密码,先要了解一下pg_authid表。
postgres=# SELECT rolname,rolpassword FROM pg_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 | md595aaa05cd729a6b009a25fc012aaa3b5
test | md581db3552a331b95842e7782346aa66b2
目前我的环境使用的是md5加密。
先从源代码中找出要挖掘的文件号。

此处显示挖掘1260文件。1260文件比较特殊,它不在任何数据库下,而是在 global文件夹下,因此需要指定路径为global/1260
[postgres@centos8 pgdata]$ pg_filedump -D oid,name,bool,bool,bool,bool,bool,bool,bool,int,text,~ ./global/1260 | grep COPY:
COPY: 10 postgres t t t t t t t -1 \N \N
COPY: 3373 pg_monitor f t f f f f f -1 \N \N
COPY: 3374 pg_read_all_settings f t f f f f f -1 \N \N
COPY: 3375 pg_read_all_stats f t f f f f f -1 \N \N
COPY: 3377 pg_stat_scan_tables f t f f f f f -1 \N \N
COPY: 4569 pg_read_server_files f t f f f f f -1 \N \N
COPY: 4570 pg_write_server_files f t f f f f f -1 \N \N
COPY: 4571 pg_execute_server_program f t f f f f f -1 \N \N
COPY: 4200 pg_signal_backend f t f f f f f -1 \N \N
COPY: 10 postgres t t t t t t t -1 md595aaa05cd729a6b009a25fc012aaa3b5 \N
COPY: 73931 test t t f f t f f -1 \N \N
COPY: 73931 test t t f f t f f -1 md581db3552a331b95842e7782346aa66b2 \N
不久我们就挖出了加密密码。但加密后的密码无法登录到数据库。
[postgres@centos8 ~]$ psql -h192.168.56.119 -Upostgres -d postgres -W
Password:
2021-02-07 08:32:11.788 UTC [8054] FATAL: password authentication failed for user "postgres"
2021-02-07 08:32:11.788 UTC [8054] DETAIL: Password does not match for user "postgres".
Connection matched pg_hba.conf line 91: "host all all 0.0.0.0/0 md5"
psql: error: FATAL: password authentication failed for user "postgres"
PostgreSQL的密码不是对密码值进行默认散列,而是使用(密码+ Slat)来散列。test用户密码是Sqlite123,让我们来计算它。
[postgres@centos8 pgdata]$ echo -n "Sqlite123" | md5sum
708afc6329d6ce5eec8fef1c54b27259 -
我们会发现,计算出的md5值与挖掘出的md5值不同。添加slat值后再来测试一下。
[postgres@centos8 pgdata]$ echo -n "Sqlite123test" | md5sum
81db3552a331b95842e7782346aa66b2 -
可以看到这次和我们挖掘的密码值一样了。所以PostgreSQL的slat其实就是用户名。我的postgres的密码也是Sqlite123,加上Slat可以看到和我们挖掘的数据一致。
[postgres@centos8 pgdata]$ echo -n "Sqlite123postgres" | md5sum
95aaa05cd729a6b009a25fc012aaa3b5 -
既然我们知道加密的md5值,要反推明文的密码,实际上是很困难的,尤其是加了 slat之后。

为什么用slat破解比较困难,因为每个用户都有自己的用户名,然后每个用户的H函数(H函数就是要破解的哈希函数)就不一样了。您必须为每一位用户生成不同的彩虹表。因此解码非常困难。
但您可以想象,超级管理员的slat总是postgres,因此仍然有可能被破解。在网络上,我们发现了一种破解的网站,尝试未能成功。

但是我在stackoverflow.com上发现有人用hashcat工具破解了密码,这里也添加了salt。它能将较简单的解码出来。

我自己下了hashcat,总是试验不成功。因此破译密码的之路从入门到放弃了。在PostgreSQL10之后,推荐使用scram-sha-256加密算法进行加密。
后记
虽然是一次失败的尝试,从入门到放弃,但是并不是说无法破解,起码我们还可以通过修改底层文件,直接篡改md5值来进行破解。




