WebSocket握手Host头与目标不一致及Linear应用复现问题排查
我正在拦截名为Linear的车库门开启应用(iOS/Android)的WebSocket流量,从域名(trafficmanager.net、cloudapp.net等)推测其使用Azure服务。该应用升级WebSocket的初始HTTP请求发送至https://linr-cs-tm-prod.trafficmanager.net:8080,但Host头为11323322-00AC-55F0-C09E-A903E123A25C。
我尝试用以下Python代码复现该请求时出现TimeoutError:
SERVICE_URL = "ws://linr-cs-tm-prod.trafficmanager.net:8080/Message.svc" class Linear: """Class used for a Linear account.""" message_id = 0 async def login(self: Linear, email: str, password: str): """Login to a linear account.""" async with websockets.connect( SERVICE_URL, origin="LinAccess-Android/1.3.16", open_timeout=30, ) as websocket: print("connected!") async def get_sites(): """Get sites available under this account."""
我已尝试提取CA证书作为SSL上下文、移除Host头、关闭SSL、将ws改为wss等操作,现咨询三个问题:
- 应设置什么Host值?
- 为何如此设置Host?
- 该ID是Burp的产物还是Azure的要求?
1. 应设置的Host值
直接使用你拦截到的UUID 11323322-00AC-55F0-C09E-A903E123A25C 作为Host头的值,同时要把代码里的ws://改为wss://(因为原请求基于HTTPS,对应加密WebSocket协议)。修改后的连接代码示例:
async with websockets.connect( "wss://linr-cs-tm-prod.trafficmanager.net:8080/Message.svc", origin="LinAccess-Android/1.3.16", open_timeout=30, extra_headers={"Host": "11323322-00AC-55F0-C09E-A903E123A25C"} ) as websocket:
2. 为何要这么设置Host
这是Azure Traffic Manager的路由规则要求。Traffic Manager作为Azure的流量负载均衡服务,需要通过请求的Host头识别要转发到的后端服务实例。这个UUID是Linear绑定的后端服务(比如Azure App Service)的内部标识或自定义路由标识,只有携带这个Host头,Traffic Manager才能将请求正确路由到Linear的实际WebSocket服务节点,否则会因找不到目标服务导致超时。
3. 该ID的来源
这个UUID不是Burp的产物,是Azure服务架构的要求。Burp只是捕获到了Linear应用与Azure通信时必须携带的Host头值——这个值是Linear应用预设的,用于让Azure Traffic Manager完成正确的流量路由。
内容的提问来源于stack exchange,提问作者IceBotYT

