门禁控制系统原理
一个标准的门禁控制系统由几部分组成。门,锁,rfid 读卡器。一个正常的流程如图所示
一个带有门禁卡权限的人把门禁卡放在读卡器上,读卡器就会正确的读卡并开门。但是这个过程中要注意的是,读卡器并不会对你的卡进行鉴权,它只能够读取卡片并且将卡片的内容发送到位于后端的控制器并由控制器进行判断。如果控制器接收到的信息是正确的,控制器再发送开门的命令给锁并且发送一个信号给读卡器使得读卡器亮正确的灯
然而在读卡器传输信息到控制器这个过程当中是完全没有加密的。这是因为一种名为韦根(wiegand)协议。因此我们很容易就能够实现中间人攻击去获取正确的权限。有一个名为 espkey(https://github.com/octosavvi/ESPKey) 的设备可以很轻松的完成这一点
OSDP 背景介绍
因此在以上的基础之上,OSDP 被提出用于替代韦根协议。OSDP 对读卡器到控制器这一过程进行了加密并且采用了强加密算法。保证传输过程无法被解密在 OSDP 中为了防止简单的重放攻击,它对协议包的加密是这样的:在正确的数据后面会加上一个序列号以确保每一条信息都一致。接着他们被打包为 hmac
因此直接破解加密信息是完全不现实的。
在此基础之上 OSDP 还使用了 AES-CBC 模式来加密通信数据
在上述 OSDP 的背景之下.HMAC 有一个非常不好的一点就是它实际上只有前 32 个字节是被维护的,后面 96 个字节实际上是可被丢弃的
这一功能在规范当中是被这么描述的
甚至为了减少传输时间,只发送 4 个字节。
这就意味着,我们可以使用生日攻击去破解这 32 位字节
这个过程中不涉及到任何新的数据,我们只是在一遍又一遍的重复播放上述收集到的信息.
容易出现漏洞的地方
协议,库,配置
针对 OSDP 的攻击方式
针对 OSDP 有一个名为 mellon 的工具[https://github.com/BishopFox/mellon](https://github.com/BishopFox/mellon)攻击方式 一 加密不强制
osdp 支持加密并不强制性要求加密。osdp 支持一个安全通道但是这个并不是强制性要求的而是一个可选项此外由于 OSDP 基于 RS485 协议运行,这是一个串行协议。因此如果有多个控制器,他们在系统当中应该是这样的。不同的阅读器同时存在同一根总线上与控制器相连接,所有的信息都通过总线传播
因此这就意味着,假设我想要打开的目标门禁为 A。我只需要把一个监听设备放在其它的读卡器位置就能收到门禁 A 的信息。
在 OSDP 系统当中,所有的读卡器都是客户端,只有控制器是服务端。所有的信息都是由控制器发送,而读卡器只能够回复
攻击方式 2 降级攻击
当读卡器启动的时候,控制器和读卡器之间会有一个握手,控制器会像读卡器发出一个质询去询问读卡器的能力接着读卡器就会返回一些基础信息给控制器。例如是否有生物指纹信息,有键盘数据等等..在这堆数据里面有一个很有趣的东西叫做通信安全位。所以我们可以在这中间加入 mellon。当读卡器启动的时候,它向控制器返回一些信息, 将这个通信安全位从 1 被篡改为 0 了。控制器就会自然而然的认为读卡器不支持加密,这样 降级攻击就完成了
攻击方式 3 安装模式
OSDP 有一个准官方的 “安装模式”,适用于读卡器和控制器。顾名思义,它应该在首次设置读取器时使用。它的作用本质上是允许读者向控制器询问基本加密密钥 (SCBK) 是什么。这本身并不是一个疯狂的想法。它基于 SSH:第一次的配置是不安全的,在配置完成后就会安全 。问题是,许多控制器被配置为永久保持 “安装模式” ,也许是永远保持 “安装模式”。一些控制器在完成后会让管理员手动单击退出 “install mode”。
当读卡器和控制器都处于安装模式,就像 SSH 的配对模式一样。读卡器会像控制器发出质询获取密钥
接着控制器会把加密的密钥返回给读卡器。问题是,如果安装模式没有退出的话。攻击者便可以重复这个流程,获取到 ssh 密钥
攻击方式 4 弱键
在数据包加密当中我们希望看到的数据结构应该是这样的由头 明文 和数据构成。但这是被加密后的结果,而不是一截命令
但这是实际上我们看到的
实际上 command byte 会告诉我们信息是如何传输的。
例如 OSDP_RAW,OSDP_fmt,OSDP keyset 的信息
基本上,消息的密钥包含正在被传递的加密密钥。
为什么这会是一个安全问题? 实际上这个问题与 OSDP 协议本身无关
在实现一个通信协议的时候它们实际会引用到很多很多的库。
这是加密密钥的层次结构。控制器中存储有一个或曾经有一个主密钥。会话密钥由该主密钥派生,然后进行实际加密.osdp的新标准摆脱了主密钥,因此只有会话基础密钥和加密密钥。
协议设置了这些但是实际上并没有说明我们应该如何导出会话基本密钥。我们可以在网络上找到很多 osdp 引用库的硬编码密钥。这些库正在使用这些密钥来进行基础的加密
假设我们通过设备从总线上获取了一些加密的密钥
现在我们可以尝试使用了一大堆无意义的升序数字或者降序数字,总共 1 千个密钥。如果真的猜出一个 那么这时候我们就可以解密了。
攻击方式 5 密钥集捕获
这个过程只使用了 AES,问题是如果只使用对称加密而在这个过程中没有非对称算法对密钥加密该如何进行密钥交换?在这里使用的是一个名为 SCBK-D 的东西。
:::info
SCBK-D 是 OSDP(Open Supervised Device Protocol)中的默认安全会话密钥(Secure Channel Base Key - Default)。在OSDP协议中,安全通信是通过一个安全通道来实现的,而这个通道的密钥就是SCBK(Secure Channel Base Key)。
SCBK-D 的具体作用
1. **安全通道**:在OSDP协议中,为了保护敏感数据(如认证信息或命令),设备之间可以建立一个加密的安全通道。这个通道依赖于一个基础密钥,称为SCBK。 2. **SCBK-D 是默认密钥**: - **SCBK-D(Secure Channel Base Key - Default)** 是在设备没有被安全配置的情况下使用的默认密钥。 - 当使用默认密钥时,设备之间的通信并没有得到良好的保护,因为SCBK-D是一个标准的、已知的密钥,任何人都可以在公开文档中找到它。因此,设备默认的安全性较低,容易受到中间人攻击或其他形式的攻击。 3. **安全建议**:出于安全考虑,生产环境中应避免使用SCBK-D。在部署系统时,应该使用特定的、安全配置的SCBK(非默认),通过配对双方的密钥来确保通信的机密性和完整性。SCBK vs SCBK-D 的区别
+ **SCBK(自定义密钥)**: - SCBK是为每个设备自定义的密钥,用来建立安全通道,通常在设备初始化时进行配置。它提供了高等级的安全性。 - 这些自定义密钥可以通过安全方式配置,确保只有合法的控制面板和外围设备之间能够通信。 + **SCBK-D(默认密钥)**: - SCBK-D是标准化的密钥,适用于设备出厂时的初始配置,用于测试或调试。使用默认密钥时,通信并不安全,容易被攻击。:::
那么这里的 SCBK-D 其实就是我们上面提到的硬编码
那么作为一个攻击者如何才能够获取这个基本密钥?遗憾的是由于 OSDP 没有外带机制,因此我们如果想要获取这个基本密钥只能够是让控制器发送这个密钥才能获取它。
所以在实际的物理红队攻击当中我们可以设想这样的攻击场景
- 损坏 RFID 读卡器。这有很多种办法,例如我们可以使用某些 NFC 工具使得 RFID 读卡器收到损害无法正常工作,或者直接暴力拆开。总之这一目的是使得读卡器无法正常工作
- 在 RS485 总线上放一个监听设备
- 等待读卡器被更换
- 通过网络获取 keyset 信息