![将用户输入传送到另一个程序](https://linux22.com/image/186687/%E5%B0%86%E7%94%A8%E6%88%B7%E8%BE%93%E5%85%A5%E4%BC%A0%E9%80%81%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%A8%8B%E5%BA%8F.png)
我知道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
中获取输入管道,但使用用户输入而不是文件。CMD
cat
我正在寻找一种方法来将用户输入逐行传输到另一个进程,最好是作为短单行。我怎样才能获得这样的用户输入管道?
答案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
终止cat
和base64
。基本上,正在等待从到 end 的base64
输出,但不输出,因此永远不会返回编码的输出。通过使用,用户输入会被反射并通过管道传输到,但仅在输入后输出。cat
EOF
cat
EOF
cat << EOF | base64
base64
EOF
$ cat << EOF | base64
pipe heredoc> ls
pipe heredoc> test
pipe heredoc> EOF
bHMKdGVzdAo=
另一方面,nc
连续接收用户输入,其输入可以用 分隔\n
。因此,管道与 一起工作cat | nc
。这就是在渗透测试和 CTF 中获取 shell 的方式cat
和nc
常用方法
绑定外壳
# user
$ cat | nc $IP 1337
# target
$ nc -lp 1337
反壳
# user
$ cat | nc -lp 1337
# target
$ nc $IP 1337
由于应用程序(base64
和nc
)之间的缓冲和终止符存在差异,如果不进行一些调整,我想要制作的管道是不可能的。最终的链可以通过将一次性返回所有输出的命令(例如base64
)放入循环内while
,以及逐行获取输入的命令(例如nc
在管道的右侧)来实现
# code courtesy of @muru in the comments
while read x; do
echo "$x" | base64
done | nc