Author:qingxp9@360PegasusTeam
首發(fā)于:http://www.freebuf.com/articles/web/161010.html
前幾日看到一則新聞,一家星巴克店內(nèi)無線網(wǎng)絡(luò)被發(fā)現(xiàn)植入了惡意代碼,劫持網(wǎng)絡(luò)流量利用用戶設(shè)備挖掘門羅幣(XMR)。

與加密貨幣相關(guān)的安全事件總是引人注目,我們除了認(rèn)識(shí)到門羅幣具有一定的入手價(jià)值外,還再次見識(shí)到了公共WiFi的危險(xiǎn)。不久后Arnau Code寫了一篇文章,詳細(xì)介紹了如何通過MITM攻擊植入JavaScript代碼,從而讓W(xué)iFi網(wǎng)絡(luò)內(nèi)的所有設(shè)備幫助攻擊者挖礦,并以CoffeeMiner的名稱進(jìn)行了開源:https://github.com/arnaucode/coffeeMiner

我相信有很多家伙會(huì)從這個(gè)新聞以及CoffeeMiner工具中得到啟發(fā),利用類似的攻擊方式開創(chuàng)挖礦事業(yè)。不過本篇我并不想過多討論攻擊方面的問題,最近行業(yè)內(nèi)出現(xiàn)了對(duì)防御型安全人才的呼聲,因此我打算應(yīng)景的寫一篇防御角度的文章,分析如何便捷的檢測周圍WiFi網(wǎng)絡(luò)是否被植入了挖礦代碼。
后文我將圍繞“CoinHive的介紹”,“開放式WiFi網(wǎng)絡(luò)的特性”,“檢測工具的實(shí)現(xiàn)”三點(diǎn)來進(jìn)行敘述,文章的末尾將公布完整的代碼方便大家參考。
CoinHive
星巴克挖礦事件中所使用的便是CoinHive挖礦程序。Coinhive是一個(gè)提供門羅幣挖掘JS腳本的網(wǎng)站平臺(tái)(https://coinhive.com),攻擊者會(huì)將其提供的腳本植入到自己或入侵的網(wǎng)站上。一旦有用戶訪問網(wǎng)頁加載JS后,便會(huì)利用用戶設(shè)備的運(yùn)算資源挖掘門羅幣。
在CoinHive官網(wǎng)注冊(cè)登陸后,在其文檔中發(fā)現(xiàn)了多種部署方式的介紹,包括JS代碼形式、人機(jī)驗(yàn)證形式、Wordpress插件形式等等,種類非常豐富。

比如注冊(cè)登陸時(shí)候的人機(jī)驗(yàn)證,就會(huì)啟動(dòng)挖礦程序,等待一段時(shí)間的挖礦后才能登錄。

根據(jù)JavaScript Miner的介紹文檔,將事例代碼放入網(wǎng)站的html中就可以了,部署極其簡單。
相應(yīng)的,屏蔽的方法也很簡單,各種Adblock軟件早已將它們屏蔽啦。

根據(jù)提示,如果不想有提示用戶的彈窗可以將代碼中的 authedmine.min.js 替換為 coinhive.min.js。
開放式WiFi的特性
無密碼的開放式WiFi網(wǎng)絡(luò)一直以來因其存在的安全威脅為廣大安全人員所詬病,主要在于兩點(diǎn):攻擊者可輕易建立同名釣魚WiFi(客戶端會(huì)自動(dòng)連接?。ㄐ艛?shù)據(jù)未加密容易被嗅探。
最近Wi-Fi聯(lián)盟表示將在即將發(fā)布的WPA3中,添加對(duì)開放式WiFi的通信數(shù)據(jù)加密。但在支持WPA3的設(shè)備被廣泛使用前,需要警惕相應(yīng)的攻擊場景還會(huì)存在很長一段時(shí)間?;氐奖疚?,開放式的WiFi網(wǎng)絡(luò)一直是類似惡意攻擊發(fā)生的重災(zāi)區(qū),結(jié)合剛剛所介紹的“通信數(shù)據(jù)未加密特性”,我們的檢測工具實(shí)現(xiàn)原理就呼之欲出了,即監(jiān)聽明文的802.11數(shù)據(jù)幀,當(dāng)發(fā)現(xiàn)目標(biāo)信息便進(jìn)行告警。
檢測工具的實(shí)現(xiàn)
搭建測試熱點(diǎn)
首先,建立一個(gè)包含攻擊代碼的開放式WiFi網(wǎng)絡(luò)方便后續(xù)測試。
筆者是通過無線網(wǎng)卡Hostapd建立軟AP,Dnsmasq提供DHCP及DNS服務(wù),本地Nginx提供Web服務(wù)并植入CoinHive代碼,最后通過iptables配置Captive Portal(強(qiáng)制認(rèn)證登陸頁面)。如此當(dāng)移動(dòng)設(shè)備連接到該熱點(diǎn),會(huì)自動(dòng)彈窗提示需要認(rèn)證,點(diǎn)擊后就會(huì)訪問含有挖礦代碼的網(wǎng)頁了。
考慮到大部分讀者并不像我這樣富有,同時(shí)擁有兩塊無線網(wǎng)卡?。ㄖ笮枰粔K來進(jìn)行監(jiān)聽),而且Hostapd、Dnsmasq、Nginx、iptables這套方案的部署配置較為復(fù)雜,沒有祖?zhèn)鞯氖炙嚾菀壮鰡栴}。在此我推薦一個(gè)簡單的方案:利用隨身WiFi或者家庭路由器建立熱點(diǎn),配置認(rèn)證頁面到本地Web服務(wù)。好吧,如果沒有認(rèn)證頁面的配置選項(xiàng),手動(dòng)訪問網(wǎng)頁也是一樣的。
監(jiān)聽明文802.11數(shù)據(jù)幀
下一步,我們來嗅探傳遞在空氣中的HTTP數(shù)據(jù)。將無線網(wǎng)卡配置為Monitor模式,切換到熱點(diǎn)所在的Channel,并使用Wireshark進(jìn)行觀察。
ifconfig wlan0 down
iwconfig wlan0 mode monitor
ifconfig wlan0 up
iwconfig wlan0 channel 11
映入眼簾的應(yīng)該是大量的各種802.11幀。我們的目標(biāo)是未加密的數(shù)據(jù)幀,其中的HTTP數(shù)據(jù)將會(huì)被Wireshark所解析,我們鍵入“http.response”進(jìn)行篩選HTTP Response包。與此同時(shí),需要讓我們的移動(dòng)設(shè)備訪問目標(biāo)網(wǎng)頁,接著就能觀察到一些數(shù)據(jù)啦。

