-
Notifications
You must be signed in to change notification settings - Fork 3
怎么开始编写后渗透模块
后渗透模块开发对你的编程技能构成了挑战. 这不像编写基于内存破坏的漏洞, 从技术上来讲通常是指制作恶意输入 - 字符串. 后渗透模块更多地是关于正确的模块设计, Ruby 和 Metasploit 库的实践知识. 这也是一项非常有价值的技能, 因为如果你在弹出 shell 后不知道要做什么, 那么渗透测试的目的是什么, 对吧? 另外, 如果模块不起作用怎么办? 你是否愿意等待几天, 几周甚至几个月的时间, 让别人为你修复它? 可能不是. 如果你自己知道如何进行操作, 则可以更快地对其进行修复, 然后继续进行笔试并做更多的事情. 因此, 学习后渗透模块开发! 这对你和你的职业都有好处.
就像编写软件一样, 在开始编码之前, 你应该对后渗透模块的工作有一个明确的目标. 在单个模块中具有多个功能绝不是一个好主意. 例如: 让它窃取网络配置文件, 窃取密码, 哈希值, shell 历史记录等. 你应该将其分解为多个模块.
你还应该考虑支持哪些会话类型: meterpreter 或 shell. 理想情况下, 同时支持两者. 但是, 如果必须在两者之间进行选择, 则在 Windows 上, 你应该偏爱 Windows Meterpreter. 在 Linux 上, shell 会话类型比 Linux Meterpreter 更适合使用, 但希望这会在不久的将来改变. 对于没有 Meterpreter 的平台, 显然唯一的选择是 shell.
另一个重要的事情是考虑模块在不同发行版/系统上运行. 例如, 假设你要在 Linux 上运行 ifconfig 命令. 在 Ubuntu 上, 这很简单, 只需运行 ifconfig 命令. 好吧, 不同的 Linux 发行版可能实际上不知道你要执行的是什么, 因此你必须更加具体, 而执行 /sbin/ifconfig
. 与 Windows 相同. 是 C:\WINDOWS\
还是 C:\WinNT
? 都是. 是 C:\Documents and Settings\[用户名]
, 还是 C:\Users\[用户名]
? 两者都取决于该 Windows 版本. 一个更好的解决方案是使用环境变量:-)
始终做好功课, 并包含尽可能多的场景. 最重要的是, 获取你的虚拟机并进行测试!
后渗透模块根据其行为进行分类. 例如, 如果收集数据, 则自然会进入 "gather" 类别. 如果它添加、更新或删除用户, 则它属于 "manage". 以下是参考清单:
类别 | 描述 |
---|---|
gather | 涉及数据收集/枚举的模块. |
gather/credentials | 收集凭证的模块. |
gather/forensics | 涉及取证数据收集的模块. |
manage | 修改/操作/操纵系统上某些东西的模块. 与会话管理相关的任务 (例如迁移, 注入) 也位于此处. |
recon | 这些模块将帮助你从侦察方面了解有关系统的更多信息, 而不是有关数据窃取的信息. 了解这与 "gather" 类型的模块不同. |
wlan | 用于 WLAN 相关任务的模块. |
escalate | 已弃用, 但由于流行, 模块仍保留在此处. 这曾经是特权升级模块的地方. 所有特权提升模块不再被视为后渗透模块, 它们现在已成为 exploit 模块. |
capture | 涉及监视捕获数据的模块. 例如: 键盘记录. |
你知道在《指环王》中人们完全沉迷的 "一环" 吗? 好吧, session 对象就是这样. 你不能没有的一个 session 对象. 所有的 post 模块和其他相关的 mixin 基本上都建立在 session 对象之上, 因为它了解有关受感染主机的所有信息, 并允许你对其进行命令执行.
在 post 模块中你可以使用 session
方法访问这个 session 对象或它的方法别名 client
. 与人互动的最佳方式是通过 irb/pry (self 代表 session/client 本身), 示例:
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:55157) at 2014-07-31 17:59:36 -0500
meterpreter > irb
[*] Starting IRB shell
[*] The 'client' variable holds the meterpreter client
>> self.class
=> Msf::Sessions::Meterpreter_x86_Win
在这一点上, 你有权统治所有这些. 但是请注意, 上面的示例是一个 Msf::Sessions::Meterpreter_x86_Win
对象. 实际上还有更多不同的命令: command_shell.rb
, meterpreter_php.rb
, meterpreter_java.rb
, meterpreter_x86_linux.rb
等. 它们的行为各不相同, 因此实际上很难一一解释, 但它们在 lib/msf/base/sessions/ 目录中定义, 因此你可以去了解它们的工作原理. 或者已经在 irb 下了, 所以你可以玩一下.
在 Ruby 中, 有两种方便调试的对象方法. 第一个是 methods
, 它将列出该对象的所有公共方法和受保护方法:
session.methods
另一个是 inspect
, 它返回对象的人类可读表示形式的字符串:
session.inspect
你还可以查看 其他当前 post 模块, 并查看它们如何使用其会话对象.
正如我们所解释的, 大多数 post 模块 mixins 构建在 session 对象的顶部, 并且有很多. 但是, 有一个主要的生命显然不能没有: Msf::Post
mixin. 当你使用此 mixin 创建 post 模块时, 针对各种情况, 也已经包含了许多其他 mixin, 更具体地说:
-
msf/core/post/common - post 模块常用方法, 如:
cmd_exec
. - msf/core/post_mixin - 跟踪会话状态.
- msf/core/post/file - 文件系统相关方法.
- msf/core/post/webrtc - 使用 WebRTC 与目标计算机的网络摄像头进行交互.
-
msf/core/post/linux - 实际上没有什么, 主要是
get_sysinfo
和is_root?
专门针对 Linux. -
msf/core/post/osx -
get_sysinfo
,get_users
,get_system_accounts
,get_groups
, 以及操作目标机器的网络摄像头的方法. - msf/core/post/solaris - 非常类似于 linux mixin. 相同的方法, 但适用于 Solaris.
-
msf/core/post/unix -
get_users
,get_groups
,enum_user_directories
- msf/core/post/windows - 大多数开发时间都花在了这里. 包括 Windows 帐户管理, 事件日志, 文件信息, Railgun, LDAP, netapi, powershell, 注册表, wmic, 服务等.
这里我们有一个 post 模块模板. 如你所见, 有一些必填字段需要填写. 我们将分别解释:
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
class MetasploitModule < Msf::Post
def initialize(info = {})
super(update_info(info,
'Name' => '[Platform] [Module Category] [Software] [Function]',
'Description' => %q{
Say something that the user might want to know.
},
'License' => MSF_LICENSE,
'Author' => [ 'Name' ],
'Platform' => [ 'win', 'linux', 'osx', 'unix', 'bsd', 'solaris' ],
'SessionTypes' => [ 'meterpreter', 'shell' ]
))
end
def run
# Main method
end
end
Name 字段应以平台开头, 例如: Multi, Windows, Linux, OS X 等. 接着是模块的类型: Gather, Manage, Recon, Capture, Wlan. 其次是软件的名称, 最后是描述模块功能的一些技巧. 完整的示例: "Multi Gather RndFTP Credential Enumeration".
Description 字段应说明模块的功能, 需要注意的事项, 特定要求, 越多越好. 目的是让用户了解他在使用什么, 而无需实际阅读模块的源代码并弄清楚事情. 相信我, 他们中的大多数都不知道.
Platform 字段指示支持哪些平台, 例如: win, linux, osx, unix, bsd.
SessionTypes 字段应该是 meterpreter 或 shell. 你应该尝试同时支持两者.
最后, run
方法就像你的 main 方法一样. 从那里开始编写代码.
Metasploit 不再使用 svn 进行源代码管理, 而是使用 git, 因此了解 git 的一些技巧将大有帮助. 我们并不是在这里向你介绍 git 的出色表现, 我们知道它具有学习曲线, 并且发现新用户出错也就不足为奇了. git 利用分支对你来说很重要.
每次创建模块或对现有代码进行某些更改时, 都不应在默认的 master 分支上执行此操作. 为什么? 因为当你执行 msfupdate (这是 Metasploit 的用于更新的实用程序) 时, 它将在合并更改之前执行 git reset, 因此所有的修改都会消失.
另一个常见的错误是在提交 pull request 之前将所有更改都 commit 在 master 上. 这是个坏主意, 因为你很可能要提交其他你不想更改的修改, 并且你可能要求我们在仅需一次提交时合并其他不必要的提交历史记录.
因此, 作为一种习惯, 当你要创建或更改某些代码时, 请从一个新的分支开始, 该分支是最新的. 如果你执行 git status
则它会告诉你所在的分支.
$ git status
# On branch upstream-master
nothing to commit, working directory clean
好的, 现在执行 git pull
从 Metasploit 下载最新更改:
$ git pull
Already up-to-date.
此时, 你就可以开始新的分支了. 将新分支命名为 my_awesome_branch
:
$ git checkout -b my_awesome_branch
Switched to a new branch 'my_awesome_branch'
然后, 你可以继续添加该 Exploit 模块. 确保它在正确的路径中:
$ git add [module path]
当你决定保存更改时, 提交 (如果只有一个模块, 你也可以执行 git commit -a
, 因此你不必键入模块路径. 注意 -a
确实意味着所有) :
$ git commit [module path]
完成后, 请推送更改, 这会将你的代码上传到远程分支 my_awesome_branch
. 你必须推送你的更改才能提交 pull request, 与 Internet 上的其他人共享请求.
$ git push origin my_awesome_branch
https://github.com/rapid7/metasploit-framework/tree/master/modules/post
https://github.com/rapid7/metasploit-framework/tree/master/lib/msf/core/post