这个“强制门户”如何拦截和操纵我的 HTTP 请求?

信息安全 无线上网 中间人 tcp
2021-08-22 04:29:37

我有时会使用免费的 Wifi 服务来上网。
与大多数/所有此类服务提供商一样,该服务采用强制门户因此,如果您尝试在浏览器中发出 HTTP 请求(请求网页)并且您未在网络上获得授权,您将只会看到显示“欢迎使用免费 -wifi 网络。这是我们的条款等”的页面...”
我对滥用免费 wifi 服务不感兴趣 - 我想知道当我使用此服务时哪些信息(HTTP 事务)暴露/不安全,以及他们对我的系统进行了哪些持久更改,即隐藏 cookie在我的浏览器中(通过使用匿名主机)。
所以我连接到他们的 wifi 接入点,此时他们为我的计算机分配了 IP 地址和 DNS 服务等。

$ nmcli device show wlp2s0
IP4.ADDRESS[1]:                         192.168.12.199/22
IP4.GATEWAY:                            192.168.12.1
IP4.ROUTE[1]:                           dst = 169.254.0.0/16, nh = 0.0.0.0, mt = 1000
IP4.DNS[1]:                             123.123.xxx.xxx
IP4.DNS[2]:                             123.123.xxx.xxx

然后我尝试一个 HTTP 请求 - 在尚未授权的情况下尝试“浏览网页”。(作为 HTTP,此请求/响应将是未加密的,处理请求的服务器上不会进行身份检查 [通过 SSL 证书颁发机构通过公钥/私钥签名等进行确认])

