黄玮
注意此时无线网卡指示灯 均已点亮
Virtualbox
的 USB
设备管理菜单能识别连入的 USB 无线网卡Kali
作为基础操作系统Kali
开箱即用提供了大量 USB 接口无线网卡驱动lsusb
无法识别的 USB 无线网卡大概率无法使用lsusb
可识别但 iw
无法管理的无线网卡可以通过手动安装对应驱动程序的方式来解决网卡使用问题# 查看 USB 接口上是否已识别无线网卡
lsusb
# Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
# Bus 001 Device 006: ID 0bda:a811 Realtek Semiconductor Corp. RTL8811AU 802.11a/b/g/n/ac WLAN Adapter
# Bus 001 Device 008: ID 0cf3:9271 Qualcomm Atheros Communications AR9271 802.11n
# Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
# 查看无线网卡驱动加载情况
# Driver=rtl88XXau 非空,说明无线网卡驱动加载正常
lsusb -t
# /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
# /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/8p, 480M
# |__ Port 1: Dev 2, If 0, Class=Vendor Specific Class, Driver=rtl88XXau, 480M
# 查看 USB 接口连接设备的详细信息
lsusb -v
# Bus 001 Device 006: ID 0bda:a811 Realtek Semiconductor Corp. RTL8811AU 802.11a/b/g/n/ac WLAN Adapter
# Device Descriptor:
# ...
# idVendor 0x0bda Realtek Semiconductor Corp.
# idProduct 0xa811 RTL8811AU 802.11a/b/g/n/ac WLAN Adapter
# bcdDevice 2.00
# iManufacturer 1 Realtek
# iProduct 2 802.11ac WLAN Adapter
# iSerial 3 00e04c000001
# bNumConfigurations 1
# Configuration Descriptor:
# ...
# Bus 001 Device 011: ID 0cf3:9271 Qualcomm Atheros Communications AR9271 802.11n
# Device Descriptor:
# ...
# idVendor 0x0cf3 Qualcomm Atheros Communications
# idProduct 0x9271 AR9271 802.11n
# bcdDevice 1.08
# iManufacturer 16 ATHEROS
# iProduct 32 USB2.0 WLAN
# iSerial 48 12345
# bNumConfigurations 1
# ...
# 使用 iw 工具查看无线网卡基本信息
iw dev
# phy#1
# Interface wlan1
# ifindex 6
# wdev 0x100000001
# addr 0e:05:8c:fd:dc:56
# type managed
# txpower 20.00 dBm
# phy#0
# Interface wlan0
# ifindex 5
# wdev 0x1
# addr 56:6a:c9:ec:2d:2f
# type managed
# txpower 20.00 dBm
# 查看无线网卡详细硬件参数信息
iw phy
monitor
(监听)模式
BSS
AP
或进⼊ Ad-Hoc
模式channel hopping
(跳频)技术在多个 channel
(频道)之间快速切换IEEE 802.11
协议的支持有 硬件差异
a/b/g/n/ac
,其中 b/g
最为常见# 方法一
# 最傻瓜化的指令 airmon-ng
# 配置指定网卡 wlan 进入监听模式
# 部分型号无线网卡可能会被重命名
# 重命名后的网卡名称可能是 wlan0mon
airmon-ng start wlan0
# 配置指定网卡 wlan 退出监听模式(回到默认的 managed 模式)
airmon-ng stop wlan0
# airmon-ng stop wlan0mon
# 使用无线网卡底层配置工具 iw
# 方法二
# 配置指定网卡 wlan 进入监听模式
iw dev wlan0 set type monitor
# 配置网卡监听 channel
iw dev wlan0 set channel 6
# 配置指定网卡 wlan 进入 managed 模式
iw dev wlan0 set type managed
# 方法三
# 对于硬件支持创建虚拟子接口的网卡可以采用以下指令
iw dev wlan0 interface add mon0 type monitor
# 此时再次查看 iw dev 输出结果会发现多了一个「无线网卡」 mon0
# 如果提示 command failed: Device or resource busy (-16)
# 需要先从操作系统层面禁用无线网卡,再执行上述 iw 指令配置网卡工作模式
# 常见故障排查手段
# 操作系统层面启用无线网卡
ip link set wlan0 up
# 操作系统层面禁用无线网卡
ip link set wlan0 down
# 注意网卡被禁用后通常硬件的工作状态指示灯也会灭掉
# 开始以channel hopping模式抓包
# 注意看清楚 iw dev 输出的网卡名称
airodump-ng wlan0
# CTRL-C退出当前抓包
# 选择一个"感兴趣"的目标AP进行定向(指定工作channel)监听并将结果保存到本地文件
airodump-ng wlan0 --channel 13 -w saved --beacons --wps
# 以上命令会在当前目录保存文件名为saved-NN的几个文件:.cap、.csv、.kismet.csv、.kismet.netxml
# 其中NN按照从01开始编号,重复执行上述命令多次,捕获到的数据报文会保存在不同编号的.cap文件中
# 使用 --beacons 参数可以记录每一个独立BSSID发送的所有beacon frame
# 如果不使用上述参数,airodump-ng 默认对一个独立BSSID只记录一个beacon frame
# 假如某个AP在抓包过程中更换了ESSID,则抓包结果会遗失大部分ESSID
# 不使用 --beacons 参数可以减少大量的I/O写磁盘次数(大部分AP每秒会发送10个beacon frame)
# --wps 可以显示开启了WPS功能的AP的WPS相关信息
# 如果希望只监听指定AP的所有通信数据报文,可以使用以下命令
airodump-ng -c 8 --bssid <bssid> -w saved wlan0
# 上述命令中<bssid>替换为实际目标AP的BSSID值即可
# tcpdump 和 tshark 未开箱即用提供 channel hopping 功能
# 只能固定在一个指定 channel 上抓包
# 部分无线网卡可能不支持 -I 参数
tshark -i wlan0 -I -w saved.cap
tshark --help | grep -- -I
# -I, --monitor-mode capture in monitor mode, if available
tcpdump -i wlan0 -w saved.cap
监听模式
channel hopping
模式收集附近无线网络信息USB 连接接口
,有些电脑的不同 USB 接口
由于供电能力差异,部分耗电量较大的 USB 无线网卡
可能只能在电脑的特定 USB 接口
上可以正常工作;USB 无线网卡
的 USB 连接线
,排除连接线故障原因;USB 3.0兼容
选项或者如果 USB 3.0兼容模式
无法正常识别网卡或网卡无法抓包,可以降级为 USB 2.0兼容模式
尝试故障排查;tail -F /var/log/messages
,重新连接 USB 无线网卡
,检查该日志中的消息是否有出现一些故障信息报错。尝试在搜索引擎中搜索相关报错信息关键词;重启
大法好。无论是虚拟机还是物理主机,有时可能是由于新安装了USB驱动或其他未知不可描述原因,重启或关闭系统再启动(冷启动)就可以解决问题;准备无线网络抓包实验环境,动手抓包时间。
Aircrack-ng is a complete suite of tools to assess WiFi network security.
# 查看版本信息和命令行参数帮助
aircrack-ng --help
# 查看当前系统上的 aircrack-ng 安装了哪些文件
dpkg -L aircrack-ng
Column Preferences
Type
为 Custom
的自定义列,值为 wlan.fc.type_subtype
先讲一段「基础理论」知识
STA
的身份IEEE 802.11
通常要求双向式的身份确认,它也允许同⼀时间⼀个 STA
和多个 STA
(包括 AP
)进⾏身份验证STA
可以用这个服务来取消身份认证,⼀旦取消后连接也同时被取消STA
和 AP
(或 STA
)之间建立⼀个通信链路AP
接⼊分布式系统的,这些信息都可以由连接服务提供AP
进⾏连接BS
内有⼀个 AP
,因此在这个区域内的任意主机若想要与外界进⾏通信,就必须先与此 AP
进⾏连接。这个过程类似注册,当主机完成连接后,AP
就会记住这台主机目前在它的管辖范围之内。连接服务通常都由主机启动,用它来与 AP
进⾏连接
AP
进⾏连接,这样才能使分布式系统知道哪个主机是由哪个 AP
所管辖的,然⽽⼀个 AP
却可以同时与多台主机进⾏连接AP
转移⾄另⼀个 AP
AP
进⾏连接,使分布式系统知道此主机已经转移⾄另⼀个 AP
的管辖区域内AP
启动重连服务外,还会对旧的 AP
启动取消连接服务BSS
中的主机使用AP
,再由 AP
通过分布式系统传送⾄目的地IEEE 802.11
并没有规定分布式系统要如何将数据正确的送⾄目的地,但它说明了在连接、取消连接和重连等服务中,数据应该由哪个 AP
进⾏输出以将数据送达⾄正确的目标地点隐藏节点并发同 AP 通信
可能导致的丢帧问题
隐藏节点
问题,引⼊了 RTS
/CTS
+ ACK
协议Beacon
数据包等
BSSID
时,它们才会被送⾄ MAC 管理层
,唯⼀例外的是 Beacon
帧wlan.fc.type == 0
Type | Subtype 2进制表示 | Subtype 10进制表示 | 功能 |
---|---|---|---|
00 | 1000 | 8 | Beacon |
00 | 0100 | 4 | Probe Request |
00 | 0101 | 5 | Probe Response |
00 | 1011 | 11 | Authentication |
00 | 1100 | 12 | Deauthentication |
00 | 0000 | 0 | Association request |
00 | 0001 | 1 | Association response |
tshark -r 0-open-ap-public.pcap -T fields -e wlan.fc.type -e wlan.fc.subtype -e _ws.col.Info "wlan.mgt" | awk -F ',' '{print $1}' | sort -t 1 -u
# 0 0 Association Request
# 0 1 Association Response
# 0 10 Disassociate
# 0 11 Authentication
# 0 13 Action
# 0 4 Probe Request
# 0 5 Probe Response
# 0 8 Beacon frame
# 查看 scapy 支持的协议对象
## Dot11 开头的都是 IEEE 802.11 相关协议对象
ls()
# Dot11AssoReq : 802.11 Association Request
# Dot11AssoResp : 802.11 Association Response
# Dot11Auth : 802.11 Authentication
# Dot11Beacon : 802.11 Beacon
# Dot11Deauth : 802.11 Deauthentication
# Dot11Disas : 802.11 Disassociation
# Dot11ProbeReq : 802.11 Probe Request
# Dot11ProbeResp : 802.11 Probe Response
# Dot11QoS : 802.11 QoS
# Dot11ReassoReq : 802.11 Reassociation Request
# Dot11ReassoResp : 802.11 Reassociation Response
# 构造一个 Beacon Frame
beacon=RadioTap()/Dot11()/Dot11Beacon()
# 可视化 Beacon Frame 结构
beacon.show2()
# ###[ RadioTap ]###
# version= 0
# pad= 0
# len= 8
# present=
# notdecoded= ''
# ###[ 802.11 ]###
# subtype= Beacon
# type= Management
# proto= 0
# FCfield=
# ID= 0
# addr1= 00:00:00:00:00:00 (RA=DA)
# addr2= 00:00:00:00:00:00 (TA=SA)
# addr3= 00:00:00:00:00:00 (BSSID/STA)
# SC= 0
# ###[ 802.11 Beacon ]###
# timestamp= 0
# beacon_interval= 100
# cap=
# 打印 type 和 subtype 字段取值
print("{} {}".format(beacon.getlayer(Dot11).type, beacon.getlayer(Dot11).subtype))
# 0 8
# 管理帧字段 type=0
IEEE 802.11
允许 STA
使用 request to send
和 clear to send
信号来清空传送区域tshark -r 0-open-ap-public.pcap -T fields -e wlan.fc.type -e wlan.fc.subtype -e wlan.fc.type_subtype -e _ws.col.Info "wlan.fc.type==1" | awk -F ',' '{print $1}' | sort -t 1 -u
# 1 11 27 Request-to-send
# 1 12 28 Clear-to-send
# 1 13 29 Acknowledgement
# 1 8 24 802.11 Block Ack Req
# 1 9 25 802.11 Block Ack
# 构造一个默认的控制帧
dot11ack=RadioTap()/Dot11()/Dot11Ack()
# 可视化这个控制帧字段结构
dot11ack.show2()
# ###[ RadioTap ]###
# version= 0
# pad= 0
# len= 8
# present=
# notdecoded= ''
# ###[ 802.11 ]###
# subtype= Ack
# type= Control
# proto= 0
# FCfield=
# ID= 0
# addr1= 00:00:00:00:00:00 (RA)
# 打印 type 和 subtype 字段取值
print("{} {}".format(dot11ack.getlayer(Dot11).type, dot11ack.getlayer(Dot11).subtype))
# 1 13
# 控制帧字段 type=1
tshark -r 1-wpa2mixed-public.pcap -T fields -e wlan.fc.type -e wlan.fc.subtype -e wlan.fc.type_subtype -e _ws.col.Info "wlan.fc.type==2" | awk -F ',' '{print $1}' | sort -t 1 -u
# 2 0 32 Data
# 2 4 36 Null function (No data)
# 2 8 40 Key (Message 1 of 4)
# 2 8 40 Key (Message 2 of 4)
# 2 8 40 Key (Message 3 of 4)
# 2 8 40 Key (Message 4 of 4)
# 2 8 40 QoS Data
(wlan.addr == 3c:46:d8:59:e8:f4) || (wlan.addr == 76:73:c1:7d:ef:a1) && (wlan.fc.type_subtype <= 0x1b || eapol) && !(wlan.addr == ce:1e:34:cd:76:a9) && !(wlan.addr == ba:2a:cd:46:18:22) && !(wlan.da == 48:64:12:67:f9:c2) && !(wlan.fc.type_subtype == 0x001b) && !(wlan.fc.type_subtype == 0x000a) && !(wlan.fc.type_subtype == 0x000c) && !(wlan.addr == 9c:c8:f3:82:89:e0)
分段名称 | FC | D/I | Addr1 | Addr2 | Addr3 | SC | Addr4 | body | CRC |
---|---|---|---|---|---|---|---|---|---|
字节数(octets) | 2 | 2 | 6 | 6 | 6 | 2 | 6 | 0 ~ 2312 | 4 |
分段名称 | Protocol | Type | Subtype | TD | FD | MF | Retry | PM | MD | PF | Order |
---|---|---|---|---|---|---|---|---|---|---|---|
比特数(bits) | 2 | 2 | 4 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
beacon=RadioTap()/Dot11()/Dot11Beacon()
beacon.psdump('beacon.demo.eps', layer_shift=1)
WEP | WPA | WPA2 | WPA3 | |
---|---|---|---|---|
发布时间 | 1997 | 2003 | 2004 | 2018 |
安全模型 | Open/Shared | PSK/Enterprise | PSK/Enterprise | PSK/Enterprise |
加密算法 | RC4 | TKIP | AES-CCMP | AES-CCMP/AES-GCMP |
密钥长度 | 64b/128b | 128b | 128b | 128b/256b |
完整性校验算法 | CRC-32 | 64b MIC | CBC-MAC | SHA-2 |
PMF 支持 | 不支持 | 可选 | 可选 | 强制要求 |
FS 支持 | ❌ | ❌ | ❌ | ✅ |
已淘汰(2021) | 2004 | 2012 | 未淘汰 | 未淘汰 |
本课程专注于 WPA/WPA2
协议及其安全问题讲解。
预共享密钥
机制IEEE 802.1X
标准,支持非共享的独立认证凭据密钥类型 | 用途 | 来源 |
---|---|---|
PSK | 认证 | (离线)配置😈 |
PMK | 长期使用😈,产生其他加密用途密钥 | EAP 协商 |
PTK | 加密单播(unicast)通信 | 产生自 PMK/PSK |
GTK | 加密广播(broadcast)和多播(multicast)通信 | 产生自 PMK/PSK |
PBKDF
运算之后每次的结果都不相同c
,增加暴力破解的计算量,从而增加破解时间salt
的选择如果做到 不可预测 ,则可以抵御预先计算 PBKDF
字典的加速暴力破解攻击方法
WPA/WPA2 PSK
使用的 salt
是 SSID
和 ssidLength
Function
是 预先定义好的伪随机函数
DHCP
和禁用 DHCP
状态下进行抓包
AP
广播的 beacon frame
STA
主动发出的 probe request frame
[RadioTap]
-[Dot11]
-- [Dot11<Frame Type>]
--- [Dot11Elt]
--- [Dot11Elt]
…
--- [Dot11Elt]
frame = RadioTap()/Dot11()/Dot11ProbeReq()/Dot11Elt()
# 查看 Dot11 字段定义
ls(Dot11)
# subtype : BitMultiEnumField (4 bits) = (0)
# type : BitEnumField (2 bits) = (0)
# proto : BitField (2 bits) = (0)
# cfe : BitEnumField (Cond) (4 bits) = (0)
# FCfield : MultipleTypeField = (<Flag 0 ()>)
# ID : ShortField = (0)
# addr1 : _Dot11MacField = ('00:00:00:00:00:00')
# addr2 : _Dot11MacField (Cond) = ('00:00:00:00:00:00')
# addr3 : _Dot11MacField (Cond) = ('00:00:00:00:00:00')
# SC : LEShortField (Cond) = (0)
# addr4 : _Dot11MacField (Cond) = ('00:00:00:00:00:00')
# 查看 Dot11Elt 字段定义
ls(Dot11Elt)
# ID : ByteEnumField = (0)
# len : FieldLenField = (None)
# info : StrLenField = (b'')
# 发送构造好的 wireless frame
sendp(frame, iface='wlan0', count=10, inter=0.2)
# 从 pcap 中读取 wireless frame
frame_list = rdpcap(filename)
frame_obj = frame_list[0]
# 嗅探模式实时抓包
# count=10 捕获 10 个 frame 后退出嗅探
# prn=FrameHandler 注册一个回调函数 FrameHandler
# 用于每收到一个 frame 后调用该函数
sniff(iface='wlan0', count=10, prn=FrameHandler)
# 捕获数据写入文件
wrpcap(filename, frames_list)
RADIUS
协议认证
802.11
是无线网络链路层协议规范802.1X
是物理层无关的基于端口的(链路层)访问控制协议DoS
攻击IEEE 802.11
协议中提供 STA
和认证服务器之间的端到端认证
AP
在这个过程中扮演认证代理角色RADIUS
是 EAP
在 IP
网络中传输的事实标准EAP encapsulation over LAN.
EAP
的标准EAP
消息被封装在以太帧负载⚠️ 本节内容仅限「教学演示」用途,包含严重安全漏洞,切勿用于生产环境!!
⚠️ 本节内容仅限「教学演示」用途,包含严重安全漏洞,切勿用于生产环境!!
⚠️ 本节内容仅限「教学演示」用途,包含严重安全漏洞,切勿用于生产环境!!
OpenWrt 19.07.5, r11257-5090152ae3
opkg update && opkg install freeradius3-default freeradius3-utils
freeradius3/clients.conf
# 修改配置文件中 secret 变量赋值
# AP 访问 FreeRADIUS 使用的秘密凭据
secret = SecretForAP1
freeradius3/mods-config/files/authorize
# 添加以下「用户密码明文对」到文件第一行
# 无线客户端连接 AP 时使用的独立用户名密码
bob Cleartext-Password := "password1"
freeradius3/sites-available/default
# 取消 radutmp 这一行的行首注释
radutmp
freeradius3/sites-available/inner-tunnel
# 取消注释 'update output.session-state' 这一小节配置
update outer.session-state {
User-Name := &User-Name
}
config wifi-iface 'default_radio0'
option device 'radio0'
option mode 'ap'
option ssid 'OpenWrt'
option network 'wan'
option encryption 'wpa2'
option server '127.0.0.1'
option key 'SecretForAP1'
option acct_server '127.0.0.1'
option acct_secret 'SecretForAP1'
完成以上配置之后,可以通过 LuCI
重启无线网络以使配置生效。