对于我的 IT 安全课程暑期项目,我们必须研究不同的方法来规避学校/公司网络上设置的安全措施,并解释如何检测和避免这些黑客攻击。
其中一个主题是(请原谅我的翻译不佳):
Albert 使用笔记本电脑连接到学校网络。他只能通过学校过滤代理访问万维网。此代理配置为仅允许 HTTP (TCP 80) 和 HTTPS (443) 请求,并且某些网站(例如 www.forbidden-forum.com)被过滤掉。ICMP 回显请求/回复是允许的。
Albert 会使用什么技巧从学校网络访问 www.forbidden-forum.com ?作为网络和系统管理员,您如何检测/阻止这些技巧?
现在我不要求回答这个练习这里(这会让我参加这门课程的意义荡然无存并且不会教会我任何东西)。
到目前为止我想到以下技巧:
- 使用 ICMP 隧道。可以通过监控异常大量的 ICMP 帧轻松检测到。
- 通过手机共享互联网连接。很难检测,尤其是当管理员对学生的计算机没有管理权限时。
- 通过 443 TCP 端口使用 VPN。可以通过监控到特定主机(VPN 服务器)的异常高 443 流量来检测,但很难,因为这可能是合法流量。管理员可以尝试使用 Web 浏览器连接到同一主机,但可能会检测到它不是合适的 Web 服务器。
- 拥有一个外部 Web 服务器,充当远程浏览器将所有内容重定向至www.forbidden-forum.com。
我的问题实际上是关于最后一点的。我认为可以开发一个可以做到这一点的软件,但它必须:
- 按需连接到www.forbidden-forum.com
- 替换响应文档/javascript 代码中的所有 URL 以重新映射到其自身,这样 Albert 的计算机实际上就不会尝试直接访问 www.forbidden-forum.com。
- 能够将替换的 URL 翻译为原来的 URL。
我实际上很想能够在学校访客网络(有类似的限制)上的项目演示期间演示这个 PoC,但我真的想避免必须自己“开发”一些东西。
我的开发技能实际上并不是那么好,我想知道:是否有可以做类似事情的软件?也许是 Apache 模块或配置?
答案1
这被称为反向代理,并且需要mod_proxy
加载。
配置指令是:
ProxyPass /localpath http://remote-site.example.com:8080/remotepath
ProxyPassReverse /localpath http://remotesite.example.com:8080/remotepath
ProxyPassReverseCookieDomain remote-site.example.com proxy.fully.qualified.domain.com
ProxyPassReverseCookiePath /remotepath /localpath
因此对于你的例子(加上一些额外的内容):
ProxyPass /ff http://www.forbidden-forum.com/
ProxyPassReverse /ff http://www.forbidden-forum.com/
ProxyPassReverseCookieDomain www.forbidden-forum.com benign.proxy.com
ProxyPassReverseCookiePath / /ff
ProxyPass /wl http://wikileaks.org/
ProxyPassReverse /wl http://wikileaks.org/
ProxyPassReverseCookieDomain wikileaks.org benign.proxy.com
ProxyPassReverseCookiePath / /wl
打开时http://benign.proxy.com/ff
将显示来自 的内容http://www.forbidden-forum.com/
,并将http://benign.proxy.com/wl
打开http://wikileaks.org/
。
在 上提供一些完全无害(且可信)的内容http://benign.proxy.com/
。如果有人尝试“检查有效性”,他们会看到一些值得信赖的页面。
更好的是,通过 HTTPS 提供代理来隐藏转发的 URL(我将把这个留给你作为练习)。
这种方法可以通过所谓的“线路中的碰撞”——一个完全值得信赖的中间人透明代理来规避。
如果用户无法完全控制客户端主机,他们将容易受到线路故障的影响,但可以手动验证密钥指纹以确保隐私,并且在密钥无法验证时避免建立连接。
用户还需要注意其他 SSL 问题(例如无效证书、sslstrip 等)。
答案2
您所描述的基本上就是代理本身;一种软件,它接收来自浏览器的 Web 请求,满足这些请求,并将收到的数据传回浏览器。通过让浏览器预先知道它正在通过代理连接到 Web,可以避免 URL 重写的整个问题。然后,问题简化为“考虑到我拥有的网络访问权限,我如何访问这样的代理,以便不容易检测到我正在这样做”。
Apache 有这样一个模块,以前也有人在这里问过这个问题;参见如何使用 Apache 作为浏览器的代理?更多细节。