将用户输入传送到另一个程序

将用户输入传送到另一个程序

我知道cat不带参数运行反映了用户输入

$ cat
test
test
reflected
reflected

我想将反射的输出通过管道传输到另一个程序,例如base64.预期的行为是这样的

$ cat | base64
test
dGVzdA==
another
YW5vdGhlcg==

我希望在输入时逐行编码文本,和/或通过类似nc.然而,当这样使用时,似乎没有输出被反映,并且转义ctrl+C只是终止整个事情而没有输出

$ cat | base64
test
fail
^C

如果一切正常,我应该能够像这样建立编码/加密连接(非常简单的聊天应用程序)

# client
$ $CMD | encrypt | nc $SERVER $PORT
this is a test
multiple lines
^C

# host
$ nc -lvp | decrypt
this is a test
multiple lines

同样,我应该能够编码并保存如下

$ CMD | base64  | tee log_file
test
dGVzdA==
another
YW5vdGhlcg==
^C

$ cat log_file
dGVzdA==
YW5vdGhlcg==

请注意,整个事情应该是一条管道。使用循环效果不佳,因为nc每次迭代都会建立一个新连接,tee否则-a会覆盖文件的每一行(每次迭代)。我想要最终命令的 1 个实例(例如nc, )从类似 withbase64中获取输入管道,但使用用户输入而不是文件。CMDcat

我正在寻找一种方法来将用户输入逐行传输到另一个进程,最好是作为短单行。我怎样才能获得这样的用户输入管道?

答案1

像这样的东西吗?

# this is an infinite loop, but can be changed to whatever you need
while true; do read x; echo "$x" | base64; done

输出:

foo
Zm9vCg==
bar
YmFyCg==

答案2

我已经弄清楚为什么cat | base64不能按我的预期工作。base64需要接受全部输入的,由(我认为)终止EOF。由于 的输出cat没有终止符,因此base64永远不会停止接收和缓冲输入,并ctrl-C终止catbase64。基本上,正在等待从到 end 的base64输出,但不输出,因此永远不会返回编码的输出。通过使用,用户输入会被反射并通过管道传输到,但仅在输入后输出。catEOFcatEOFcat << EOF | base64base64EOF

$ cat << EOF | base64
pipe heredoc> ls
pipe heredoc> test
pipe heredoc> EOF
bHMKdGVzdAo=

另一方面,nc连续接收用户输入,其输入可以用 分隔\n。因此,管道与 一起工作cat | nc。这就是在渗透测试和 CTF 中获取 shell 的方式catnc常用方法

绑定外壳

# user
$ cat | nc $IP 1337

# target
$ nc -lp 1337

反壳

# user
$ cat | nc -lp 1337

# target
$ nc $IP 1337

由于应用程序(base64nc)之间的缓冲和终止符存在差异,如果不进行一些调整,我想要制作的管道是不可能的。最终的链可以通过将一次性返回所有输出的命令(例如base64)放入循环内while,以及逐行获取输入的命令(例如nc在管道的右侧)来实现

# code courtesy of @muru in the comments
while read x; do
   echo "$x" | base64
done | nc

相关内容