1. 程式人生 > >RFID破解三兩事

RFID破解三兩事

網上看了很多RFID破解的文章,大部分都是工具使用,一步步該怎麼操作,基本上沒有講原理的,估計導致了很多初學者非常迷惑,特別是一旦按照操作步驟操作的時候出錯時更加迷惑,不知道是什麼狀況,國內radiowar也同樣沒有看到過特別介紹原理性的文章。

建議大家還是多看看外文原版的資料說明,會理解的更透徹些,才能更快的加入到RFID安全研究及測試中。

參考站點:

http://www.proxmark.org 多看看論壇裡面提問跟回答

http://nfc-tools.org

http://www.openpcd.org/ 

http://www.rfdump.org

 

http://www.libnfc.org

這篇文章就當是我自以為是的普及性介紹,我想應該還是會給很多人解惑。

首先,先說說目前RFID破解涉及到的幾種方法,我儘量以最直白的語言描述。

1、  最簡單ID卡破解

常見破解辦法:ID卡複製,ID卡除了複製也沒有其他研究的了,畢竟太簡單了。

基本原理介紹:

ID卡屬於大家常說的低頻卡,一般大部分情況下作為門禁卡或者大部分大學裡使用的飯卡,一般為厚一些的卡,是隻讀的,卡里面只儲存有一串唯一的數字序號ID,可以把這串數字理解為你的身份證號,刷卡的時候,讀卡器只能讀到ID號,然後通過跟後臺資料庫進行匹配,如果是門禁卡,那麼資料庫裡面就是存在這樣的ID號,如果匹配上門就開了,匹配不上門就開不了。

如果是學校的飯卡,刷卡的時候,實際上操作的是你對應ID號相關的資料庫中的資料。ID卡本身不存在任何其他資料,所以,學校使用的ID卡飯卡,只能複製卡,刷別人的錢(資料庫中的錢),再沒有其他辦法。

破解方法:通過ID卡讀卡器,讀取卡內的ID號,然後把這串ID號寫入到ID卡空卡中即可,各類工具特別多,需要一個ID卡讀卡器。最簡單的淘寶有賣的工具,兩節7號電池,按讀卡按鈕讀要複製的卡的ID,然後再按寫卡按鈕,把讀到的ID號寫入到空白卡中,即完成了卡複製工作,優點就是方便,缺點就是我們看不到整個過程,對我們安全研究來說作用不大。

20130420003137_80509[1]

2、  射頻IC卡破解

寫在前面的技術鋪墊:

射頻IC卡種類繁多,標準也繁多,這些不在介紹範圍內,但是以下攻擊介紹的原理類似,下面不特別說明就是指的M1 S50卡,這也是目前廣泛使用的,並且大家做測試時最常見的IC卡。

常見的破解方法:

1)跟ID卡一樣,複製IC卡的UID號碼寫入到新的空白IC卡中。
2)破解IC卡的密碼,從而改寫IC卡中的資料。
3)破解IC卡的密碼之後,把所有資料匯出再寫入到一個新的空白IC卡中,也就是 IC卡全卡複製(NFC手機及PM3等裝置也支援把自己模擬成一個IC卡,實際上也屬於卡複製一類)。

IC 卡 (S50) 分為16個扇區(0-15),每個扇區又分為4個區域塊(0-63), 每個扇區都有獨立的一對密碼keyA和keyB(先記著獨立兩個字,後面要思考問題)負責控制對每個扇區資料的讀寫操作,keyA和keyB分佈在每個扇區的第四塊中,第0扇區的第一個資料塊,儲存著IC卡的UID號(想成身份證號),其他扇區可以儲存其他的資料,如錢等資料。

一般IC卡的UID是唯一的也是寫死的不能更改,其他塊的資料是可以更改的,所以也就有了普通IC空白卡以及UID可寫空白卡(可以認為是不遵守規範的商家制作的)。

現在我們開始想象破解的幾種環境:

