如何将netcat中的二进制数据发送到已经建立的连接?

use*_*437 10 networking linux tcp netcat

我可以执行以下操作以在 netcat 中发送二进制数据:

echo -e '\x80' | nc host port
Run Code Online (Sandbox Code Playgroud)

但我不想这样做,我想要的是连接到服务器:

nc 192.168.1.115 12345
Run Code Online (Sandbox Code Playgroud)

然后发送一些文本:

aaaaaaaaaabbbbbbbbbbccccccccccc
Run Code Online (Sandbox Code Playgroud)

然后发送一些二进制数据:

0x80 0xF4 0x12
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Kam*_*ski 7

注意:在遵循此解决方案时,除非另有说明,否则请在单个 shell 会话中键入命令(或使用单个脚本)。这是因为它使用变量和文件描述符,它们在原始会话之外不能直接使用。

创建临时fifo。创建临时文件的正确方法是使用mktemp. 不幸的是,它不能创建先进先出。它可以创建一个临时目录:

tmpd=`mktemp -d`
tmpf="$tmpd"/fifo
mkfifo "$tmpf"
printf "%s\n" "$tmpf"  # just to know the path to the fifo, it may be useful later
Run Code Online (Sandbox Code Playgroud)

或者,您可以在某个固定或临时位置手动创建一个命名的 fifo。由你决定。

创建一个后台进程,它将读取 fifo 并将数据传递给服务器:

nc 192.168.1.115 12345 < "$tmpf" &
ncpid=$!  # PID may be useful later
Run Code Online (Sandbox Code Playgroud)

注意如果nc没有过早退出。假设连接本身和服务器都没有问题,上面的后台命令将保持连接,直到您完成通过 fifo 发送第一组数据。但是您希望它保持打开状态并接受多次写入,因此请打开 fifo 并且不要关闭它(还):

exec 3> "$tmpf"
Run Code Online (Sandbox Code Playgroud)

现在您可以通过 fifo 发送您喜欢的任何内容,并且后台连接仍然存在:

echo abcd      >&3  # sends text
echo -e '\x80' >&3  # sends "binary"
cat /etc/issue >&3  # sends file
cat            >&3  # type whatever you want, terminate with Ctrl+D
Run Code Online (Sandbox Code Playgroud)

&3只要您知道路径,就可以使用 fifo 的路径而不是 来调用这些命令中的任何一个。知道路径后,您可以从同一个或另一个shell 会话写入 fifo :

cat > /path/to/the/fifo  # type whatever you want, terminate with Ctrl+D
Run Code Online (Sandbox Code Playgroud)

或者,您可以以与原始会话类似的方式在另一个会话中打开描述符。无论您以何种方式写入 fifo,nc都将通过单个连接将其传递给远程服务器。

但要注意竞争条件。在单个 shell 会话中使用单个描述符是避免它们的好方法。

传递所需的任何数据后,终止nc并关闭原始 shell 会话中的描述符:

kill $ncpid
exec 3>&-
Run Code Online (Sandbox Code Playgroud)

请注意,在某些情况下,唯一的后一个命令足以使后台nc退出;这取决于你做了什么以及你还在用 FIFO 做什么。出于这个原因,我选择nc明确地杀死。

删除临时目录及其内容(即 fifo):

rm -r "$tmpd"
Run Code Online (Sandbox Code Playgroud)

最后说明:

没有必要首先放入nc后台。您可以在一个终端中运行它,从另一个终端写入 fifo(知道它的路径)。这样您就可以轻松监控其状态。根据您的需求定制此解决方案。


AFH*_*AFH 3

以下似乎有效:

while read -r; do echo -en "$REPLY" | nc ...; done
Run Code Online (Sandbox Code Playgroud)

\xNN这允许您在正常数据中包含转义序列,如下所示:

aaaaaaaaaabbbbbbbbbbccccccccccc\x80\xF4\x12
Run Code Online (Sandbox Code Playgroud)

请记住将\文本输入中的任何文字字符加倍。请注意,使用read -rand$REPLY代替变量会停止删除前导空格和尾随空格。

这不会在缓冲区末尾添加换行符,因此您需要忽略命令n中的选项或在需要换行符的位置echo键入。\x0a

nc我目前无法设置,但我已经测试过:

while read -r; do echo -en "$REPLY" | cat | xxd; done
Run Code Online (Sandbox Code Playgroud)

od -ct x1对于测试,如果没有,可以使用xxd;或者od -c如果您很高兴看到八进制的二进制字符,请使用。您可以从管道中省略cat |:我将其包含在内可能是对nc.