隨著《政府采購法實(shí)施條例》正式實(shí)施,雖然安全行業(yè)迎來了數(shù)據(jù)庫國產(chǎn)化的春天,但現(xiàn)今Oracle依舊是中國政府機(jī)關(guān)使用最廣泛的數(shù)據(jù)庫。其安全性受到廣泛關(guān)注。
Oracle數(shù)據(jù)庫必須使用TNS Listener(數(shù)據(jù)庫監(jiān)聽器)來完成數(shù)據(jù)庫和客戶端之間的通訊。因此TNS Listener的漏洞成了很多黑客的主要目標(biāo)。這些TNS Listener的漏洞如果不及時處理,將對用戶的信息資產(chǎn)造成重大損失,同時也使許多敏感信息處于危險境地。本文主要對TNS Listener的漏洞帶來的安全威脅和防護(hù)措施進(jìn)行介紹,希望管理者和數(shù)據(jù)庫的維護(hù)人員能夠提高警惕,加強(qiáng)針對TNS Listener漏洞的防護(hù)措施。
根據(jù)安華金和數(shù)據(jù)庫安全實(shí)驗(yàn)室統(tǒng)計(jì),2001年至2012年間,針對TNS LISTENER的漏洞有15個,其中高危漏洞9個,中危漏洞6個。TNS Listener漏洞總數(shù)并不多,但其具備威脅大,跨越數(shù)據(jù)庫版本多,適合通過網(wǎng)絡(luò)遠(yuǎn)程攻擊的特點(diǎn)。本文將針對這15個TNS漏洞按照攻擊原理進(jìn)行分類,并最終給出對應(yīng)防護(hù)技術(shù)。
TNS Listener作為ORACLE的必備組件,TNS Listener不僅定義了數(shù)據(jù)庫和客戶端之間的通訊協(xié)議,更負(fù)責(zé)對客戶端進(jìn)行身份驗(yàn)證(確認(rèn)客戶端用于通訊的用戶名和密碼是否合法)。根據(jù)TNS這2條主要功能可以把漏洞分成三大類:
第一類漏洞,TNS Listener被觸發(fā)緩沖區(qū)重寫,導(dǎo)致服務(wù)器無法響應(yīng)客戶端。造成通訊失敗。簡單說就是使TNS Listener崩潰。例如漏洞CVE-2007-5507就是這個類型的代表。
第二類漏洞,繞過TNS身份驗(yàn)證,獲得合法數(shù)據(jù)庫賬號和密碼。這個類型具體可以分三種:
1.通過劫持TNS信息,把oracle的登錄信息劫持到攻擊者機(jī)器,獲取敏感信息,甚至獲取oracle管理員賬號密碼。具體請參考安華金和數(shù)據(jù)庫安全實(shí)驗(yàn)室發(fā)表的《Oracle數(shù)據(jù)庫漏洞隱患無需user/password快速入侵 》一文。
2.直接對在TNS中加密的oracle登錄密鑰進(jìn)行破解具體請參考安華金和數(shù)據(jù)庫安全實(shí)驗(yàn)室發(fā)表《破解oracle9i、oracle10g、oracle11g密碼》一文。
3.在遠(yuǎn)程登陸過程中對服務(wù)器進(jìn)行sql注入。利用某些特殊函數(shù),創(chuàng)建新的數(shù)據(jù)庫賬號,并為新賬號創(chuàng)建DBA權(quán)限。例如漏洞CVE-2006-0552就是這個類型的代表。
第三類漏洞,通過緩沖區(qū)溢出控制數(shù)據(jù)庫所在操作系統(tǒng)。這個類型具體可分兩種方式:
1.直接通過向TNS Listener發(fā)送含有異常字段的包,當(dāng)oracle調(diào)用含有異常字段的包的時候,觸發(fā)緩沖區(qū)溢出。具體可以參考安華金和數(shù)據(jù)庫安全實(shí)驗(yàn)室發(fā)表《通過OracleTNS漏洞攻占o(jì)racle所在操作系統(tǒng),進(jìn)而入侵oracle》一文。
2.向TNS Listener發(fā)送含有異常數(shù)據(jù)的包,直接觸發(fā)緩沖區(qū)溢出,奪取數(shù)據(jù)庫所在操作系統(tǒng)控制權(quán)限。例如漏洞CVE-2002-0965就是這個類型的代表。
其中第三類漏洞在15個漏洞中分布最廣泛。下面我們按照類型進(jìn)行原理介紹。
第一類漏洞中的代表是CVE-2007-5507。GIOP格式的消息中的DWORD被用來描述后面的字段的長度。當(dāng)DWORD被惡意的修改后,如果DWORD所指出的長度比實(shí)際的字段的長度要長。TNS Listener會按照DWORD的數(shù)值來分配內(nèi)存,把實(shí)際的字段考入。再讀取的時候按照DWPRD的長度去讀取,就會導(dǎo)致讀取失敗。TNS Listener服務(wù)崩潰,無法接受客戶端的請求。導(dǎo)致服務(wù)器無法響應(yīng)客戶端。
該問題幾乎存在于Oracle的所有版本,并且Oracle至今僅是發(fā)布了警告性通知,并未提供解決方案。TNS劫持的核心點(diǎn)在于監(jiān)聽會按照目標(biāo)數(shù)據(jù)庫名遞送到名稱正確的數(shù)據(jù)庫。通過遠(yuǎn)程注冊的方法可以讓一個監(jiān)聽下同時存在2個同名數(shù)據(jù)庫(1個黑客的機(jī)器1個目標(biāo)機(jī)器)。監(jiān)聽將自動按照負(fù)載均衡把每次訪問發(fā)送到負(fù)載低的數(shù)據(jù)庫上,進(jìn)行連接訪問。也就是說有高過一半的幾率TNS Listener有可能把客戶端的請求錯誤的發(fā)送到黑客的機(jī)器上。黑客的機(jī)器再配置listener_name=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=目標(biāo)機(jī)器IP)(PORT=目標(biāo)機(jī)器端口)))
就可以變成客戶端和目標(biāo)機(jī)器的中間站。自己發(fā)送信息給目標(biāo)機(jī)器,讓目標(biāo)機(jī)器誤以為是客戶端發(fā)送的信息。
雖然11g在登錄信息加密上做了較大改善。但算法主體思想還是客戶端和數(shù)據(jù)庫分別以O(shè)racle_hash為基礎(chǔ)生成S_AUTH_SESSKEY和C_AUTH_SESSKEY。客戶端對傳過來的S_AUTH_SESSKEY。做AES192解密處理拿到server_sesskey。把server_sesskey和自己的client_sesskey做md5生成combine。用combine生成AUTH_PASSWORD。服務(wù)器端最后用combine對AUTH_PASSWORD解密。對比密碼,如果一致登陸成功。所以oracle的默認(rèn)加密算法基本已經(jīng)被破。一旦登錄包被截獲則可能直接被離線暴力破解出用戶名和密碼。
這種漏洞是利用的協(xié)議認(rèn)證的機(jī)制,在Oracle Database的登錄過程時,遠(yuǎn)程攻擊者在登錄過程中對服務(wù)器進(jìn)行SQL注入攻擊。協(xié)議認(rèn)證由兩個步驟組成,包含有兩個不同的客戶端請求和兩個服務(wù)器響應(yīng)。第一個請求僅包含有用戶名,而第二個請求包含有用戶名和亂碼的口令。第二個請求(下圖)還包含有”名稱-值”對列表,描述客戶端的各種屬性,其中AUTH_ALTER_SESSION就是這個sql注入的目標(biāo)。AUTH_ALTER_SESSION的值中可以包含有任意SQL語句。并且AUTH_ALTER_SESSION是以O(shè)racle訪問控制機(jī)制之外的SYS用戶環(huán)境執(zhí)行的,因此通過將AUTH_ALTER_SESSION值改為創(chuàng)建用戶語句,并給予新用戶DBA權(quán)限。簡單說就是,攻擊者可以通過這類的漏洞創(chuàng)建新的數(shù)據(jù)庫帳號并為帳號創(chuàng)建DBA權(quán)限。
通過緩沖區(qū)溢出攻占數(shù)據(jù)庫所在操作系統(tǒng)的控制權(quán)。以CVE-2002-0965為例,
上圖為正常的的會話,CVE-2002-0965就是把上圖中的SERVICE_NAME用超過20字節(jié)的字符串代替。導(dǎo)致TNS在調(diào)RVICE_NAME的時候出現(xiàn)緩沖區(qū)溢出,緩沖區(qū)溢出后調(diào)用寫好的shellcode。奪取操作系統(tǒng)權(quán)限(具體可以參考安華金和數(shù)據(jù)庫實(shí)驗(yàn)室發(fā)辮的《windows緩沖區(qū)溢出原理(棧)》一文)。
buff=”超過20字節(jié)的串”
sploit=”(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=#{rhost}(PORT=#{rport}))(CONNECT_DATA=(SERVICE_NAME=#{buff})(CID=(PROGRAM=MSF))))”
上面按照2001年到2012年間15個漏洞,總結(jié)了TNS Listener漏洞主要被利用的5種方式。(類型3的2種子類方式一樣,只是緩沖區(qū)溢出的用法有差別,這里就不作區(qū)分了)
TNS Listener作為oracle的核心組件和安全門戶。如果被黑客用上述任何一種方式入侵都很可能產(chǎn)生,類似2013年CSDN公司用戶信息大規(guī)模泄漏事件。而且由于TNS Listener位置的特殊性,對TNS Listener的防護(hù)手段有別于其他數(shù)據(jù)庫組件的安全防護(hù)手段。對TNS Listener的防護(hù)手段主要分為四個層次:
第一層是:通過數(shù)據(jù)庫弱口令掃描產(chǎn)品和定期更換安全密碼進(jìn)行預(yù)防。
第二層是:對TNS Listener進(jìn)行密碼設(shè)置防止遠(yuǎn)程注冊被黑客利用。(阻止來自網(wǎng)絡(luò)的非法注冊)
最三層是:通過下載官方補(bǔ)丁或者使用含有VPATH的防火墻產(chǎn)品對已知漏洞進(jìn)行修復(fù)。
最后一層:是通過數(shù)據(jù)局保險箱對數(shù)據(jù)庫進(jìn)行全庫或者敏感字段加密。保證即便TNS Listener被攻破,核心數(shù)據(jù)依舊不會泄露。
大多數(shù)黑客通過TNS Listener入侵?jǐn)?shù)據(jù)庫并非因?yàn)槁┒矗峭ㄟ^默認(rèn)口令、弱口令、撞庫等方式。數(shù)據(jù)庫弱口令掃描工具就是專門用來檢測oracle的賬號口令安全強(qiáng)度。利用探測到的賬號以數(shù)據(jù)庫管理員特權(quán)身份或其他特權(quán)身份進(jìn)入被掃描的數(shù)據(jù)庫系統(tǒng),從內(nèi)部檢查數(shù)據(jù)庫的認(rèn)證、授權(quán)與系統(tǒng)完整性等內(nèi)部配置信息,全面地分析、評估數(shù)據(jù)庫的安全弱點(diǎn)和安全風(fēng)險。
針對第二類第二種,截獲通訊包線下暴力破解。雖然這個密碼是通過模擬oracle加密的過程算出來的。但是本質(zhì)上還是需要足夠大的密碼庫進(jìn)行比對。所以只要定期更換長度和復(fù)雜度滿足oracle官方要求的密碼,就基本可以應(yīng)付線下暴力破解問題。關(guān)鍵是不要用不滿足oracle的密碼,和長期不換密碼。
雖然TNS Listener默認(rèn)是不設(shè)置密碼的,但是其本身是支持加密的。加密后可以杜絕外來黑客對TNS Listener進(jìn)行的非法注冊。從根本上杜絕了第二類中的第一種漏洞。
TNS Listener加密方法如下:
LSNRCTL> start
LSNRCTL> change_password
Old password:
New password:
Reenter new password:
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test)(PORT=1521)))
Password changed for listener_demo92
The command completed successfully
LSNRCTL> save_config
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test)(PORT=1521)))
TNS-01169: The listener has not recognized the password
LSNRCTL> set password
TNS Listener是oracle 的重要組件,所以盡可能第一時間安裝Oracle公司會定期地公布的補(bǔ)丁包,這些補(bǔ)丁包也會修復(fù)TNS Listener中存在的漏洞。有些數(shù)據(jù)庫漏洞掃描工具能夠掃描出這些缺陷,并提醒用戶下載補(bǔ)丁包。當(dāng)然更為安全的策略,是定期到Oracle官方網(wǎng)站上進(jìn)行訪問,看是否有新的補(bǔ)丁包發(fā)布并進(jìn)行安裝。
3.5、數(shù)據(jù)庫防火墻(第三層)
當(dāng)然有些生產(chǎn)或測試環(huán)境因?yàn)榉N種原因無法對數(shù)據(jù)庫進(jìn)行補(bǔ)丁升級,那么建議在數(shù)據(jù)庫服務(wù)器和應(yīng)用服務(wù)器之間加入帶有虛擬補(bǔ)丁(可以起到打oracle升級包效果)功能的數(shù)據(jù)庫防火墻產(chǎn)品。這樣既不對數(shù)據(jù)庫服務(wù)器有任何變化,還同時能阻止黑客使用未修復(fù)的TNS Listener漏洞。數(shù)據(jù)庫防火墻還可以通過設(shè)置對SQL語句、客戶端IP地址、應(yīng)用服務(wù)請求等進(jìn)行人為禁止。為數(shù)據(jù)庫搭建可信的安全訪問環(huán)境。
當(dāng)數(shù)據(jù)庫防火墻被部署于上圖所示的位置的時,將把數(shù)據(jù)庫從整個網(wǎng)絡(luò)環(huán)境中隔離出去。禁止一切對數(shù)據(jù)庫的非法偵測。
最壞的情況是黑客通過TNS Listener的漏洞,獲取了數(shù)據(jù)庫本地操作系統(tǒng)權(quán)限或是數(shù)據(jù)庫DBA權(quán)限。批量導(dǎo)出數(shù)據(jù)庫內(nèi)存儲的核心信息。為了保護(hù)那些核心信息,我們可以通過數(shù)據(jù)庫保險箱對整個數(shù)據(jù)庫進(jìn)行加密操作。只要未獲取加密時對應(yīng)的KEY。即便是DBA權(quán)限也只能看到的是加密后的亂碼無法從中獲取有用信息。從源頭上保護(hù)了數(shù)據(jù)庫中存儲的敏感信息。
本文提供了四個層次的防護(hù)手段。這四個層次涵蓋了六種應(yīng)對TNS Listener安全威脅的防護(hù)手段。如果管理者或管理員能把這六種防護(hù)手段結(jié)合使用,將杜絕TNS Listener帶來的安全威脅。
本文分析了TNS Listener漏洞帶來的五種安全威脅:TNS Listener服務(wù)崩潰漏洞(第一類)、TNS 劫持(第二類第一種)、破解TNS默認(rèn)加密方式(第二類第二種)、遠(yuǎn)程非法創(chuàng)建新DBA權(quán)限用戶(第二類第三種)、通過TNS奪取操作系統(tǒng)(第三類)。同時提出了四層防護(hù)手段:數(shù)據(jù)庫弱口令檢查、定期更換oracle推薦的密碼、TNS Listener加密、下載對應(yīng)官方補(bǔ)丁包、數(shù)據(jù)庫防火墻、數(shù)據(jù)庫加密。當(dāng)然對TNS Listener漏洞的安全威脅和防護(hù)的研究,需要持續(xù)不斷地進(jìn)行下去,更關(guān)鍵的是要不斷地普及防護(hù)意識和技術(shù),才能有效保護(hù)政府部門的信息安全。