1)讀卡器把IC卡當成ID卡一樣只識別UID正確即可,不管IC卡內其他資料,這時候,只需要把卡的UID讀出來,並使用一個UID可寫的空白卡,把UID寫入即可。
2)讀卡器首先識別UID是否正確,然後再識別其他扇區的資料,通過keyA或者keyB對資料進行讀寫操作。這樣首先UID得正確,其次,keyA或者keyB得正確(後面為了說的方便,我們就不說keyA或者keyB,直接說IC卡密碼)。
這樣如果知道了IC卡密碼,我們也不需要複製新卡,那麼就可以更改IC卡中的資料,比如更改飯卡中的錢數。如果我們想複製一張一模一樣的卡,那麼就把原卡的所有扇區的資料全面匯出來,再寫入新的UID可寫卡中即可。
3)讀卡器不識別UID,只管對扇區的密碼進行驗證,如果驗證成功則允許對卡內資料操作等。(如某“XX快捷酒店”的門卡,就不管UID,只要扇區密碼正確即可),那我們可以通過扇區密碼更改門卡中的資料,如房號,住宿的時間等,也可以通過一個普通的IC卡(uid不能更改)複製一張門卡(跟原卡UID不同),也可以通過一個UID可寫的卡,複製一張跟原卡完全相同的卡(跟原卡UID也相同)。

基本上也就是以上幾種環境,改寫UID、通過扇區密碼改寫扇區資料、通過把原卡資料匯出重新匯入到新的IC卡中複製一張卡。

IC卡的UID是不通過密碼控制的,可以直接通過讀卡器獲得,後面講IC卡的通訊過程會說明。那麼我們做IC卡破解時,主要的問題就是破解IC卡每個扇區的控制密碼,如果密碼破解了,那要怎麼操作都隨便了。 

IC卡密碼破解的幾種方法:

1)  使用預設的密碼攻擊

很多應用IC卡都沒有更改預設密碼,所以導致可以直接使用預設密碼來嘗試接入IC卡,常見的預設密碼有:

ffffffffffff
000000000000
a0a1a2a3a4a5
b0b1b2b3b4b5
aabbccddeeff
4d3a99c351dd
1a982c7e459a
d3f7d3f7d3f7
714c5c886e97
587ee5f9350f
a0478cc39091
533cb6c723f6
8fd0a4f256e9
FFzzzzzzzzzz
A0zzzzzzzzzz

2)  nested authentication 攻擊(大家常說的驗證漏洞攻擊)

前面講到每個扇區都有獨立的密碼,一些情況下,比如某飯卡,扇區3中儲存著錢等資料,扇區3的更改了預設密碼,扇區5中也儲存著一些資料,扇區5也更改了密碼,其他扇區沒有更改預設密碼。我們要操作扇區3跟5,不知道密碼怎麼辦?使用nested authentication 攻擊,這種攻擊方式是在已知了16個扇區中任意一個扇區的密碼之後,採用的攻擊方式,可以獲得其他扇區的密碼。我們前面都提到了,16個扇區的密碼都是獨立的,那麼怎麼能通過某個扇區的密碼獲得其他扇區的密碼呢?如果可以,那說明扇區就不是獨立的呀,有人會說,由於M1卡的加密演算法被破解了,我只能說那是還沒有理解,具體演算法不講,只說明一下,演算法只是使得猜解密碼的時間變短,使得猜解密碼成為可能。

這是什麼樣的原理呢?首先先了解,這是一個對等加密演算法,也就是讀卡器跟tag中都儲存著同樣的密碼,也都是用同樣的演算法加密,然後看rfid的驗證過程:開始互動的時候,tag就已經把uid給reader說了,主要牽扯到防衝撞機制,之後才開始驗證。

20130420003158_32532[1]

20130420003206_80685[1]

第一次驗證時,讀卡器首先驗證0扇區的密碼,tag給讀卡器傳送一個隨機數nt(明文),然後讀卡器通過跟密碼相關的加密演算法加密nt,同時自己產生一個隨機數nr,(密文)傳送給tag,tag用自己的密碼解密之後,如果解密出來的nt就是自己之前傳送的nt,則認為正確,然後通過自己的密碼相關的演算法加密讀卡器的隨機數nr(密文)傳送給讀卡器,讀卡器解密之後,如果跟自己之前傳送的隨機數nr相同,則認為驗證通過,之後所有的資料都通過此演算法加密傳輸。

首先記住這裡面只有第一次的nt是明文,之後都是密文,而且nt是tag傳送的,也就是驗證過程中,tag是主動先發隨機數的。我們破解的時候,讀卡器中肯定沒有密碼(如果有就不用破解了),那麼tag傳送一個nt給讀卡器之後,讀卡器用錯誤的密碼加密之後傳送給tag,tag肯定解密錯誤,然後驗證中斷,這個過程中,我們只看到tag傳送的明文隨機數,tag根本沒有把自己儲存的密碼相關的資訊傳送出來,那怎麼破解呢?

