做家装的网站,企业的网络推广,地铁建设优缺点,微信公司这是关于网络指纹识别的两部分系列的第二部分上一部分我介绍了有关TLS 指纹识别方法#xff08;以及在不同客户端的指纹有何区别#xff09;#xff1a;https://mp.weixin.qq.com/s/BvotXrFXwYvGWpqHKoj3uQHTTP/2 指纹识别和Tls指纹类似也是一种 Web 服务器可以依赖指纹来识…这是关于网络指纹识别的两部分系列的第二部分上一部分我介绍了有关TLS 指纹识别方法以及在不同客户端的指纹有何区别https://mp.weixin.qq.com/s/BvotXrFXwYvGWpqHKoj3uQHTTP/2 指纹识别和Tls指纹类似也是一种 Web 服务器可以依赖指纹来识别哪个客户端。例如它可以识别浏览器类型和版本或者是否使用了脚本(你是真实浏览器啊还是ScriptBoy?)。该方法依赖于 HTTP/2 协议的内部结构与其更简单的前身 HTTP/1.1 相比这些内部结构鲜为人知。在这篇文章中我将首先简要介绍 HTTP/2协议然后详细介绍我们可以协议的哪些参数来识别你究竟谁(what are you)与HTTP/1.1相比使用HTTP/1.1协议,客户端向服务器发送文本请求通常使用 TLS 加密默认情况下Chrome 的请求如下所示GET / HTTP/1.1
Host: www.wikipedia.orgsec-ch-ua: Not A;Brand;v99, Chromium;v101, Google Chrome;v101
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: Windows
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36
Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,image/apng,;q0.8,application/signed-exchange;vb3;q0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q0.9User-Agent包含客户端的确切版本虽然可用于识别客户端。但是很容易被任何 http 库或命令行工具伪造(地球人都知道)HTTP/2 简介HTTP/2 是 HTTP 协议的主要修订版从 2015 年左右开始出现。现在大约一半的网站使用 HTTP/2image基本上所有流行的网站都默认使用它如何看服务端使用的是否是http2协议呢在chrome上看是这样的image在Firefox上看是这样的HTTP/2 的主要目标是提高性能多路复用Multiplexing - 多个请求和响应可以同时共享同一个 TCP 连接从而减少了获取具有大量资源图像、脚本等的站点的时间。优先级PRIORITY - HTTP/2 支持对某些请求和响应进行优先级排序。服务器推送Server push - 在 HTTP/2 中服务器可以在客户端请求资源之前将资源发送给客户端。然而HTTP 协议的应用程序语义没有改变它仍然由熟悉的请求/响应模型组成包括 URI、HTTP 方法、HTTP 标头和状态码。Frames and StreamsHTTP/2 是一种二进制协议与文本 HTTP/1.1 不同。HTTP/2 中的消息由帧组成有十种不同用途的帧。帧始终是流的一部分。Stream都是有编号的从0开始如上图编号为0的Stream包含如下SETTINGS是客户端发送的第一帧包含 HTTP/2 的特定配置WINDOW_UPDATE- 增加接收器的窗口大小下面会讲到然后是编号开始递增代表了客户端给服务端发送的实际请求如上图为1的StreamHEADERS 包含 URI、HTTP 方法和客户端的 HTTP 头DATA 包含来请求的资源数据以及服务器的响应使用 HTTP/2 进行客户端指纹识别研究http2协议的工具这里推荐使用nghttpd它可以很方便的创建一个http2协议的webserver。最关键的是让客户端请求的时候它能够直观的把每一帧都给打印出来下面会给大家演示 我将它安装在wsl的ubuntu机器上还得自建一个证书这里我遇到了一点坑 避坑指南请看我写的(wsl创建证书让chrome浏览器识别)下面就是如何使用nghttpd跑h2协议server我这里分别使用如下客户端来测试Chrome浏览器Firefox浏览器CURLPython脚本1. SETTINGS上面介绍到这是客户端发送的第一帧里面有一些特殊配置Chromeimagerecv SETTINGS frame length24, flags0x00, stream_id0[SETTINGS_HEADER_TABLE_SIZE(0x01):65536][SETTINGS_MAX_CONCURRENT_STREAMS(0x03):1000][SETTINGS_INITIAL_WINDOW_SIZE(0x04):6291456][SETTINGS_MAX_HEADER_LIST_SIZE(0x06):262144]Firefoximagerecv SETTINGS frame length18, flags0x00, stream_id0[SETTINGS_HEADER_TABLE_SIZE(0x01):65536][SETTINGS_INITIAL_WINDOW_SIZE(0x04):131072][SETTINGS_MAX_FRAME_SIZE(0x05):16384]CURLimagerecv SETTINGS frame length18, flags0x00, stream_id0[SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100][SETTINGS_INITIAL_WINDOW_SIZE(0x04):1073741824][SETTINGS_ENABLE_PUSH(0x02):0]PYTHONimageimagerecv SETTINGS frame length36, flags0x00, stream_id0[SETTINGS_HEADER_TABLE_SIZE(0x01):4096][SETTINGS_ENABLE_PUSH(0x02):0][SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535][SETTINGS_MAX_FRAME_SIZE(0x05):16384][SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100][SETTINGS_MAX_HEADER_LIST_SIZE(0x06):65536]很明显根据测试在SETTINGS Frame帧里面配置 不同的客户端设置的种类和值都是不同的这使得很容易区分是否是浏览器 而且这个配置不容易控制可以用于指纹识别WINDOW_UPDATEHTTP/2 实现了一种流控制机制。流量控制为接收方提供了在每个流的基础上调节流量的机制。使用WINDOW_UPDATE大小来实现的默认窗口大小由SETTINGS帧里面的 SETTINGS_INITIAL_WINDOW_SIZE中的值控制 参考上方测试可以看到 Chrome 使用 6MB (6291456) 而 Firefox 使用 128KB (131072)当客户端接收数据时它可以使用WINDOW_UPDATE框架来调整窗口大小从而增加其窗口大小。Chromerecv WINDOW_UPDATE frame length4, flags0x00, stream_id0(window_size_increment15663105)Chrome 实际上将连接级窗口大小增加到 15MB (156631056553515MB)Firefoxrecv WINDOW_UPDATE frame length4, flags0x00, stream_id0(window_size_increment12517377)Firefox 会将其增加到 12MBCURLrecv WINDOW_UPDATE frame length4, flags0x00, stream_id0(window_size_increment1073676289)curl使用 32MB参考https://github.com/curl/curl/blob/10cd69623a544c83bae6d90acdf141981ae53174/lib/http2.c#L62PYTHONrecv WINDOW_UPDATE frame length4, flags0x00, stream_id0(window_size_increment16777216)PYTHON 会将其增加到 16MB所以我们也可以使用该参数用于指纹识别HEADERS这个有点意思了从广义上讲HEADERS 包含了 HTTP/1.1 的所有功能包含了 URI、方法GET/POST/等和客户端的头等下面的几个伪标头的顺序对于每个客户端是不同的。:method:authority:scheme:path我们来测试一下Chromeimage顺序是m,a,s,pFirefoximage顺序是m,p,a,sCURLimage顺序是m,p,s,aPythonimage顺序是m,a,s,p这个看似很小的差异,也可以用于指纹识别HTTP/2 指纹识别在哪里使用它用于与TLS 指纹识别类似的目的比如反 DDOS 和反脚本等自动爬虫(提高门槛)只允许真实浏览器等。如何让你的server具有提取客户端HTTP2指纹的能力ja3是tls指纹的标准,wiresharp也默认带有image搞http2指纹的目前市面上还没有标准 我开源了一款提取tlshttp2指纹的中间件面向aspnetcore的https://github.com/yuzd/ja3-csharpimage在线测试保护了tls指纹和用于h2指纹的关键参数https://kawayiyi.com/tls{tlsVersion: Tls12,tcpConnectionId: 0HMKCUARI97OU,tlsHashOrigin: 771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-21,29-23-24,0,tlsHashMd5: cd08e31494f9531f560d64c695473da9,cipherList: [TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA],extentions: [server_name,extended_master_secret,renegotiation_info,supported_groups,ec_point_formats,session_ticket,application_layer_protocol_negotiation,status_request,signature_algorithms,signed_certificate_timestamp,key_share,psk_key_exchange_modes,supported_versions,compress_certificate,extensionApplicationSettings,padding],supportedgroups: [X25519,CurveP256,CurveP384],ecPointFormats: [uncompressed],proto: HTTP/2,h2: {SETTINGS: {1: 65536,3: 1000,4: 6291456,6: 262144},WINDOW_UPDATE: 15663105}
}如何过http2指纹呢知道了原理还不好过吗总结指纹识别在整个网络中变得非常普遍Http2的指纹相对来说不为人知但是并不新鲜比如这篇论文https://www.blackhat.com/docs/eu-17/materials/eu-17-Shuster-Passive-Fingerprinting-Of-HTTP2-Clients-wp.pdf详细介绍了一项具有类似结论的研究我是正东,学的越多不知道也越多,从tls到h2的协议解析,开始接触的时候觉得太难了,但是念念不忘必有回响,业余时间一点点研究,在合适的时候总会出现一些帮助,感谢lwthiker大神,davidfowl大神