2017年12月有一则新闻称,国外一家星巴克店内的无线网络被发现植入了恶意代码,劫持网络流量,利用用户设备挖掘门罗币(XMR)。与加密货币相关的安全事件总是引人注目,我们也再次见识到了公共Wi-Fi的危险。
不久,ArnauCode写了一篇文章CoffeeMiner:HackingWiFitoinjectcryptocurrencyminertoHTMLrequests,其中详细介绍了如何通过MITM攻击植入JavaScript代码,从而让Wi-Fi网络内的所有设备帮助攻击者挖矿,架构如图2-132所示。
在本文内容中,我们将提出一种可以检测周围Wi-Fi网络是否被植入挖矿代码的便捷方法。
1.什么是CoinHive在星巴克挖矿事件中所使用的便是CoinHive挖矿程序。CoinHive是一个提供了门罗币挖矿脚本的网站平台,攻击者将该平台提供的脚本植入到自己或入侵的网站上。一旦有用户访问加载网页上的JavaScript代码,便会利用用户设备来挖掘门罗币。
在CoinHive官网中可以发现多种部署方式,包括JavaScript代码形式、人机验证形式、WordPress插件形式等,种类非常丰富。例如,在注册登录时的人机验证,界面如图2-133所示。一旦单击就会启动挖矿程序,在运算一段时间后用户才可以继续登录。
根据JavaScriptMiner的介绍文档,将示例代码放入网站的HTML文件中就可以了,部署极其简单,如图2-134所示。
由于JavaScript挖掘代码的易用性及加密货币的经济价值,CoinHive经常被不法分子所利用。例如,站长或黑客攻破网站后主动插入挖矿代码,站点本身没有挖矿脚本却被运营商链路劫持插入挖矿代码,通过广告联盟将挖矿代码随着广告分发到大量的网站上。
这次星巴克热点的挖矿事件向大家揭示了公共Wi-Fi网络也是容易被不法分子利用的场景。
2.无线热点中的挖矿代码植入原理在星巴克热点挖矿案例中,可以通过多种方式达到植入挖矿代码的目的。
(1)在商家无线网络中,通过中间人攻击植入挖矿代码,如图2-135所示。
ARP欺骗是中间人攻击中最为常见的一种。在局域网中,设备间的通信依赖于MAC地址(而不是IP),每个设备都会在本地维护一个ARP映射表,记录MAC与IP的对应关系。所谓ARP欺骗,就是让目标设备在本地ARP表中记录错误的对应关系(如图2-136所示的ARP映射表),使其将数据发向错误的目标,从而被黑客所劫持。黑客通过对用户进行中间人攻击,进而劫持目标与网关间的通信数据,例如替换网页图片(如图2-137所示)、替换安装包及植入挖矿代码等。
(2)攻击者创建钓鱼热点植入挖矿代码。在2.4节中我们了解到,当无线设备发现周围存在同名同加密类型的历史连接热点时,会尝试自动连接。黑客可以通过创建与星巴克热点同名的开放式热点骗取用户主动或被动连接。而该处的DNS是由黑客控制的,可以将所有的网页请求指向被黑客植入了挖矿代码的网页,如图2-138所示。
3.检测工具的原理与实现现有检测工具大多数使用终端上的安全软件对网络入口流量进行检测,进而发现挖矿代码,这需要设备先连接目标网络才能检测。如果想检测周边的所有热点就只能逐个连接,可预想到效率会非常低。而下面介绍的检测方法可以在无连接的情况下批量检测周边热点,这种检测方式主要基于以下两点。
①由于恶意热点出于吸引更多用户的目的,往往是无密码的开放式热点。
②开放式热点的通信数据是未加密的。
检测工具的原理就呼之欲出了,即监听明文的802.11数据帧,当发现挖矿特征便进行告警。
(1)搭建测试热点
为方便后续测试,先建立一个包含挖矿代码的开放式热点。参考2.4节钓鱼热点中的内容,通过hostapd建立热点,利用dnsmasq提供DHCP及DNS服务,本地nginx提供Web服务并植入CoinHive代码,最后通过iptables配置CaptivePortal强制门户。如此,当移动设备连接该热点时会自动弹出窗口提示需要认证,单击后就会访问含有挖矿代码的网页了。
(2)监听明文802.11数据帧
监听传递在空中的HTTP数据。将无线网卡配置为Monitor模式,切换到热点所在的Channel,并使用Wireshark进行观察。命令如下:
ifconfigwlan0downiwconfigwlan0modemonitorifconfigwlan0upiwconfigwlan0channel11
我们的目标是获取未加密的数据帧,其中的HTTP数据将会被Wireshark所解析,在图2-139中输入进行HTTPResponse帧筛选。与此同时,需要让移动设备访问目标网页,接着就能观察到一些数据。
直接尝试过滤出包含CoinHive特征代码的数据包,结果如图2-140所示。
此时便能得出结论,该热点存在CoinHive挖矿代码。从字段取得该热点的MAC地址,再结合Beacon帧或Probe帧获取该热点的名称。以上描述的方法也可以使用Wireshark的命令行工具Tshark在终端中进行操作。
(3)使用Scapy编写挖矿热点识别框架
我们即将打造的程序就是一个对明文802.11数据帧的分析器。按照这个思路,只需要添加不同的识别规则就能扩展出对攻击代码的检测了。为了便于扩展,使用Scapy来编写一个简单的框架。
①安装Scapy。由于Scapy没有对HTTP协议进行解析,所以需要引入了scapy_http扩展包。命令如下:
aptinstallpython-pippipinstallscapypipinstallscapy_http
②获取热点列表。扫描周边热点信息,以便后用,相关代码如下:
*="wlan0"ap_dict={}defBeaconHandler(pkt):(Dot11):==0==8:_():ap_dict[]=(iface=iface,prn=BeaconHandler,timeout=1)③监听含有关键字的HTTP数据包。当匹配到告警规则后,输出热点名称、MAC地址及告警详情,相关代码如下:
filter_response="tcpsrcport80"defHTTPHandler(pkt):('HTTP'):mac="":reason="CoinHive"else:returnifmacinap_():ssid=ap_dict[mac]print"FindRogueAP:%s(%s)--%s"%(ssid,mac,reason)else:printmacsniff(iface=iface,prn=HTTPHandler,filter=filter_response,timeout=5)④监听模式及信道切换。在2.4GHz中,热点一般会建立在1、6、11三个互不干扰的信道上。为了增加监听覆盖的信道,可以让程序增加信道切换功能,相关代码如下:
importosprint"[+]Setiface%stomonitormode"%(iface)("ifconfig"+iface+"down")("iwconfig"+iface+"modemonitor")("ifconfig"+iface+"up")channels=[1,6,11]print"[+]Sniffingonchannel"+str(channels)whileTrue:forchannelinchannels:("iwconfig"+iface+"channel"+str(channel))把以上模块组装在一起就可以使用了(完整代码见)。如果想添加更多的检测规则,可以在HTTPHandler函数中进行扩展。





