声明
本文是我的公众号文章,提早发,免得又有人比我先发,让不知道的人还以为是他的(嘿嘿),原文地址:
前言
这篇文章发布有一年多时间了,我也由js和app逆向,来回切换了有段时间了,说实话,已经在躺平了
卧槽了,突然看到ja3作者在十几天前发了个ja4,我以为闹着玩的呢,点开是ja3作者发布的,垂死病中惊坐起!!!
接下来就来浅浅的剖析下这ja4是怎么个事,暂时就不深度剖析了
分析
开源链接是:
https://github.com/FoxIO-LLC/ja4
ja4概述文章是:
https://blog.foxio.io/ja4-network-fingerprinting-9376fe9ca637
关键他一发还发了好几个产品,有ja4,ja4+,ja4s啥的,接下来就来展开讲讲,当然我也是照着他的博客,再加上自己的理解来讲,如果您觉得我讲的不行,你可以看原文即可。
ja4+简介
JA4 / S/H/L/X/SSH,简称JA4+,所以,也就是说,这个ja4+是一整套产品的名字而已
JA4+提供了一套易于使用和共享的模块化网络指纹,取代了3年的JA2017 TLS指纹标准。这些方法既是人类可读的,也是机器可读的,以促进更有效的威胁搜寻和分析。这些指纹的用例包括扫描威胁参与者、恶意软件检测、会话劫持预防、合规性自动化、位置跟踪、DDoS 检测、威胁参与者分组、反向外壳检测等等
JA4+ 是一组简单而强大的网络指纹,适用于人类和机器可读的多种协议,有助于改进威胁搜寻和安全分析。如果您不熟悉网络指纹识别,我鼓励您阅读我的博客,在这里发布JA3,在这里发布JARM,以及Fastly关于TLS指纹识别状态的优秀博客,其中概述了上述历史及其问题。JA4+ 提供专门的支持,使方法随着行业的变化而保持最新状态。此外,根据大众的需求,正在建立一个包含指纹、相关应用程序和推荐检测逻辑的官方JA4+数据库。
所有JA4+指纹都具有a_b_c格式,分隔构成指纹的不同部分。这允许仅使用 ab 或 ac 或 c 进行搜寻和检测。如果一个人只想对传入到他们应用程序中的 cookie 进行分析,他们只会查看JA4H_c。这种新的局部性保留格式有助于进行更深入、更丰富的分析,同时保持简单、易于使用并允许可扩展性。
看着很牛逼的样子,大概意思是说添加更多的指纹识别策略,行为分析啥的
生成依据有:
初始指纹:
JA4 — TLS 客户端 JA4S — TLS 服务器响应
JA4H — HTTP 客户端
JA4L — 光距离/位置
JA4X — X509 TLS 证书
JA4SSH — SSH 流量
然后给了些例子:
那么接下来仔细看,这些ja4+的产品各个都是些啥
ja4简介
JA4 对客户端进行指纹识别,无论流量是通过 TCP 还是 QUIC 进行的。QUIC是新的HTTP / 3标准使用的协议,它将TLS 1.3封装到UDP数据包中。由于QUIC是由Google开发的,如果一个组织大量使用Google产品,QUIC可以占其网络流量的一半,因此捕获这一点很重要
JA4还清楚地显示了ALPN(应用层协议协商)。这表示应用程序在 TLS 协商完成后要在其中进行通信的协议。“h2” = HTTP/2, “h1” = HTTP/1.1, “dt” = DNS-over-TLS等可以在此处找到可能的 ALPN 的完整列表。这里的“00”表示缺少 ALPN。请注意,ALPN“h2”的存在并不表示浏览器,因为许多物联网设备通过HTTP / 2进行通信。但是,缺少 ALPN 可能表明客户端不是 Web 浏览器。
JA4在应用基本上是静态的生产网络中非常有价值。如果您运行的是全Linux基础架构,那么Windows JA4指纹将值得研究。如果您只运行Exchange服务器,那么突然的python JA4指纹将值得研究。在尝试了解网络流量时,JA4 是分析中一个很好的枢轴点,a_b_c格式允许进行更深入的分析
厉害了,之前ja3作者自己说过,不能直接解析quic的数据流,所以quic不支持ja3指纹,它这么一搞,意思是quic指纹也可以搞了,然后把http2.0的指纹也加入进来了,666啊
试试动图能不能插入进来
相关的例子:
ja4s简介
例子:
客户端发送其 TLS 客户端 Hello 数据包后,服务器将使用其 TLS 服务器 Hello 数据包进行响应。此数据包也以明文形式发送,是根据服务器在客户端 Hello 中选择的可用选项制定的。这包括从可用选项列表中选择的一个密码,以及服务器希望设置的任何扩展名。
因此,服务器 Hello 对于服务器应用程序和发送给它的客户端 Hello 都是唯一的。不同的客户端 Hello 可能会导致来自同一服务器的不同服务器 Hello,从而产生不同的 JA4S。但是,相同的客户端问候将始终从该服务器应用程序生成相同的服务器问候。例如,如果客户端发送 JA4=a_b_c 并且服务器响应 JA4S=d_b_e,则该服务器将始终使用 d_b_e 响应a_b_c。但是,如果另一个应用程序向同一服务器发送不同的客户端问候,例如 JA4=x_y_z,服务器将使用不同的服务器问候 JA4S=t_y_v 进行响应。因此,这是对不同应用程序的不同响应,但对同一应用程序始终是相同的响应
JA4S与JA4结合使用时,可显著提高检测保真度。从仅识别客户端的底层库到识别客户端或恶意软件系列。除了应用程序识别之外,人们还可以查看JA4S_b以了解任何给定网络上正在使用哪些密码,以确保其满足合规性要求。所有这些都可以在不破坏加密的情况下实现
因为之前一直有一个猜测,就是一模一样的配置,相同的局域网(所以出口同一个ip),相同的浏览器版本,发起的tls,很多人都会以为生成的tls指纹是同一个,但其实不是的,都是唯一的,后面谷歌浏览器更新之后,把那5个tls组件的第三个extensions的顺序给随机以后,同一个电脑产生的ja3也不一样了(但是只要做好排序,还是固定的)
他这里倒没说有啥新的东西,我倒是感觉他可能把这个唯一性做的更严谨了(我猜测)
ja4H简介
JA4H 根据每个 HTTP 请求对 HTTP 客户端进行指纹识别。由于大多数流量都是加密的,因此 JA4H 最适合在服务器、代理、WAF、TLS 终止负载均衡器以及解密 TLS 的环境中使用。然而,即使在TLS未解密的环境中,JA4H仍然很有价值,因为许多设备和程序(包括恶意软件)仍然通过HTTP进行通信。例如,IcedID恶意软件投放器不使用TLS。这些恶意软件程序很容易指纹识别在服务器端,可以使用JA4H_c作为搜寻方法。由于服务器指定客户端应使用哪些 cookie 字段,因此所有客户端都应具有相同的JA4H_c。这里的差异值得研究。还可以使用JA4H_d跟踪用户,并使用JA4H_ab跟踪其客户端应用程序,或者仅使用JA4H_ab识别机器人。
在客户端(代理、NDR、零信任),JA4H 与 JA4 和 JA4S 相结合,可实现极高的保真度应用程序和恶意软件检测。
JA4H有很多用例,特别是当与JA4+的其余部分结合使用时。我将在以后的博客文章中更详细地介绍所有这些
所以他本质就是个HTTP 客户端指纹。等会儿,卧槽,http的也可以获取指纹了,之前ja3指纹,是依附于tls/ssl的,所以可以借助tls version,cipher suites,extensions,support group ,ec format point五大组件生成。但是很多人其实不想在ssl上部署,因为很多服务,其实只能在http,https配置也繁琐。
有了这个ja4h,http上也可以获取指纹了,卧槽,牛逼大了啊
JA4H_ab是所用给定 HTTP 方法的应用程序的指纹。缺少接受语言清楚地表明该应用程序不是人类交互的,因此是机器人。
JA4H_c 是 Cookie 的指纹,对于访问的每个网站会有所不同,但对于该网站或应用程序将是相同的。例如,每个 Plex 服务器或 Okta 服务器将产生相同的JA4H_c。
JA4H_d是用户的指纹,每个用户都不同。这允许在不记录 SPII 的情况下通过网站跟踪用户,从而保持日志记录系统 GDPR 合规性
例子:
ja4L简介
JA4L 通过查看连接中前几个数据包之间的延迟来测量客户端和服务器之间的距离。我们使用前几个数据包,因为这些数据包是低级机器生成的,因此在创建和发送这些数据包时处理延迟几乎为零。时间以微秒 (μs) 为单位,1ms = 1000μs,因为微秒是数据包捕获中的标准时间测量单位。
在服务器端将 JA4 与 JA4H 和 JA4L 结合使用,使服务器应用程序能够识别会话劫持或 MiTM 攻击。如果会话 Cookie (JA4H_d) 突然更改位置、操作系统 (JA4L) 和应用程序(JA4 和 JA4H_ab),则撤销会话令牌,要求用户使用 MFA 重新登录是有意义的。对于这种类型的逻辑,应特别注意不要将特定指纹列入允许列表,因为应用程序会随着时间的推移而变化,而是要寻找显着的变化。使用 JA4+ 进行会话劫持检测是 darksail.ai 目前正在研究的事情
卧槽,这高科技啊,新东西,通过延迟来判定服务端与客户端的距离
如果 JA4L 正在运行服务器端,这将测量客户端与服务器的距离,如果这是运行的客户端,这将测量服务器与客户端的距离。如果这是在网络分流器上运行的,它将测量每个分流器与网络分流器位置的距离
注意这句话,你想想,要是运行在cdn上,会有什么效果,然后能干啥,举个例子,拿来判定是否用了代理,这tm有点猛啊
666,他还有计算公式,卧槽,有点看不懂了。但是,可以通过这个,生成一些数据模型,以此来判断是否是可疑设备,他们已经给了一些规律
太狠了卧槽
ja4X简介
JA4X 根据 TLS 证书的生成方式进行指纹识别,而不是对证书中的值进行指纹识别。这可以识别用于创建证书的应用程序和设置,这在威胁搜寻中非常有用,因为威胁参与者将创建不同的证书,但倾向于使用相同的方法来创建所述证书,从而具有相同的 JA4X 指纹。
这个的大概就是说可以识别证书伪造与否,也可以用来识别是否是可以设别,比如,证书被替换抓包啥的,如果有这个,可以防止一定程度的中间人代理抓包,有点东西啊
加上,市面上的国际大组织,用的证书都是一套,收集好了证书的指纹,就可以用来甄别
ja4SSH简介
JA4SSH 通过查看 SSH 数据包并在可配置的滚动基础上提供一个小、简单、易于读取的会话指纹来识别 SSH 会话,默认情况下每 200 个数据包。有了这个,我们能够确定SSH连接中发生了什么,即使流量是加密的,并为分析师提供一组简单的指纹进行分析。
请注意,JA4SSH 指纹是 SSH 会话,而不是 SSH 应用程序
简而言之,SSH 数据包根据所使用的密码算法和 HMAC 填充到特定长度。使用 chacha20-poly1305,最终为 36 字节。当客户端在 ssh 终端中键入字符时,该字符将使用填充为 36 字节的数据包进行加密,然后发送到服务器。服务器将在 36 字节数据包中使用相同的字符进行响应,这就是该字符显示在终端窗口中的时间。然后,客户端将发送一个 TCP ACK 数据包,告诉服务器他们已完成上一个事务
JA4SSH可以轻松检测某些类型的SSH活动,并以易于理解的格式提供指纹。将JA4SSH与JA4L相结合可以通知客户端/服务器的距离以及每个客户端/服务器的操作系统
这个倒是用的不多,基本都是远程连接服务器啥的会用到,所以这个也会用来检测是否是可疑设备,防黑客啥的。对逆向来说的话,用处不大
ja4与ja3的区别
上面的文章里,他其实并没有解释与ja3的区别
那么我们就只能看源码来确认了
找个对比的工具,对比ja3和ja4的区别
https://github.com/salesforce/ja3/blob/master/python/ja3.py
https://github.com/FoxIO-LLC/ja4/blob/main/python/ja4.py
ja4:
ja3:
我大概的看了下,有以下区别
1.ja3是借助dpkt这个包来解析tls的,ja4是借助tshark(wireshark的终端工具)解析的,这个跟我之前开课里讲的思路一致
2.ja4加入了tcp,udp,http1.0,http2.0,quic的指纹分析,以及相对底层的stream流,ja3只是五大组件的解析
3.ja4最后的生成:
x['JA4']=f"{ptype}{version}{sni}{cipher_len}{ext_len}{alpn}_{sorted_ciphers}_{sorted_extensions}"
有了ptype,sni,alpn,去掉了supported group和ec format point(没看错的话)
具体的你们可以自行看他的源码
结语
真刺激,又有新东西了。
不说了,继续期待大佬写一个一键操作能伪造ja4的请求库出来