freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

拒绝成为免费劳动力:检测含有挖矿脚本的WiFi热点
qingxp9 2018-01-23 08:00:46 1379432
所属地 河北省

前几日看到一则新闻,一家星巴克店内无线网络被发现植入了恶意代码,劫持网络流量利用用户设备挖掘门罗币(XMR)。

拒绝成为免费劳动力:检测含有挖矿脚本的WiFi热点

与加密货币相关的安全事件总是引人注目,我们除了认识到门罗币具有一定的入手价值外,还再次见识到了公共WiFi的危险。不久后[Arnau Code写了一篇文章,详细介绍了如何通过MITM攻击植入JavaScript代码,从而让WiFi网络内的所有设备帮助攻击者挖矿,并以CoffeeMiner的名称进行了开源:https://github.com/arnaucode/coffeeMiner


拒绝成为免费劳动力:检测含有挖矿脚本的WiFi热点

我相信有很多家伙会从这个新闻以及CoffeeMiner工具中得到启发,利用类似的攻击方式开创挖矿事业。不过本篇我并不想过多讨论攻击方面的问题,最近行业内出现了对防御型安全人才的呼声,因此我打算应景的写一篇防御角度的文章,分析如何便捷的检测周围WiFi网络是否被植入了挖矿代码。

后文我将围绕“CoinHive的介绍”,“开放式WiFi网络的特性”,“检测工具的实现”三点来进行叙述,文章的末尾将公布完整的实现代码方便大家参考。

CoinHive

星巴克挖矿事件中所使用的便是CoinHive挖矿程序。Coinhive是一个提供门罗币挖掘JS脚本的网站平台,攻击者会将其提供的脚本植入到自己或入侵的网站上。一旦有用户访问网页加载JS后,便会利用用户设备的运算资源挖掘门罗币。

在CoinHive官网注册登陆后,在其文档中发现了多种部署方式的介绍,包括JS代码形式、人机验证形式、Wordpress插件形式等等,种类非常丰富。

拒绝成为免费劳动力:检测含有挖矿脚本的WiFi热点

比如注册登陆时候的人机验证,就会启动挖矿程序,等待一段时间的挖矿后才能登录。

拒绝成为免费劳动力:检测含有挖矿脚本的WiFi热点

根据JavaScript Miner的介绍文档,将事例代码放入网站的html中就可以了,部署极其简单。

相应的,屏蔽的方法也很简单,各种Adblock软件早已将它们屏蔽啦。

拒绝成为免费劳动力:检测含有挖矿脚本的WiFi热点

根据提示,如果不想有提示用户的弹窗可以将代码中的 authedmine.min.js 替换为 coinhive.min.js。

开放式WiFi的特性

无密码的开放式WiFi网络一直以来因其存在的安全威胁为广大安全人员所诟病,主要在于两点:攻击者可轻易建立同名钓鱼WiFi(客户端会自动连接!),通信数据未加密容易被嗅探。

最近Wi-Fi联盟表示将在即将发布的WPA3中,添加对开放式WiFi的通信数据加密。但在支持WPA3的设备被广泛使用前,需要警惕相应的攻击场景还会存在很长一段时间。回到本文,开放式的WiFi网络一直是类似恶意攻击发生的重灾区,结合刚刚所介绍的“通信数据未加密特性”,我们的检测工具实现原理就呼之欲出了,即监听明文的802.11数据帧,当发现目标信息便进行告警。

检测工具的实现

搭建测试热点

首先,建立一个包含攻击代码的开放式WiFi网络方便后续测试。

笔者是通过无线网卡Hostapd建立软AP,Dnsmasq提供DHCP及DNS服务,本地Nginx提供Web服务并植入CoinHive代码,最后通过iptables配置Captive Portal(强制认证登陆页面)。如此当移动设备连接到该热点,会自动弹窗提示需要认证,点击后就会访问含有挖矿代码的网页了。

考虑到大部分读者并不像我这样富有,同时拥有两块无线网卡!(之后需要一块来进行监听),而且Hostapd、Dnsmasq、Nginx、iptables这套方案的部署配置较为复杂,没有祖传的手艺容易出问题。在此我推荐一个简单的方案:利用随身WiFi或者家庭路由器建立热点,配置认证页面到本地Web服务。好吧,如果没有认证页面的配置选项,手动访问网页也是一样的。

监听明文802.11数据帧

下一步,我们来嗅探传递在空气中的HTTP数据。将无线网卡配置为Monitor模式,切换到热点所在的Channel,并使用Wireshark进行观察。

```

ifconfig wlan0 down

iwconfig wlan0 mode monitor

ifconfig wlan0 up

iwconfig wlan0 channel 11

```

映入眼帘的应该是大量的各种802.11帧。我们的目标是未加密的数据帧,其中的HTTP数据将会被Wireshark所解析,我们键入“http.response”进行筛选HTTP Response包。与此同时,需要让我们的移动设备访问目标网页,接着就能观察到一些数据啦。

拒绝成为免费劳动力:检测含有挖矿脚本的WiFi热点

我们直接尝试过滤包含CoinHive特征代码的数据包“data-text-lines contains CoinHive.Anonymous”,结果如下。

拒绝成为免费劳动力:检测含有挖矿脚本的WiFi热点

此时我们便能得出结论,该热点存在着CoinHive挖矿代码。从wlan.sa字段取得该热点MAC地址,再结合Beacon或Probe帧获取其热点名称。当然我们也可以使用Wireshark的命令行工具Tshark在终端里进行操作,并指定输出格式只输出热点MAC地址。

拒绝成为免费劳动力:检测含有挖矿脚本的WiFi热点

使用Scapy编写恶意热点识别框架

总结一下,我们的程序就像是一个对明文802.11数据帧的分析器。按照这个思路,只需要添加不同的识别规则就能扩展出对各种不同攻击行为的检测。为了添加扩展性,在此使用Scapy来编写一个简单的框架。

1.使用PIP安装Scapy

注意由于scapy没有对http协议进行解析,所以引入了scapy_http扩展包。

```

sudo apt install python-pip

pip install scapy

pip install scapy_http

```

2.获取热点列表

上面tshark的程序有个缺点,就是不太方便同时显示出热点名称。于是在此框架中,我们会先扫描一下周边热点信息以便后用。

```

from scapy.all import *

from scapy.layers import http

iface = "wlan0"

ap_dict = {}

def BeaconHandler(pkt) :

  if pkt.haslayer(Dot11) :

    if pkt.type == 0 and pkt.subtype == 8 :

        if pkt.addr2 not in ap_dict.keys() :

            ap_dict[pkt.addr2] = pkt.info

sniff(iface=iface, prn=BeaconHandler, timeout=1)

```

3.监听含有关键字的HTTP数据包

当匹配到告警规则后,输出热点名称、MAC地址及告警详情。

```

filter_response = "tcp src port 80"

def HTTPHandler(pkt):

  if pkt.haslayer('HTTP'):

    if "CoinHive.Anonymous" in pkt.load:

      mac = pkt.addr2

      if mac in ap_dict.keys() :

          ssid = ap_dict[mac]

          reason = "Coinhive_miner"

          print "Find Rogue AP: %s(%s) -- %s" %(ssid, mac, reason)

      else:

          print mac

sniff(iface=iface, prn=HTTPHandler, filter=filter_response, timeout=5)

```

4.监听模式及信道切换

2.4GHz中,热点一般会建立在1、6、11三个互不干扰的信道上。为了增加监听覆盖的信道,让我们的程序增加信道切换功能。

拒绝成为免费劳动力:检测含有挖矿脚本的WiFi热点

```

import os

print "[+] Set iface %s to monitor mode" %(iface)

os.system("ifconfig " + iface + " down")

os.system("iwconfig " + iface + " mode monitor")

os.system("ifconfig " + iface + " up")

channels = [1,6,11]

print "[+] Sniffing on channel " + str(channels)

while True:

    for channel in channels:

        os.system("iwconfig " + iface + " channel " + str(channel))

        ...

```

5. 最终效果

把以上的模块组装在一起就可以使用啦,可以[在这查看完整代码]

测试效果如下:

拒绝成为免费劳动力:检测含有挖矿脚本的WiFi热点

如果你想添加更多的检测规则,可以在HTTPHandler函数里边扩展。

*本文作者:qingxp9@360PegasusTeam,转载请注明来自 FreeBuf.COM

# wifi # 挖矿
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 qingxp9 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
qingxp9 LV.4
yyf
  • 6 文章数
  • 33 关注者
红蓝对抗中的近源渗透
2020-09-18
影响所有苹果设备的无线漏洞,可被强行接入恶意热点
2019-05-16
三步学会爬动态网站
2019-03-07
文章目录