暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL | 用pg_dumpfile来破解密码,从入门到放弃

是不是可以破解密码呢?

今日突然想到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值来进行破解。


文章转载自励志成为PostgreSQL大神,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论