简介
App分析和动态密码生成过程追踪
如下图,getYb方法的作用是根据输入的 wifiSN 和 randomCode 字符串计算出一个临时密码。
1.首先判断输入参数 wifiSN 和 randomCode 是否为空,若为空则返回空字符串 “”。
2.将输入参数 wifiSN 和 randomCode 以及一个时间戳拼接在一起,生成一个新的字符串 str。
3.将 str 字符串转换为字节数组 bytes,并使用 SHA-256 哈希算法对其进行哈希运算。
4.取哈希结果的前 4 个字节,将其转换为长整型数 l,通过调用 i(byte[] p0) 方法实现转换。
5.对 l 进行 0xf4240 取模运算,得到一个不超过 0xf4240 的非负整数。
6.将取模运算的结果转换为字符串类型,并在其前面补充若干个 “0”,使得 yb 的总长度为 6 个字符。
7.返回临时密码。
总结就是该方法的作用是生成一个临时密码,该字符串的值由 wifiSN 和 randomCode 字符串以及当前时间戳经过 SHA-256 哈希算法计算得出,并对一个固定数值 0xf4240 取模运算得到一个 0 到 0xf4240-1 之间的整数。临时密码的长度为 6 个字符,其中前面可能会补充若干个 “0”。
由此可知生成需要序列号以及一个未知的randomCode参数
3.为了追溯随机码的产生过程,使用全局搜索找到了随机码赋值的位置。
4.下图就是赋值randomcode的方法,在m14595e方法中首先将输入的字符串进行补0操作,再进行 SHA-256 的摘要计算;将摘要值与输入的字节数组进行 AES 解密操作,得到随机数和校验和;对随机数进行 CRC32 校验,与解密得到的校验和进行比较,判断是否匹配。
其中,第一步是对输入的密码进行处理,以便于后续的加密和解密操作。第二步是通过密钥将输入的字节数组进行解密,得到随机数和校验和。第三步是对随机数进行 CRC32 校验,以验证其合法性。
我们只关心randomcode的生成也就是bArr4,根据代码分析得知调用m20569e进行aes解密之后得到了e2,其中参数一是由m14595e中的参数二取0-32得来,参数二是由m14595e的参数一补0然后sha256得来。
wifi模组固件提取
1.通过芯片手册还可以得知其是外置flash,拆下来的flash芯片将其焊接到转接板上。
2.放入编程器读取固件,编程器识别出flash芯片型号。读取固件另存为bin文件,这里实际是RISCV 32bit 小端序。
2.连接电脑后设置波特率等参数获得shell,如下是输出的日志。
1.在进行配网的时候查看wifi模组日志看到g_tx_buffer[45]与app中大小一致且是在配网过程产生的由此可以推测打印出的这串数据很有可能就是randomcode aes加密过的数据。
2.查看固件可以看到序列号,连接的wifi名,密码等,设置好固件架构,基地址等搜索字符串send opf data定位到日志输出的位置回溯,FUN 230acdd8的代码表示将0x4201cc08处的内容赋值给DAT_420122d0.
3.在门锁进入配网模式后可以看到0x4201cc08有了内容。
4.全局搜索-0x3f8的位置查看操作0x4201cc08的位置,下面代码0x4201cc08开始到0x4201cc28就是aes加密过的randomcode,从0x4201cc28开启0xe个字节这里其实是设备的序列号,他们都取决于参数二。
5.回溯看到可能是一个回调函数。推测参数二可能是门锁向wifi模组传输的数据。
6.同时发现在进入配网模式后wifi模组会recv一段data而这串数据包含0x4201cc08的内容,由此可以确定aes加密过的数据是在门锁固件里面生成发给wifi模组的。
7.下面是把wifi模组recv data的aes加密的部分拿出来,并使用管理员密码对其aes解密得到的就是randomcode。
8.那这里如果想知道randomcode怎么生成的就需要提一下门锁固件了,要说明的是固件存放的位置一般分为两种,一种是集成在MCU中,另外一种是单独放在一块芯片上,这里的芯片没有找到datasheet,所以就直接把看着像外置flash的芯片提了一下发现都不是,难受噢,不过想了两种情况:
第一种:门锁->随机数->sha224->randomcode
第二种:门锁->随机28个字节的十六进制数->randomcode
后面有机会在验证下!
1.回到绑定过程,请求包是加密的,对其hook可以看到包含六个参数,其中包含了设备的序列号,用户id,randomcode等。因为randomcode是门锁生成的通过ap模式传给了app,app会把randomcode发给云端保存,但是在这里randomcode云端是没有校验的。所以我们要想劫持门锁app权限,只需要将arg0与arg1写成我们想要劫持的设备的序列号就可以了。
2.然后逆向一下算法写个脚本跑一下就可以劫持指定序列号的门锁获取其app权限了。
在本文的分析过程中,我们探索了一款智能门锁的多个安全层面,包括从硬件、固件、App到云端。通过固件提取、分析、获取UART shell、分析App和通信协议等多种手段,从不同的角度挖掘了门锁的安全问题。最后,希望大家能够喜欢这个分享内容,有什么想要讨论的,可以随时联系。
原文始发于微信公众号(DX安全实验室):物联网 | 智能门锁安全分析:多方位探索硬件、固件、app和云端