引言
在本实验中,你将学习识别恶意接入点 (AP) 和恶意强制门户 (captive portal) 的基本步骤。恶意接入点是指未经网络所有者明确授权而在网络上安装的无线接入点。攻击者经常使用它们来发起“中间人”攻击,以拦截流量。
强制门户是一种网页,用户在获得公共网络访问权限之前必须查看并与之交互。虽然许多合法的热点使用它们,但攻击者可以创建自己的强制门户来钓取凭据。
本实验将在安全的环境中模拟此场景。你将使用命令行工具扫描网络,发现可疑的“邪恶双胞胎”网络,并分析虚假的强制门户以识别其为威胁。
在客户端设备上扫描 Wi-Fi 网络
在此步骤中,你将模拟扫描可用的 Wi-Fi 网络。在实际场景中,你将使用 nmcli、iwlist 或 airodump-ng 等工具。在本实验中,我们准备了一个名为 scan-wifi.sh 的脚本,该脚本模拟了网络扫描的输出。这使得我们无需实际的 Wi-Fi 硬件即可进行实验。
本实验的所有文件都位于 ~/project 目录中。让我们执行脚本,查看模拟 Wi-Fi 网络列表。
在你的终端中运行以下命令:
~/project/scan-wifi.sh
你应该会看到类似以下的输出,列出了可用的网络、它们的信号强度和安全类型。
IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY
* AA:BB:CC:11:22:33 CorpWifi Infra 6 54 Mbit/s 90 ▂▄▆█ WPA2
AA:BB:CC:44:55:66 CorpWifi Infra 11 54 Mbit/s 95 ▂▄▆█ --
DE:F0:12:34:56:78 GuestWifi Infra 1 54 Mbit/s 70 ▂▄▆_ WPA2
注意两个同名网络 (ESSID)
在此步骤中,你将分析扫描结果以发现异常。ESSID (Extended Service Set Identifier) 是 Wi-Fi 网络的公共名称。
仔细查看上一步的输出。你应该会注意到两个不同的网络共享同一个 SSID,“CorpWifi”。这是潜在“邪恶双胞胎”攻击的典型迹象。一个网络是合法的,另一个是由攻击者设置的恶意接入点。
关键区别在于 SECURITY 列。合法网络使用 WPA2 加密,而恶意网络是开放的(由 -- 表示)。攻击者经常创建开放网络,因为用户更倾向于连接它们而无需密码。
为了更清楚地说明这一点,让我们使用 grep 命令过滤输出,只显示名为 CorpWifi 的网络。
~/project/scan-wifi.sh | grep CorpWifi
此命令将产生以下输出,突出显示这两个网络。
* AA:BB:CC:11:22:33 CorpWifi Infra 6 54 Mbit/s 90 ▂▄▆█ WPA2
AA:BB:CC:44:55:66 CorpWifi Infra 11 54 Mbit/s 95 ▂▄▆█ --
连接到网络的开放(未加密)版本
在此步骤中,我们将模拟连接到可疑的、开放的“CorpWifi”网络。在实际场景中,你设备的操作系统将处理连接。对于我们的模拟,所谓的“连接”将涉及启动一个本地 Web 服务器,该服务器将充当恶意接入点的强制门户 (captive portal)。
用于此伪造门户的文件位于 ~/project/portal 目录中。我们将从该目录运行一个简单的 Python Web 服务器。为了让我们的终端保持可用以执行其他命令,我们将把服务器作为后台进程运行。
首先,将当前目录更改为 ~/project/portal:
cd ~/project/portal
接下来,使用 & 符号在后台启动 Python Web 服务器:
python3 server.py &
你将看到一个进程 ID 和一条确认消息,表明服务器正在运行。
[1] 1234
Serving captive portal on port 8000
服务器现在正在运行,并在端口 8000 上监听连接,模拟了恶意网络的运行环境。
观察到自动重定向到登录页面
在此步骤中,你将看到强制门户 (captive portal) 的实际运行情况。连接到带有强制门户的网络后,任何浏览网页的尝试通常都会被拦截并重定向到登录页面或服务条款页面。
我们将通过使用 curl 命令尝试访问一个网站来模拟这一点。由于我们模拟的网络环境由我们刚刚启动的 Python 服务器控制,因此对 localhost:8000 的任何 HTTP 请求都将被“捕获”并提供我们门户中的 index.html 文件。
使用 curl 向本地服务器发出请求。这模仿了连接到新网络后浏览器发出的初始请求。
curl http://localhost:8000
该命令将返回伪造登录页面的 HTML 源代码。在真实的浏览器中,此代码将被渲染为图形登录表单。
<!DOCTYPE html>
<html>
<head>
<title>CorpWifi Login</title>
<style>
body {
font-family: sans-serif;
background: #f0f2f5;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
.login-box {
background: white;
padding: 20px 40px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
text-align: center;
}
input {
margin: 10px 0;
padding: 8px;
width: 200px;
border: 1px solid #ddd;
border-radius: 4px;
}
button {
padding: 10px 20px;
background-color: #1877f2;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
width: 100%;
}
</style>
</head>
<body>
<div class="login-box">
<h2>CorpWifi Access</h2>
<p>Please log in to continue.</p>
<input type="text" placeholder="Username" />
<br />
<input type="password" placeholder="Password" />
<br />
<button>Log In</button>
<p style="font-size: 12px; color: #888; margin-top: 15px;">
Powered by CorpWifi-Login.net
</p>
</div>
</body>
</html>
识别 URL 不是合法域名
在最后一步中,你将执行关键检查,以确认这是一个恶意的强制门户 (captive portal)。此类门户的目标是诱骗你在一个伪造的页面上输入你的凭据。识别伪造页面的最可靠方法是检查域名 (URL)。
在真实的浏览器中,你会检查地址栏。在我们的模拟中,我们可以检查 HTML 内容中的线索。查看上一步的 HTML,我们可以在底部找到一行可疑的文本。让我们使用 grep 在 index.html 文件中查找它。
首先,让我们返回到主项目目录。
cd ~/project
现在,搜索门户 HTML 文件中的可疑文本:
grep 'CorpWifi-Login.net' portal/index.html
该命令将找到并显示包含可疑域名的那一行。
<p style="font-size: 12px; color: #888; margin-top: 15px;">Powered by CorpWifi-Login.net</p>
域名 CorpWifi-Login.net 非常可疑。攻击者经常注册听起来官方但实际上并非如此的域名。合法的公司门户将托管在公司的官方域名上(例如 wifi.corp.com)。这一发现证实了开放网络是一个恶意接入点 (rogue AP),而登录页面是一个网络钓鱼尝试。
总结
在本实验中,你通过模拟成功识别了一个恶意接入点 (rogue AP) 和一个恶意的强制门户 (captive portal)。你学习了一个实用的分步过程来识别常见的 Wi-Fi 威胁。
你完成了以下操作:
- 扫描 Wi-Fi 网络,并识别出一个与安全网络同名的未加密“邪恶双胞胎” (evil twin)。
- 通过启动本地服务器模拟连接到恶意接入点。
- 观察强制门户如何拦截 Web 流量并显示登录页面。
- 分析登录页面的内容,找到一个可疑的、非合法的域名,从而确认了网络钓鱼尝试。
关键要点是,始终对开放的 Wi-Fi 网络保持警惕,并在输入敏感信息之前仔细检查任何登录页面的 URL。
最后,让我们停止后台服务器进程。%1 指的是第一个后台作业。
kill %1
