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 ,或直接扫描下方二维码添加。
你好,怎么样才能抓到https 数据,已经安装了charles证书,surge设置代理,但是https数据还是不能显示,请问有什么秘诀吗》?谢谢!
如果你说的https数据不能显示,指的是能看到请求,但看不到内容,那目测是证书没配置好。
你在安装完charles证书后,ios设备还需要到设置>通用>关于本机>拉到最下面“证书信任设置”中,将刚才安装的证书开启。
如果你也开启了,还是不行,建议重启手机和电脑。
感谢回复,你说的设置都没问题,证书已经信任了,手机重启试过了 ,charles版本也换了,一直没找到问题的原因,难道是亲邻开门版本问题,请问你抓包的是哪个版本的app,谢谢
大概率不是亲邻版本的事情,比如你抓别的能抓到https吗?
你还可以再试一下:在手机上,把surge改为直连,开启mitm和抓取流量,直接用surge抓取流量。
我的surge是网上找的免费版没有mitm等功能,用stream手机抓包也是看不到内容,只能抓亲邻开门叮咚mp3。https比如百度网页等可以看见发送内容,google等和亲邻一样提示证书不匹配,所以我怀疑亲邻有sslpinning之类的,用了安卓4.4.2模拟器+drony转发,不行又试了xpose框架just trustme+sslunpinning等各种方法都试过了,就亲邻抓不到,后来看了你的文章就换了iphone+surge 还是一样handshake_failur问题,charles提示返回亲邻服务器证书是digicert,手机电脑证书都安装了所以我也不知道问题出在哪里
我刚才又试了下,最新版的APP,直接可以用surge抓到。我是iOS最新版+surge最新版+亲邻科技最新版。
如果你能用mitm,需要注意两点:一个是安装根证书,另一个是需要在mitm里开启“跳过服务端证书认证”和“用于tcp连接”,因为亲邻APP的就是tcp连接。
另我这篇文章是用mac环境下的Charles,我建议你换一下charles版本,有些破解版本确实存在问题。不建议使用安卓,因为安卓整个系统都是该安全的地方不安全,不安全的地方瞎安全。
现在好像多了几个字段 捷径用不了了
目前还可以用哈 iOS手机下载一个stream抓包软件 获取Mac address 和session
能抓包的工具很多,但如何解决token的问题才是关键
现在还能用吗?小区刚换了这个,每次出入掏手机和打开小程序或app挺麻烦的!有快捷指令就好了~但下载了用不到
你好,目前不能使用了。
你好,目前使用不了,能提供一些解决思路吗
你好,文章开头有提到目前失效的原因。思路无非是找到绕过或不需要签名的接口。也许小程序可以,但session保持又是个问题。
根据博主的思路,简单描述下我的一个尝试过程,希望可以跟大家交流一下,看能否有更好的方法。
小程序抓包还是很方便的,在抓包过程中发现有个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等云服务器中执行,省事不少。
此外,我还使用了辅助功能>触控>轻点背面动作关联了博主的开门快捷指令,这样一来,冬天不用从兜里掏出手机,也能完成解锁操作了。
欢迎讨论!
思路没问题,正文中也说了,可以抓包小程序的接口,再定时访问保存session。但这样做法最不好的地方就在于,产生了非常多无意义的接口请求,虽然可能是用vps请求的,对咱们来说没什么影响,但全局来说,对亲邻是不友好的嘛!说不定这样搞的人多了,微信接口也会加上重放攻击的保护。
接着你的思路来说,如果你的路由器刷了固件的话,可以考虑用路由来执行这个请求,可以省掉vps。或再激进一些,用网站监控来完成,比如“监控宝”。
但我还是不建议这样搞哦,不求双赢,但求无损。
是这样的,但是月底小程序就停用了。所以还需要重新找app的解决方案。
能不能解包,然后盗取这个加密算法,这样就可以继续做捷径开门了,我也一直在找思路,唯一一个就是解包了,
成本比较高,既然加了token,就不会轻易让外人解密的。而且当他们发现算法被解密,也只需要很低成本就可以更换。所以最好可以跳脱出来换个思路。
目前方法二已经被加密了。不知还有其他方法没?
我的思路通过一个连接触发VPS获取最新的sessionId=wxmini:xxxx。然后再调用其进行开门。 目前未成功。
目前暂无
surge能解决sslpining问题,抓取https的包么,是mac版surge还是iOS版
可以,我用的是ios版本,其他类似app应该也可以。
博主,ios现在还能用surge抓包吗?
依旧可以,同时现在也出现了很多专业抓包的软件,比如国外的Proxyman。
有没有新的教程。现在ios上抓不到了。不知道是方法错了还是app新版本的不行了
保持session的方法还是可用的,在家里PVE上跑了个定时任务,另外AWS上用cloudwatch event + Lambda跑了个定时任务作为备份,目前用了几天还没有问题。
即使有sign和nonce,token/key本身也是存在本地的,理论上反编译app应该能够拿到吧?
最近搬家了物业用亲邻,app和小程序屎一样全是广告,于是折腾了一下。抓不到包是因为不是原生app而是flutter应用,flutter开发的应用常规方法抓不到包,sign的逆向也挺简单,直接frida hook就行
👍🏻,你可以完整说下你的方案
其实就是常规的flutter应用逆向,抓包可以通过reflutter配合brup。我是通过ida解析so文件获取了函数列表,获取了对应的加密方法,frida hook了某个hash方法(最常见的hash)得到了它的加密串,然后就很简单了,自己拼串hash发请求就行了。周末我博客写一篇文章可以一起交流下。不说的很详细是因为不想让方法扩散导致失效,望理解。
请问是使用的旧版本的APP吗,还是最新版本的呢。新版本的貌似导出的dump.dart找不出需要的代码偏移。
blutter可解
谢谢,没想到这个新项目这么好用。
打开了新大陆,成功了,特来感谢
各位大佬,可以单独分享下API开门加密方法吗?仅个人使用,不会扩散
感谢分享 👍, reFlutter 抓包配合 Blutter & Frida 完美解决
请问hook什么地方?多谢
抓到了,但是没找到hash方法
请问hook哪里?抓到包了,没搜到sign相关的代码
建议使用老版本apk,就是最初那种,老版本直接reflutter就好了。新版本包括最新的语言使用blutter。方向就是这样,剩下的需要你对flutter app逆向有基础了解。可在b站搜索相应教程。
打错字了。新版本包括最新的需要,打成语言了
朋友,用的哪个版本啊?我用的最新的,找不到sign生成的方式,不知道hook哪里,老版本在java层吗?
已经搞定,多谢,shouji号加密没找到方法,哈哈,md5 hook到了
希望楼主出一个方法二详细点的教程,我老是获取不到mobileapi.qinlinkeji.com,但是能获取倒mobileapi3.qinlinkeji.com,可是没有macAddress,卡在这里了。
后期版本 好像就是改了 mobileapi.qinlinkeji.com 为 mobileapi3.qinlinkeji.com,所以要具体分析了
感谢博主分享,这玩意的广告真的是满天飞,实在是受不了了,目前抓包貌似是行不通了,现在有 nonce 和 sslpining 校验。所以我换了个思路,直接用安卓模拟器配合 Adb 模拟点击来实现了自动开门,项目开源在这里了 https://github.com/kasuganosoras/FuckQL
其实还是用小程序的API是最稳定,最简单的。定期刷新cookie就好了
小程序不是已经开不了门了吗?接口还能用吗
对的