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