【轉】ORACLE TNS Listener遠程注冊投毒(Poison Attack)漏洞


來源:http://blog.csdn.net/wengtf/article/details/46632405

此次有用戶正好大規模安全漏洞掃描后,發現此漏洞,該漏洞存在於Oracle DB的所有版本中,當然10g和11g均中招.

1. Vulnerability Description(漏洞描述)

This security alert addresses the security issue CVE-2012-1675, a vulnerability in the TNS listener which hasbeen recently disclosed as "TNS Listener Poison Attack" affecting the Oracle Database Server. This vulnerability may be remotely exploitable without authentication, i.e. it may be exploited over a network without the need for a username and password. A remote user can exploit this vulnerability to impact the confidentiality, integrity and availability of systems that do not have recommended solution applied.

Oracle 2012年發布的告警,CVE-2012-1675漏洞是Oracle允許攻擊者在不提供用戶名/密碼的情況下,向遠程“TNS Listener”組件處理的數據投毒的漏洞。舉例:攻擊者可以再不需要用戶名密碼的情況下利用網絡中傳送的數據消息(包括加密或者非加密的數據),如果結合(CVE-2012-3137漏洞進行密碼破解)從而進一步影響甚至控制局域網內的任何一台數據庫。
2.針對該漏洞,oracle給出了2種不同環境的解決方法:

http://www.oracle.com/technetwork/topics/security/alert-cve-2012-1675-1608180.html Recommendations for protecting against this vulnerability can be found at: My Oracle Support Note 1340831.1 for Oracle Database deployments that use Oracle Real Application Clusters (RAC). My Oracle Support Note 1453883.1 for Oracle Database deployments that do not use RAC.

舉例說明下(非RAC)單實例情況下的修復和測試方式:圖2 中的被劫持的數據庫的listener.ora加上: SECURE_REGISTER_LISTENER = (TCP) 圖2 中的(即黑客想要訪問的最終的劫持數據庫)做: SQL>alter system set remote_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = database2)(PORT = 1521))' scope = both; $lsnrctl reload   <<<<重啟監聽

注意:驗證環節需要在圖2的劫持數據庫中的監聽日志中,查看是否存在refuse remote_listener訪問的信息,如有,即說明加固成功

 

 

 

同時,還提及了一個在11.2.0.4和12.1中或者在RAC中的新參數配置解決該問題:Valid Node Checking For Registration (VNCR) (文檔 ID 1600630.1)

 

VALID_NODE_CHECKING_REGISTRATION_listener_name Values: OFF/0 - Disable VNCR ON/1/LOCAL - The default. Enable VNCR. All local machine IPs can register. SUBNET/2 - All machines in the subnet are allowed registration.

#可以指定固定IP或者網段中的服務器

REGISTRATION_INVITED_NODES_listener-name Values are valid IPs, valid hosts, a subnet using CIDR notation (for ip4/6), or wildcard (*) for ipv4. For example: REGISTRATION_INVITED_NODES_Listener=(net-vm1, 127.98.45.209, 127.42.5.*)

Note that when an INVITED list is set, it will automatically include the machine's local IP in the list. There is no need to include it.

REGISTRATION_EXCLUDED_NODES_listener_name - the inverse of INVITED_NODES.

 

3.針對上文提到的2個漏洞,有網友也通過組合模擬了截取數據庫密碼的測試,及以下(攻擊部分)轉至網絡:
 
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中數據的訪問;

 
 
畫了幾個圖了解下整個過程:
1.oracle 通過在本地解析網絡服務名到目標主機IP地址,服務端口號,目標數據庫名,把這些信息發送到oracle服務器端監聽程序,最后再由監聽程序遞送DB。
圖(1)
 
 
2.如果同時一個 監聽下存在有2個同名數據庫(見圖3,一個local listener,一個remote listener),由於圖3中已被注冊遠程監聽到劫持數據庫,客戶端鏈接很可能會被分配到劫持者的數據庫實例下(圖2,第2步),再通過配置劫持者的本地監聽把客戶端請求指回原數據庫(圖2,第3步)。
圖(2)
可以發現已經注冊到被劫持數據庫上
圖(3)
 
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

 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM