| name | performing-wireless-security-assessment-with-kismet |
| description | 使用 Kismet 通过被动射频监控进行无线网络安全评估,检测流氓接入点(Rogue AP)、隐藏 SSID、弱加密和未授权客户端。 |
| domain | cybersecurity |
| subdomain | network-security |
| tags | ["kismet","wireless-security","wifi-assessment","rogue-ap",802.11,"wardriving","wids","wireless-ids","rf-monitoring"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
使用 Kismet 进行无线安全评估
概述
Kismet 是一款开源无线网络探测器、数据包嗅探器和无线入侵检测系统(WIDS),支持 802.11a/b/g/n/ac/ax。与主动扫描器不同,Kismet 以被动监听模式运行,使被评估网络无法检测到它。Kismet 捕获原始 802.11 帧,识别接入点、客户端、探测请求和加密类型,无需发送任何数据包。本技能涵盖部署 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
无线帧类型
| 帧类型 | 用途 | 安全相关性 |
|---|
| Beacon | AP 宣告其存在 | SSID、加密类型、厂商 |
| Probe Request | 客户端搜索网络 | 揭示首选网络 |
| Probe Response | AP 响应客户端探测 | 隐藏 SSID 泄露 |
| Authentication | 客户端向 AP 认证 | 认证类型识别 |
| Deauthentication | 断开客户端与 AP 的连接 | 潜在攻击指示器 |
| Association | 客户端加入网络 | 客户端-AP 关系 |
加密评估
| 加密类型 | 状态 | 风险 |
|---|
| 开放(无加密) | 不安全 | 严重 - 所有流量可见 |
| WEP | 已破解 | 严重 - 数分钟内可破解 |
| WPA-TKIP | 已弃用 | 高 - 存在已知漏洞 |
| WPA2-PSK (CCMP) | 可接受 | 中 - 取决于密码短语强度 |
| WPA2-Enterprise (802.1X) | 推荐 | 低 - 基于证书 |
| WPA3-SAE | 最佳实践 | 低 - 可抵御离线攻击 |
步骤
步骤 1:准备无线网卡
iwconfig
iw list | grep -A 10 "Supported interface modes"
sudo airmon-ng check kill
sudo ip link set wlan0 down
sudo iw dev wlan0 set type monitor
sudo ip link set wlan0 up
iw dev wlan0 info | grep type
步骤 2:配置并启动 Kismet
编辑 /etc/kismet/kismet.conf:
source=wlan0:name=WiFi-Monitor,channel_hop=true,channel_hoprate=5/sec
log_types=kismet,pcapng
log_prefix=/opt/kismet/logs/assessment
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=gpsd:host=localhost,port=2947
alert=ADVCRYPTCHANGE,5/min,1/sec
alert=BSSTIMESTAMP,5/min,1/sec
alert=CRYPTODROP,/min,/sec
=DISASSOCTRAFFIC,/min,/sec
=DEAUTHFLOOD,/min,/sec
=PROBENOMFP,/min,/sec
启动 Kismet:
sudo kismet -c wlan0
步骤 3:执行评估扫描
流氓接入点检测:
curl -u kismet:kismet http://localhost:2501/devices/summary/devices.json | \
python3 -m json.tool > all_devices.json
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
客户端探测分析:
探测请求(Probe Request)揭示客户端曾连接过的网络,可能表明:
- 企业设备连接至不安全的家庭网络
- 设备搜索已知恶意 SSID(易受邪恶双胞胎攻击)
- 企业环境中的未授权个人设备
步骤 4:分析结果
Kismet 数据库分析 Python 脚本:
"""分析 Kismet 捕获数据库中的无线安全发现。"""
import sqlite3
import json
import sys
from collections import defaultdict
def analyze_kismet_db(db_path: str):
"""分析 Kismet SQLite 数据库中的安全问题。"""
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
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', '未知')
channel = device.get('kismet.device.base.channel', '')
manuf = device.get('kismet.device.base.manuf', '未知')
ap_info = {'mac': mac, 'ssid': name, : crypt, : channel, : manuf}
all_aps.append(ap_info)
crypt crypt == :
open_networks.append(ap_info)
crypt:
wep_networks.append(ap_info)
crypt crypt:
wpa_tkip_networks.append(ap_info)
ssid_entry ssid_map:
(ssid_entry, ):
ssid = ssid_entry.get(, )
ssid == ssid :
hidden_networks.append(ap_info)
base:
client_count +=
()
()
()
()
()
open_networks:
()
net open_networks:
()
wep_networks:
()
net wep_networks:
()
wpa_tkip_networks:
()
net wpa_tkip_networks:
()
hidden_networks:
()
net hidden_networks:
()
channel_usage = defaultdict()
ap all_aps:
ch = ap.get(, )
channel_usage[ch] +=
()
ch, count (channel_usage.items()):
()
conn.close()
__name__ == :
db_path = sys.argv[] (sys.argv) >
analyze_kismet_db(db_path)
步骤 5:检测流氓接入点
将已发现的 AP 与授权清单进行比对:
"""通过与授权 AP 列表比对来检测流氓接入点。"""
import json
import sys
def load_authorized_aps(filepath: str) -> set:
"""从文件加载授权 AP MAC 地址。"""
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):
"""将已发现的 AP 与授权列表进行比对。"""
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', ),
: device.get(, ),
: device.get(, ),
: device.get(, ),
: device.get(, {}).get(, ),
})
rogues:
()
rogue rogues:
()
()
()
()
()
()
()
:
()
__name__ == :
(sys.argv) < :
()
sys.exit()
detect_rogues(sys.argv[], sys.argv[])
评估检查清单
最佳实践
- 书面授权 — 进行无线评估前务必获取签署的授权
- 仅被动模式 — 使用 Kismet 被动模式,不发送取消认证帧或探测请求
- 全面信道覆盖 — 扫描 2.4GHz 和 5GHz 频段,包括 DFS 信道
- 多点位置 — 在多个物理位置进行捕获以获得完整覆盖
- 捕获时长 — 捕获至少 30-60 分钟以观测间歇性设备
- GPS 映射 — 使用 GPS 创建信号边界热力图
- 基线比对 — 维护授权 AP 清单并在每次评估中进行比对
参考资料