国庆假期回家,如往常一样set好猫猫的饮用水、摄像头和喂食机,结果却发现喂食机App无法正常工作了,无法在列表中刷出我的喂食机设备。考虑到可以远程控制,必然有个官方后台服务做类似于控制中心的角色,感觉那个服务可能歇菜了。App已经不能在App Store搜索到,手机上的版本连全面屏都尚未适配。App中Copy Right是2016-2018,搜索到的官方公众号也在18年停更。木得办法着急出门只能让猫猫敞开吃了……
回来一查,这个小桔智能喂食机,中山厂家小桔互联出品,域名orangelink.cn 2021年到期,但已经找不到可以打开的主页,先给域名持有人罗先生的邮箱发个邮件问问(交叉对比的天眼查这家公司的法人信息)
话说还有点想让喂食机复活,有那么几个思路:
- 抓包理出机器和后台控制中心通讯使用的域名、协议等,倘若协议比较简单,可通过路由器dns host把原控制中心域名转发到自有服务器,再mock一个控制中心的实现即可。
- 如果网络协议难以分析,可以从app入手,可以拿android的安装包反编译看看有什么线索。
- 再不济,因为机器上有手动出粮开关,我可以外挂其他设备例如m5stack(esp32)来做控制和远程通讯,在桥接手动出粮开关即可
首先尝试思路1,通过手机上的App直接进行抓包,可以看到请求发往api.orangelan.com:443,这个域名解析到一个香港的ip,但是由于SSL连接错误无法进行下一步,因此没能看到请求细节,在电脑上telnet 443尝试可以连上但是秒被断开。如果需要进一步探测需要mock一个https的server,做路由dns host和mitm重签名,暂时放一放,看看App反编译的思路有没有提示。
从搜索引擎拿到一个小桔App的Android版apk,尝试丢到在线反编译网站,发现腾讯乐固的痕迹,看不到什么实质内容。参考网上方法尝试用Xposed脱壳,但是由于我只有x86 Android虚拟机,没有适配的Xposed框架支持,于是改用frida的方式,可以轻松拿到3个dex文件,选择其中最大的那个(另外两个大小可以推测不是业务内容),通过dex2jar转换成jar,然后就可以通过jd-gui查看部分代码内容。
代码内容里面,从com.orangelink.orangepet_tencent.common 中找到一个ServiceMethod的class,里面有各种api的url,简单来看后台应该由asp技术搭建(确实跟不上潮流了)
再看了下其他代码,内容还是不少的。不过理论上app里面只包含app到设备,app到控制中心的内容,并不包含设备到控制中心的通讯内容,这部分还需要抓设备的包才能看到,设备可能还不像手机可以方便的做https mitm。
App到设备这一段,可以在代码里面看到一个叫 Esptouch 的东西,看了下Expressif家的一个协议,用于给相关设备配置Wi-Fi,感觉是公开协议的话比较好实现。从com.orangelink.orangepet_tencent.device 中 EsptouchActivity.class 的一个点击事件可以看到,配网需要ap的ssid,bssid和密码
如果采用的是标准的Esptouch协议配网,那么实际上Expressif自家有个demo app就可以用。一开始尝试死活不能成功,demo app并不能成功使喂食机重新配网,后来看App中提示Wi-Fi必须是2.4G的不能是5G的,而我是2.4G+5G融合信号,想着可能有影响,于是用主路由纯2.4G信号进行配网,秒可以。
在路由上tcpdump喂食机的流量,比较诡异,喂食机连Wi-Fi之后,只和s1a.time.edu.cn做了ntp对时,并未抓到和控制中心的通讯包
而且断电重启之后发现黄灯闪烁,依然停留在配网模式。因此怀疑在配网成功之后,原喂食机App需要把用户信息包含密钥投递到喂食机,喂食机才能用这些信息和后台控制中心联网,所以接下来还要看看配网之后的设备初始化(用户绑定/设备远程注册)流程,未完待续……
参考内容:
https://www.tianyancha.com/brand/b0c8d9052
https://xz.aliyun.com/t/7670
https://www.jianshu.com/p/3ae7ef9b4d13
https://www.espressif.com/zh-hans/products/software/esp-touch/overview
https://www.espressif.com/sites/default/files/documentation/esp-touch_user_guide_cn.pdf
https://blog.csdn.net/flyingcys/article/details/49283273