使用快捷指令捷径破解亲邻开门

9月27日更新:

最近发现快捷指令失效了,重新抓包后发现请求中增加了sign和nonce字段,这两个字段都是用来防御重放攻击的。虽然前几个接口并未强制验证,但关键的开门接口进行了验证,导致无法正常执行开门操作。目前暂时无解,正在思考其他替代方案。

原文:

由于最近快递只能送到小区门口,大大增加了出入小区的频次,也越来越发觉每次掏出门禁、刷门禁这个动作很繁琐,特别是在拿了很多东西的情况下。

因此希望通过更便捷的方式打开小区门禁,我选择通过iOS的“快捷指令/捷径”。

实现思路:抓包开门请求,使用快捷指令/捷径模拟请求。

尝试一

第一个想到的是抓小程序的请求链接。在WiFi中设置好电脑的代理地址和端口,打开Charles进行抓包,会有下面四个关键请求:

# 请求1,初次登录,换取sessionId
https://mobileapi.qinlinkeji.com/api/wxmini/v3/appuser/checkLogin?sessionId=undefined

# 请求2,刷新首页
https://mobileapi.qinlinkeji.com/api/wxmini/v3/appuser/refresh?sessionId=wxmini:XXXXX

# 请求3,获取最近使用的小区门禁
https://mobileapi.qinlinkeji.com/api/doorcontrol/queryUserDoorByCache?sessionId=wxmini:XXXXX

# 请求4,打开指定门禁
https://mobileapi.qinlinkeji.com/api/open/doorcontrol/v2/open?sessionId=wxmini:XXXXX

这四个请求都为POST方式。当然,请求时需要带上相关参数,具体抓包可见。

对我们有价值的是请求4,使用“快捷指令/捷径”模拟请求4即可。

刚做完的时候还是好用的,但是到了第二天,就发现无法正常开门,猜测到是sessionId过期了。通过搜寻,找到一个可以使sessionId不过期的方法,应该是定期向亲邻服务器模拟请求2,使当前使用的sessionId出于活跃状态。

但我不推荐这样做,原因:1.我没尝试;2.就算有用,你还需要有个服务定期请求,也增加了不必要的浪费。

尝试二

在抓小程序无果后,想到了能不能抓取亲邻开门App的请求。App相比小程序,更加自由,认证方式也比较简单,我猜sessionId应该也能保持很久吧?

在WiFi中设置好电脑的代理地址和端口,打开Charles进行抓包,运行亲邻开门App。

奇怪的是无论怎么操作都没有抓到任何请求,这应该是App强制跳过了代理。

解决方法也很简单,使用系统VPN进行代理转发。我这里使用的是Surge,新建一个代理规则,默认走代理,代理服务器的IP和端口,填写电脑的代理地址和端口。测试一下,能抓到请求了。

关键请求和小程序类似,我就不再列举,开门请求为:

# 开门请求
https://mobileapi.qinlinkeji.com/api/open/doorcontrol/v2/open?appChannel=2&macAddress=FC19CA012345&sessionId=app:XXXXX

其中macAddress的值为门禁的mac地址,sessionId为App的登录session。

目前session一直有效中。

已创建好的“快捷指令/捷径”在 https://sharecuts.cn/shortcut/5342 ,或直接扫描下方二维码添加。

