Metasploit/開發輔助模組
本章介紹了輔助模組背後的概念、其結構以及如何開發輔助模組的工作示例。本章的大部分討論都圍繞著輔助模組的開發展開。Metasploit 版本 3 使用 Ruby 程式語言編寫。雖然不瞭解任何 Ruby 程式設計知識也可以讓你對框架的組織和功能有很好的瞭解;但如果你瞭解 Ruby 語言並且想要編寫 Metasploit 的模組,你會發現這些材料最有幫助。
在 Metasploit 中,任何不是漏洞利用的模組都是輔助模組。漏洞利用模組始終包含有效負載。輔助模組是框架的一項迷人功能,它允許框架擴充套件以實現各種目的,而不僅僅是漏洞利用。你可以建立自己的快速漏洞掃描程式、埠掃描程式,使 MSF 充當 FTP、HTTP 或 SMTP 客戶端,以及執行很多其他很酷的事情。你可以使用現成的程式碼庫,快速開發此類工具。
在本章中,我們將研究輔助模組的各個方面和功能,並嘗試實現我們自己的輔助模組。該模組將嘗試將檔案放置到允許 HTTP 協議的 PUT 和 DELETE 方法而不進行任何身份驗證的 Web 伺服器上,或者從這些伺服器上刪除檔案。這是一個輔助模組的良好示例,因為它不是漏洞利用。它只是一個簡單的工具來檢查 Web 伺服器配置錯誤。
輔助模組駐留在框架主目錄的 modules/auxiliary/ 目錄中。下面是輔助模組的基本定義。
require 'msf/core' p "My Auxiliary Module" class Metasploit3 < Msf::Auxiliary end # for the class definition
將此程式碼放置在 '$HOME/.msf/modules/auxiliary' 資料夾下的任何位置。
所有輔助模組都繼承自它們的基類 Msf::Auxiliary。當 msf 載入時,行 p "My Auxiliary Module" 會列印一行。現在,你的模組已成為 MSF 的一部分,可以透過各種 MSF 使用者介面使用它。當然,就目前而言,此模組除了列印一行(其他任何模組都不會這樣做)之外,什麼也不做。
我們需要做的第一件事是新增一些關於此模組的資訊。這可以在類的 initialize 建構函式中完成。讓我們在類定義中包含 initialize 建構函式。
def initialize(info = {})
super(update_info(info,
'Name' => 'HTTP Put method exploiter',
'Description' => %q{
This module exploits faulty web server configurations
allowing HTTP PUT and DELETE methods without any user validation.
},
'Author' => [ 'Kashif [at] compulife.com.pk' ],
'License' => BSD_LICENSE,
'Version' => '$Revision: 4663 $',
'Privileged' => false,
'Platform' => [ ],
'Arch' => [ ARCH_X86, ARCH_PPC, ARCH_SPARC, ARCH_CMD ],
'Targets' => [ [ 'Wildcard Target', { } ] ],
'DefaultTarget' => 0,
'Actions' => [AuxiliaryAction.new('PUT_FILE', {}),
AuxiliaryAction.new('DELETE_FILE', {})],
'DefaultAction' => [ 'PUT_FILE' ]
))
register_options(
[
OptString.new('PATH', [ true, "path where to store the new file", '/']),
OptString.new('DATA', [ false, "Data to write into the file", ' ']),
], self.class
)
end
建構函式首先透過呼叫 super 方法呼叫其基類的建構函式。所有模組都應該包含此呼叫。請注意對建構函式中的 update_info 方法的呼叫。此方法用於更新模組的資訊,無論是漏洞利用模組還是輔助模組。每種模組型別接受的選項略有不同,例如,漏洞利用模組包含 payload 選項,而輔助模組則沒有。
(此處將提供對 update_info 可以接受的選項的詳細描述)
第二個呼叫是針對 register_options 方法的。此方法新增使用者可以在執行模組之前指定的選項。
使用者設定的選項可以透過名為 datastore 的預定義雜湊表使用。例如
print_status("the contents of the DATA variable are: " + datastore['DATA'])
輔助模組 Mixin 提供了有用的功能,你可以使用這些功能來增強你建立的輔助模組。