Oracle數(shù)據(jù)庫密碼存儲(chǔ)和驗(yàn)證過程

Oracle雖然是目前市場(chǎng)占有率第一的數(shù)據(jù)庫產(chǎn)品,但是自身存在的安全問題也是非常多的。當(dāng)然攻擊者對(duì)于Oracle數(shù)據(jù)庫的攻擊也屢見不鮮,攻擊者是怎樣攻擊數(shù)據(jù)庫呢?攻擊者針對(duì)數(shù)據(jù)庫的身份驗(yàn)證過程主要采取兩種策略:一種是繞過數(shù)據(jù)庫身份驗(yàn)證過程,一種是是攻破數(shù)據(jù)庫身份驗(yàn)證過程。

利用Oracle的默認(rèn)密碼和Oracle密碼特點(diǎn)破解密碼

獲取Oracle密碼的暴力破解方法,除去通用的排列組、字典破解等方式外,Oracle 自身存在一些默認(rèn)用戶名密碼,例如智能代理賬戶DBSNMP/DBSNMP。這是Oracle 中最可能被忘記修改的默認(rèn)用戶名和密碼。造成這一現(xiàn)象的原因是智能代理的密碼需要在兩個(gè)不同的地方進(jìn)行修改,首先要在數(shù)據(jù)庫中對(duì)DBSNMP用戶密碼進(jìn)行修改,其次需要在snmp_rw.ora這個(gè)文件中再次進(jìn)行密碼修改。

還有Oracle登陸包中會(huì)帶有數(shù)據(jù)庫密碼位數(shù)的信息,這是由于數(shù)據(jù)庫服務(wù)器和客戶端之間加密協(xié)議造成的。在數(shù)據(jù)庫的登錄信息包中存在一個(gè)關(guān)鍵字段AUTH_PASSWORD,這個(gè)字段是客戶端對(duì)密碼進(jìn)行加密后傳出的,這個(gè)參數(shù)的長度和原密碼的長度密切相關(guān)。我們以O(shè)racle 11g為例這個(gè)AUTH_PASSWORD的長度是96位預(yù)示著密碼明文的長度應(yīng)該是16-30位之間(Oracle密碼長度最大不超過30位)。

Oracle數(shù)據(jù)庫密碼存儲(chǔ)和驗(yàn)證過程

下圖中AUTH_PASSWORD的長度是64位預(yù)示著密碼明文的長度應(yīng)該是1-15位之間。

Oracle數(shù)據(jù)庫密碼存儲(chǔ)和驗(yàn)證過程

這一特點(diǎn)不是11g版本獨(dú)有的,oracle所有版本都有類似的特點(diǎn)。通過包中AUTH_PASSWORD位數(shù)確定密碼的位數(shù),此舉將有效的降低暴力破解的成本。

從Oracle本地文件獲取密碼

雖然可以進(jìn)行一定的優(yōu)化,但暴力破解本質(zhì)還是靠大量的訪問鏈接進(jìn)行測(cè)試。除了暴力破解外還存在著更為簡便的獲得密碼的方法。假設(shè)已經(jīng)可以訪問數(shù)據(jù)庫所在主機(jī)的文件系統(tǒng),那么可以通過Oracle的一些本該刪除的文件獲得數(shù)據(jù)庫密碼信息。例如在數(shù)據(jù)庫四大用戶中SYSMAN的密碼會(huì)以密文的形式被寫入到文件中,但是同時(shí)也會(huì)把密鑰寫入到同一個(gè)文檔中。例如C:\app\lsc\product\11.2.0\dbhome_1\sysman\config下的emoms.properties 中存儲(chǔ)了 SYSMAN的密碼和密鑰。打開emoms.propeties

Oracle數(shù)據(jù)庫密碼存儲(chǔ)和驗(yàn)證過程

圖中畫紅線的位置:

oracle.sysman.eml.mntr.emdRepPwd記錄的是sysman的密碼,oracle.sysman.eml.mntr.emdRepPwdSeed記錄的是對(duì)應(yīng)密碼的密鑰。

同時(shí)得到了密文與密鑰用DES解密器可以獲得密碼原文

Oracle數(shù)據(jù)庫密碼存儲(chǔ)和驗(yàn)證過程

如果數(shù)據(jù)庫管理中多個(gè)賬號(hào)采用統(tǒng)一密碼,就會(huì)導(dǎo)致直接外泄SYS/SYSTEM密碼。

在Oracle主目錄的cfgtoologs文件夾中還存在一些會(huì)暴露密碼信息的文件。

利用Oracle加密原理破解密碼

