用好你的瑞士军刀/netcat( 二 )

nc 192.168.1.2 8080 < image.jpgnetcat 嘛,就是用于通过网络把东西 cat 过去,注意,老版本 GNU / OpenBSD 的 netcat 再文件结束(标准输入碰到 EOF),发送文件一端就会关闭连接,而新版本不会,你需要再开个窗口到 A 主机上看看接收下来的文件尺寸和源文件比较一下判断传输是否结束 。
当传输完成后,你再任意一端 CTRL+C 结束它 。对于新版 OpenBSD 的 netcat 有一个 -N 参数,可以指明 stdin 碰到 EOF 就关闭连接(和老版本一致),我们写作:
/bin/nc.openbsd -N 192.168.1.2 8080 < image.jpg你机器上的 nc 命令有可能指向 /bin/nc.traditional 或者 /bin/nc.openbsd 任意一个,这里显示指明调用 openbsd 版本的 netcat 。
这样在 openbsd 新版本的 netcat 中使用 -N参数,就不需要再开个终端去手工检查传输是否完成,传输结束了就会自动退出 。其实 GNU 版本的 netcat 也有可以加个 -q0 参数,达到和 openbsd 版本 -N 的效果:
/bin/nc.traditional -q0 192.168.1.2 8080 < image.jpg 只不过是 Linux 下面最新的 GNU netcat,对应 Windows 版本 没有该参数,所以从 Windows 传文件过去时,少不了再开个终端看一下进度,如果是 Linux 端发送就没问题了 。通过管道协作,搭配 tar 命令,还可以方便的传一整个目录过去,有兴趣可以自己研究 。
使用 netcat 这个系统默认安装的工具进行文件传输,可以算作你保底的手段,当 scp/ftp 都没法使用的情况下,你的一个杀手锏 。
网速吞吐量测试最简单的方法,GNU 版本的 netcat 加上 -v -v 参数后,结束时会统计接收和发送多少字节,那么此时 A 主机上显示运行 GNU 版本的 nc 监听端口:
/bin/nc.traditional -v -v -n -l -p 8080 > /dev/null加 n 的意思是不要解析域名,避免解析域名浪费时间造成统计误差,然后 B 主机上:
time nc -n 192.168.1.2 8080 < /dev/zero回车后执行十秒钟按 CTRL+C 结束,然后在 A 主机那里就可以看到接收了多少字节了,此时根据 time 的时间自己做一下除法即可得知,注意 GNU 的 netcat 统计的数值是 32 位 int,如果传输太多就回环溢出成负数了 。
对于 OpenBSD 版本的 nc 我们可以用管道搭配 dd 命令进行统计,服务端运行:
nc -l -p 8080 > /dev/null客户端运行 dd 搭配 nc:
dd if=/dev/zero bs=1MB count=100 | /bin/nc.openbsd -n -N 192.168.1.2 8080结束以后会有结果出来,注意这里使用了 -N 代表 stdin 碰到 EOF 后就关闭连接,这里凡是写 nc 命令的地方,代表 GNU/OpenBSD 任意版本的 netcat 都可以,显示的指明路径,就代表必须使用特定版本的 netcat,上条命令等效的 GNU 版本是:
dd if=/dev/zero bs=1MB count=100 | /bin/nc.traditional -n -q0 192.168.1.2 8080其实上面两种方法都把建立连接的握手时间以及 TCP 窗口慢启动的时间给计算进去了,不是特别精确,最精确的方式是搭配 pv 命令(监控统计管道数据的速度),在 A 主机运行:
nc -l -p 8080 | pv然后再 B 主机运行:
nc 192.168.1.2 8080 < /dev/zero此时 A 主机那端持续收到 B 主机发送过来的数据并通过管道投递给 pv 命令后,你就能看到实时的带宽统计了,pv 会输出一个实时状态:
353MiB 0:00:15 [22.4MiB/s] [<=>]【用好你的瑞士军刀/netcat】让你看到最新的带宽吞吐量,这是最准确的吞吐量测试方法,在不需要 iperf 的情况下,直接使用 nc 就能得到一个准确的数据 。
系统后门假设你用串口登录到 A 主机,上面十分原始,包管理系统都没有,sshd/telnetd 都跑不起来,这时候你想用 B 主机通过网络登录 A 主机有没有办法?
GNU 版本的 netcat 有一个 -e 参数,可以在连接建立的时候执行一个程序,并把它的标准输入输出重定向到网络连接上来,于是我们可以在 A 主机上 -e 一下 bash:
/bin/nc.traditional -l -p 8080 -e /bin/bash按回车打开系统后门,然后再 B 主机那里照常:
nc 192.168.1.2 8080你就可以在 B 主机上登录 A 主机的 shell 了,操作完成 CTRL+C 结束 。
对于 openbsd 版本的 netcat,-e 命令被删除了,没关系,我们可以用管道来完成,和刚才一样,在 A 主机上:
mkfifo /tmp/fcat /tmp/f | /bin/bash 2>&1 | /bin/nc.openbsd -l -p 8080 > /tmp/f然后 B 主机和刚才一样:
nc 192.168.1.2 8080即可访问,用完注意将 /tmp/f 这个 fifo 文件删除 。
结 束netcat 就是可以在命令行直接的方式操作 tcp/udp 进行原始的:监听,连接,数据传输等工作 。然后搭配管道,实现灵活多样的功能,或者进行各种网络测试 。


推荐阅读