发言者: cuamckuu检索地图内容并与EMV团队合作可能不仅对研究目的而言很有趣。 对非接触式银行卡的攻击有几种类型,下面将讨论其实现方式。
引言
今年,我在Digital Security的Hack of Summer 2019实习,从事非接触式EMV卡的研究主题。 在实习期间,事实证明,学习银行卡的工作方式并创建用于处理非接触式卡的新实用程序更好。 可以在
此处找到数据读取模式的演示。
攻击类型
卡和终端使用EMV标准(Europay + MasterCard + VISA)进行通信,该标准旨在提高付款安全性。 就这一点而言,非接触卡上的攻击向量并不多。 本文将重点关注以下内容:
- 在网上商店中链接他人的卡
- 社会工程的辅助步骤
- 非接触式DoS,可将卡变成积木
当根据EMV标准与卡进行交互时,可能会发生此类攻击。 许多卡可让您轻松读取用户的私人信息,尤其是PAN,有效期限和持有人的姓名。 读取的数据足以在某些在线商店(例如Amazon)中映射卡。 接收到的私人数据可用于更个性化的网络钓鱼或发送垃圾邮件。
以类似的方式,实施DoS攻击。 调用必要的EMV命令可以使内部事务计数器溢出或模拟不正确的PIN码输入,从而导致卡阻塞。
为什么要重新发明轮子?
在开始开发之前,已决定研究现有解决方案。 他们特别考虑了:
RFIDIOt / ChAP.py ,
Jaccal ,
nfcmillionaire ,
会议PoC ,
“ Ruby”脚本 ,
Android应用/库 。
所审查的大多数程序都试图模拟POS终端的操作,并使用带有支持卡标识符的字典,因此,此类解决方案通常仅适用于Visa和MasterCard。
另一个问题是读取数据的一小部分,而不是转储完整的转储。 几乎所有程序都试图动态分析尽可能多的EMV并产生分析错误。
如果没有或没有解决任何问题,那么很可能我们在谈论Android的应用程序/库,您将需要一部带有NFC阅读器的手机,而这并不是每个人都拥有的。
所描述的问题可以解决,为此有必要:
- 动态检测地图类型,而不是使用字典
- 添加多种操作模式以读取完整文件
- 请勿试图即时拆卸EMV标准
- 使用便宜的阅读器PN532(〜5 $)
从卡中检索数据
哈布雷(Habré)上已经有文章详细描述了卡与终端(
一 ,
二 ,
三 )之间的交互过程,因此,我将尽量避免重复自己,而是着重于实际部分。
为了与卡进行通信,由于价格优惠和libnfc库,我们将使用PN532读取器。 无缝开展业务。 地图上的数据组织如下:
环境->应用程序->文件->记录。
读取的目的是从所有记录中获取数据,为此您需要经过一个完整的链,并且环境和应用程序的选择仅在通信开始时发生一次。
在EMV命令方面,该过程相同:
- SELECT PPSE //选择非接触式环境
- 选择应用程序//通过AID选择应用程序
- READ RECORD //指定文件和记录号
考虑组成一个团队的例子。 选择非接触式环境的第一个命令始终相同,如下所示:
byte_t const command[] = { 0x40, 0x01,
响应示例: 6F 23 84 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 A5 11 BF 0C 0E 61 0C 4F 07 A0 00 00 00 03 10 10 87 01 01 90 00
要调用下一个命令,我们需要解析上一个命令的响应。

我们对应用程序标识符AID感兴趣。 我们记住它并形成一个新的SELECT查询,但是这次我们将接收到的AID传递给SELECT命令,而不是像第一个命令那样传递给PPSE。
示例: 00 A4 04 00 07 A0 00 00 00 03 10 10 00
如前所述,动态获取AID而不是使用预先准备的字典很重要,然后您的应用程序很可能能够读取不同类型的卡,例如MIR卡。
选择了应用程序之后,我们可以使用READ RECORD命令读取必要的记录,并传入文件号和记录号作为参数。
团队形成的示例:(
有关更多信息,请参见标准。EMVBook1。11.2 READ RECORD) byte_t const sfi_param = (sfi << 3) | (1 << 2); byte_t const command[] = { 0x40, 0x01,
呼叫示例: 00 B2 02 14 00
请注意,没有分别为文件号分配一个完整的字节,总共可能有31(2 ^ 5-1)个文件和255个条目。从第1到第10的文件被分配用于内部数据的存储,其余的文件被分配用于存储如果卡支持日志记录,则为事务日志。
现在使用两个嵌套循环,我们可以通过为每对调用READ RECORD命令来获取所有地图记录的数据。 如果您注意卡返回的状态字(响应的最后两个字节),则可以大大加快搜索过程。 状态可以告诉我们该文件不存在(SW = 0x6A82)或该文件中没有其他条目(SW = 0x6A83)。
实际上,事实证明只考虑不存在文件的情况是有道理的,因为有时有些卡会错误地使用状态码来填写丢失的条目。 读取数据后,您可以将其发送到其中一个在线解析器,我喜欢
这个 。
从地图记录中提取的数据片段:

读取的数据足以在某些在线商店(主要在外国商店)中映射卡,并且所获得的信息可以用于使用社交工程进行更具个性化的攻击。
我们组织非接触式DoS
我们继续进行下一种攻击。 DoS-a至少有两种实现方法。
慢路
要实施慢速方法(攻击大约需要4分钟),有必要将内部卡交易计数器(ATC)填满。 为此,请致电:
- SELECT PPSE //选择非接触式环境
- 选择应用程序//选择一个应用程序
- GET DATA //找出ATC溢出前还剩下多少(可选)
- 获取处理选项//开始交易
- ...
- 获取处理选项//重复事务直到溢出
请更详细地考虑这些步骤。 非接触式环境和应用程序的选择类似于具有数据提取功能的项目,唯一的区别是这次我们需要处理SELECT APPLICATION命令的响应。

我们对PDOL字段感兴趣,因为后续调用GET PROCESSING OPTIONS命令将需要它,这将增加每个调用的事务计数器。
在PDOL中,银行卡要求您提供有关终端和付款的信息。
在上面的示例中,地图问我们:
- 9F66 04 //终端事务限定符(4个字节)
- 9F02 06 //数量(6个字节)
- 9F37 04 //不可预测的数字(4个字节)
- 5F2A 02 //交易货币代码(2个字节)
由于我们采用DoS而非真正的付款方式,因此我们不必担心值的正确性,只需使用卡将接受的预先准备的值即可。 阅读有关标准中所需值的更多信息。
(EMV书3.附件A数据元素字典)。为了方便实际使用,我引用下表:
形成卡所要求的数据后,我们就可以致电GPO了。
示例: 80 A8 00 00 12 83 10 79 00 40 80 00 00 00 10 00 00 82 3D DE 7A 01 24 00
答案: 77 4F 82 02 20 00 94 0C 10 02 03 00 18 01 01 00 10 04 04 00 57 13 42 76 55 00 66 83 25 13 D2 00 52 01 14 89 36 20 00 00 1F 5F 20 02 20 2F 9F 10 07 06 01 11 03 80 20 00 9F 6C 02 30 00 9F 26 08 33 33 89 D5 70 A3 DF 37 9F 27 01 00 9F 36 02 02 48 48 90 00
重复GPO呼叫65 536次,卡被阻止。 您可以通过先使用GET DATA读取当前的ATC值来减少所需的呼叫次数。
快速方式
快速方法更加方便(并且更加危险),因为锁定卡大约需要2秒钟,因此对实现细节的详细分析将在幕后进行。
该方法与先前的方法相似,但是这次将有必要降低尝试输入PIN码的次数,而不是增加交易次数。 尝试计数器的PIN值也可以通过GET DATA获得,但是在这种情况下,速度不会显着提高。
所需的操作:
- SELECT PPSE //选择非接触式环境
- 选择应用程序//选择一个应用程序
- GET DATA //找出尝试输入PIN的次数
- 获取处理选项//开始交易
- 验证//输入错误的PIN码
- ...
- 验证//直到卡被阻止
总结
在实习期间,可以创建一种用于处理非接触式银行卡的新工具并解决现有解决方案中存在的若干问题,并且使用便宜的读卡器可以大大降低研究套件的成本,并可以帮助吸引新人们来研究非接触式银行卡的安全性。 该程序的源代码
可在Github上找到 。