**注意: 這個文檔可能需要審查**
一個數據存儲選項是用戶可以設置的變量的一個類型,允許metasploit的各種組件在使用時更具有配置性.例子,在msfconsole,你能設置ConsoleLogging選項來記錄所有控制臺的輸入輸出的所有日志 -- 在滲透過程中方便文檔記錄的一種方法.當你載入一個模塊,這個mixin或模塊會注冊更多選項.一些常見的有:用于服務器exploit或輔助模塊的 RHOST 和 RPORT ,客戶端模塊的SRVHOST等等.準確找出可以設置的數據存儲選項的最佳方法是通過使用以下命令
* ```show options``` - Shows you all the basic options.
* ```show advanced``` - Shows you all the advanced options.
* ```show missing``` - Shows you all the required options you have not configured.
* ```set``` - Shows you everything. Obviously you also use this command to set an option.
### 選項源: ModuleDataStore, active_module, session, and framework
**用戶如何查看數據儲存選項:**
在用戶方面,數據儲存選項 像全局或者模塊級別:全局 意味全部模塊都能使用該選項.可以使用```setg```命令來設置.模塊級別意味著只有你當前正在使用的模塊會記住儲存選項,沒有其他的能記住.如果先加載模塊,則需要設置模塊級別選項,然后使用```set```命令,像下面這樣:
```
msf > use exploit/windows/smb/ms08_067_netapi
msf exploit(ms08_067_netapi) > set rhost 10.0.1.3
rhost => 10.0.1.3
```
**metasploit開發者如何查看數據儲存選項**
在開發方面,事情有點瘋狂.數據存儲選項實際上可以在至少四個不同的來源中找到:the ModuleDataStore object, active_module, session object, or the framework object.
如果你只是進行模塊開發.你能信任的最好的源是ModuleDataStore對象.這個對象有一個特定的加載順序,然后把所需的選項交給你.如果這個選項可以在模塊的數據存儲中找到,它會給你這個選項。如果沒有找到,它從一個框架給你一個.以下是如何讀取模塊中的數據存儲選項的例子
```ruby
current_host = datastore['RHOST']
```
如果你的開發工作在模塊領域之外,那么很有可能你甚至沒有ModuleDataStore對象。但是在一些情況,你仍然可以從驅動程序讀取[active_module accessor](https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/ui/console/driver.rb#L607) .或者如果你可以訪問[ModuleCommandDispatcher](https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/ui/console/module_command_dispatcher.rb#L28),有一個一個給你相同東西的```mod```方法.有時mixin會在派發模塊的時候會通過 ```run_simple```方法進行傳遞.比如,你可以看這個[Msf::Ui::Console::CommandDispatcher::Auxiliary](https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/ui/console/command_dispatcher/auxiliary.rb)類
在一些情況就像在post exploit運行腳本,你可能沒有 ModuleDataStore 或者 active_module,但是你應該仍然有一個session對象.應該有一個```exploit_datastore``` 給你所有的數據儲存選項
```ruby
session.exploit_datastore
```
如果你無權訪問模塊或者session對象,最后的源顯然是這個framework對象.并且這個framework對象總是存在.否則,像我們之前說的,如果用戶設置一個 module-level 選項 沒有其他的組件可以看到他,這引入框架對象
```ruby
framework.datastore
```
所以現在你知道數據儲存選項的多個來源.希望在這一點上,你清楚的認識到不是所有的源必然分享所有的東西.如果你嘗試所有東西,像一個生成規則,這應該是你的載入順序
1. Try from the ModuleDataStore
2. Try from active_module
3. Try from session
4. Try from framework
### 核心選項類型
所有核心數據儲存選項類型是定義在[option_container.rb](https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/core/option_container.rb) 文件.你應該總是挑選最合適的一個,因為每個都有自己的輸入驗證
那么你在數據注冊階段初始化一個選項,它應該遵循以下格式
```ruby
OptSomething.new(option_name, [boolean, description, value])
```
* **option_name** -選項的名字
* **boolean** - 第一個屬性,true的意思是這是一個必選的 false的意思是這是一個可選的
* **description** - 關于這個選項的短描述
* **value** - 一個默認值,注意如果第一個屬性是false,你不需要提供這個值,它將會自動填充nil
現在讓我們討論關于什么類是可用的
* **OptString** - 通常用于字符串選項。如果輸入以“file://”開頭,則OptString也會自動假定這是一個文件,并從中讀取。但是,在發生這種情況時沒有文件路徑驗證,所以如果要加載文件,則應該使用OptPath,然后自己讀取該文件。代碼示例:
```ruby
OptString.new('MYTEST', [ true, 'Set a MYTEST option', 'This is a default value' ])
```
* **OptRaw** 實際上它的功能與OptString完全相同
* **OptBool** - bool選項它將驗證輸入是true或者false.例如y, yes, n, no, 0, 1, 代碼示例
```ruby
OptBool.new('BLAH', [ true, 'Set a BLAH option', false ])
```
* **OptEnum** - 基本上這將限制輸入到特定的選項。例如,如果您希望輸入是`apple`或者`orange`,而不是其他的.那么OptEnum就是您的選擇。代碼示例:
```ruby
# Choices are: apple or range, defaults to apple
OptEnum.new('FRUIT', [ true, 'Set a fruit', 'apple', ['apple', 'orange']])
```
* **OptPort** -對于輸入它意味著是用作端口號。這個數字應該在0 - 65535之間。代碼示例:
```ruby
OptPort.new('RPORT', [ true, 'Set a port', 21 ])
```
* **OptAddress** 作為IPv4地址的輸入。代碼示例:
```ruby
OptAddress.new('IP', [ true, 'Set an IP', '10.0.1.3' ])
```
* **OptAddressRange** 作為IPv4地址的輸入,例如:10.0.1.1-10.0.1.20或10.0.1.1/24。您也可以提供文件路徑而不是范圍,它會自動將該文件視為IP列表。或者,如果你使用rand:3語法,其中3意味著3次,它會為你生成3個隨機IP。代碼示例:
```ruby
OptAddressRange.new('Range', [ true, 'Set an IP range', '10.0.1.3-10.0.1.23' ])
```
* **OptPath** 如果你的數據儲存選項要求一個本地文件路徑.請使用此選項。
```ruby
OptPath.new('FILE', [ true, 'Load a local file' ])
```
* **OptInt** 它可以是一個16進制值或者10進制
```ruby
OptInt.new('FILE', [ true, 'A hex or decimal', 1024 ])
```
* **OptRegexp** 是一個正則表達式數據存儲選項。
```ruby
OptRegexp.new('PATTERN', [true, 'Match a name', '^alien']),
```
**Other types:**
在某些情況下,可能沒有適合您的數據存儲選項類型。最好的例子是URL:即使沒有OptUrl這樣的東西,你可以做的是使用OptString類型,然后在你的模塊中做一些驗證,如下所示:
```ruby
def valid?(input)
if input =~ /^http:\/\/.+/i
return true
else
# Here you can consider raising OptionValidateError
return false
end
end
if valid?(datastore['URL'])
# We can do something with the URL
else
# Not the format we're looking for. Refuse to do anything.
end
```
### register_options 方法
這```register_options```方法可以注冊多個基本數據存儲選項。基本數據存儲選項是必須配置的選項,例如服務器端漏洞中的RHOST選項。或者它是非常常用的,例如登錄模塊中的各種用戶名/密碼選項。
以下是在模塊中注冊多個數據存儲選項的示例:
```ruby
register_options(
[
OptString.new('SUBJECT', [ true, 'Set a subject' ]),
OptString.new('MESSAGE', [ true, 'Set a message' ])
], self.class)
```
### register_advanced_options 方法
這個```register_advanced_options```方法 以注冊多個高級數據存儲選項。高級數據存儲選項是在使用模塊之前不需要用戶配置的選項。例如,代理選項幾乎總是被視為“高級”。但是,當然,這也意味著大多數用戶會覺得難以配置。
注冊高級選項的示例:
```ruby
register_advanced_options(
[
OptInt.new('TIMEOUT', [ true, 'Set a timeout, in seconds', 60 ])
], self.class)
```
### 更改數據存儲選項的默認值
當一個數據存儲選項已經被一個mixin注冊時,仍然有辦法改變模塊的默認值。您可以使用```register_options```方法,也可以在模塊的元數據中添加一個DefaultOptions鍵。
#### 使用register_options更改默認值:
使用register_options其中一個優點是,如果數據存儲選項是高級的,這就允許它在基本選項菜單上,這意味著當人們在msfconsole上“show options”時,該選項將會在那里。您還可以更改選項說明,以及此方法是否必須。
#### 使用DefaultOptions更改默認值:
當Metasploit初始化一個模塊時,將會調用`import_defaults`方法。此方法將更新所有現有的數據存儲選項(這就是為什么`register_options`可以用來更新默認值),然后它將專門檢查模塊元數據中的DefaultOptions鍵,并再次更新。
下面是一個使用DefaultOptions鍵的exploit模塊初始化的例子:
```ruby
def initialize(info={})
super(update_info(info,
'Name' => "Module name",
'Description' => %q{
This is an example of setting the default value of RPORT using the DefaultOptions key
},
'License' => MSF_LICENSE,
'Author' => [ 'Name' ],
'References' =>
[
[ 'URL', '' ]
],
'Platform' => 'win',
'Targets' =>
[
[ 'Windows', { 'Ret' => 0x41414141 } ]
],
'Payload' =>
{
'BadChars' => "\x00"
},
'DefaultOptions' =>
{
'RPORT' => 8080
},
'Privileged' => false,
'DisclosureDate' => "",
'DefaultTarget' => 0))
end
```
### deregister_options 方法
`deregister_options`方法可以注銷基本或高級選項。用法非常簡單:
```ruby
deregister_options('OPTION1', 'OPTION2', 'OPTION3')
```
### 在運行時改變數據存儲選項
目前,在運行時修改數據存儲選項最安全的方法是重寫一個方法。例如,一些mixins像這樣檢索RPORT選項:
```ruby
def rport
datastore['RPORT']
end
```
在這種情況下,你可以從模塊中覆蓋這個rport方法,并返回一個不同的值
```ruby
def rport
80
end
```
這樣,當一個mixin想要這個信息的時候,最終的值是80,而不是實際的值`datastore['RPORT']`
### 理想的數據存儲命名
正常選項總是大寫,高級選項是駝峰式,規避選項是前綴::駝峰式
- Home
- 開始使用
- 安裝metasploit開發環境
- 使用metasploit
- 使用git
- 報告一個bug
- 貢獻代碼
- 貢獻給metasploit
- 創建一個loginscans Metasploit模塊
- 接受模塊和增強功能的指導
- 常見的Metasploit模塊代碼錯誤
- 樣式提示
- metasploit提交者
- metasploit開發
- 為什么是ruby
- 樣式提示
- 如何開始寫一個exploit
- 如何開始寫一個輔助模塊
- 如何開始寫一個post模塊
- 如何開始寫一個Meterpreter腳本
- 載入外部模塊
- exploit rank
- Metasploit模塊引用標識符
- 怎么在你的exploit中確認window補丁程序級別
- 如何使用filedropper清理文件
- 如何棄用metasploit模塊
- 如何在模塊開發中報告或儲存數據
- 在metasploit如何使用日志
- 如何在metasploit對JavaScript進行混淆
- 如何解析一個http響應
- 如何使用HTTPClient發送HTTP請求
- 如何使用命令階段
- 如何使用數據儲存選項
- 如何在window后期開發中使用railgun
- 如何在exploit中使用powershell
- 如何使用PhpEXE來利用任意文件上傳漏洞
- 如何使用FILEFORMAT mixin創建一個文件格式exploit
- 如何使用BrowserExploitServer編寫一個瀏覽器exploit
- 如何使用HttpServer編寫瀏覽器exploit
- 如何編寫一個check()方法
- 如何使用Seh mixin來利用異常處理程序
- 如何在Windows上使用WbemExec進行寫入權限攻擊
- 如何使用httpserver和httpclient編寫一個模塊
- payloads如何工作
- 如何免殺
- 如何正確使用metasploit模塊