一、场景
场景描述:请求包host字段跟目的ip端口不一致(客户端设置了hosts)
测试方法:
a)、在xray配置文件config.yaml中设置漏洞扫描代理(其中8080是burp的代理端口),启动xray监听7878端口做代理
xray_windows_amd64.exe webscan --listen 127.0.0.1:7878 --html-output xray-testphp.html
b)、burp开启拦截模式
c)、开启wireshark,过滤拦截的流量host www.xxx.com || host 192.168.0.45(拦截hosts的主机跟ip)
d)、发包测试,代码如下
import requests cobra_proxy_url = { "http": "http://127.0.0.1:7878", "https": "https://127.0.0.1:7878" } cobra_proxy_cert = 'D:/xray/ca.crt' url = "http://192.168.0.45/user/login" method = "GET" headers = { "User-Agent" : "Mozilla/5.0 (Linux; Android 9; V1913A Build/P00610; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36 newType/wifi", "Accept-Encoding" : "gzip", "Accept" : "*/*", "Connection" : "Keep-Alive", "Host" : "www.xxx.com", "Referer" : "http://www.xxx.com", } requests.request(method, url=url, headers=headers, proxies=cobra_proxy_url, verify=cobra_proxy_cert, timeout=5, allow_redirects=False)
e)、过程就不再详细说了,直接说结果,通过分析发现:
1、xray会代理第一个请求,第一个请求不会走burp,并且会把hosts改成真实的目的ip(如果使用burp做代理还是www.xxx.com,如下图)
(图一、xray作为代理发送请求)
(图二、burp作为代理发送请求)
2、xray好像只会扫描第一个代理请求返回码为200的数据包
3、发送第一个请求不会走burp代理,xray再发送payload才会走config.yaml设置的代理,且这时候
host变回www.xxx.com 。。。?????绝望!
这会导致一个问题如果你只想在测试环境使用xray,设置hosts,但是部署xray的那台机器没有设置hosts(因为xray要代理各种各样的测试环境,甚至有时候要测试同一个域名对应不同的ip,所以在部署xray的服务器设置hosts不太可能),xray第一个代理包是会发到测试环境(192.168.0.45),但是后面涉及到payload的包都会发送到生产环境(www.xxx.com)
二、尝试解决方案(还是没解决)
1、在请求包头字段设置真实ip端口(X-real-ip,X-real-port),然后在config.yaml设置代理服务器C,C可以做一个解析服务,解析请求包X-real-ip,X-real-port,并发送到真实ip。
这个方案的问题就是xray代理的第一个请求不走config.yaml设置代理服务器C。。。。崩溃
2、买商业版看看能不能提需求,哈哈哈
三、为啥不把请求头Host字段改成真实ip端口
毕竟xray代理的第一个包就是这么做的,为啥我不直接把host字段改成真实ip呢?因为当一台nginx或者一个ip可以对应多个域名。如果都跟xray一样直接把请求头Host字段改成真实ip,请求包到达服务器或者nginx的时候根本不知道这个数据包发给哪个服务
打个广告
字节跳动,深圳IT大量岗位招人,内推码