Metasploit插件之钉钉机器人通知主机上线
声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失 , 均由使用者本人负责 , 雷神众测以及文章作者不为此承担任何责任 。
雷神众测拥有对此文章的修改和解释权 。 如欲转载或传播此文章 , 必须保证此文章的完整性 , 包括版权声明等全部内容 。 未经雷神众测允许 , 不得任意修改或者增减此文章内容 , 不得以任何方式将其用于商业目的 。
前言
当有新的主机上线时 , 希望可以及时得收到通知 , Metasploit官方本来就有一个邮件会话上线通知的插件plugins/session_notifier.rb , 但是这需要发件服务器 , 也不一定能及时收到 , 所以就写了一个钉钉机器人通知 。
实现这个需求需要写一个插件 , 能获取到一个会话上线的事件 , 按照钉钉的开发文档发送一个请求 。
No.1 插件编写
lib/msf/core/plugin.rb , 插件的基类 , 全部插件都要实现基类的接口 , 管理控制台调度程序 。
lib/msf/core/plugin_manager.rb , 插件管理器 , 实现了load和unload方法
插件可以通过添加新特性、新的用户界面命令或任何其他任意方法来更改框架的行为 。
官方有一个例子plugins/sample.rb , 里面ConsoleCommandDispatcher是实现控制台调度程序的一个类 。
文章插图
class ConsoleCommandDispatcher
include Msf::Ui::Console::CommandDispatcher
#
# The dispatcher's name.
#
def name
"Sample"
end
#
# Returns the hash of commands supported by this dispatcher.
#
def commands
{
"sample" => "A sample command added by the sample plugin"
}
end
#
# This method handles the sample command.
#
def cmd_sample(*args)
print_line("You passed: # {args.join(' ')}")
end
end
上面的代码功能:添加一个sample命令到控制台调度器(help命令可以看见) , cmd_sample为这个命令的动作 。
如果你的插件需要控制台操作设置就需要使用到插件基类里面的add_console_dispatcher方法添加控制台调度程序 。
No.2 事件通知订阅
因为我们只需要会话上线的事件 , 所以只需要在当前的类将on_session_open方法实现 , 其他会话事件可以在lib/msf/core/session.rb文件中找到 。
实现了on_session_open方法还不行 , 因为没有程序调用它 , 所以还要将它加入session_event_subscribers会话事件的订阅器 。
self.framework.events.add_session_subscriber(self)
事件的调度器可以在lib/msf/core/event_dispatcher.rb找到 , 还没添加事件订阅是会话的事件订阅器只有两个 。
文章插图
执行添加订阅器的代码后 , 将自身类添加到订阅器列表中 , 现在订阅器长度为3 , 说明添加成功 。
文章插图
添加后 , 即将当前类添加到会话事件订阅器 , 当有会话事件发生时会到session_event_subscribers这个列表中调用下面的方法 。 妙啊!
# 不写事件方法名 , 当方法名找不到是自动调用下面的函数处理全部事件 , 下面以on_session_open事件为例
def method_missing(name, *args)
event,type,rest = name.to_s.split("_", 3) # event => on; type => session; rest => open
subscribers = "# {type}_event_subscribers" # 得到拼接会话订阅器列表:session_event_subscribers
found = false
case event
when "on"
if respond_to?(subscribers, true)
found = true
self.send(subscribers).each do |sub|
next if not sub.respond_to?(name, true) # 我们在写插件时有定义on_session_open这个方法 , 当然不会跳过
sub.send(name, *args) # 通过反射判断session_event_subscribers的类中有没有on_session_open这个方法 , 用就调用
end
else
(general_event_subscribers + custom_event_subscribers).each do |sub|
next if not sub.respond_to?(name, true)
sub.send(name, *args)
found = true
end
end
when "add"
if respond_to?(subscribers, true)
found = true
add_event_subscriber(self.send(subscribers), *args)
end
when "remove"
if respond_to?(subscribers, true)
found = true
remove_event_subscriber(self.send(subscribers), *args)
- 纠结|硬杠红米Note9Pro?iQOO Z1跌至1575,对比之后纠结了!
- 王兴称美团优选目前重点是建设核心能力;苏宁旗下云网万店融资60亿元;阿里小米拟增资居然之家|8点1氪 | 美团
- 长安|长安傍上华为这个大腿,市值暴涨500亿!可见华为影响力之大?
- 光晕|PS插件:Oniric Glow Generator (光晕效果)支持ps 2021
- 巅峰|realme巅峰之作:120Hz+陶瓷机身+5000mAh 做到了颜值与性能并存
- 蛋壳公寓|官媒发声:绝不能让“割韭菜者”一跑了之!
- 看过明年的iPhone之后,现在下手的都哭了
- 直播销售员|石家庄桥西区插上“互联网+”智慧发展之翼
- 精英|业务流程图怎么绘制?销售精英的经验之谈
- 砍单|iPhone12之后,拼多多又将iPhone12Pro拉下水