Oracle数据库漏洞隐患无需user/password快速入侵

作者:安华金和 思成

摘要

一般性的数据库漏洞,都是在成功连接或登录数据库后实现入侵;本文介绍两个在2012年暴露的Oracle漏洞,通过这两种漏洞的结合,可以在不掌握用户名/密码的情况下入侵Oracle,从而完成对数据的窃取或者破坏。

这两个漏洞就是CVE-2012-1675和CVE-2012-3137。

引言

国内外很多重要的系统都采用Oracle作为数据存储的数据库;在Oracle中存储着企业或政府大量敏感的信息,在金钱或政治的诱导下,内外部黑客会想法利用管理、网络、主机或数据库的自身漏洞尝试入侵到数据库中,以达到自身的目的。

本文的作者通过对Oracle俩种漏洞的组合研究,设计了一套在不掌握用户名/密码的方式入侵到Oracle中;这种方法,比传统的需要登录到数据库中的入侵方法,具有更大的安全隐患和破坏性。

本文希望通过对这两个漏洞和攻击方法的介绍,能够引起相关人员的重视,完善对数据库安全的措施。

1、概要介绍

本文提供的方法是基于漏洞CVE-2012-1675和CVE-2012-3137攻击oracle的方法。

CVE-2012-1675漏洞是Oracle允许攻击者在不提供用户名/密码的情况下,向远程“TNS Listener”组件处理的数据投毒的漏洞。攻击者可利用此漏洞将数据库服务器的合法“TNS Listener”组件中的数据转向到攻击者控制的系统,导致控制远程组件的数据库实例,造成组件和合法数据库之间的中间人攻击、会话劫持或拒绝服务攻击。

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

我们通过如下的步骤和过程可以实现对Oracle的入侵:

  1. 利用CVE-2012-1675进行TNS劫持,在监听下利用远程注册,注册同名数据库实例;
  2. 新登陆的用户,在TNS的负载均衡策略下,有可能流量登录到伪造的监听服务上;
  3. 该监听服务对用户的登陆过程进行监控,并将相关数据流量转发到真实的数据库上;
  4. 利用CVE-2012-3137获得通讯过程中的认证相关信息;
  5. 对认证相关信息进行离线的暴力破解,获得登陆的密码;
  6. 试用破解的用户名/密码登陆Oracle,完成对Oracle中数据的访问;


2、CVE-2012-1675进行TNS劫持

该漏洞存在于Oracle的所有版本,并且Oracle至今仅是发布了警告性通知,并未提供解决方案。

要想利用CVE-2012-1675漏洞做TNS劫持,首先需要了解TNS机制。如下图所示oracle 通过在本地解析网络服务名到目标主机IP地址,服务端口号,目标数据库名,把这些信息发送到oracle服务器端监听程序,最后再由监听程序递送DBMS。

其中关键点在于监听会按照目标数据库名递送到名称正确的数据库。那么如果一个监听下有2个同名数据库。监听将自动按照负载均衡把这次访问发送到负载低的数据库上,进行连接访问。数据库注册到监听的方法就决定了,能否同时注册同名数据库在同一个监听下。注册方式分为本地注册和远程注册,通过修改参数可以调整为远程注册。

下面是一段可用的TNS劫持的过程:

1.在劫持机上创建一个和目标数据库实例同名的数据库实例。

2.在劫持机上修改 tnsnames.ora 文件

添加

listener_name=

(DESCRIPTION=

(ADDRESS=(PROTOCOL=tcp)(HOST=目标机器IP)(PORT=目标机器端口)))

3.在劫持机上用SQL*Plus 顺序执行下面步骤。

1.$ sqlplus / as sysdba

2. SQL> ALTER SYSTEM SETREMOTE_LISTENER=‘LISTENER_NAME‘;

3. SQL> ALTER SYSTEM REGISTER;

4.多个客户端,向数据库发起登录。会劫持到一部分客户端的登录信息。

最终达到效果如下图所示:

按照猜想同一个监听下有2个同名实例。客户端访问监听,监听按照客户端中的数据库名信息分配数据库,由于监听下有2个同名数据库,客户端链接很可能会被分配到劫持者的数据库实例下,再通过配置劫持者的本地监听把客户端请求指回原数据库。结构图如下:

测试客户端链接196次。目标数据库实例获得113次,劫持数据库实例获得83次基本满足负载均衡的假设。(注上面实例是local server 下面实例是 remote server)

通过以上方式我们可以截获约一半左右客户端发送到服务器的合法链接。其中获得了服务器IP、端口号、数据库位置、实例名、登录用户名等一系列明文信息和4组密文信息(AUTH_SESSKEY,AUTH_SESSKEY_CLIENT,AUTH_PASSWORD,AUTH_VFR_DATA)。

3、通过CVE-2012-3137进行密码破解

CVE-2012-3137受影响的数据库版本有11.2.0.3,11.2.0.2,11.1.0.7,有使用了SHA-1加密算法的10.2.0.5和10.2.0.4,还有使用了SHA-1的10.2.0.3(运行在z/OS下)版本。

虽然这个漏洞在11.2.0.3中已经解决,但是仅仅数据库客户端和服务器都升级到11.2.0.3并且sqlnet.ora文件中增加SQLNET.ALLOWED_LOGON_VERSION=12才有效。

正如CVE-2012-3137所描述Oracle为了防止第三方通过网络获取登录信息包。而对密码进行了加密处理。本部分只以oracle11.1密码如何破解为例进行说明。

在发起连接之后(oracle牵手完成),客户端和服务器经过协商确定要使用的验证协议。要完成这个任务,客户端首先向数据库发送一个包。包中包含客户端主要信息和所请求的加密方式。数据库确认加密方式有效后,发送一个确认服务包如下图所示:

在通过安全网络服务完成任何所要求的协议之后,数据库用户被O3logon(oracle验证方式) 进行验证,这个协议执行一个序列来向数据库证明客户端拥有密码。为了避免网络第三方截获到密码。首先客户端发送用户名到数据库来表明用户身份。数据库端根据加密协议,其中96位的作为数据库端密钥,20位的作为偏移量,它对每个连接都是不同的。一个典型的数据库端发给客户端的密钥如下:

AUTH_SESSKEY.....COCDD89FIGODKWASDF……………………

客户端根据加密算法向服务器端发送96位的客户端密钥和64位的密码密钥。服务器端计算客户端传入的密码密钥。如果计算后密码密文和数据库中存储的16位密码密文一致则验证通过。

根据这个过程可知上面TNS劫持包中取得的加密信息:AUTH_SESSKEY,AUTH_SESSKEY_CLIENT,AUTH_PASSWORD,AUTH_VFR_DATA这四个值是解密的关键。我们把他们按照SHA1,MD5,AES192进行一系列处理。最终通过数据字典碰撞得到密码明文。

下面这段是绿盟网站上公布的一段示例代码,这段代码与笔者的思路不完全相同,但也能大概地说明这个漏洞的攻击过程:

import hashlib
    from Crypto.Cipher import AES
      
    def decrypt(session,salt,password):
            pass_hash= hashlib.sha1(password+salt)
            key =pass_hash.digest() + ‘\x00\x00\x00\x00‘
            decryptor= AES.new(key,AES.MODE_CBC)
            plain =decryptor.decrypt(session)
            returnplain
    session_hex =‘EA2043CB8B46E3864311C68BDC161F8CA170363C1E6F57F3EBC6435F541A8239B6DBA16EAAB5422553A7598143E78767‘
      
    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‘))
            ifsession_id[40:] == ‘\x08\x08\x08\x08\x08\x08\x08\x08‘:
                    print‘PASSWORD IS "%s"‘ % password
                    break

4、建议的预防措施

根据以上两段分析,我们可以有如下的预防措施:

  1. 在条件许可的情况下,对Oracle进行补丁升级,对Oracle打cpuoct2012-1515893补丁;注意对于cpuoct2012-1515893补丁要求服务器端和应用服务器端同时升级,否则应用系统将无法访问Oracle;
  2. 若无法对Oracle升级,要购买或安装具备虚拟补丁功能的数据库安全产品,防止对CVE-2012-3137和CVE-2012-1675的利用;
  3. 建立足够强健的口令,不要使用8位以下密码,或者字典库中的口令。

关于安华金和

安华金和是我国专业数据库安全产品和服务提供商,由长期致力于数据库内核研发和信息安全领域的专业资深人员共同创造,是国内唯一提供全面的数据库安全产品、服务和解决方案服务商,覆盖数据库安全防护的事前检查、事中控制和事后审核,帮助用户全面实现数据库安全防护和安全合规。

安华金和数据库安全产品已经广泛地应用于政府、军队、军工、运营商、金融、企业信息防护等领域,建立了一定的声誉,成为众多企业在该领域寻求安全产品和服务的首选。

时间: 2024-10-01 07:29:39

Oracle数据库漏洞隐患无需user/password快速入侵的相关文章

Oracle数据库监听器引起的安全威胁和防护技术

1.引言 在今年的两会上,<政府采购法实施条例>正式实施.虽然安全行业迎来了数据库国产化的春天,但现今Oracle依旧是中国政府机关,使用最广泛的数据库.其安全性受到广泛关注. Oracle数据库必须使用TNS Listener(数据库监听器)来完成数据库和客户端之间的通讯.因此TNS Listener的漏洞成了很多黑客的主要目标.这些TNS Listener的漏洞如果不及时处理,将对用户的信息资产造成重大损失,同时也使许多敏感信息处于危险境地.本文主要对TNS Listener的漏洞带来的安

