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

Author:qingxp9@360PegasusTeam
首发于:http://www.freebuf.com/articles/web/161010.html


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

image.png

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

image.png

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

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

CoinHive

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

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

image.png

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

image.png

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

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

image.png

根据提示,如果不想有提示用户的弹窗可以将代码中的 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包。与此同时,需要让我们的移动设备访问目标网页,接着就能观察到一些数据啦。

image.png

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

image.png

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

image.png

使用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三个互不干扰的信道上。为了增加监听覆盖的信道,让我们的程序增加信道切换功能。

image.png

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.最终效果

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

测试效果如下:


demo.gif

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容