前言

最近互联网冲浪,经常看到一个话题。那就是

您的腾讯云账号(账号ID:xxxxx,昵称:xxxxx)下的设备(IP:xxxxx)存在通过技术手段使其成为跨境访问节点等行为

而腾讯云给出的理由是,检测到访问受限网站且和境内有流量传输。在我看来,这不过是搪塞用户的说辞,如果将真正的检测点公布就意味着绕过;并且以机房为单位进行单纯此行为检测的话,误报会非常大,是完全无法进行运营的。正当我好奇腾讯云是如何精准检测的时候,看到如下帖子内容。 瞬间就明白大致情况。

什么是JA3/JA3S?

概念最早由salesforce的工程师(https://github.com/salesforce/ja3 )提出,通过TLS握手字段中的 SSLVersion,Cipher,SSLExtension,EllipticCurve,EllipticCurvePointFormat 信息进行计算得出hash,通过该hash来标记SSL握手中客户端、服务端特征。client hello计算出的为ja3,server hello中计算出的为ja3s。

什么是JARM?

概念由salesforce的工程师(https://github.com/salesforce/jarm )提出,JA3/JA3S是在流量被动监听中得到,而JARM则是主动探测得到。由client指定不同的TLS版本、支持套件去试探服务器的响应情况。通过探测的结果形成hash来标记服务器的特征。

可以用来做什么?

两者均是TLS信息(版本、支持套件)的简化表现形式。所以JA3/JA3S可以用来标记特质的客户端、服务端所产生的流量,例如CobaltStrike,目前看到的是CobaltStrike服务端JA3S指纹如下: JA3指纹则根据客户端的不同环境(系统版本等)有变化。Suricata支持ja3关键字,可以直接通过指纹形成规则。

JARM则可以用来威胁狩猎:

回到开头

正如帖子中说到的那样,楼主的FRP被腾讯云识别到。(当然,FRP默认就有很多的特征可以用来识别)巧合的是某款流行的“射线”代理工具(该工具有V2和X两个版本,此处不再具体指明)和FRP一样,都是Golang写的,本地测试一下,得到其握手JA3/JA3S、JARM。通过最新版本的JARM进行测绘:

根据版本的变化会有不同的指纹表现,相信全部拿到也只是时间问题。云供应商 完全可以通过此JA3、JA3S规则进行初步筛选租户的流量,辅以主动探测JARM、流量境内外差值情况佐证,相信准确率可以大大提升。

如何规避?

使用流量基数大的客户端、服务端指纹进行中转,例如:服务端使用Nginx、Apache等主流中间件进行反向代理,客户端在直接链接到服务端之前先过本地的主流中间件中转。或者从底层修改掉相关指纹的表达(此处不再具体延申)。

其他

本文所提到的所有内容均在存在TLS握手过程的情况下才可复现,单纯HTTP流量不适用。

试了一下。挖矿的恶意流量也会表现出特有指纹。