2015年数据库漏洞威胁报告

互联网就像空气,彻底的融入我们的生活之中.因此我们愈发习惯把越来越多的数据保存在网上以换取更便捷的服务.不过,随之而来的安全事件无不让人触目惊心. 安华金和数据库安全攻防实验室(DBSecLabs )回忆2015年整年发生的数据泄露事件,2015年一月机锋论坛包括用户名.邮箱.加密密码的2300万用户信息泄漏.随后国内10多家酒店大量客户开 房信息泄漏.中国广东人寿10W保单泄漏.大麦网600万用户信息和网易邮箱过亿用户信息泄漏--一连串的信息泄漏事件无不令人提心吊胆.覆巢之下安有完 卵,全球第

webform快速创建表单内容文件--oracle 数据库

使用方法 前台页面这样写就足够了 <form class="stdform" runat="server"> <div id="field_tab_content" runat="server"></div> </form> 新增编辑加载页面(改页面需要继承CreateModel类) Type type; public decimal id = 0; protected void

Oracle数据库XXE注入漏洞(CVE-2014-6577)分析

在这篇文中,我们将共同分析一下Oracle数据库的XXE注入漏洞(CVE-2014-6577),Oracle公司1月20日发布了针对该漏洞的相关补丁. 有关XXE的相关知识,可以查看安全脉搏站内的另一篇文章<未知攻焉知防--XXE漏洞攻防>. 漏洞描述 Oracle数据库的XML解析器模块容易受到XML外部实体(XML External Entity , XXE)注入. 受影响版本:11.2.0.3, 11.2.0.4, 12.1.0.1 和12.1.0.2 所需权限:创建会话(CREATE

C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 更优美的Oracle数据库上的代码生成器

代码生成器进行了改进,针对Oracle数据库生成更优美的代码.这样生成出来的代码,更像微软的风格,更像C#.NET的标准规范,阅读起来也更优美.把Oracle表字段名默认大写, 有_分割等进行了优化,这样用我们代码生成器生成的代码,阅读起来,更顺眼.更能拿得出手了.代码生成器生成代码效率高.规范性强.错误少.质量可靠. EF 生成的 Oracle 底层数据库的SQL语句性能不能有保障.在大并发大用户时会有很多不确定因素.甚至优化起来工作量大,所以在 Oracle 上自己生成底层代码还是很有必要的

分享知识-快乐自己:Excel快速导入Oracle 数据库

需求: oracle 数据库有一个student表,现有一个excel表:student.xlsx,需导入oracle数据库student表中. student表的拥有者是c##MLQ1  密码为:xxx 表结构: 打开需导入的excel表格,单击office按钮,选择另存为--其他格式 选择保存路径(置于D:\),保存类型CSV(逗号分隔)(*.csv),设置文件名为student.csv,单击保存   新建input.ctl文件(置于D:\),内容为: load data infile 'd

Oracle 数据库12c 16大新特性总结

Oracle 12c 已发布很久,一直想找个时间好好学习一下,毕竟后续12c将会逐渐替代现有数据库版本,成为主流数据库版本.现就12c 一些常用的 特性给大家一起学习一下. 1. 在线重命名和重新定位活跃数据文件 不同于以往的版本,在Oracle数据库12c R1版本中对数据文件的迁移或重命名不再需要太多繁琐的步骤,即把表空 间置为只读模式,接下来是对数据文件进行离线操作.在12c R1中,可以使用ALTER DATABASE MOVE DATAFILE这 样的SQL语句对数据文件进行在线重命名

Oracle数据库SQL注入浅析与防护建议

作者:安华金和 思成 SQL注入是在信息安全领域一种常见的攻击手段.但是大部分人理解的SQL注入就是通过把SQL命令插入到Web表单提交或在输入域名.页面请求时加入的查询字符串,最终达到欺骗服务器执行偏离预期的SQL命令.这种情况下的SQL注入,引发原因基本是网页对用户输入的信息缺乏校验而导致. 很多人认为只有网页才可以进行 SQL 注入,才有注入点.这是一个普遍对SQL 注入的错误认识.SQL注入严格来讲应该叫做数据库SQL注入.SQL注入的最终目的是获取数据库中存储的敏感信息.事实上,任何可

Oracle数据库语句大全

转自:http://blog.sina.com.cn/s/blog_b5d14e2a0101c56z.html ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CHECK (检查)--检查在约束中指定的条件是否得到了满足. UNIQUE (唯一)--保证在指定的列中没有重复值.在该表中每一个值或者每一组值都将是唯一的. PRIMARY KEY (主键)--用来唯一的标识出表的每