【新】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