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