tls指纹之app端的tls指纹检测突破

admin 2024年2月1日22:07:00评论29 views字数 2606阅读8分41秒阅读模式

前言

2024年第一卷!!!

摆烂了有段时间了,期间也遇到不少影响心情的事,其实不是没有想写想发的

有几天晚上睡不着的时候,几度想要不要把公众号文章都删了,号也注销算了,这个圈子混不动了,好多次有种 “我把别人放心里,别人把我揣兜里,用时伸手不用弃之” 的感觉,有点心累了

当然还有几个更重要的原因导致不想发文(仅代表我个人观点,与事实并不对应):

    1).我个人角度看来,我有点看不到这个领域的未来了

    2).新人入行门槛高导致好多人进不来,大环境也不太好,老人们为了生活只能划水了不敢随心而为

    3).头部的几大开源库lsp,zygisk next,kernelsu等)因为被人无脑喷已停更

    4).各种防护检测手段玩飞起,逆向这个领域没剩几条活路可走

生活总得有点期盼,即使那个期盼可能并不切实际,能苟就苟吧
刚好一个朋友遇到一个app,调试起来很奇怪,所以让我帮忙看看,他感觉像是tls指纹检测,所以这不正好在我的兴趣点上吗,我研究了会儿,搞定之后立马记录下来,所以还是热乎的
这个app名字和域名,由于不可抗力原因,下面我会全程打码,而且厚码以示尊重。好奇的朋友也不要私聊问我是哪个app了,不是不愿意说,对你我都好,只展示思路就行了

分析

该app是一个海外的app,目标就是其中一个接口,场景是用clash+charles抓包可以正常抓,但是重放请求就不行,用代码请求也不行
这个描述是不是已经让你以为是tls了?真的是吗?
有朋友可能会有感而发: 我去,app上也有了tls指纹检测?之前不是说只有web端才有吗?
哈哈,正常,tls是在服务端的东西,不管客户端是电脑(web),手机(app),还是手表(智能穿戴),还是啥,tls是在服务器后端接口层的东西,只要想检测,都可以很容易实现的,我之前的练习题我也自己开发了一个检测app端的tls指纹的,而且针对不同的tls指纹绕过库做了专项特征分析,可以检测到
行了,不扯远了,各位朋友接着往下看

1.问题演示

首先,app上安装这个app,然后justtrustme啥的lsp插件自己处理好,以免漏包,然后有一部分lsp检测,用我自己开发的绕过检测lsp的插件绕过即可
电脑开启xxash(虽然该项目作者跑路了不过将就用),然后开启charles
charles做如下配置即可:

tls指纹之app端的tls指纹检测突破

7890是我xxash的局域网端口

tls指纹之app端的tls指纹检测突破

xxash配置:

tls指纹之app端的tls指纹检测突破

然后就可以正常抓海外app的包了

tls指纹之app端的tls指纹检测突破

然后这个rendxx接口就是目标接口了:

tls指纹之app端的tls指纹检测突破

鼠标右键,repeat,实现重放

tls指纹之app端的tls指纹检测突破

结果就不行,要嘛是403

tls指纹之app端的tls指纹检测突破

要嘛是200,但是返回异常

tls指纹之app端的tls指纹检测突破

正常的话,是有数据的:

tls指纹之app端的tls指纹检测突破

调试

ok,问题如上,开始搞
我先对比了请求头

tls指纹之app端的tls指纹检测突破

发现确实有点差异,一个有http2.0,一个是http1.1
怎么判断是1.x还是2.0
请求头有
:method:path:authority:scheme
这几个的就是http2.0,之前我那个查看tls指纹的,里面的akxxai 指纹就是通过这个计算的http2.0指纹,这个反正确实是一个检测点
用requests请求确认:

tls指纹之app端的tls指纹检测突破

是有点影响,但是感觉影响不大,我多试了几次后,发现不是这个问题,他也会返回这样的时候,说明验证了某个值的,请求头一看果然有个token

tls指纹之app端的tls指纹检测突破

难道就这一个token的时效性问题,感觉不太像,此时我继续在charles里重放,又可以了,神奇,同样的token加密参数

tls指纹之app端的tls指纹检测突破

所以问题不在这
用httpx试试,这个库支持http2.0

tls指纹之app端的tls指纹检测突破

结果还是不行,那只能试试tls了
这里我用的我群里大佬3301开发的pyhttpx库,我用起来顺手一点,当然其他的tls库也可以,这里就不展开了,之前的tls相关文章已经提过好几次了 tls指纹之chrome新版功能/近期问题汇总/目前能直接使用的tls对抗库
这么设置以后

tls指纹之app端的tls指纹检测突破

请求还是不行,

tls指纹之app端的tls指纹检测突破

那只能看看tls了
在charles里,看了下,这两个好像确实不一样

tls指纹之app端的tls指纹检测突破

可能看过我文章的朋友这里就要问了,“你之前不是说在客户端看tls信息不准确吗,验证是在服务端的事”
确实啊,但是这里其实并不冲突,因为我们看不到服务端的验证,那么这里只能猜测,毕竟我现在打开任何一个带有ssl的网站都会有这段代码,而且用charles重放的时候,这里还为空:

tls指纹之app端的tls指纹检测突破

所以用charles确实是不准确的,只是顺带看看,毕竟上面两个图,一下就看出区别了
那么相对稳妥的方法是什么呢?

wireshark

tls指纹之app端的tls指纹检测突破

然后用ip.addr == 你那台目标手机的局域网ip
然后往下找,找client hello包:

tls指纹之app端的tls指纹检测突破

这些就是手机实际发包的tls了,然后展开最后的ja3 fullstring:

tls指纹之app端的tls指纹检测突破

把这个值复制出来,放到代码里,请求:

tls指纹之app端的tls指纹检测突破

发现还是不行?
难道说,并不是?
不,前面不是说了有个加密参数吗,重新获取下最新的,怎么获取,重新抓个包不就完了:

tls指纹之app端的tls指纹检测突破

ok了,剩下就是去逆向这个加密参数了
搞定!!!!!

补充

如果你不信任wireshark解析的,其实可以拿到cipher suite相关的,自己去解值:
https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtmlhttps://www.openssl.org/docs/man1.0.2/man1/ciphers.html
怎么解,演示下:
比如你拿到一个
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
找对应的value

tls指纹之app端的tls指纹检测突破

最左边的就是value,然后转10进制,他那样写你直接复制转出来是有问题的,你得把中间的逗号和0x删了再操作才是正确的值,按我下面的演示

tls指纹之app端的tls指纹检测突破

即可得知
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 = 52392
所以其他的以此类推即可得出完整的ja3指纹的值
还有种办法就是,你自己写个app demo,然后去请求tls.peet.ws/api/all,请求库用你目标app相同的库,比如目标app用的okhttp4.10,那你的demo也用okhttp4.10,请求tls.peet.ws/api/all,把结果用logcat打印出来,然后复制结果,把结果赋值给pyhttpx的ja3即可

结语

随缘更新,不水文

工作避坑&内推(仅成都)、商务合作、技术交流群

扫码或者搜ID:geekbyte

tls指纹之app端的tls指纹检测突破

原文始发于微信公众号(编角料):tls指纹之app端的tls指纹检测突破

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月1日22:07:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   tls指纹之app端的tls指纹检测突破https://cn-sec.com/archives/2402594.html

发表评论

匿名网友 填写信息