当前位置: 首页 > news >正文

玩转无线电 -- 温哥华天车 RFID 票务系统

0x00 前言

如今物联网 RFID系统已经完全融入了我们的生活当中. 从楼宇门禁到 Apple Pay. 可以说其身影是无处不在.很多网友也分享了自己对RFID系统的安全测试心得.不过大多还是基于门禁卡和 Mifare-Classic 而言. 实际上在 Mifare 系列的大家族中还有着许多其他类别. 比如 Mifare-DESFire 和本文的主角 Mifare-Ultralight.

温哥华交通公司Translink 在 2015年开始逐渐淘汰老旧的打印票务系统. 并全面推广RFID为基础的票务系统, 并为其取名为 Compass. 此系统为了方便不同乘客的需要, 使用了Mifare-DESFire 作为月票卡. 同时还以Mifare-Ultralight 作为一次性车票.因 Mifare-Ultralight 成本低廉, 使其成为车票的不二之选. 但也正是为了节省成本, 其安全性近乎于零. 它的天生残疾为攻击者打开了一道方便之门.本文将以此轻轨RFID 票务系统为例, 跟大家一起来场RFID 系统的探索之旅.

0x01 Mifare-Ultralight 简介

Mifare-Ultralight 是 NXP 公司出品的众多Mifare系列中的一款. 其同样工作在 13.56 Mhz. 但跟它的老大哥 Mifare-Classic 不同的是, 它并无使用任何加密, 其数据内容是可以任意访问的. 因为造价低廉很多需要一次性门票的场合都将其作为首选.比如 2006 的世界杯比赛.其数据结构非常简单明了. 总共 64 bytes. 分为16 个区, 每个区为4 bytes. 而 4 - 15 区通常会用于数据存储, 存有时间; 入口和站台名等. 值得一提的是此区可任意读写无需认证哦. ;)

UID区

其 UID 区在默认情况下是不可写的. 占有 9 个 bytes, 但只有 7 个bytes 作为 UID 使用. 比如 “ 04 e2 a8 c6 ba e2 43 80 9b ” 其中只有 04 e2 a8 ba e2 43 80 被识别为UID, 而 c6 和 9b 是作为校验值 Check Bytes 存在的.

OTP 区

前面提到Ultralight 的安全性近乎于零, 是因为它设有这个One time programmable 区. 整个区分为 4 bytes, 默认数值为 00 00 00 00. 通常将其作为为车票的计数器使用. 通过 01 对每个 bits 进行 OR 不可逆运算. 直到 00 全部用完车票作废.不过这个OTP 也是可以通过激活 Lock Byte 来 bypass. 因为 Compass 系统并无使用OTP , 所以无做此测试.

0x02 实战测试 — Single Fare Reset Attack

需要事先声明整个测试过程使用的是预先支付的车票. 并仅是在车站入口处测试了 Reset 攻击, 并无实际逃票行为. 所以不要担心会发生被请喝茶的悲剧. 而且在下也反对滥用此类技术来做坏事... :p

其实整个攻击过程非常简单. 因为Data 区可任意读写无需认证. 所以我们可以事先 dump 出 Compass 车票的原始数据. 等车票过期无法使用后, 用手机 APP 将原始数据写回车票. 从而实现 Reset 攻击, 达到系统绕过目的. :) 整个攻击过程出奇的简单对吗? 而从 Translink 的角度来看, 又有哪些防御方案呢? 其实 NXP 公司早就提供了3DES加密的 MIFARE Ultralight C. 不知道为什么 Translink 在系统设计之初不考虑呢?

0x03 总结

最后要感谢在整个研究过程中提供过帮助的弟兄们. 同时在下认为系统安全加固, 有时也取决于自身对问题的态度. 出了问题不积极修复, 却试图将问题隐藏. 并寄希望于掌握了解方法的人越少越好. 这是十分不明智的处理态度.

在这里强烈鄙视温哥华交通公司 TransLink. 在漏洞曝光后明知系统存在隐患的情况下仍放任不理. 当记者采访时还摆出一副有种你咬我的嘴脸. 那好吧 May the luck be with you…FXXK YOU…Now we all know how to hack you..

0x04 参考文献

  • http://www.nxp.com/documents/data_sheet/MF0ICU1.pdf
  • https://www.youtube.com/watch?v=Czvn4L1r6f4(Building safe NFC system --30c3)
  • http://www.cbc.ca/news/canada/british-columbia/compass-ticket-hack-1.3535955
  • http://bc.ctvnews.ca/security-flaw-lets-smartphone-users-hack-transit-gates-1.2852464
  • https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2012/september/ultrareset-bypassing-nfc-access-control-with-your-smartphone/

相关文章:

  • 前端常见的linux指令
  • [转]CentOS-6.3安装配置SVN
  • leetcode 205. Isomorphic Strings
  • node的安装
  • Sqlserver2008相关配置问题
  • node 模块简述--内置fs http ---自定义模块
  • ppt 制作海报 导出高分辨率图片
  • 数组常见的方法
  • 数据结构-C语言递归实现树的前中后序遍历
  • 核心动画(Core Animation)
  • url模块 和 querystring模块
  • APP开发的一些简单流程思路
  • querystring 查询字符串模块
  • 查看数据库表的数据量和SIZE大小的脚本修正
  • commonJS模块化
  • JavaScript设计模式之工厂模式
  • Joomla 2.x, 3.x useful code cheatsheet
  • js中的正则表达式入门
  • MySQL-事务管理(基础)
  • Mysql数据库的条件查询语句
  • nfs客户端进程变D,延伸linux的lock
  • PAT A1050
  • ReactNativeweexDeviceOne对比
  • ubuntu 下nginx安装 并支持https协议
  • vagrant 添加本地 box 安装 laravel homestead
  • 记一次和乔布斯合作最难忘的经历
  • 盘点那些不知名却常用的 Git 操作
  • 前端面试之CSS3新特性
  • 前端学习笔记之观察者模式
  • 如何在 Tornado 中实现 Middleware
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 无服务器化是企业 IT 架构的未来吗?
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​一些不规范的GTID使用场景
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #在 README.md 中生成项目目录结构
  • (2)nginx 安装、启停
  • (3)llvm ir转换过程
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)Linux+Windows下安装ffmpeg
  • (转)四层和七层负载均衡的区别
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .Family_物联网
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET CORE 第一节 创建基本的 asp.net core
  • .Net Web项目创建比较不错的参考文章
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET关于 跳过SSL中遇到的问题