Ubuntu中使用netcat发送16进制网络数据包
在 Ubuntu 中,使用 netcat
(nc
)发送 16 进制数据,可以通过 echo
、printf
或 xxd
等工具将十六进制数据转换为二进制格式,再通过管道传递给 nc
。以下是几种方法:
方法 1:使用 echo
+ xxd
(推荐)
xxd
是一个十六进制转二进制的工具,可以方便地将十六进制字符串转换为原始二进制数据。
示例(发送 UDP 十六进制数据):
echo "48656c6c6f20576f726c64" | xxd -r -p | nc -u 目标IP 目标端口
48656c6c6f20576f726c64
是"Hello World"
的十六进制形式。xxd -r -p
:-r
表示反向转换(十六进制→二进制),-p
表示纯十六进制模式。nc -u
:-u
表示 UDP 模式(TCP 可去掉-u
)。
方法 2:使用 printf
printf
可以直接输出二进制数据,适合简单的十六进制数据。
示例(发送 TCP 十六进制数据):
printf '\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64' | nc 目标IP 目标端口
\x48\x65\x6c\x6c\x6f...
是"Hello World"
的十六进制转义形式。- 如果发送 UDP,加上
-u
选项:printf '\x48\x65\x6c\x6c\x6f' | nc -u 目标IP 目标端口
方法 3:发送文件中的十六进制数据
如果数据较长,可以先将十六进制内容写入文件,再用 xxd
转换后发送:
echo "48656c6c6f0a" > hexdata.txt # 写入十六进制数据
xxd -r -p hexdata.txt | nc 目标IP 目标端口
验证接收端
可以使用 nc
监听端口,并用 xxd
查看接收到的十六进制数据:
nc -l -p 端口 | xxd
-l -p 端口
:监听指定端口(TCP)。- 如果是 UDP,使用:
nc -u -l -p 端口 | xxd
注意事项
- 协议选择:
- TCP 默认模式(不加
-u
)。 - UDP 需加
-u
选项。
- TCP 默认模式(不加
- 数据格式:
- 确保十六进制字符串是 偶数长度(如
AABBCC
,不能是AABBC
)。
- 确保十六进制字符串是 偶数长度(如
- 工具安装:
- 如果
xxd
未安装,可以通过vim-common
或xxd
包安装:sudo apt install xxd
- 如果
总结
- 简单十六进制数据 →
printf '\x...' | nc
。 - 复杂或长数据 →
echo "..." | xxd -r -p | nc
。 - UDP 模式 → 加
-u
选项。
如果需要发送特定协议(如自定义 TCP/UDP 头),建议改用 Scapy
或 sendip
等更灵活的工具。