【新】Metasploit上使用RPC方式复现一个Linux提权漏洞

【新】Metasploit上使用RPC方式复现一个Linux提权漏洞

0x00 MSF RPC基础

Metasploit官方提供了API调用方式,有RPC,REST两种方式,REST方式只支持专业版使用,这里推荐使用RPC方式调用,即标准API调用。无论在免费版还是商业版的msf中,都会提供msfrpc服务,以便去远程调用。

  • 开启服务端PRC服务
    开启服务端API服务有两种方式:
    【1】通过msfconsole加载msfrpc插件来开启PRC
    【2】通过msfrpcd服务来开启RPC
  • 通过msfconsole加载PRC

msf5 > load msgrpc ServerHosr=127.0.0.1 ServerPort=55553 User=‘msf’ Pass=‘msf’
其中ServerHost即运行msf的主机,可以为127.0.0.1,也可以是0.0.0.0,区别是前者只能本机连接

  • 通过msfrpcd来开启PRC服务

$ msfrpcd -U msf -P msf -S -f

  • MSF RPC与msgpack
    与msf rpc api通信需要对通信内容使用msgpack进行序列化,简单说就是将数据包转换为二进制。msgpack序列化之后的数据包支持多种语言,可以在msf服务端由ruby正常解析。
    python下安装msgpack包:

$ pip install msgpack

import msgpack
dic = {'result':'suceess','token':'TEMPSsU2eYsNDom7GMj42ZldrAtQ1vGK'}
res = msgpack.packb(dic)
print(res)

结果:
'\x82\xa5token\xda\x00 TEMPSsU2eYsNDom7GMj42ZldrAtQ1vGK\xa6result\xa7success'
  • API请求
    在服务端开启RPC之后,可以使用HTTP协议去访问,会提示404,访问’api’会将文件下载下来。如果发生上述效果,表明服务端开启成功。
    其实,MSF的RPC调用也利用HTTP协议,需要先连接RPC socket然后构造POST请求,不同的是,需要指定Content-type为binary/message-pack,这样客户端才会正确解析包。

  • 连接MSF服务端并进行登陆的简单demo

# _*_ encoding:utf-8 _*_
# __author__ = "dr0op"
# python3

import msgpack
import http.client

HOST="127.0.0.1"
PORT="55553"
headers = {"Content-type" : "binary/message-pack"}

# 连接MSF RPC Socket
req = http.client.HTTPConnection(HOST, PORT)
options = ["auth.login","msf","msf"]

# 对参数进行序列化(编码)
options = msgpack.packb(options)

# 发送请求,序列化之后的数据包
req.request("POST","/api/1.0",body=options,headers=headers)

# 获取返回
res = req.getresponse().read()

# 对返回进行反序列户(解码)
res = msgpack.unpackb(res)
res = res[b'token'].decode()
print(res)

结果:
{‘result’: ‘success’, ‘token’: ‘TEMPSsU2eYsNDom7GMj42ZldrAtQ1vGK’}

  • 其他常见调用
    【1】console.create 创建一个终端
    【2】console.list 列出创建好的console
    【3】console.write 向终端写命令
    【4】console.read 获取命令执行后的结果

  • MsfRpcClient
    使用一个MSF RPC Demo来演示一下
    https://github.com/dr0op/MsfRpcApi/blob/master/demo2.py

0x01 Demo1

# _*_ encoding:utf-8 _*_

import msgpack
import http.client

HOST = "192.168.31.111"
PORT = "55553"
headers = {"Content-type":"binary/message-pack"}

# 连接MSF PRC Socket
req = http.client.HTTPConnection(HOST,PORT)
options = ["auth.login","msf","msf"]

# 对参数进行序列化(编码)
options = msgpack.packb(options)

# 发送请求,序列化之后的数据包
req.request("POST","api/1.0",body=options,headers=headers)

# 获取返回
res = req.getresponse().read()

# 对返回进行反序列化(解码)
res = msgpack.unpackb(res)
res = res[b"token"].decode()
print(res)

在这里插入图片描述
报错:

Traceback (most recent call last):
File “demo1.py”, line 24, in
res = msgpack.unpackb(res)
File “msgpack/_unpacker.pyx”, line 208, in msgpack._unpacker.unpackb
msgpack.exceptions.ExtraData: unpack(b) received extra data.

想了想是不是应该是攻击机【kali】上开启RPC服务,在靶机【linux】上运行demo.py

尝试了一下

在这里插入图片描述报错:
在这里插入图片描述
unpack 接收的数据超限了

在解压之前打印了res
在这里插入图片描述
这里收到的应答是404,为找到服务,在kali机上试一试吧
在这里插入图片描述

拒绝连接!!!!
没有开启msf服务端
在这里插入图片描述
开启msf服务端后仍然显示404 Not Found,这时还会报出unpack()接收过多数据。

经过查询网上资料,我觉得是服务未成功开启或拒绝连接造成的。

停了几天,今天(9月7日)成功翻墙,找到了官方文档,成功连接msf rpc Server

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值