这是“您应该知道的UNIX工具系列”里的第二篇。在这一篇文章里,我将介绍netcat工具,简称nc。
Netcat常被称为“瑞士军刀”。就像古老瑞士军刀的多功能实用性一样,Netcat的功能也是非常实用的。它的功能包括端口扫描、文件传输、端口监听,而且它可以用作一个后门。
在2006年的"Top 100 Network Security Tools"调查中,netcat排名第四。所以它绝对是您应该了解的一个工具。
您可以看看本主题系列的第一篇文章,关于 pipe viewer的介绍。如果您对这篇文章感兴趣,那么请订阅我的 rss feed。
怎样使用nc?
让我们从一些非常简单的例子开始,然后逐步增加复杂度。
如果您还记得我说过netcat是一把瑞士军刀。那么什么是瑞士军刀呢?无论何时,它都不是一把普通的小刀,是吧?netcat可以用作替代telnet的工具:
$ nc www.google.com 80
实际上,它比普通的telnet方便得多,因为您可以随时用ctrl+c断开连接,而且它能像处理常规数据一样处理二进制数据(不用转义码,什么也不用)。
您可以用”-v”参数获取更多的冗余信息,而两个v(-vv)则可以获得连接期间传输了多少字节的统计信息。
Netcat本身也可以作为服务器使用。如果您按以下方式启动netcat,它会监听12345端口(全监听):
$ nc -l -p 12345
#译者注,在一些版本里,直接用 nc –l 12345 而不能加 –p
如果这时候您连接到这台主机的12345端口,那么您键入的所有内容,都会被发送给对端,这样,netcat就变成一个聊天服务了。先在一台机器上启动服务:
# 在计算机A上,IP为10.10.10.10
$ nc -l -p 12345
在另一台计算机上连接到刚才的服务器上:
# 计算机 B
$ nc 10.10.10.10 12345
现在,双方就可以聊天了。
说到这,我们可以稍微调整下下,让两个进程彼此交互,这样,nc就变成运行于网络之上的I/O了。比如说:您可以用nc将整个目录从一台计算机拷贝到另一台上,方法是在一台机器上通过管道将tar的输出重定向到nc,在另一台机器上,则将nc的输出重定向给tar。
假设您想把计算机A(IP为192.168.1.10)上的/data目录拷贝到计算机B(任意IP)上。方法很简单:
# 计算机 A,IP 192.168.1.10
$ tar -cf - /data | nc -l -p 6666
#译者注,在linux下,tar要保留根目录/,需要用参数P,即tar –cPf - /data
# 计算机 B
$ nc 192.168.1.10 6666 | tar -xf -
不要忘记本系列中前一篇文章所讲的方法,结合管道和pipe viewer,获取操作进度的统计信息。
如果是拷贝单个文件,那就更容易了:
# 计算机 A , IP 192.168.1.10
$ cat file | nc -l -p 6666
# 计算机 B
$ nc 192.168.1.10 6666 > file
您甚至可以用nc来拷贝和恢复整个磁盘:
#计算机 A , IP 192.168.1.10
$ cat /dev/hdb | nc -l -p 6666
# 计算机 B
$ nc 192.168.1.10 6666 > /dev/hdb
注意:在Mac平台上,”-l”参数不能和”-p”参数一起使用!解决方法是去掉”-p”,仅用”-l 6666”(译者注,在译者的CenoOS 平台和Fedira平台下,这两个参数也是不能一起使用的,解决方法是一样的),即:
$ nc -l 6666
# 现在nc 就会监听Mac平台下的6666端口
Netcat的一个不常用的功能是端口扫描。Netcat不是完成这项工作的最佳工具,但它确实能够胜任这项工作(端口扫描的最佳工具是 nmap):
$ nc -v -n -z -w 1 192.168.1.2 1-1000
(UNKNOWN) [192.168.1.2] 445 (microsoft-ds) open
(UNKNOWN) [192.168.1.2] 139 (netbios-ssn) open
(UNKNOWN) [192.168.1.2] 111 (sunrpc) open
(UNKNOWN) [192.168.1.2] 80 (www) open
(UNKNOWN) [192.168.1.2] 25 (smtp) : Connection timed out
(UNKNOWN) [192.168.1.2] 22 (ssh) open
这里,用”-n”参数防止DNS查寻;”-z”参数让nc不接收来自服务端的任何数据;”-w 1”参数则让连接在闲置1秒后超时。
Netcat的另一个不常用功能是代理。它可以重定向端口和主机。看一下这个例子:
$ nc -l -p 12345 | nc www.google.com 80
上面这条命令,将nc启动为服务,监听12345端口,这个端口上的所有连接,都将被重定向到google.com的80端口上。如果这时您连接到这台机器上的12345端口,并发送一个请求,您会发现没有数据回传。这就对了,因为我们没有建立双向管道。如果添加一个管道,那么就能在另一个端口上得到回传的数据了:
$ nc -l -p 12345 | nc www.google.com 80 | nc -l -p 12346
在您发送请求到12345端口之后,连接12346端口,就能得到回传的数据了。
Netcat最强大的功能,可能是它能把任意进程变成一个服务:
Probably the most powerful netcat's feature is making any process a server:
$ nc -l -p 12345 -e /bin/bash
“-e”选项执行一个可执行文件,并将它的输入和输出通过网络套接字重定向。如果这时您连接到这台机器的12345端口上,您就可以使用bash:
$ nc localhost 12345
ls -las
total 4288
4 drwxr-xr-x 15 pkrumins users 4096 2009-02-17 07:47 .
4 drwxr-xr-x 4 pkrumins users 4096 2009-01-18 21:22 ..
8 -rw------- 1 pkrumins users 8192 2009-02-16 19:30 .bash_history
4 -rw-r--r-- 1 pkrumins users 220 2009-01-18 21:04 .bash_logout
...
其后果是:nc变成一个流行的黑客工具,因为它在计算机上创建一个后门是如此容易。在Linux平台下,它能执行/bin/bash;而在windows平台下,它能控制cmd.exe。
译者注:在我的环境中,CentOS和Fedora都是没有-e选项的,但在板子里的版本,是支持-e选项的。
这是我能想到的一切。您是否知道一些其它我没提及的功能呢?
怎样安装 nc?
如果您是Debian或Ubuntu用户:
$ sudo aptitude install netcat
如果您是Fedora或CentOS用户:
$ sudo yum install netcat
如果您是Slackware、FreeBSD、NetBSD、Solaris或Mac用户,那么从source code of nc 下载源码,并执行安装三步曲:
$ tar -zxf nc-version.tar.gz
$ cd nc-version
$ ./configure && sudo make install
如果是Mac用户,如果您有 MacPorts:
$ sudo port install netcat
Slackware用户,事实上可以从n/ 软件包目录安装:
$ sudo installpkg nc-1.10-i386-1.tgz
如果您是windows用户,请从securityfocus下载安装包。
可以到man nc查阅使用手册。
祝您使用愉快,欲知后事如何,请听下回分解。