Google Code Prettify

2014年7月27日日曜日

NFCカード(payPass)を読んでみた - Octopusカードリーダー使ってみた

カードを読んで、カード番号次第で電源をオンにするような仕組みのプロトタイプを作りたかったので、ちょっとNFCの勉強しました。電源オンの仕組みは以前作ったので、今回取り組んだ案件の肝はカード読み取りです。

まずはカードリーターの確保。いろいろ買っちゃいましたが、案外これだけで十分そうです。HK$148 (2000円弱)で香港中のMTR駅構内のカスタマーサービスで買えます。

Welcome to Octopus Hong Kong - Get Your Octopus - Online Shop
http://onlineshop.octopus.com.hk/cart/?catid=3


ACSのACR122というものですが、シャムスイポだとHK$400とかぼったくられそうな品物ですが、MTRで買えばたったのHK$148です。香港の会社が製造していて、そこそこ海外でも認知されているようで。恐るべし香港。

制御に使うコンピューターですが、またしても、Raspberryで制御です。
持ち運んでどこでも見せることができるし、安いので最近はこればかりいじってます。
関係しそうな情報を片っ端から眺めて、ちょうどいいツールのめぼしをつけました。
やってることは、Linuxでlibnfcを使ってちょっとCとかシェルスクリプトを書いてるだけなんで、Raspberryだけでなくそこら中のLinuxでも同じはずです。

Hacking the NFC credit cards for fun and debit Renaud Lifchitz
http://www.ustream.tv/recorded/21805507
https://www.youtube.com/watch?v=VWIzW0rRw_s

"Hacking the NFC credit cards for fun and debit ;)" presentation slides - HES2012 - Renaud Lifchitz
https://code.google.com/p/readnfccc/downloads/detail?name=hes2012-bt-contactless-payments-insecurity.pdf&can=2&q=

Contacless payments insecurity Renaud Lifchitz - 8.8 Computer Security Conference October 24-25, 2013 – Santiago, Chile
http://www.8dot8.org/2013/deck/8dot8_2013_pres_RL.pdf


readnfccc ... English version
https://github.com/azet/readnfccc/blob/master/readnfccc.c

readnfccc 2.0 ... Spanish version
https://github.com/azet/readnfccc/blob/master/readnfccc.es.c


Complete list of EMV & NFC tags
https://www.eftlab.co.uk/index.php/site-map/knowledge-base/145-emv-nfc-tags

emvlab.org - the one-stop tools site for banking techies
http://www.emvlab.org/

emvlab.org:TLV Utilities - decodes EMV records encoded in tag-length-value (TLV) format.
http://www.emvlab.org/tlvutils/

Getting information from an EMV chip card with Java
http://blog.saush.com/2006/09/08/getting-information-from-an-emv-chip-card/

MasterCard PayPass Vendor Testing Guide (Terminals) Version 1.0 - September 2007
https://www.paypass.com/pdf/public_documents/PayPass%20Vendor%20Testing%20Guide%20Terminals%20Sept07.pdf

この、readnfcccっていうのが、手っ取り早くカード番号を読むのに使えそうなツールなのですが、どうもすんなりとは動きません。libnfcを入れるところから始まり、"byte_t"なんて型知らないとコンパイラに怒られ新しいバージョンを探し直したり、見つかった新しいバージョンもすんなりとは動作せず、自分の環境、カードで動作させるために、電文の内容を把握することが必要そうです。。ところどころプログラムをいじくって、どうにかこうにか、payPassカード番号だけは読み込むようになりました。。
下記のような雰囲気の修正をちょこちょこしてます。
単なるPoCだったのに、だいぶ疲れたのでもうおしまいです。

52c52
<   uint8_t SELECT_APP[] = {0x00, 0xA4, 0x04, 0x00, 0x07, 0xA0, 0x00, 0x00, 0x00, 0x04, 0x10, 0x10, 0x00};
---
>   uint8_t SELECT_APP[] = {0x00, 0xA4, 0x04, 0x00, 0x07, 0xA0, 0x00, 0x00, 0x00, 0x42, 0x10, 0x10, 0x00};
166,167c163
<     if (*res == 0x15 && *(res + 1) == 0x57) {
<     // if ( *(res + 1) == 0x57) {
---
>     if (*res == 0x9c && *(res + 1) == 0x57) {