您应该知道的UNIX工具系列之2:Netcat

这是“您应该知道的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上,IP10.10.10.10

$ nc -l -p 12345

在另一台计算机上连接到刚才的服务器上:

# 计算机 B

$ nc 10.10.10.10 12345

现在,双方就可以聊天了。

说到这,我们可以稍微调整下下,让两个进程彼此交互,这样,nc就变成运行于网络之上的I/O了。比如说:您可以用nc将整个目录从一台计算机拷贝到另一台上,方法是在一台机器上通过管道将tar的输出重定向到nc,在另一台机器上,则将nc的输出重定向给tar

假设您想把计算机A(IP192.168.1.10)上的/data目录拷贝到计算机B(任意IP)上。方法很简单:

# 计算机 AIP 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.com80端口上。如果这时您连接到这台机器上的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

 

译者注:在我的环境中,CentOSFedora都是没有-e选项的,但在板子里的版本,是支持-e选项的。

 

这是我能想到的一切。您是否知道一些其它我没提及的功能呢?

怎样安装 nc?

如果您是DebianUbuntu用户:

$ sudo aptitude install netcat

如果您是FedoraCentOS用户:

$ sudo yum install netcat

如果您是SlackwareFreeBSDNetBSDSolarisMac用户,那么从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查阅使用手册。

祝您使用愉快,欲知后事如何,请听下回分解。

你可能感兴趣的:(Debian,unix,centos,FreeBSD,工具,平台)