mcpField
P
performing-wireless-security-assessment-with-kismet

performing-wireless-security-assessment-with-kismet

github.com/mukul975安全35.2k87 次安装8 周前更新
代码仓库

关于 performing-wireless-security-assessment-with-kismet

这项技能指导安全团队使用 Kismet 被动评估无线网络,识别未授权接入点、弱加密和客户端行为。内容涵盖配置、采集与结果分析。

主要功能

  1. 01被动捕获 802.11 帧
  2. 02识别接入点与客户端
  3. 03检查加密类型和隐藏网络
  4. 04发现未授权接入点
  5. 05分析客户端探测请求

适用场景

  1. 01开展经授权的无线安全评估
  2. 02排查未授权接入点
  3. 03评估无线加密配置
  4. 04调查客户端探测行为

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill performing-wireless-security-assessment-with-kismet

安装后在 Claude Code 中输入/performing-wireless-security-assessment-with-kismet确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
references/
api-reference.md
scripts/
agent.py

详细介绍

使用 Kismet 执行无线安全评估

概述

Kismet 是一款开源无线网络探测器、数据包嗅探器和无线入侵检测系统(WIDS),支持 802.11a/b/g/n/ac/ax。与主动扫描器不同,Kismet 以被动监听模式运行,因此对被评估的网络来说无法被检测到。它捕获原始 802.11 帧,识别接入点、客户端、探测请求和加密类型,而不发送任何数据包。本技能涵盖部署 Kismet 进行全面的无线安全评估、识别流氓接入点、检测弱加密、绘制隐藏网络以及分析客户端行为。

何时使用

  • 当进行涉及使用 Kismet 执行无线安全评估的安全评估时
  • 当遵循相关安全事件的事件响应流程时
  • 当执行计划的安全测试或审计活动时
  • 当通过动手测试验证安全控制时

前置条件

  • 已安装 Kismet 2023+ 的 Linux 系统(Kali Linux、Ubuntu 22.04+)
  • 支持监听模式的无线网卡(例如 Alfa AWUS036ACH、TP-Link TL-WN722N v1)
  • 无线评估的书面授权(法律要求)
  • GPS 接收器(可选,用于地理位置映射)
  • 目标环境的无线网络文档

核心概念

Kismet 架构

Kismet 采用客户端-服务器架构:

  • kismet - 捕获并处理数据包的主服务器进程
  • kismet_cap_linux_wifi - Linux WiFi 接口的捕获源
  • kismet_cap_linux_bluetooth - 蓝牙的捕获源
  • Web UI - 位于 http://localhost:2501 的基于浏览器的界面
无线帧类型
帧类型用途安全相关性
BeaconAP 宣告其存在SSID、加密、厂商
Probe Request客户端搜索网络揭示首选网络
Probe ResponseAP 响应客户端探测隐藏 SSID 泄露
Authentication客户端向 AP 认证认证类型识别
Deauthentication将客户端从 AP 断开潜在攻击指标
Association客户端加入网络客户端-AP 关系
加密评估
加密状态风险
Open(无加密)不安全严重 - 所有流量可见
WEP已被破解严重 - 几分钟内可破解
WPA-TKIP已弃用高 - 存在已知漏洞
WPA2-PSK (CCMP)可接受中 - 取决于口令强度
WPA2-Enterprise (802.1X)推荐低 - 基于证书
WPA3-SAE最佳实践低 - 可抵御离线攻击

工作流

步骤 1:准备无线网卡
# Identify wireless interfaces
iwconfig

# Check adapter capabilities
iw list | grep -A 10 "Supported interface modes"

# Kill processes that may interfere
sudo airmon-ng check kill

# Enable monitor mode
sudo ip link set wlan0 down
sudo iw dev wlan0 set type monitor
sudo ip link set wlan0 up

# Verify monitor mode
iw dev wlan0 info | grep type
步骤 2:配置并启动 Kismet

编辑 /etc/kismet/kismet.conf:

# Data sources
source=wlan0:name=WiFi-Monitor,channel_hop=true,channel_hoprate=5/sec

# Logging configuration
log_types=kismet,pcapng
log_prefix=/opt/kismet/logs/assessment

# Enable all 802.11 channels (2.4GHz and 5GHz)
channel_hop_speed=5
channel_list=IEEE80211:1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165

# GPS configuration (if available)
gps=gpsd:host=localhost,port=2947