所以,要已知一個扇區的密碼,第一次驗證的時候,使用這個扇區驗證成功之後,後面所有的資料互動都是密文,讀其他扇區資料的時候,也需要驗證,也是tag首先發送隨機數nt,這個nt是個加密的資料,我們前面也說過每個扇區的密碼是獨立的,那麼加密實際上就是通過tag這個扇區的密碼相關的演算法加密的nt,這個資料中就包含了這個扇區的密碼資訊,所以我們才能夠通過演算法漏洞繼續分析出扇區的密碼是什麼。

這也是為什麼nested authentication攻擊必須要知道某一個扇區的密碼,然後才能破解其他扇區的密碼。

3)  darkside攻擊

假設某個IC卡的所有扇區都不存在預設密碼怎麼辦?暴力破解根本不可能,那這時候就是演算法的問題導致的darkside攻擊,我們照樣不說具體演算法什麼漏洞之類,同樣,我們考慮首先要把tag中的key相關的資料騙出來,也就是讓tag傳送出來一段加密的資料,我們通過這段加密的資料才能把key破解出來,如果tag不傳送加密的資料給我們,那沒法破解了。

前面我們也說了,第一次驗證的時候tag會發送明文的隨機數給讀卡器,然後驗證讀卡器傳送加密資料給tag,tag驗證失敗就停止,不會發送任何資料了,這樣看,根本就沒有辦法破解密碼。

實際上經過研究人員大量的測試之後,發現演算法還存在這樣一個漏洞,當讀卡器傳送的加密資料中的某8bit全部正確的時候tag會給讀卡器傳送一個加密的4bit的資料回覆NACK,其他任何情況下tag都會直接停止互動。

那麼這個4bit的加密的NACK就相當於把tag中的key帶出來了,然後再結合演算法的漏洞破解出key,如果一個扇區的key破解出來,就可以再使用nested authentication 攻擊破解其他扇區密碼。

4)  正常驗證過程獲得key

1-3都是通過一般的讀卡器,把tag中的密碼破解出來,破解的原理中,不管密碼破解演算法的漏洞,實際上都是要讓tag中傳送出來一段密文。

那如果讀卡器本身就儲存有密碼,卡也是授權的卡,也就是說卡和讀卡器都是正確授權的,那麼他們之間的加密資料交換就可以直接使用PM3等監控下來,然後通過“XOR效驗與算Key”程式算出密碼來。

這種情況下一般都是內部人員做案,或者把讀卡器中的SAM偷出來,SAM實際上就是儲存讀卡器中密碼的一個模組,然後通過另外的讀卡器插入SAM,用正常的授權的卡刷卡,然後監控交換資料,從而算出密碼。

5)  另一個方面

前面4類方法基本上把目前的rfid卡破解講清楚了,文字太多,所以也就沒有截圖,還有一個地方大家不知道考慮了麼?

我們提到的都是卡和讀卡器之間的資料交換,這是加密的資料,但是有沒有想過讀卡器跟電腦相連這塊,電腦中肯定沒有加密晶片,所以這塊肯定是明文傳輸,在某種環境中,比如通過電腦的控制程式匯入密碼(假設是二進位制等不能直接觀看的密碼檔案)到讀卡器的時候,我們通過監控USB口(串列埠)資料通訊,是不是就能明文看到密碼呢?

20130420003216_82025[1]

軟體裝載密碼到讀卡器

20130420003224_23579[1]

使用USB監控抓到的明文資料,包含了匯入到讀卡器中的密碼明文。 

常用工具說明:

1)mfoc  mfocgui 以及目前網路上,淘寶上充斥的各類破解工具都是基於nested authentication攻擊原理,就是內建了一些預設密碼,首先使用預設密碼對每個扇區進行測試,如果某個扇區存在預設密碼,然後就是用nested authentication攻擊獲得其他扇區的密碼。
2)PM3的darkside攻擊,Mfcuk等為darkside攻擊工具,一個扇區密碼都不知道的情況下破解用的,由於破解演算法的原理本身就不是100%成功的,所以如果長時間破解不出來,就停了重新換個nt,重新選個時間破解,跟運氣也有些關係。
不要別人幾個小時,甚至幾十分鐘就破解成功了,你幾天都沒有破解出來,還一直傻傻的等,不如暫停換個nt,過一會再試。
3)Libnfc工具,目前用的比較多的是radiowar的nfcgui,radiowar網站上也說了,就是給nfc-list  nfc-mfsetuid  nfc-mfclassic  這三個工具寫了個gui介面,你也可以使用命令列模式,或者你也可以自己寫個gui介面呼叫這三個程式即可,這些都是操作卡或者讀卡資料的工具,國內不同的IC卡讀卡器都附帶有一些讀寫卡程式,我用的一個比這個要方便的多。