我的问题是:有没有办法预处理通过 socat 客户端执行的命令的标准输入。
socat
上下文:我正在使用以下命令启动反向 shell :
$> socat -T30 "openssl-connect:api.hoposhell.com:10000,verify=0,keepalive" "exec:$SHELL,pty,stderr,setsid"
为了保持连接,我的服务器每 10 秒发送一次 ACK ASCII 字符 (0x06)。然而,这在某些应用程序中会产生副作用,并且^F
会出现一些字符。
在 bash 或 zsh 中,可以使用 sed 管道,如下所示:
$> echo "rick roll" | sed 's/r//g'
ick oll
有没有办法用 socat 做类似的事情?(例如在套接字读取和执行命令之间使用 cat)
笔记:
- 这是对该问题的后续跟进 使用 socat 保持 SSL 客户端连接
- 如果可以解决这个问题,我很乐意使用其他 ASCII 字符(0x06 除外)
- 我在 Linux 和 MacOS (Big Sur) 下使用 bash 和 zsh
编辑:简单等效示例
假设我用(机器 1)监听反向 shell
1> socat -d -d TCP4-LISTEN:4242 STDOUT
并将反向 shell 与(机器 2)连接
2> socat TCP4:localhost:4242 SYSTEM:/bin/bash,pty,setsid,stderr
我现在可以使用来自计算机 1 的 shell(在计算机 2 上执行)现在我希望每次我将字符 0x06 从 1 发送到 2 时,它都会被忽略。
现在,如果我替换为:
2> socat TCP4:localhost:4243 SYSTEM:"/usr/bin/sed -u 's/a/b/g' | bash -i",pty,setsid,stderr
现在,当所有“a”都变成“b”时,我应该会得到一个反向 shell,如下所示(在机器 1 上)。但我遇到了两个问题:
- 当我输入“a”时,“a”仍然显示(两次),如下所示(我按下“la”+ ENTER)
bash-3.2$ la
la
lb
bash: lb: command not found
bash-3.2$
- 当我的服务器发送一些“a”字符时,它们仍然按原样显示
bash-3.2$ aaaaaaaaaa
aaaaaaaaaa
bbbbbbbbbb
bash: bbbbbbbbbb: command not found
bash-3.2$
我的目标是分别获得:
bash-3.2$ lb
bash: lb: command not found
bash-3.2$ bbbbbbbbbb
bash: bbbbbbbbbb: command not found
答案1
帖子 在 socat 中使用 Sed 进行端口转发 建议使用类似以下命令:
socat TCP-LISTEN:8002,fork SYSTEM:/path/to/replace.sh
该文件replace.sh
应该具有执行权限。
a
将全部更改为的示例b
:
#!/bin/bash
sed -u 's/a/b/g'
对于 sed 来说,使用-u
(无缓冲)非常重要。