# Alert configuration
alert=ADVCRYPTCHANGE,5/min,1/sec
alert=BSSTIMESTAMP,5/min,1/sec
alert=CRYPTODROP,5/min,1/sec
alert=DISASSOCTRAFFIC,10/min,1/sec
alert=DEAUTHFLOOD,10/min,2/sec
alert=PROBENOMFP,5/min,1/sec

启动 Kismet:

# Start Kismet server
sudo kismet -c wlan0

# Access web interface
# Open browser to http://localhost:2501
# Default credentials: kismet / kismet (change immediately)
步骤 3:执行评估扫描

流氓接入点检测:

# Export device list via Kismet REST API
curl -u kismet:kismet http://localhost:2501/devices/summary/devices.json | \
    python3 -m json.tool > all_devices.json

# Filter for access points
curl -u kismet:kismet \
    'http://localhost:2501/devices/summary/devices.json' \
    -d 'json={"fields":["kismet.device.base.macaddr","kismet.device.base.name","kismet.device.base.type","kismet.device.base.crypt","kismet.device.base.channel","kismet.device.base.manuf","dot11.device/dot11.device.advertised_ssid_map/dot11.advertisedssid.ssid"]}' \
    > access_points.json

客户端探测分析:

探测请求揭示客户端之前连接过的网络,这可能表明:

  • 企业设备连接到不安全的家庭网络
  • 设备搜索已知恶意的 SSID(易受邪恶双胞胎攻击)
  • 企业空间中的未授权个人设备
步骤 4:分析结果

用于 Kismet 数据库的 Python 分析脚本:

#!/usr/bin/env python3
"""Analyze Kismet capture database for wireless security findings."""

import sqlite3
import json
import sys
from collections import defaultdict


def analyze_kismet_db(db_path: str):
    """Analyze Kismet SQLite database for security issues."""
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()

    findings = []

    # Query all devices
    cursor.execute("""
        SELECT devmac, type, device
        FROM devices
    """)

    devices = cursor.fetchall()
    ap_count = 0
    client_count = 0
    open_networks = []
    wep_networks = []
    wpa_tkip_networks = []
    hidden_networks = []
    all_aps = []

    for mac, dev_type, device_json in devices:
        try:
            device = json.loads(device_json)
        except json.JSONDecodeError:
            continue

        base = device.get('kismet.device.base.type', '')

        if 'Wi-Fi AP' in base or 'Wi-Fi Device' in base:
            ap_count += 1
            ssid_map = device.get('dot11.device', {}).get(
                'dot11.device.advertised_ssid_map', []
            )
            crypt = device.get('kismet.device.base.crypt', '')
            name = device.get('kismet.device.base.name', 'Unknown')
            channel = device.get('kismet.device.base.channel', '')
            manuf = device.get('kismet.device.base.manuf', 'Unknown')

            ap_info = {
                'mac': mac,
                'ssid': name,
                'encryption': crypt,
                'channel': channel,
                'manufacturer': manuf,
            }
            all_aps.append(ap_info)

            if 'None' in crypt or crypt == '':
                open_networks.append(ap_info)
            elif 'WEP' in crypt:
                wep_networks.append(ap_info)
            elif 'WPA+TKIP' in crypt and 'AES' not in crypt:
                wpa_tkip_networks.append(ap_info)

            for ssid_entry in ssid_map:
                if isinstance(ssid_entry, dict):
                    ssid = ssid_entry.get('dot11.advertisedssid.ssid', '')
                    if ssid == '' or ssid is None:
                        hidden_networks.append(ap_info)

        elif 'Wi-Fi Client' in base:
            client_count += 1

    # Generate findings
    print(f"\n{'='*70}")
    print("WIRELESS SECURITY ASSESSMENT REPORT")
    print(f"{'='*70}")
    print(f"\nTotal Access Points Detected: {ap_count}")
    print(f"Total Clients Detected: {client_count}")

    if open_networks:
        print(f"\n[CRITICAL] Open Networks (No Encryption): {len(open_networks)}")
        for net in open_networks:
            print(f"  - SSID: {net['ssid']}, MAC: {net['mac']}, "
                  f"Channel: {net['channel']}, Vendor: {net['manufacturer']}")

    if wep_networks:
        print(f"\n[CRITICAL] WEP-Encrypted Networks: {len(wep_networks)}")
        for net in wep_networks:
            print(f"  - SSID: {net['ssid']}, MAC: {net['mac']}, "
                  f"Channel: {net['channel']}")

    if wpa_tkip_networks:
        print(f"\n[HIGH] WPA-TKIP Networks (Deprecated): {len(wpa_tkip_networks)}")
        for net in wpa_tkip_networks:
            print(f"  - SSID: {net['ssid']}, MAC: {net['mac']}, "
                  f"Channel: {net['channel']}")

    if hidden_networks:
        print(f"\n[MEDIUM] Hidden SSIDs Detected: {len(hidden_networks)}")
        for net in hidden_networks:
            print(f"  - MAC: {net['mac']}, Channel: {net['channel']}, "
                  f"Vendor: {net['manufacturer']}")

    # Channel utilization analysis
    channel_usage = defaultdict(int)
    for ap in all_aps:
        ch = ap.get('channel', 'Unknown')
        channel_usage[ch] += 1

    print(f"\n[INFO] Channel Utilization:")
    for ch, count in sorted(channel_usage.items()):
        print(f"  Channel {ch}: {count} APs")

    conn.close()


