BeEF 創建擴展
介紹
顧名思義,擴展用于“擴展” BeEF的功能。擴展與模塊略有不同。它們是向BeEF的核心功能添加新功能的一種方式,而模塊通常具有執行特定任務的狹窄功能集。通過模塊化新的核心功能,有助于防止功能蠕變。
目錄布局
添加一個新的擴展位于extensions/目錄中,并且通常具有以下布局:
extension.rb<name>.rbconfig.yamlapi.rbmodel.rbrest/<name>.rb
從技術上講,唯一需要的文件是extension.rb和config.yaml。但實際上,您還<name>.rb至少需要一個文件,以使所有內容都不會被塞到一個位置。堅持這種布局可以提高一致性和可維護性。
extension.rb
該文件是擴展的主要入口點。當BeEF引導時加載其擴展名時,它將從此處開始。它的內容包括與您的擴展相關的元數據:它的簡稱,全名和描述。它也是require擴展將使用的任何其他文件的位置。這里定義的類必須是extendBeEF:: API::Extension。<name>.rb
這是擴展程序的核心功能所在。它將屬于BeEF:: Extension名稱空間。例如,如果您的擴展名為“ foobar”,則該文件將被命名foobar.rb并定義模塊BeEF:: Extension::Foobar。如果您發現擴展名需要的不僅僅是一個類,則應將其拆分為多個文件。config.yaml
在此處可以找到任何特定于擴展名的設置。您的擴展名必須在下面,beef.extension并且至少要包含enable用于控制其使用的布爾鍵。api.rb
如果擴展需要注冊任何定時的API調用,則可以在此處定義一個類來注冊。最常見的API類是BeEF:: API::Server注冊#pre_http_start和#mount_handler。如果需要多個類,請將它們放在新的api/子目錄下。model.rb
如果擴展需要數據庫模型,則在此定義模型。BeEF使用DataMapper作為其ORM,因此此處定義的任何類都必須mixinDataMapper::Resource。如果需要多個模型,請將它們放在新的models/子目錄下。rest/
添加到BeEF的RESTful API接口的擴展將在此子目錄中進行。關聯的HTTP路由是使用Sinatra inside 定義的<name>.rb。
Daytime 示例
如果在BeEF的問題跟蹤器發現了模塊請求。無論出于何種原因,該特定模塊都需要訪問Daytime協議。作為一名專業的BeEF黑客,您決定實現Daytime服務的最佳方法是擴展。如果該模塊或任何以后的模塊和擴展需要Daytime 服務,則只需聯系BeEF服務器。
首先創建一個新extensions/daytime/目錄。在其中,您需要的前兩個文件是extension.rb和config.yaml。
# extension.rb
module BeEF
module Extension
module Daytime
extend BeEF::API::Extension
@short_name = 'daytime'
@full_name = 'Daytime Service'
@description = 'Implementation of the Daytime protocol which sends the current date and time'
end
end
end
require 'extensions/daytime/api.rb'
require 'extensions/daytime/daytime.rb'
BeEF:: API::Extension和定義@short_name,@full_name并分別@description解釋擴展名的簡稱,全名和描述。在文件末尾,您需要require任何其他源文件。在這里,我們包括了api.rb和daytime.rb。我們尚未定義它們,但我們會盡快定義。
你在那兒 現在寫入您的config.yaml文件。
# config.yaml
beef:
extension:
daytime:
enable: true
name: 'Daytime Service'
address: '127.0.0.1'
port: '1300'
authors: ['Kilgore Trout']
由于我們正在編寫一個非常簡單的擴展程序,因此中僅需要幾個基本設置config.yaml。該enable密鑰用于控制是否應加載該擴展名,擴展名應name類似于@full_namein中extension.rb。您在其中定義了服務器的地址和端口,address以及port。請注意,我們將端口設置為1300,而不是傳統的端口13。這是因為眾所周知的端口0-1023需要超級用戶特權。最后,authors關鍵是要把這項出色的工作歸功于自己。
賦予事物生命
是時候給這個擴展加上一些字符了。daytime.rb像這樣創建一個新文件。
module BeEF
module Extension
module Daytime
class Server
FORMAT = "%A, %B %d, %Y %H:%M:%S-%Z"
def self.run_server(address, port)
@server = TCPServer.new(address, port)
loop do
Thread.start(@server.accept) do |socket|
socket.write(Time.now.strftime(FORMAT))
socket.close
end
end
end
end
end
end
end
很簡單,對吧?這是您的基本套接字服務器。在新的連接請求上,它僅使用Ruby的Time類發送回當前時間。
您在擴展程序中所做的完全取決于您。除了在中定義以外,沒有其他限制BeEF::Extension。
但是,如何在BeEF啟動時使其運行?這就是BeEF的API注冊商開始發揮作用的地方。BeEF啟動時,它將運行任何具有hook的方法BeEF:: API::Server#pre_http_start。這正是我們將要做的api.rb。
# api.rb
module BeEF
module Extension
module Daytime
module API
module DaytimeHandler
BeEF::API::Registrar.instance.register(BeEF::Extension::Daytime::API::DaytimeHandler,
BeEF::API::Server,
'pre_http_start')
def self.pre_http_start(http_hook_server)
config = BeEF::Core::Configuration.instance
address = config.get('beef.extension.daytime.address')
port = config.get('beef.extension.daytime.port')
Thread.new { BeEF::Extension::Daytime::Server.run_server(address, port) }
print_info "Daytime Server: #{address}:#{port}"
end
end
end
end
end
end
要向#pre_http_startBeEF 注冊我們的方法,我們通過調用BeEF:: API::Registrar#register.Inside 通知注冊服務商,我們#pre_http_start使用從配置文件中檢索地址和端口值BeEF:: Core::Configuration。注意,我們在一個新線程中啟動了服務器。這是因為我們的擴展程序旨在在后臺連續運行。如果沒有,BeEF將繼續等待#pre_http_start返回并最終無限期掛起。
運行
現在已經實現了服務器,并且已經告訴BeEF何時啟動服務器,我們可以通過運行BeEF來檢查一切是否就緒。
[foobar@localhost beef]$ ./beef
[21:43:34][*] Bind socket [imapeudora1] listening on [0.0.0.0:2000].
[21:43:34][*] Browser Exploitation Framework (BeEF) 0.4.4.5-alpha
[21:43:34] | Twit: @beefproject
[21:43:34] | Site: http://beefproject.com
[21:43:34] | Blog: http://blog.beefproject.com
[21:43:34] |_ Wiki: https://github.com/beefproject/beef/wiki
[21:43:34][*] Project Creator: Wade Alcorn (@WadeAlcorn)
[21:43:35][*] BeEF is loading. Wait a few seconds...
[21:43:35][*] 13 extensions enabled.
[21:43:35][*] 162 modules enabled.
[21:43:35][*] 2 network interfaces were detected.
[21:43:35][+] running on network interface: 127.0.0.1
[21:43:35] | Hook URL: http://127.0.0.1:3000/hook.js
[21:43:35] |_ UI URL: http://127.0.0.1:3000/ui/panel
[21:43:35][+] running on network interface: 192.168.240.28
[21:43:35] | Hook URL: http://192.168.240.28:3000/hook.js
[21:43:35] |_ UI URL: http://192.168.240.28:3000/ui/panel
[21:43:35][*] RESTful API key: 1e95497768c5aa542eb2632362869ec050e48142
[21:43:35][*] Daytime Server: 127.0.0.1:1300
[21:43:35][*] HTTP Proxy: http://127.0.0.1:6789
[21:43:35][*] BeEF server started (press control+c to stop)
擴展程序已正確加載,盡管這不一定意味著我們的Daytime服務器實際上就可以工作,所以需要使用Netcat來確保。
[foobar@localhost ~]$ nc 127.0.0.1 1300
Sunday, June 09, 2013 21:50:52-EDT
BeEF中文文檔
推薦文章: