前言:
本文還是去年年初寫(xiě)的,當(dāng)時(shí)出于安全考慮沒(méi)放出來(lái)。現(xiàn)在部分網(wǎng)上銀行已大幅度降低了無(wú)高級(jí)別安全措施情況下的轉(zhuǎn)賬限額,并建議用戶使用動(dòng)態(tài)口令卡或者USBKey,總體安全系數(shù)有所提高。
隨著子商務(wù)的普及,網(wǎng)上銀行以及在線電子支付等方式逐漸被網(wǎng)民所接受和喜愛(ài)。但是網(wǎng)上銀行以及電子商務(wù)支付平臺(tái)的安全性不容樂(lè)觀。盡管各網(wǎng)上銀行采取SSL加密防止通過(guò)嗅探網(wǎng)絡(luò)封包的方式截取密碼;對(duì)于防止WEB登陸時(shí)密碼被竊取,網(wǎng)上銀行采取了安全控件或者動(dòng)態(tài)軟鍵盤(pán)的方法,但考慮的仍不全面,我們還是能采取相應(yīng)的方法截獲用戶輸入的密碼。
下面就以具有代表性的四大銀行:中國(guó)工商銀行(601398,股吧)、中國(guó)農(nóng)業(yè)銀行、中國(guó)建設(shè)銀行(601939,股吧)、中國(guó)銀行(601988,股吧);商業(yè)銀行:招商銀行(600036,股吧);電子支付平臺(tái):阿里巴巴支付寶等為例,分別就客戶端密碼方面進(jìn)行脆弱性分析。網(wǎng)上銀行以及其他電子商務(wù)支付平臺(tái)的WEB登陸安全性直接與用戶的經(jīng)濟(jì)利益相關(guān),所以有必要不遺余力的加強(qiáng)WEB登陸安全性的建設(shè)。另外由于不是所有的用戶都使用數(shù)字證書(shū)和U盾之類安全認(rèn)證產(chǎn)品,所以“黑客”只要截取到用戶的登陸密碼以及支付密碼就能隨心所欲的轉(zhuǎn)帳/支付,危害甚大。
本文談的是采用純技術(shù)截取密碼,而不是用假頁(yè)面假接口等釣魚(yú)方式騙取密碼的方法。
網(wǎng)上銀行對(duì)于防止密碼被盜分別采用了安全控件和動(dòng)態(tài)軟鍵盤(pán)的方法:
1、采取安全控件的,典型代表有:中國(guó)工商銀行、招商銀行、阿里巴巴支付寶等
這類安全控件考慮還算全面,防止了鍵盤(pán)/消息鉤子,而且使通過(guò)IE的COM接口獲取密碼的方法也無(wú)能為力。但是這類安全控件做得不夠底層,考慮得欠深入。
我們采用鍵盤(pán)過(guò)濾驅(qū)動(dòng)的方法就可以突破安全控件的保護(hù)記錄密碼了。除了鍵盤(pán)過(guò)濾驅(qū)動(dòng)方法外還可以掛接IDT(中斷描述符表)的鍵盤(pán)入口,或者掛鉤鍵盤(pán)驅(qū)動(dòng)Dispatch例程以及Inlinehook相應(yīng)IRP分發(fā)函數(shù)。當(dāng)然,更深入點(diǎn)的話還可以掛鉤i8042prt.sys。
不過(guò)由于編寫(xiě)驅(qū)動(dòng)程序不同與開(kāi)發(fā)普通的應(yīng)用程序,難度稍大,所以目前還未見(jiàn)公開(kāi)的采用此技術(shù)截取這些網(wǎng)上銀行密碼的木馬。但是開(kāi)發(fā)起來(lái)也并不是太困難,相對(duì)而言采取鍵盤(pán)過(guò)濾驅(qū)動(dòng)的方法較通用穩(wěn)定。
基本原理是我們的驅(qū)動(dòng)創(chuàng)建一個(gè)設(shè)備附加到鍵盤(pán)驅(qū)動(dòng)Kbdclass下的設(shè)備,這樣所有的IRP(輸入輸出請(qǐng)求包)包都將先發(fā)給我們的驅(qū)動(dòng)程序,然后再轉(zhuǎn)發(fā)給系統(tǒng)中的鍵盤(pán)驅(qū)動(dòng),我們的驅(qū)動(dòng)程序獲取IRP后就可以從中獲得鍵盤(pán)的scancode掃描碼,這樣就能在系統(tǒng)內(nèi)核的層面獲得鍵盤(pán)輸入信息。鍵盤(pán)過(guò)濾驅(qū)動(dòng)的部分代碼如下:
NTSTATUS HookKeyboard(IN PDRIVER_T pDrivert)
PDEVICE_T pKeyboardDevicet;
NTSTATUS status=IoCreateDevice(pDrivert,sizeof(DEVICE_EXTENSION),NULL,FILE_DEVICE_KEYBOARD, 0, true, &pKeyboardDevicet);
pKeyboardDevicet->Flags =pKeyboardDevicet->Flags(DO_BUFFERED_IO DO_POWER_PAGABLE);
pKeyboardDevicet->Flags=pKeyboardDevicet->Flags&~DO_DEVICE_INITIALIZING;
RtlZeroMemory(pKeyboardDevicet->DeviceExtension,sizeof(DEVICE_EXTENSION));
PDEVICE_EXTENSIONpKeyboardDeviceExtension=(PDEVICE_EXTENSION)pKeyboardDevicet->DeviceExtension;
CCHAR ntNameBuffer[64] = "\\Device\\KeyboardClass0";
STRING ntNameString;
UNICODE_STRING uKeyboardDeviceName;
RtlInitAnsiString( &ntNameString, ntNameBuffer );
RtlAnsiStringToUnicodeString(&uKeyboardDeviceName,&ntNameString, TRUE );
IoAttachDevice(pKeyboardDevicet,&uKeyboardDeviceName,&pKeyboardDeviceExtension->pKeyboardDevice);
RtlFreeUnicodeString(&uKeyboardDeviceName);
return STATUS_SUCCESS;
下面以工商銀行的網(wǎng)上銀行為例,演示我們的程序。為了演示,我們的驅(qū)動(dòng)程序?qū)?shí)時(shí)打印出獲得的鍵盤(pán)記錄的信息,并且把完整的信息記錄到磁盤(pán)文件上。招商銀行、阿里巴巴支付寶等效果等同,支付密碼用此法同樣能截取。截取時(shí)實(shí)時(shí)打印的信息如圖1:,記錄到文件里的完整信息:如圖2:。合發(fā)送郵件或者ASP/PHP留言的方式我們就能遠(yuǎn)程的得到密碼。
2、采取動(dòng)態(tài)軟鍵盤(pán)的,典型代表有:中國(guó)建設(shè)銀行、中國(guó)銀行、中國(guó)農(nóng)業(yè)銀行
采用動(dòng)態(tài)軟鍵盤(pán)技術(shù)初看確實(shí)能使攻擊者無(wú)法截獲密碼,但是截取密碼的方法不僅僅是接截獲鍵盤(pán)記錄一種方法。我們可以通過(guò)IE的COM獲取的密碼。
對(duì)于中國(guó)建設(shè)銀行,通過(guò)IE的COM接口獲取的密碼框里的內(nèi)容就是密碼,其他大部分采用軟鍵盤(pán)技術(shù)的網(wǎng)站大都也是這樣。但是中國(guó)農(nóng)業(yè)銀行WEB程序中做了一點(diǎn)處理,通過(guò)鼠標(biāo)點(diǎn)擊軟鍵盤(pán)傳入密框的內(nèi)容不是實(shí)際密碼而是按鈕序號(hào),所以我們只要枚舉當(dāng)前窗口,發(fā)現(xiàn)是中國(guó)農(nóng)業(yè)銀行的網(wǎng)上銀行頁(yè)面時(shí),我們的程序就自動(dòng)截圖發(fā)給我們,我們根據(jù)所截獲得的圖象和通過(guò)IE的COM接口所獲得的序號(hào)偽密碼之間的關(guān)系進(jìn)行轉(zhuǎn)換(抽象為一個(gè)簡(jiǎn)單的函數(shù)映射),很容易的。這樣便獲得了農(nóng)行網(wǎng)上銀行的密碼。下面是截取中國(guó)建設(shè)銀行網(wǎng)上銀行密碼的演示截圖,利用動(dòng)態(tài)軟鍵盤(pán)的其他網(wǎng)站效果相同。如圖3:(衍生:對(duì)付應(yīng)用程序的部分軟鍵盤(pán)可以運(yùn)用HookTextOutW/A的類似屏幕取詞的方法來(lái)截取。)
后記:
盡管網(wǎng)上銀行等電子支付平臺(tái)在密碼防盜方面做了安全考慮,但是還是不夠安全。不過(guò)大家也大可不必因此不使用網(wǎng)上銀行,采取數(shù)字證書(shū)以及USBKey(比如U盾)等安全措施相對(duì)而言還是比較安全的。
|