if __name__ == '__main__':
    db_path = sys.argv[1] if len(sys.argv) > 1 else 'Kismet-*.kismet'
    analyze_kismet_db(db_path)
步骤 5:检测流氓接入点

将发现的 AP 与授权清单进行比对:

#!/usr/bin/env python3
"""Detect rogue access points by comparing against authorized AP list."""

import json
import sys


def load_authorized_aps(filepath: str) -> set:
    """Load authorized AP MAC addresses from file."""
    authorized = set()
    with open(filepath, 'r') as f:
        for line in f:
            mac = line.strip().lower()
            if mac and not mac.startswith('#'):
                authorized.add(mac)
    return authorized


def detect_rogues(kismet_json: str, authorized_file: str):
    """Compare discovered APs against authorized list."""
    authorized = load_authorized_aps(authorized_file)

    with open(kismet_json, 'r') as f:
        devices = json.load(f)

    rogues = []
    for device in devices:
        mac = device.get('kismet.device.base.macaddr', '').lower()
        dev_type = device.get('kismet.device.base.type', '')

        if 'AP' in dev_type and mac not in authorized:
            rogues.append({
                'mac': mac,
                'ssid': device.get('kismet.device.base.name', 'Unknown'),
                'encryption': device.get('kismet.device.base.crypt', ''),
                'channel': device.get('kismet.device.base.channel', ''),
                'manufacturer': device.get('kismet.device.base.manuf', ''),
                'signal': device.get('kismet.device.base.signal', {}).get(
                    'kismet.common.signal.last_signal', 0),
            })

    if rogues:
        print(f"\n[ALERT] {len(rogues)} ROGUE ACCESS POINTS DETECTED\n")
        for rogue in rogues:
            print(f"  MAC: {rogue['mac']}")
            print(f"  SSID: {rogue['ssid']}")
            print(f"  Encryption: {rogue['encryption']}")
            print(f"  Channel: {rogue['channel']}")
            print(f"  Vendor: {rogue['manufacturer']}")
            print(f"  Signal: {rogue['signal']} dBm")
            print()
    else:
        print("No rogue access points detected.")


if __name__ == '__main__':
    if len(sys.argv) < 3:
        print("Usage: python detect_rogues.py <kismet_devices.json> <authorized_aps.txt>")
        sys.exit(1)
    detect_rogues(sys.argv[1], sys.argv[2])

评估检查清单

  • 所有授权 AP 均已识别并验证
  • 流氓/未授权 AP 已识别并定位
  • 所有 SSID 的加密类型均已记录
  • 隐藏 SSID 已发现并记录
  • 客户端探测请求已分析敏感模式
  • 邪恶双胞胎易感性已评估
  • 所有 AP 的 WPS 状态已检查
  • 信号覆盖边界已绘制
  • 访客网络隔离已验证
  • 管理接口未在无线网络上暴露

最佳实践

  • 书面授权 - 执行无线评估前始终获取签署的授权
  • 仅被动模式 - 以被动模式使用 Kismet;不要发送去认证帧或探测请求
  • 全面信道覆盖 - 扫描 2.4GHz 和 5GHz 频段,包括 DFS 信道
  • 多个位置 - 从多个物理位置执行捕获以获得完整覆盖
  • 时间长度 - 至少捕获 30-60 分钟以观察间歇性设备
  • GPS 映射 - 使用 GPS 创建热图以进行信号边界分析
  • 基线对比 - 维护授权的 AP 清单并在每次评估时进行对比

参考资料

评论

支持 Markdown