視窗操作系統(tǒng)密碼體系的弱點(diǎn)及對策(圖)
更新時間:2007年01月16日 00:00:00 作者:
一、問題的提出
本文僅就此處所列的幾個在實(shí)際工作里發(fā)現(xiàn)的問題,對目前普遍使用的視窗操作系統(tǒng)里隱藏的幾個有關(guān)密碼體系的危險弱點(diǎn)進(jìn)行了分析并給出相應(yīng)對策,這些危險弱點(diǎn)導(dǎo)致的計(jì)算機(jī)安全隱患,希望能引起相關(guān)用戶的重視。
1、視窗操作系統(tǒng)“用戶登錄”對話框問題
圖A是大家熟悉的“用戶登錄”對話框:
圖A
大家都知道,只要愿意,現(xiàn)在可以通過很多能方便從互聯(lián)網(wǎng)上下載的實(shí)用程式對圖A所示的“TesT”用戶進(jìn)行“Crack”以獲得其原先設(shè)定在TesT.PwL文件內(nèi)的正確密碼,盡管這需要耗些時間,目的是能假冒用戶“TesT”登錄操作系統(tǒng)或應(yīng)用系統(tǒng),以逃避安全審計(jì)系統(tǒng)。
問題是視窗操作系統(tǒng)其內(nèi)置的密碼安全體系存在很多弱點(diǎn)甚至缺陷,導(dǎo)致對于上述操作系統(tǒng)起碼的安全環(huán)節(jié)——用戶登錄,只需對一個名為“■spwL”的系統(tǒng)動態(tài)鏈接庫文件,僅僅修改其“一個”字節(jié)后,視窗操作系統(tǒng)這個起碼的安全環(huán)節(jié)就告失效!利用這個弱點(diǎn)相比上述“Crack”方法幾乎沒有“時間成本”。
相關(guān)實(shí)驗(yàn):
在視窗操作系統(tǒng)內(nèi)找到名為“■spwL”的系統(tǒng)動態(tài)鏈接庫文件,然后在常見的十六進(jìn)制編輯器里搜索十六進(jìn)制串{ B9 10 00 00 00 2B }后將其間的{ 10 }改為{ 00 }即上述十六進(jìn)制串被改動一個字節(jié)后變?yōu)閧 B9 00 00 00 00 2B },即:
搜索 → B9 10 00 00 00 2B
替為 → B9 00 00 00 00 2B |
保存這個改動,然后嘗試再次登錄,就會發(fā)現(xiàn),所有在系統(tǒng)初始化文件里記錄的用戶,都可以任意的密碼甚至僅僅一個回車鍵的形式輕松登錄,而“合法”用戶很難察覺。
2、視窗操作系統(tǒng)“標(biāo)識登錄”對話框問題
圖B是大家熟悉的“標(biāo)識登錄”對話框:
圖B
這個“標(biāo)識登錄”對話框最常見的是在用戶試圖使用視窗操作系統(tǒng)內(nèi)置的OutLooK Express電子郵件組件時由視窗操作系統(tǒng)彈出。當(dāng)用戶選擇自己的標(biāo)識并輸入正確的密碼后即可通過OutLooK Express收發(fā)電子郵件。
同樣地,大家可以在互聯(lián)網(wǎng)上下載一些相關(guān)的實(shí)用程式來“Crack”上述“TesT” 標(biāo)識的密碼,然后可以假冒合法用戶的標(biāo)識收發(fā)郵件,但是通過這些實(shí)用程式執(zhí)行后需要消耗時間才能獲得結(jié)果。
同樣地,我們發(fā)現(xiàn)視窗操作系統(tǒng)內(nèi)置的密碼安全體系存在的相關(guān)弱點(diǎn),導(dǎo)致用戶的“標(biāo)識密碼”形同虛設(shè)——只需對一個名為“■sidenT”的系統(tǒng)動態(tài)鏈接庫文件,僅僅修改其“二個”字節(jié)后,視窗操作系統(tǒng)的這個安全環(huán)節(jié)也告失效。
相關(guān)實(shí)驗(yàn):
在視窗操作系統(tǒng)內(nèi)找到名為“■sidenT”的系統(tǒng)動態(tài)鏈接庫文件,然后在常見的十六進(jìn)制編輯器里搜索十六進(jìn)制串{ 8A188AD33A19751A84D274128A5801}后將其間的{ 18 }改為{ 19 }及{ 58 }改為{ 59 }即上述十六進(jìn)制串被改動二個字節(jié)后變?yōu)閧 8A198AD33A19751A 84D27412 8A5901 },即:
搜索 → 8A 18 8AD3 3A19 751A 84D2 7412 8A 58 01
替為 → 8A 19 8AD3 3A19 751A 84D2 7412 8A 59 01 |
保存這個改動,然后嘗試再次登錄,就會發(fā)現(xiàn),所有標(biāo)識,都可以任意的密碼甚至僅僅一個回車鍵的形式輕松登錄!而被冒認(rèn)的“標(biāo)識”所有者很難察覺!
3、視窗操作系統(tǒng)“連接登錄”對話框問題
圖C大家熟悉的“連接登錄”對話框:
圖C
大家都知道,目前可以方便地通過實(shí)用程式,對密碼形式的文本框進(jìn)行“透視”。這里我們不討論這些內(nèi)容,我們希望通過對視窗操作系統(tǒng)的密碼安全體系里存在的危險弱點(diǎn)進(jìn)行討論,讓大家在自己的應(yīng)用系統(tǒng)里避免類似的疏漏,讓我們自己的的應(yīng)用系統(tǒng)更為安全。
我們發(fā)現(xiàn)視窗操作系統(tǒng)內(nèi)置的密碼安全體系存在的相關(guān)弱點(diǎn),導(dǎo)致上述“TesT”用戶的密碼在內(nèi)存里竟以明碼出現(xiàn),根本無須“透視”而只要在內(nèi)存里稍微探查一下即可。
相關(guān)實(shí)驗(yàn):
使用運(yùn)行在系統(tǒng)級的內(nèi)存探查程序或調(diào)試器,我們可以輕而易舉地在系統(tǒng)內(nèi)存探查到圖C的連接登錄密碼(圖C“TesT”用戶事先設(shè)定的密碼是“Chinese!10-01-1949” ):
視窗操作系統(tǒng)之“連接登錄”密碼內(nèi)存探查結(jié)果[2]
地址80FD9E2A起
00 00 00 00 00 00 00 00-00 00 3F 03 8C 03 26 01 ..........?...&.
43 68 69 6E 65 73 65 21-31 30 2D 30 31 2D 31 39 Chinese!10-01-19
34 39 00 00 00 00 00 00-00 00 00 00 00 00 00 00 49..............
00 00 67 03 B4 03 22 01-54 65 73 54 00 00 00 00 ..g...".TesT.... |
在上述探查結(jié)果里,我們可以輕易發(fā)現(xiàn)“TesT”用戶的連接密碼為“Chinese!10-01-1949”。
4、視窗操作系統(tǒng)“共享登錄”設(shè)置對話框問題
圖D是大家熟悉的“共享登錄”設(shè)置對話框:
圖 D
大家知道,上述對話框同樣可以方便地通過實(shí)用程式,對密碼形式的文本框進(jìn)行“透視”。這里我們不討論這些內(nèi)容,我們換一個角度來討論。
我們發(fā)現(xiàn)視窗操作系統(tǒng)內(nèi)置的密碼安全體系存在的相關(guān)弱點(diǎn),同樣導(dǎo)致上述“TesT”用戶的“只讀”密碼以及“完全訪問”密碼在內(nèi)存里以明碼出現(xiàn),根本無須“透視”而只要在內(nèi)存里稍微探查一下即可。
相關(guān)實(shí)驗(yàn):
使用運(yùn)行在系統(tǒng)級的內(nèi)存探查程序或調(diào)試器,我們可以輕而易舉地在系統(tǒng)內(nèi)存探查到圖D的共享登錄設(shè)置密碼(圖D“TesT”用戶事先設(shè)定的“只讀”密碼以及“完全訪問”密碼分別是“TesTTesT” 及“!!GoTo!!”——最多八個字符):
視窗操作系統(tǒng)之“共享登錄”設(shè)置密碼內(nèi)存探查結(jié)果
地址816B55D2起
00 00 B6 0F 00 00 00 40-00 00 E7 02 64 03 2A 01 .......@.
54 65 73 54 54 65 73 54-00 00 00 00 00 00 00 00 TesTTesT.
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .........
00 00 3F 03 8C 03 26 01-00 00 00 00 00 00 00 00 ..?...&..
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .........
00 00 00 00 00 00 00 00-00 00 67 03 B4 03 22 01 .........
54 65 73 54 00 00 00 00-00 00 00 00 00 00 00 00 TesT.....
地址816B57F2起
00 00 06 00 00 00 00 00-05 00 57 04 74 06 2E 01 .........
21 21 47 6F 54 6F 21 21-00 00 00 00 00 00 00 00 !!GoTo!!. |
在上述探查結(jié)果里,我們可以輕易地發(fā)現(xiàn)“TesT”用戶的“只讀”密碼為“TesTTesT”同時其 “完全訪問”密碼為“!!GoTo!!”)。
二、問題的分析及對策
1、關(guān)于視窗操作系統(tǒng)“用戶登錄”對話框問題
我們將視窗操作系統(tǒng)內(nèi)“用戶登錄”密碼研判的核心代碼列出來分析如下。
: :
以上進(jìn)行了多次單向HasH運(yùn)算并得到長度為128位的HasH串(具體算法分析略)然后與保存在對應(yīng)PWL文件內(nèi)的正確值比對,詳見以下代碼。
: :
7FA71D97 B910000000 mov ecx, 00000010 ;HasH串為128位即16個字節(jié)
7FA71D9C 2BC0 sub eax, eax ;初始化EAX寄存器
7FA71D9E F3 repz
7FA71D9F A6 cmpsb ;進(jìn)行128位HasH串比對
7FA71DA0 7405 je 7FA71DA7 ;相等,系統(tǒng)認(rèn)為用戶密碼正確
7FA71DA2 1BC0 sbb eax, eax ;否則置密碼比對錯誤標(biāo)志
7FA71DA4 83D8FF sbb eax, FFFFFFFF
7FA71DA7 85C0 test eax, eax ;測試密碼比對標(biāo)志位
7FA71DA9 B8261C0000 mov eax, 00001C26 ;預(yù)置密碼錯誤消息
7FA71DAE 7502 jne 7FA71DB2 ;密碼比對錯誤,則轉(zhuǎn)
7FA71DB0 33C0 xor eax, eax ;否則置密碼比對正確位
7FA71DB2 5F pop edi ;恢復(fù)現(xiàn)場
7FA71DB3 5E pop esi ;恢復(fù)現(xiàn)場
7FA71DB4 5B pop ebx ;恢復(fù)現(xiàn)場
7FA71DB5 8BE5 mov esp, ebp ;恢復(fù)現(xiàn)場
7FA71DB7 5D pop ebp ;恢復(fù)現(xiàn)場
7FA71DB8 C20400 ret 0004 ;返回
: : |
從上述分析可見,當(dāng)我們將密碼比對的長度由“0x10H” 改為“0”——也就是將上述
將 mov ecx, 00000010
改為 → mov ecx, 00000000 |
僅僅改動“一個”字節(jié),“用戶登錄”密碼的比對結(jié)果就將“永遠(yuǎn)”正確。
僅僅依賴一條“repz cmpsb”指令對系統(tǒng)級的密碼進(jìn)行決定性研判是相當(dāng)危險的,而僅僅通過一條件語句來選擇視窗操作系統(tǒng)的密碼安全類指令的決定性流向,其實(shí)是很“傳統(tǒng)”的低級做法,保護(hù)效果相當(dāng)脆弱。因?yàn)椴徽摬僮飨到y(tǒng)采用的單向HasH結(jié)果長度多么“驚人”也不論操作系統(tǒng)在執(zhí)行“repz cmpsb”這條研判指令之前進(jìn)行了多少輪大負(fù)荷的迭代編碼,我們只要在這一條“關(guān)鍵路徑”上實(shí)施“點(diǎn)穴”——這個層次的安全保護(hù)即告失效。
對策:
視窗操作系統(tǒng)在這里的最大“疏忽”就是對“苦心積慮”最后獲得的128位HasH串僅僅參與簡單的比對,并沒有進(jìn)行更有效的利用,建議:
將上述最后運(yùn)算出來的128位HasH串不論其對錯都作為新一輪解碼迭代運(yùn)算的輸入算子,對后續(xù)的部分關(guān)鍵代碼或數(shù)據(jù)實(shí)施解碼,這樣用戶輸入正確的密碼后自然能正確地繼續(xù)裝載視窗操作系統(tǒng),否則只能導(dǎo)致錯誤提示而無法繼續(xù)正確地裝載視窗操作系統(tǒng)。
事實(shí)上這是一個明顯的安全漏洞。不要認(rèn)為存儲設(shè)備上的系統(tǒng)級文件設(shè)置了“只讀”、“隱藏”等權(quán)限,就可以高枕無憂。事實(shí)上,只要系統(tǒng)的存儲設(shè)備可以被“物理”地讀寫,那么對其上敏感的系統(tǒng)級文件進(jìn)行“篡改”就不會是一件“相當(dāng)”困難的事情。而在大多數(shù)情況下,這件事還是比較容易做到的。有關(guān)這個安全漏洞的更進(jìn)一步討論,我們將在《脆弱的軟件著作權(quán)保護(hù)方式及對策》一文里進(jìn)行,并相應(yīng)地給出一個有效的解決方案。
2、關(guān)于視窗操作系統(tǒng)“標(biāo)識登錄”對話框問題
我們將視窗操作系統(tǒng)內(nèi)“標(biāo)識登錄”密碼研判的核心代碼列出來分析如下。
: : ┏ ECX、EAX分別指向用戶輸入密碼及正確密碼
797972C3 8D4DE8 lea ecx, dword ptr [ebp-18]
797972C6 8D85E8FDFFFF lea eax, dword ptr [ebp+FFFFFDE8]
797972CC 8A18 mov bl, byte ptr [eax] ;獲取第一個密碼字符
797972CE 8AD3 mov dl, bl ;保存起副本
797972D0 3A19 cmp bl, byte ptr [ecx] ;與正確的密碼比對
797972D2 751A jne 797972EE ;第一個密碼字符不正確
797972D4 84D2 test dl, dl ;為最后一個密碼字符?
797972D6 7412 je 797972EA ;是則轉(zhuǎn)
797972D8 8A5801 mov bl, byte ptr [eax+01] ;獲取下一密碼字符
797972DB 8AD3 mov dl, bl ;保存其副本
797972DD 3A5901 cmp bl, byte ptr [ecx+01] ;與正確的密碼比對
797972E0 750C jne 797972EE ;比對不成功則轉(zhuǎn)
797972E2 40 inc eax ;調(diào)整當(dāng)前密碼字符指針
797972E3 40 inc eax ;調(diào)整當(dāng)前密碼字符指針
797972E4 41 inc ecx ;調(diào)整正確密碼字符指針
797972E5 41 inc ecx ;調(diào)整正確密碼字符指針
797972E6 84D2 test dl, dl ;為最后一個密碼字符?
797972E8 75E2 jne 797972CC ;尚未比對完則轉(zhuǎn)
797972EA 33C0 xor eax, eax ;比對結(jié)束并且全部正確
797972EC EB05 jmp 797972F3 ;轉(zhuǎn)后續(xù)測試標(biāo)志位
797972EE 1BC0 sbb eax, eax ;比對結(jié)束但是不正確
797972F0 83D8FF sbb eax, FFFFFFFF ;置錯誤標(biāo)志位
797972F3 85C0 test eax, eax ;測試標(biāo)志位
797972F5 7434 je 7979732B ;密碼比對正確則轉(zhuǎn)
: : |
從上述分析可見,當(dāng)我們將密碼比對的二個指針EAX、ECX均指向同一個地址——也就是將上述
將 mov bl, byte ptr [eax]
改為 → mov bl, byte ptr [ecx]
將 mov bl, byte ptr [eax+01]
改為 → mov bl, byte ptr [ecx+01] |
僅僅改動“二個”字節(jié),“標(biāo)識登錄”密碼的比對結(jié)果就將“永遠(yuǎn)”正確。這同樣是一個明顯的安全漏洞。這個漏洞源自明文密碼比較的指令過于接近,很容易通過對有關(guān)的指令代碼進(jìn)行“篡改”達(dá)到“冒名”攻擊的目的。
對策:
首先我們要盡可能避免明文密碼的比較,并盡可能地將明碼密碼“暗碼”化,即將明文密碼通過穩(wěn)健的摘要密碼算法“撕碎”后“淹沒”在長度至少在128位的高強(qiáng)度單向散列串里(具體參考我們發(fā)表的《大型Web應(yīng)用軟件系統(tǒng)的安全登錄隱患及對策》一文),如果實(shí)在沒有這個“耐性”做這項(xiàng)工作,那至少要考慮將密碼研判的有關(guān)指令“離散”化而不象現(xiàn)在這般前后“緊密”相連,更為安全的做法請參考我們完成的《脆弱的軟件著作權(quán)保護(hù)方式及對策》一文,里頭相應(yīng)地給出一個有效的解決方案。
3、關(guān)于視窗操作系統(tǒng)“連接登錄”對話框問題
原因在于視窗操作系統(tǒng)對這類密碼解碼及研判,既沒有如“用戶登錄”對話框般采用比較安全的“OpeNPassworDCachE”方法對有關(guān)內(nèi)存進(jìn)行分配,也沒有對有關(guān)密碼存儲的內(nèi)存在研判后進(jìn)行必要“清零”。所以我們可以輕而易舉地通過內(nèi)存探查,找到用戶的上述敏感數(shù)據(jù)。
對策:
首先考慮啟用較安全的“OpeNPassworDCachE”方法對有關(guān)內(nèi)存進(jìn)行分配,并確保密碼比較后必須立即執(zhí)行有關(guān)密碼內(nèi)存單元的“清零”工作,以抵御內(nèi)存探查工具“窺視”攻擊。如果需要更安全的密碼研判,就應(yīng)該盡可能避免在內(nèi)存里出現(xiàn)明文密碼,具體做法請參考我們完成的《脆弱的軟件著作權(quán)保護(hù)方式及對策》一文,里頭相應(yīng)地給出一個有效的解決方案。
4、關(guān)于視窗操作系統(tǒng)“共享登錄”設(shè)置對話框問題
原因在于視窗操作系統(tǒng)對這類密碼解碼及研判,既沒有采用比較安全的“OpeNPassworDCachE”方法對有關(guān)內(nèi)存進(jìn)行分配,也沒有對有關(guān)密碼存儲的內(nèi)存在研判后進(jìn)行必要“清零”。所以我們可以輕而易舉地通過內(nèi)存探查,找到用戶的上述敏感數(shù)據(jù)。
對策:
首先考慮啟用較安全的“OpeNPassworDCachE”方法對有關(guān)內(nèi)存進(jìn)行分配,并確保密碼比較后必須立即執(zhí)行有關(guān)密碼內(nèi)存單元的“清零”工作,以抵御內(nèi)存探查工具“窺視”攻擊。如果需要更安全的密碼研判,就應(yīng)該盡可能避免在內(nèi)存里出現(xiàn)明文密碼,具體做法請參考我們完成的《脆弱的軟件著作權(quán)保護(hù)方式及對策》一文,里頭相應(yīng)地給出一個有效的解決方案。
三、結(jié)論
對于被具有起碼強(qiáng)度的穩(wěn)健單向HasH算法保護(hù)的產(chǎn)品,簡單并可能有效但是未必高效的攻擊當(dāng)然首先考慮的是窮舉,當(dāng)然其規(guī)模不能太大,但是對于視窗操作系統(tǒng)產(chǎn)品而言,在大多數(shù)情況下就連窮舉都可以省略,直接“Crack”或直接進(jìn)行內(nèi)存探查就能達(dá)到目的,這是因?yàn)槠錄]有對系統(tǒng)指令代碼及密碼等敏感數(shù)據(jù)所在內(nèi)存的安全性進(jìn)行必要的維護(hù)以及保護(hù):
(1)對于系統(tǒng)指令代碼而言,視窗操作系統(tǒng)大都以常規(guī)形式讀寫、執(zhí)行,缺乏對關(guān)鍵指令代碼進(jìn)行必要的校驗(yàn),以防止其在系統(tǒng)內(nèi)存里被“篡改”。
(2)對于密碼數(shù)據(jù)而言,視窗操作系統(tǒng)將“還原”后的密碼在“使用”完畢后仍以明碼形式遺留在系統(tǒng)內(nèi)存里,而“密碼存儲內(nèi)存在密碼研判后進(jìn)行清零”——這是稍有些密碼安全知識的人的常識性做法,何以視窗操作系統(tǒng)生產(chǎn)商卻出現(xiàn)如此疏忽?
目前我們尚未獲得視窗操作系統(tǒng)生產(chǎn)商在其本土銷售的版本,如果相關(guān)的分析表明僅僅在其國際版本里才存在本文討論的這些密碼安全體系弱點(diǎn),拋開其開發(fā)成本或穩(wěn)定性等托詞,其真正用意值得大家深思。
大家也不要認(rèn)為視窗2K等版本相對而言較安全,就抱著僥幸心理以為沒有上述有關(guān)密碼安全體系方面的弱點(diǎn)。我們的分析包括了視窗2K等版本,就“用戶登錄”對話框問題而言,視窗2K等版本操作系統(tǒng)同樣存在上述安全隱患。只需對一個名為“■sv1_0”的系統(tǒng)動態(tài)鏈接庫文件,僅僅修改其“一個”字節(jié)后,視窗2K等版本操作系統(tǒng)起碼的安全環(huán)節(jié)就告失效。可輕松以超級用戶“Administrator”登錄,利用這個弱點(diǎn)無須“Crack”,有關(guān)的“時間成本”幾乎為零!所以本文的討論還是有代表性的。希望能引起大家必要的重視。
視窗2K版本的相關(guān)實(shí)驗(yàn):
在視窗2K版本操作系統(tǒng)內(nèi)找到名為“■sv1_0”的系統(tǒng)動態(tài)鏈接庫文件,然后在常見的十六進(jìn)制編輯器里搜索十六進(jìn)制串{ F8 10 0F 84 71 FF FF }后將其間的{ 10 }改為{ 00 }即上述十六進(jìn)制串被改動一個字節(jié)后變?yōu)閧 F8 00 0F 84 71 FF FF },即:
搜索 → F8 10 0F 84 71 FF FF
替為 → F8 00 0F 84 71 FF FF |
保存這個改動,然后嘗試以超級用戶“Administrator”登錄,就會發(fā)現(xiàn)相關(guān)的密碼安全弱點(diǎn)。
對策:
這個例子所揭示的安全弱點(diǎn)的有關(guān)對策請參考我們完成的《脆弱的軟件著作權(quán)保護(hù)方式及對策》一文,里頭有更為詳盡的分析。
事實(shí)證明,對于不借助可熱插拔的移動存儲介質(zhì)保存密碼(密鑰)以及缺乏穩(wěn)健的密碼安全體系的視窗操作系統(tǒng),目的明確并具備起碼專業(yè)技能的人員“入侵”視窗操作系統(tǒng)并不是一件困難的事情。(作者單位 Abusys公司)
[1] 本文僅供參考,如果讀者希望重復(fù)實(shí)驗(yàn)及數(shù)據(jù),請一定嚴(yán)格按照本文依照原樣提供的所有指令執(zhí)行,盡管我們知道本文的所有實(shí)驗(yàn)例子都可以安全地被重復(fù),但是讀者行動之前請記住,我們對因此產(chǎn)生的結(jié)果不作任何形式的擔(dān)保。
[2]本文所附圖之具體地址數(shù)值不必拘泥。
相關(guān)文章
再探九酷網(wǎng)絡(luò)個人主頁空間管理系統(tǒng)
再探九酷網(wǎng)絡(luò)個人主頁空間管理系統(tǒng)...2007-01-01河南移動網(wǎng)絡(luò)客服系統(tǒng)驗(yàn)證碼的缺陷分析和利用!
河南移動網(wǎng)絡(luò)客服系統(tǒng)驗(yàn)證碼的缺陷分析和利用!...2007-01-01關(guān)于9行代碼導(dǎo)致系統(tǒng)崩潰的分析整理
關(guān)于9行代碼導(dǎo)致系統(tǒng)崩潰的分析整理...2007-01-01phpwind管理權(quán)限泄露漏洞利用程序發(fā)布
phpwind是國內(nèi)使用非常廣泛的一款程序,由于在程序設(shè)計(jì)上存在錯誤,導(dǎo)致任何人可以取得前臺管理員及斑主權(quán)限,做刪除帖子等任意操作2008-06-06