前言
五一刚回来的第一次放假,早上起来看了下NBA,湖人大胜,热血沸腾的我,本想下午去打球锻炼锻炼身体,但是暴雨破灭了我当詹姆斯的梦,只好打开电脑开始琢磨点新玩意,正好看到了小花瓶(Charles
),奔着学习一下小花瓶抓包的技术心态,打开了小花瓶,心想拿什么练手好呢?
打开了手机,发现了”哈弗智家”APP,心想:
前几年买车的时候,看到里面有个积分商城,可以通过积分兑换一些小礼品,反正都是练手,为什么不奔着目的去?
好的,我本次的目的就是实现:
自动登录账号,并且在随机时间点签到(不让官方抓到我是薅羊毛的)
需求拆分
既然我们的目标有了,那么目前我们要做的事情应该有如下几个:
- 通过
Charles
抓包”哈弗智家”APP,获取相关接口 - 通过登录接口获取到的登录信息,请求获取积分相关的接口,如:”获取签到状态”、”签到”、”获取积分数”
- 通过代码请求接口,从而实现自动签到步骤
- 通过
crontab
定时任务来实现每天定时签到
实施
需求调研
首先我们打开”哈弗智家”APP,体验一下流程,具体的登录页面如下:
支持的登录方式有很多种:手机验证码、账号密码、微信、微博、QQ、苹果账号等
登录上来后是这样的:
有用户信息、积分信息、签到按钮
抓包过程
现在我们需要使用 Charles
进行抓包,获取到我们的登录信息,具体的抓包过程我就不写出来了,我仅仅是提供一个思路,需要学习 Charles
抓包的可以自行Google学习。
我使用 账号密码登录
后,发现”哈弗智家”APP使用的是SSO登录,我看了SSO登录的请求相关信息,重复几次,发现了几个在变化的参数,然后在查询所以抓包的信息中查找这些参数,最终在这个 account-login
接口下获取到了对应的 响应
信息,抓到的信息如下:
从这个 响应信息
中看到对应的 请求体
竟然是一段密文,What Fuck?
现在汽车厂商的APP安全性做的都这么好的么?我猜测应该是APP内部代码对我请求进来的 账号密码
进行了加密,再给后端服务器传输了。
就当我觉得我要终止 “学习” 的时候,我又想到了,不是还有其他方式么?总不能微信、、微博那些 OAuth2.0
的登录方式也进行了加密吧?
然后我又退出了登录,使用了微信登录的方式,再次抓了一次包,这一次,终于!!!被我逮到了。
果然OAuth2.0
的登录方式并没有进行加密,抓到的信息如下:
是明文的,甚至传过去的 accessToken
都是用的微信 openId
,并没有用微信给的 accessToken
。这样就方便多了,我每次都不需要与微信去交互,直接记住我的账号在 “哈弗智家”APPID下的 openId
就可以了。
剩下的就是分析还需要什么参数了,我目前已经拿到了 SSO
登录的id了,目前根据一些关于用户信息的其他接口来看,我还需要获取到用户 Token
,这里的 Token
和上面的 accessToken
并不是一个东西。
在翻了大量的接口下,终于让我找到了获取用户 Token
的接口了,具体的接口信息如下:
在这个接口中,我拿到了对应的用户 Token
。
此时我以为准备工作都做好了,剩下的接口抓一抓包,填充一下信息就好了,心里想:
就在我将获取用户信息的接口扒下来,放在 postman
请求的时候,报错了,说我签名不对!!!
我还以为是我接口请求工具有问题,我赶紧换了一个接口工具,可是还是说我签名不对,我就开始检查参数、检查地址,甚至我连网络都检查了一遍,没错呀!!!是我的 【电信千兆1ms延迟的光钎网络】 啊,然后我又看了一遍请求参数。。
最终!!!我发现请求头里,还有个 bt-auth-sign
的签名参数
我赶紧回到了 Charles
中寻找,看看这个签名是否是通过接口请求得到的,结果并没有找到。。
心里都要爆粗口了,搞什么,就签个到,这么多层加密,开发这个APP的是支付宝退伍的?这类加密看起来像是需要AK、SK组合排序,然后再通过签名算法加密的这种。这个不知道密钥压根没法玩。
可我还是不死心,我翻遍了所以的接口请求,查看响应体,完全没看到 密钥
相关的字段,而且就算我知道了密钥,我也不知道加密算法,目前看结果来看,有点像 AES
、DES
、SHA256
类加密算法,盲猜太浪费时间了。。就当我准备要放弃的时候,我想到了大学的时候,学网安的同学说过一句话”没有东西是完全安全的”。
社会工程学
先科普一下这个标题,没学过 网安
的朋友可能看不懂。社会工程学是指在信息安全方面操纵人的心理,使其采取行动或泄露机密信息。[1]有别于社会科学中的社会工程,这是种以收集信息、欺诈或入侵系统为目的的信任骗局,已发展出各种技术手段,并可能用于犯罪。
我为什么会想起了这个?因为虽然程序可以密不透风,但是在现在互联网发达的年达,没有什么东西是不透风的,人才是最不安全的。
所以我就开始去翻各大的 社交平台
根据关键字搜索。。。
没想到,功夫不负有心人,还真有人干过这事,AK、SK都对上了,而且还说明了参数的排序,我只需要从 AES
、DES
、SHA256
等等几类加密后结果为64位的算法中去尝试、比对,最终与抓包得到的一致,就证明算法是正确的。
说干就干,此处省略长达两小时的破译,最终找出了加密的算法。。
编码
剩下的事情就是编码和部署到服务器,使用 crontab
设置执行时间了,为了不收律师函,代码我就不开源了,最后奉上一张成品图:
程序内主要做的事情就是:每次定时任务执行开始,随机 sleep
一个秒数,然后依次执行 获取SSO登录ID -> SSO登录账号 -> 获取签到状态 -> 签到 -> 发送邮件
结语
折腾了一天,好像也没有分享出什么太多的流程步骤,比如:如何使用 Charles
啊、请求了哪些接口啊、我的源代码啊
上面这些都不重要,重要的是思路,有了思路,上面的东西,易如反掌。
我写这篇文章,主要是想给大家分享一下我弄这个东西的思路,以及所谓的 社会工程学
到底多离谱,也许你认为你做的系统很安全,起码机器层面上看起来是安全的,但是往往泄密的都是人,而不是机器。