使用 Netcat 将二进制文件(逐行)发送到套接字服务器

Posted

技术标签:

【中文标题】使用 Netcat 将二进制文件(逐行)发送到套接字服务器【英文标题】:Send a binary file (line by line) to a socket server with Netcat 【发布时间】:2013-10-16 09:57:18 【问题描述】:

作为this Stack Overflow question 的衍生产品,除了一些调整之外,我想归档相同的内容。

我想连接到一个主机,逐行发送一个二进制文件,每行之间有几秒钟的延迟......而且它必须在同一个连接中。我要发送的字符串主要是基于文本的,但行中有几个不可打印的字符。

这是我要发送的字符串/行的示例(每个文件有数千行):

<null>e<null><null>00326513,6598,no,8,,2z<null>

<null> 值是十六进制值0x00

我已经从第一个条目中改写了我的问题,但是 @mzet 回答了我原来的问题,因为我的问题是纯文本的,但后来我发现我的字符串有这些 0x00 字符起初我看不到里面。我想以他的答案为基础,因为我认为它几乎可以工作,但可能需要调整,所以这是他的贡献,而不是我的。

如果我有一个包含 3 行的文件:

<null>e<null><null>00370513,6598,no,8,,2z<null>
<null>f<null><null>00891548,6598,yes,8,,3z<null>
<null>f<null><null>00129525,6598,yes,8,,2z<null>

然后我想我可以调整 @mzet 答案并将文件中的 &lt;null&gt; 值替换为 \x00 并在 echo 命令上设置 -e

[root@srv]# mkfifo /tmp/fifoIn; cat /tmp/fifoIn | nc localhost 2222 &
[root@srv]# cat myfile | while read line; do echo -ne $line; sleep 2; done > /tmp/fifoIn

当我这样做时,我可以在服务器端看到x00

[root@srv]# nc -l 2222
x00ex00x0000370513,6598,no,8,,2zx00
x00fx0000891548,6598,yes,8,,3zx00
x00fx00x0000129525,6598,yes,8,,2zx00

是否可以根据需要发送二进制(文本?)文件?如果无法逐行发送文件,那么是否可以发送一个字符串数千次?绝对必要,它们不需要是唯一的或在文件中,因为我可以使用重复的相同字符串来管理。

编辑#1

为什么我的脚本只向服务器发送一行(我希望 4 行)之后它只是暂停(?)永远。客户端(也不是服务器)关闭了它的连接,但它没有出现任何错误:

rm -f /tmp/fifofile
mkfifo /tmp/fifofile
cat /tmp/fifofile | nc 192.168.20.6 5000 &
sleep 1

i="0"

while [ $i -lt 4 ]
do
  echo "$i"
  echo -ne "\x00e\x00\x00001212dsfdsfdsfsdfsdfsdfdsf\x00" | tee /tmp/fifofile
  sleep 1
  i=$[$i+1]
done

【问题讨论】:

【参考方案1】:

你可以通过两步来实现它:

1) 您需要以命名管道 (fifo) 作为其输入来启动 nc:

mkfifo /tmp/fifoIn; cat /tmp/fifoIn | nc localhost 2222 &

2) 从文件 input.txt 中逐行发送数据,延迟 2 秒:

cat input.txt | while read line; do echo $line; sleep 2; done > /tmp/fifoIn

我已经用这个“服务器”对其进行了测试(我使用的是 openbsd netcat 语法):

nc -l localhost 2222

【讨论】:

这似乎有效,我会接受您的回答,除非几天内出现更好的情况。您是否还知道是否可以避免它在每行之后发送换行符? 在while循环中尝试echo -n而不是echo【参考方案2】:

经过大量尝试和拉扯我的头发,我终于发现我可以使用 NCat 代替 Netcat,因为 NCat 可以执行命令。

在端口5000 上使用NCat 与我的套接字服务器建立连接并执行脚本./sendlines.sh

ncat --exec "./sendlines.sh" 192.168.1.10 5000

./sendlines.sh 将发送 4 行,每行之间有 2 秒的延迟:

#!/bin/bash
#
# sendlines.sh, v1.00, initial release
#
i="0"
while [ $i -lt 4 ]
do
  echo -ne "\x00e\x00\x0000370513,6598,no,8,,2z\x00"
  sleep 2
  i=$[$i+1]
done

我还没有弄清楚如何逐行发送二进制文件,但这并不是绝对必要的,因为我可以通过多次发送相同的字符串来管理。

如果您知道一种逐行发送二进制文件的方法,那就太好了,因为这对我来说是最好的解决方案。

【讨论】:

以上是关于使用 Netcat 将二进制文件(逐行)发送到套接字服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pwn 攻击中通过 netcat 发送二进制有效负载

C中的服务器/套接字编程:数据未正确发送/接收?

C:发送文件到套接字

Bash:将数据文件逐行发送到C程序中

通过套接字编程发送图像文件(jpeg、png)的提示/示例?

套接字编程/通过无线发送二进制图像数据