《使用快捷指令捷径破解亲邻开门》上有53条评论

  1. 你好,怎么样才能抓到https 数据,已经安装了charles证书,surge设置代理,但是https数据还是不能显示,请问有什么秘诀吗》?谢谢!

    1. 如果你说的https数据不能显示,指的是能看到请求,但看不到内容,那目测是证书没配置好。
      你在安装完charles证书后,ios设备还需要到设置>通用>关于本机>拉到最下面“证书信任设置”中,将刚才安装的证书开启。
      如果你也开启了,还是不行,建议重启手机和电脑。

  2. 感谢回复,你说的设置都没问题,证书已经信任了,手机重启试过了 ,charles版本也换了,一直没找到问题的原因,难道是亲邻开门版本问题,请问你抓包的是哪个版本的app,谢谢

    1. 大概率不是亲邻版本的事情,比如你抓别的能抓到https吗?
      你还可以再试一下:在手机上,把surge改为直连,开启mitm和抓取流量,直接用surge抓取流量。

  3. 我的surge是网上找的免费版没有mitm等功能,用stream手机抓包也是看不到内容,只能抓亲邻开门叮咚mp3。https比如百度网页等可以看见发送内容,google等和亲邻一样提示证书不匹配,所以我怀疑亲邻有sslpinning之类的,用了安卓4.4.2模拟器+drony转发,不行又试了xpose框架just trustme+sslunpinning等各种方法都试过了,就亲邻抓不到,后来看了你的文章就换了iphone+surge 还是一样handshake_failur问题,charles提示返回亲邻服务器证书是digicert,手机电脑证书都安装了所以我也不知道问题出在哪里

    1. 我刚才又试了下,最新版的APP,直接可以用surge抓到。我是iOS最新版+surge最新版+亲邻科技最新版。
      如果你能用mitm,需要注意两点:一个是安装根证书,另一个是需要在mitm里开启“跳过服务端证书认证”和“用于tcp连接”,因为亲邻APP的就是tcp连接。

      另我这篇文章是用mac环境下的Charles,我建议你换一下charles版本,有些破解版本确实存在问题。不建议使用安卓,因为安卓整个系统都是该安全的地方不安全,不安全的地方瞎安全。

    1. 目前还可以用哈 iOS手机下载一个stream抓包软件 获取Mac address 和session

  4. 现在还能用吗?小区刚换了这个,每次出入掏手机和打开小程序或app挺麻烦的!有快捷指令就好了~但下载了用不到

    1. 你好,文章开头有提到目前失效的原因。思路无非是找到绕过或不需要签名的接口。也许小程序可以,但session保持又是个问题。

  5. 根据博主的思路,简单描述下我的一个尝试过程,希望可以跟大家交流一下,看能否有更好的方法。
    小程序抓包还是很方便的,在抓包过程中发现有个POST接口,也就是博主上面提到的四个接口中的第二个(https://mobileapi.qinlinkeji.com/api/wxmini/v3/appuser/refresh?sessionId=wxmini:xxxx)是这样的。
    返回结果包含一些用户和小区的信息,其中包含一个expires字段,其值为1800,估计可能是30分钟。猜测是登录信息的过期时间,每请求一次,过期时间更新一次。
    于是,我用iOS的个人自动化尝试,每隔30分钟(00:00一次,00:30一次,以此类推)请求一次接口,前两个小时内,此sessionId还是有效的,能够通过此sessionId正常开门,后面直接请求失败,提示还未登录。这个问题猜测可能是其中某一次请求时间过长导致的,因此,我把自动化的间隔时间调短到每20分钟(00:00一次,00:20一次,00:40一次,以此类推)执行一次,目前sessionId一直可用。
    当然,目前iOS的个人自动化,对于这种循环定期执行的任务支持还不够好,没有像crontab那样方便,需要手动添加N多次。所以,个人有条件,可以把这个保活工作放到自己的vps等云服务器中执行,省事不少。
    此外,我还使用了辅助功能>触控>轻点背面动作关联了博主的开门快捷指令,这样一来,冬天不用从兜里掏出手机,也能完成解锁操作了。

    1. 欢迎讨论!
      思路没问题,正文中也说了,可以抓包小程序的接口,再定时访问保存session。但这样做法最不好的地方就在于,产生了非常多无意义的接口请求,虽然可能是用vps请求的,对咱们来说没什么影响,但全局来说,对亲邻是不友好的嘛!说不定这样搞的人多了,微信接口也会加上重放攻击的保护。

    2. 接着你的思路来说,如果你的路由器刷了固件的话,可以考虑用路由来执行这个请求,可以省掉vps。或再激进一些,用网站监控来完成,比如“监控宝”。

      但我还是不建议这样搞哦,不求双赢,但求无损。

    3. 是这样的,但是月底小程序就停用了。所以还需要重新找app的解决方案。

  6. 能不能解包,然后盗取这个加密算法,这样就可以继续做捷径开门了,我也一直在找思路,唯一一个就是解包了,

    1. 成本比较高,既然加了token,就不会轻易让外人解密的。而且当他们发现算法被解密,也只需要很低成本就可以更换。所以最好可以跳脱出来换个思路。

  7. 目前方法二已经被加密了。不知还有其他方法没?

    我的思路通过一个连接触发VPS获取最新的sessionId=wxmini:xxxx。然后再调用其进行开门。 目前未成功。

  8. surge能解决sslpining问题,抓取https的包么,是mac版surge还是iOS版

    1. 依旧可以,同时现在也出现了很多专业抓包的软件,比如国外的Proxyman。

  9. 有没有新的教程。现在ios上抓不到了。不知道是方法错了还是app新版本的不行了

  10. 保持session的方法还是可用的,在家里PVE上跑了个定时任务,另外AWS上用cloudwatch event + Lambda跑了个定时任务作为备份,目前用了几天还没有问题。

  11. 即使有sign和nonce,token/key本身也是存在本地的,理论上反编译app应该能够拿到吧?

  12. 最近搬家了物业用亲邻,app和小程序屎一样全是广告,于是折腾了一下。抓不到包是因为不是原生app而是flutter应用,flutter开发的应用常规方法抓不到包,sign的逆向也挺简单,直接frida hook就行

      1. 其实就是常规的flutter应用逆向,抓包可以通过reflutter配合brup。我是通过ida解析so文件获取了函数列表,获取了对应的加密方法,frida hook了某个hash方法(最常见的hash)得到了它的加密串,然后就很简单了,自己拼串hash发请求就行了。周末我博客写一篇文章可以一起交流下。不说的很详细是因为不想让方法扩散导致失效,望理解。

        1. 请问是使用的旧版本的APP吗,还是最新版本的呢。新版本的貌似导出的dump.dart找不出需要的代码偏移。

          1. 各位大佬,可以单独分享下API开门加密方法吗?仅个人使用,不会扩散

        2. 感谢分享 👍, reFlutter 抓包配合 Blutter & Frida 完美解决

      1. 建议使用老版本apk,就是最初那种,老版本直接reflutter就好了。新版本包括最新的语言使用blutter。方向就是这样,剩下的需要你对flutter app逆向有基础了解。可在b站搜索相应教程。

        1. 朋友,用的哪个版本啊?我用的最新的,找不到sign生成的方式,不知道hook哪里,老版本在java层吗?

        2. 已经搞定,多谢,shouji号加密没找到方法,哈哈,md5 hook到了

  13. 希望楼主出一个方法二详细点的教程,我老是获取不到mobileapi.qinlinkeji.com,但是能获取倒mobileapi3.qinlinkeji.com,可是没有macAddress,卡在这里了。

    1. 后期版本 好像就是改了 mobileapi.qinlinkeji.com 为 mobileapi3.qinlinkeji.com,所以要具体分析了

  14. 感谢博主分享,这玩意的广告真的是满天飞,实在是受不了了,目前抓包貌似是行不通了,现在有 nonce 和 sslpining 校验。所以我换了个思路,直接用安卓模拟器配合 Adb 模拟点击来实现了自动开门,项目开源在这里了 https://github.com/kasuganosoras/FuckQL

    1. 其实还是用小程序的API是最稳定,最简单的。定期刷新cookie就好了

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注