带探测防御的高级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
2
3
4
5
6
7
8
9
10
server{
listen 80;
server_name my.site;

if ($host != 'my.site'){
return 403;
}

return 301 https://my.site$request_uri;
}

这样一来,直接访问https://my.site的主动探测者会看到一个伪装的网页,而访问http://my.site的主动探测者也会被301重定向到https://my.site,这也是很多真正的网站常见的做法(例如本站)。

结束

嘿嘿嘿,学会了以上知识能干什么呢?我可不知道(滑稽)。