除了以上兩種獲取密碼的方法外還有更加直接的辦法,這種方法就是通過理解Oracle的密鑰傳輸過程破解Oracle通訊協(xié)議中的密文。(下面以O(shè)racle 9i為例說明這一方法,10、11原理類似,只是更加復(fù)雜)

首先拿一個(gè)Oracle登錄包來說明整個(gè)過程。首先客戶端給服務(wù)器發(fā)送SERVICE_NAME。

Oracle數(shù)據(jù)庫密碼存儲(chǔ)和驗(yàn)證過程

這一發(fā)送過程如果沒有向Listener登記該服務(wù),那么Listener會(huì)生成一個(gè)錯(cuò)誤,則終止所有過程。如果成功則進(jìn)入身份驗(yàn)證過程,首先客戶端向服務(wù)器發(fā)送一個(gè)含有用戶名的數(shù)據(jù)包,服務(wù)器判斷用戶名存在后從數(shù)據(jù)庫中提取出該用戶名的散列值,服務(wù)器使用這個(gè)散列值生成一個(gè)密碼。

這個(gè)密碼的生成過程是服務(wù)器調(diào)用orageneric庫中的函數(shù)slgdt()過程。slgdt()函數(shù)是用來重新獲得系統(tǒng)時(shí)間的,將分鐘、小時(shí)、秒、毫秒結(jié)合起來形成一個(gè)用來加密的8個(gè)字節(jié)的“文本”。文本的前四位是由分鐘和小時(shí)與用戶名對(duì)應(yīng)的散列的后四位進(jìn)行異或運(yùn)算得出,文本的后四位是由秒和毫秒與用戶名對(duì)應(yīng)的散列的前四位進(jìn)行異或運(yùn)算得出。

加密過程通過調(diào)用oracommon庫中的函數(shù)kzsrenc(),使用該密鑰對(duì)文本進(jìn)行加密。通過使用函數(shù)lncgks(),函數(shù)kzsrenc()基本完成了DES密鑰的生成,最后利用函數(shù)incecb()輸出ecb模式下的DES密文,這里生成的密文就是密碼。接著再次調(diào)用函數(shù)kzsrenc(),利用用戶的密碼散列值對(duì)該密碼加密,這樣調(diào)用的結(jié)果就是AUTH_SESSKEY然后發(fā)送給客戶端。

Oracle數(shù)據(jù)庫密碼存儲(chǔ)和驗(yàn)證過程

收到AUTH_SESSKEY后,客戶端將其重新解密并重新獲得該密碼。用戶利用oracore庫中的函數(shù)lncupw()創(chuàng)建自己密碼散列值的一個(gè)副本,然后通過調(diào)用函數(shù)kzsrdec(),將該散列值用作對(duì)AUTH_SESSKEY進(jìn)行解密的密鑰。這一過程順利完成后就會(huì)生成密碼。

這個(gè)密碼通過調(diào)用函數(shù)kzsrenp()作為密鑰對(duì)其中的明文、大小寫敏感字符進(jìn)行加密。kzsrenp()函數(shù)完成了DES密鑰的生成以及在CBC模式下用戶密碼的加密。接下來,密文以AUTH_PASSWORD的形式被送回服務(wù)器。

Oracle數(shù)據(jù)庫密碼存儲(chǔ)和驗(yàn)證過程4

服務(wù)器調(diào)用oracommon庫中的函數(shù)kzsrdep(),利用密鑰密碼對(duì)AUTH_PASSWORD進(jìn)行解密,這個(gè)時(shí)候服務(wù)器就擁有了明文密碼的一個(gè)副本,然后服務(wù)器創(chuàng)建密碼的散列值并將它與數(shù)據(jù)庫中的散列值進(jìn)行比較,如果匹配成功,那么用戶就完成了整個(gè)身份驗(yàn)證。清楚這里面的原理就可以按照Oracle的思路在網(wǎng)絡(luò)上嗅探到AUTH_SESSKEY和AUTH_PASSWORD,然后利用暴力破解破解出散列值,最終利用散列值A(chǔ)UTH_SESSKEY獲得密碼。

對(duì)于Oracle數(shù)據(jù)庫來說,默認(rèn)的用戶要經(jīng)常的進(jìn)行修改密碼,或者要定期的升級(jí)數(shù)據(jù)庫的版本,并且對(duì)一些可能泄漏數(shù)據(jù)的配置文件進(jìn)行加密,防止泄漏一些數(shù)據(jù)。從多方面進(jìn)行著手,來防止攻擊者對(duì)Oracle數(shù)據(jù)庫的攻擊導(dǎo)致密碼的泄漏。