$ curl 'http://placeimg.com/' -H 'Host: placeimg.com'  
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0' 
-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'  -v -L
*   Trying 216.243.142.217...
* Connected to placeimg.com (216.243.142.217) port 80 (#0)
> GET / HTTP/1.1
> Host: placeimg.com
>
< HTTP/1.1 302 Found
< Location: http://1.1.2.1:80/reg.php?ah_goal=auth-tc.html&ah_login=true&url=E2B8F357812412D8
<
* Ignoring the response-body
* Connection #0 to host placeimg.com left intact
* Issue another request to this URL:  
       'http://1.1.2.1:80/reg.php?ah_goal=auth-tc.html&ah_login=true&url=E2B8F35792412D8'
* Connection 0 seems to be dead!
* Closing connection 0
*   Trying 1.1.2.1...
* Connected to 1.1.2.1 (1.1.2.1) port 80 (#1)
> GET /reg.php?ah_goal=auth-tc.html&ah_login=true&url=E2B8F8 HTTP/1.1
> Host: 1.1.2.1
> User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0
> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
> Accept-Language: en-US,en;q=0.5
>
< HTTP/1.1 200 OK
< Date: Mon, 08 Aug 2016 02:50:16 GMT
< Connection: keep-alive
< Transfer-Encoding: chunked
< Content-type: text/html; charset=utf-8
<
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta name="viewport" content="width=device-width"/>
        <title>Login</title>
        <h1>WiFi - Free Internet Access</h1>
This service is provided primarily for the purposes of accessing Email and light web browsing ..
....
</div>
</body>
</html>

我已经截断并编辑了输出,但基本上看起来,当我的浏览器(curl)发出请求时,网络正在提供对真实 DNS 服务器的访问,我通过运行它进一步测试了它 - 同时连接到服务。

$dig +short google.com
203.118.141.95
203.118.141.123
... (basically real ip addresses for google.com)

因此,该服务似乎提供了有关 DNS 的真实、真实的信息,

但即使我的浏览器寻址的 IP 地址似乎有效,返回的 HTTP 响应也不是来自预期的服务器(它是由 WiFi 服务插入的服务器)。回应是

  • 3021.1.2.1/reg.php告诉我的浏览器向服务器和 URL发出新请求
  • 来自该服务器/URL 的响应是“强制门户”页面。

发出 HTTPS 请求时

$ curl 'https://google.com/' -H 'Host: google.com' -H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' -v -L
*   Trying 216.58.220.142...
* connect to 216.58.220.142 port 443 failed: Connection refused
*   Trying 2404:6800:4006:800::200e...
* Immediate connect fail for 2404:6800:4006:800::200e: Network is unreachable
*   Trying 2404:6800:4006:800::200e...
* Immediate connect fail for 2404:6800:4006:800::200e: Network is unreachable
* Failed to connect to google.com port 443: Connection refused
* Closing connection 0
curl: (7) Failed to connect to google.com port 443: Connection refused

请求完全失败-我假设是因为我的计算机不接受来自无法验证的远程主机的连接?
所以我的问题是,这是 TCP/IP 级别的“中间人”类型拦截吗?换句话说,当我的计算机上的网络堆栈尝试placeimg.com通过启动 3 次握手来与服务器建立 TCP 连接时,Wifi 服务网关或网络节点是否使用 ACK/SYN 响应我的 SYN 并说是的m 你想与之交谈的服务器 - 让我们完成我们的 TCP 连接,然后一旦建立其预编程以自动发送 HTTP 重定向,然后,因为我的浏览器实际上正在生成下一个请求1.1.2.1本身——所有“有趣的事情”都可以停止,并且从那时起所有正常的 HTTP/HTML 行为。(即像在任何普通网站上一样的标准表单填写和提交)
如果不是,当我是“未经身份验证”的用户时,此网关如何拦截和重新路由我的请求?

2个回答

所以我的问题是,这是 TCP/IP 级别的“中间人”类型拦截吗?

是的,这是一个中间人类型的拦截,这对于接入点来说很容易,因为它实际上是在您连接到互联网的中间。使用数据包过滤器可以轻松完成对捕获门户的此类重定向。

通常的方法是,一旦您授权(登录,接受条款,等等),一个临时规则将被添加到访问点的数据包过滤器中,该过滤器优先于重定向规则并允许直接访问互联网.

发出 HTTPS 请求时请求完全失败 - 我假设是因为我的计算机不接受来自无法验证的远程主机的连接?

他们似乎甚至没有试图拦截您的 HTTPS 连接,而是只是阻止它。

一些强制门户会尝试拦截 HTTPS 连接,从而导致客户端出现证书错误。

我还看到了一些强制门户,即使对于未经身份验证的用户也允许使用 HTTP。

所以我的问题是,这是 TCP/IP 级别的“中间人”类型拦截吗?换句话说,当我计算机上的网络堆栈尝试通过启动 3 次握手来与 placeimg.com 服务器建立 TCP 连接时,Wifi 服务网关或网络节点是否使用 ACK/SYN 响应我的 SYN 并说是的,我就是你想与之交谈的那个服务器——让我们完成我们的 TCP 连接,然后一旦建立了它的预编程以自动发送 HTTP 重定向,然后,因为我的浏览器实际上正在生成对 1.1.2.1 本身的下一个请求——所有从那时起,“有趣的业务”可能会停止,其所有正常的 HTTP/HTML 行为都会停止。(即像在任何普通网站上一样的标准表格填写和提交)

是的,这是正常的做法。如果强制门户服务器是基于 linux 的,则可以使用“REDIRECT”或“DNAT”目标将您的流量转移到可以发出重定向的强制门户网站服务器。其他状态防火墙系统可能有类似的选项。

这些系统通常非常灵活,因此如果门户运营商想要提供对互联网特定部分的访问(例如支付网关,以便您可以支付),他们可以轻松地做到这一点。

当您成功进行身份验证时,强制网络门户可以设置一个覆盖重定向规则的规则,允许您正常访问 Internet。

请注意,为您尝试访问的网站设置的任何(非安全)cookie 都将发送到强制门户网站服务器。这取决于强制门户的实施者是否真的对它们做任何事情。