带探测防御的高级HTTPS隧道建设
本文旨在实现一个带有“探测防御“的HTTP/HTTPS隧道。此处的”探测防御“指,在建立HTTPS隧道时,会在隧道的末端建立一个对外的HTTPS代理服务,而探测防御能避免HTTPS代理服务进程被主动探测识别,其对外表现与正常的HTTPS网页服务器无异。
本文使用Gost网络调试工具作为示例。
带探测防御的HTTPS隧道
由于有了TLS的保护,该方法可以施展魔法。
在隧道转发端设置:
1 | gost -L tcp://:1111/123.4.4.4:6789 -F https://username:password@123.4.4.4:443 |
-L
这里的tcp
表示本地TCP端口转发,即将本地的端口映射到指定远程目标的端口。整个-L
项表示在本机(0.0.0.0
)的1111
端口监听TCP流量,并转发到远程位置123.4.4.4:6789
。当然了,这种转发并不是简单的TCP转发,那就毫无意义了,我们的目的是使得流量通过HTTP隧道传输,所以我们要指定-F
项,也就是转发的途径。
-F
的配置表示,将流量转发至远程位置123.4.4.4:443
,同时设置用于验证的用户名密码(用户名密码必须设置)。
整个语句的意义即为:在本机的1111
端口上监听TCP流量,将接收到的流量包装成HTTPS,转发至123.4.4.4:80
处的HTTPS代理,该HTTPS代理把流量解密,去掉HTTP头部,转发至位置123.4.4.4:6789
。
在隧道代理端设置:
1 | gost -L="https://username:password@:443?cert=/etc/cert/my.crt&key=/etc/cert/my.key&probe_resist=file:/etc/www/my_site/index.html" |
这里的意思是,在本机443
端口设置一个带基础用户验证的HTTPS代理(用户名密码必须设置),同时设置探测防御,对于非法流量不给予HTTP代理相应,而是返回HTTP 200状态码,同时发送特定路径的文件,我这里设置的是一个html文件,故而有任何人在对本机443端口进行主动探测时,都只会发现这是一个普通的网页服务器,而不是代理服务器。
同时别忘了,要在6789
端口部署你自己的服务,毕竟那是隧道流量转发的最终目的地。
这里URL中的参数,cert
代表SSL证书,key
是SSL证书密钥,probe_resist
是探测防御。
参数probe_resist
有多种玩法,例如可以固定返回一种HTTP状态码:
1 | probe_resist=code:403 |
例如可以返回固定的静态HTML网页:
1 | probe_resist=file:/etc/www/index.html |
又例如可以做一个简单的反代:
1 | probe_resist=host:example.com:80 |
同时,最好再安装一个网页服务器(NGINX/Apache)实现HSTS(强制安全传输),表现地最像一个完整的TLS加密网页服务。
这里以NGINX为例,假设解析的域名是my.site
,创建一个在80
端口监听的虚拟主机:
1 | server{ |
这样一来,直接访问https://my.site
的主动探测者会看到一个伪装的网页,而访问http://my.site
的主动探测者也会被301重定向到https://my.site
,这也是很多真正的网站常见的做法(例如本站)。
结束
嘿嘿嘿,学会了以上知识能干什么呢?我可不知道(滑稽)。