我們直接嘗試過濾包含CoinHive特征代碼的數(shù)據(jù)包“data-text-lines contains CoinHive.Anonymous”,結(jié)果如下。

此時(shí)我們便能得出結(jié)論,該熱點(diǎn)存在著CoinHive挖礦代碼。從wlan.sa字段取得該熱點(diǎn)MAC地址,再結(jié)合Beacon或Probe幀獲取其熱點(diǎn)名稱。當(dāng)然我們也可以使用Wireshark的命令行工具Tshark在終端里進(jìn)行操作,并指定輸出格式只輸出熱點(diǎn)MAC地址。

使用Scapy編寫惡意熱點(diǎn)識(shí)別框架
總結(jié)一下,我們的程序就像是一個(gè)對(duì)明文802.11數(shù)據(jù)幀的分析器。按照這個(gè)思路,只需要添加不同的識(shí)別規(guī)則就能擴(kuò)展出對(duì)各種不同攻擊行為的檢測。為了添加擴(kuò)展性,在此使用Scapy來編寫一個(gè)簡單的框架。
1.使用PIP安裝Scapy
注意由于scapy沒有對(duì)http協(xié)議進(jìn)行解析,所以引入了scapy_http擴(kuò)展包。
sudo apt install python-pip
pip install scapy
pip install scapy_http
2.獲取熱點(diǎn)列表
上面tshark的程序有個(gè)缺點(diǎn),就是不太方便同時(shí)顯示出熱點(diǎn)名稱。于是在此框架中,我們會(huì)先掃描一下周邊熱點(diǎn)信息以便后用。
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.監(jiān)聽含有關(guān)鍵字的HTTP數(shù)據(jù)包
當(dāng)匹配到告警規(guī)則后,輸出熱點(diǎn)名稱、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.監(jiān)聽模式及信道切換
2.4GHz中,熱點(diǎn)一般會(huì)建立在1、6、11三個(gè)互不干擾的信道上。為了增加監(jiān)聽覆蓋的信道,讓我們的程序增加信道切換功能。

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.最終效果
把以上的模塊組裝在一起就可以使用啦,可以在這查看完整代碼。
測試效果如下:

如果你想添加更多的檢測規(guī)則,可以在HTTPHandler函數(shù)里邊擴(kuò)展。