安卓手機(jī)的NFC功能可截取非接觸IC卡交互數(shù)據(jù),用戶需警惕
理論基礎(chǔ)請(qǐng)看國(guó)外大神的PPT:DEFCON-20-Lee-NFC-Hacking,我大概說一下可用的方案和實(shí)現(xiàn)的功能。僅做測(cè)試,請(qǐng)勿模仿。
核心原理
借助CM9 rom 2012年2月版本,新增的nfc讀寫標(biāo)簽功能,實(shí)現(xiàn)軟件卡模擬。(之前的版本都沒有,google官方版本沒有開放此功能,目前從android 5.0起google開放了其他nfc api以進(jìn)行卡模擬操作,近期微信小程序新增了類似的api,但我還沒有找到已經(jīng)實(shí)現(xiàn)了的方案,大家找到了麻煩告訴我一下啊)。
實(shí)現(xiàn)功能
可以截獲安卓手機(jī)支持的13.56hz nfc無線通訊協(xié)議的所有標(biāo)簽數(shù)據(jù),nfc非接觸黑盒測(cè)試一直沒有太好的方案,要么太高端(需要專業(yè)的設(shè)備),要么不好用(proxmark3也不便宜,監(jiān)聽無線的方式導(dǎo)致截獲數(shù)據(jù)不穩(wěn)定,也沒有現(xiàn)成兒的解決方案,操作的便捷性和交互性也好差)nfcproxy給我們這些偶爾用一用的測(cè)試狗提供了一種低成本高效率的解決方案,支持各種nfc標(biāo)簽,iso 14443標(biāo)準(zhǔn),apdu數(shù)據(jù)也是完整穩(wěn)定的,基于安卓app源碼的二次開發(fā)也非常簡(jiǎn)單,會(huì)java的隨便改改基本都不是問題。基于這個(gè)app可以以軟件方式衍生出多種測(cè)試方式
1、卡和終端之間數(shù)據(jù)的嗅探
2、交互過程中的數(shù)據(jù)修改
3、模擬卡
最關(guān)鍵的還是簡(jiǎn)單,買倆一百來塊錢一個(gè)的二手手機(jī)就可以了。
硬件需求:
兩個(gè)帶nfc功能的android手機(jī)(咸魚最便宜300塊錢以內(nèi)可以搞定)一個(gè)帶非接觸功能的POS或者讀卡器(有個(gè)pos最省事,我有一個(gè)支持銀聯(lián)閃付的pos)自己的銀行卡,支持非接觸支付的,有銀聯(lián)quick pass標(biāo)志的都可以
1、基于支持CM9 rom的安卓手機(jī)一個(gè)
我用的是谷歌親兒子一代 nexus s,ROM是slim 4.3 build 2-OFFICIAL-1332 一個(gè)基于cm的定制版本 android版本 4.3.1。我買得早,略貴,現(xiàn)在閑魚買二手的話沒有必要買這個(gè),后面幾代也都便宜了,二兒子三兒子四兒子什么的,都可以考慮,一加一也可以考慮,略貴。理論上支持CM9的都可以,但由于CM官網(wǎng)已經(jīng)黃了老版本的rom不好找,所以盡量要先找到手機(jī)對(duì)應(yīng)的老版本的rom再?zèng)Q定買啥。
2、帶nfc功能的安卓手機(jī)一個(gè)(最好也支持cm9)
我用的是 三星 GALAXY S2的T版SGH-T989大力神,CM版本是11-20160815-NIGHTLY-hercules,android版本4.4.4 ,cm11好像已經(jīng)去掉軟件卡模擬的功能了,我也沒有去降rom版本,有一個(gè)能用行了。只要不是太奇葩的定制rom,理論上都可以。建議還是選擇支持cm的,比較保險(xiǎn)。硬件選擇同上
軟件需求
https://github.com/nfcproxy/NFCProxy有完整的功能實(shí)現(xiàn),大家可以直接打包使用我基于自己用著方便,整合了emv-bertlv庫,可以直接在app里把交互數(shù)據(jù)拆包。大家可以用著試試我的github地址:https://github.com/alcarl/nfcproxy本地app包下載: nfcproxy-app-debug.apk
使用方法
兩個(gè)手機(jī)都安裝nfcproxy都打開NFC功能連接到同一個(gè)wifi,兩個(gè)手機(jī)之間可以相互訪問
1、proxy端設(shè)置
在支持cm9卡模擬的手機(jī)(我得是nexus s),打開nfcproxy軟件,點(diǎn)設(shè)置,取消 relay mode 單選框IP 地址填另一個(gè)手機(jī)的wifi ip端口 填另一個(gè)手機(jī)的nfcproxy監(jiān)聽端口,默認(rèn)9999encrypt communications 不需要選,自己玩不用加密always keep screen on 隨便debug logging 勾上,可以顯示出卡號(hào)。然后退出設(shè)置。
2、relay端的設(shè)置
在另外一個(gè)手機(jī)(我得是t989),打開nfcproxy軟件,點(diǎn)設(shè)置,勾選 relay mode 單選框IP 地址 不用填端口 填剛剛在另一個(gè)手機(jī)設(shè)置的nfcproxy監(jiān)聽端口,默認(rèn)9999,兩邊一樣就行encrypt communications 不需要選,自己玩不用加密always keep screen on 隨便debug logging 勾上,可以顯示出卡號(hào)。然后退出設(shè)置。
3、測(cè)試
1、將用于relay端的手機(jī),nfcproxy軟件打開貼到銀行卡上,這時(shí)status窗口應(yīng)該提示TechList:android.nfc.tech.IsoDepandroid.nfc.tech.NfcA,如果沒反應(yīng)請(qǐng)檢查nfc是否打開,手機(jī)NFC功能是否正常
2、將POS機(jī)弄到選擇消費(fèi),輸入金額后,提示請(qǐng)刷卡的界面
3、將用于proxy端的手機(jī),nfcproxy軟件打開,去貼到POS機(jī)上執(zhí)行非接刷卡動(dòng)作。
正常情況貼上去后nfcproxy的data窗口會(huì)提示:Reader TAG:Tech[android.nfc.tech.Iso.PcdA]Connecting to NFCRelayConnected to NFCRelayTransaction Complete!這說明已經(jīng)已經(jīng)連上了貼卡那臺(tái)手機(jī),POS機(jī)的請(qǐng)求已經(jīng)轉(zhuǎn)發(fā)到卡上了,并且卡的應(yīng)答已經(jīng)轉(zhuǎn)發(fā)回來了,交易成了。這時(shí)候POS應(yīng)該顯示請(qǐng)輸入密碼了,輸入密碼交易成功。再看replay端的nfcproxy的data窗口,就可以看到交互的數(shù)據(jù)了在數(shù)據(jù)上長(zhǎng)按可以選擇最右面的三個(gè)豎點(diǎn),export to file將截取的數(shù)據(jù)保存到內(nèi)部存儲(chǔ)的/NfcProxy目錄中
注1:如果帖POS的手機(jī)沒反應(yīng),需要檢查nfc功能是否正常
注2:status 提示 connection to NFCRelay failed 需要檢查兩臺(tái)手機(jī)wifi是否聯(lián)通,配置的ip和端口是否正常

祝好運(yùn)。
btw:這個(gè)方案15年我就在用,只是工作測(cè)試pos需要,偶爾用到感覺很方便,最近又用了一次,下決心整理一下。之前都看大神的文章,自己也為社區(qū)貢獻(xiàn)一次。軟件本身還有很大潛力可以挖,比如動(dòng)態(tài)修改交互數(shù)據(jù)什么的。。。。。。你們懂的,不要亂來哦,會(huì)查水表的。另外也發(fā)現(xiàn)有一些終端讀卡會(huì)采用一些奇怪的模式,導(dǎo)致軟件報(bào)錯(cuò),這時(shí)候只能再用proxmark3暴力監(jiān)聽了,但這個(gè)mitm的方式比proxmark方便多了,也便宜的多了哈。最后附一張ppt里的圖,我簡(jiǎn)單畫了一下,方便大家理解




