netcat使用指南

有关netcat的文章实在是太多了,关于它的强大我就不再复述了.
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 <hostname> <portnumber>
nc http://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

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr />
<address>Apache/2.0.48-dev (Unix) Server at http://www.apache.org/ Port 80</address>
</body></html>
呵呵,看到了什么,我什么也没说哦:p

二.简单服务器
nc -l -p <portnumber> //这里-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可以将输入重定向到任何地方,不仅仅是默认的屏幕.指定的方法很简单,使用 > 和 < 重定向符号.
例1; server: nc -l -c -p 1234 </etc/passwd [这是很危险的,不要放在公网上,如果被我看到了,哼哼……:p]
client: nc 192.168.0.1 1234 >somefile
例2; server: nc -l -c -p 1234 >somefile
client: nc 192.168.0.1 1234 </etc/passwd
其中,-c选项指定在文件传输结束的时候关闭链接,这是GNU netcat特有的选项.不指定-c或者你使用@stake的netcat的话,你要在文件传输结束是按Ctrl+c关闭链接.

五.扫描端口
nc -z -w 2 -v -v http://www.somewhere.com/ port[,port[,port-port]]
-z 指定zero-I/O 模式,它让netcat禁止任何来自源系统的I/O,如果不指定它,netcat会无限期的挂起端口.所以在网络扫描时要指定-z选项.
-w 指定超时时间,单位为秒
-v 详细模式
例: nc -z -w 2 -v -v http://www.somewhere.com/ 20-30,80,100-112,443
不过我不赞成使用netcat来扫描,因为我觉得它的速度不够快,而且得到的信息不够全,而且更重要的是不够隐蔽.nmap倒是个上好的选择,如果有时间,我会在另一篇文章里讨论nmap的超酷功能.[做做广告先:p]

六.综合应用
unix的强大不在于其某个程序自身,而在于多个简单工具的组合,只要发挥你的想象力,你会发现unix的世界是多么美好.

例1.[背景]有一台主机被怀疑遭到入侵并被安装了rootkit,现在要和另一台干净的主机做一下比较.
被入侵主机:
find /etc -type f|xargs md5sum|nc -l -p 1234 -c
干净主机:
nc 192.168.0.1 1234|md5sum -c -|grep -v OK //md5sum -c 表示检查给定列表的md5sum. 后跟文件名,这里指定-,即标准输入.
//当文件的md5sum匹配是显示OK,我们过滤掉这些行,显示不匹配的行

例2.检查被入侵的主机上的suid和sgid程序.

被入侵主机: find / -xdev -type f -user root ( -perm -4000 -o -perm -2000 )|xargs md5sum |nc -l -c -p 1234
远程主机: nc 192.168.0.33 1234|md5sum -c -|grep -v OK


例3. 远程对被入侵主机做镜像.
被入侵主机:
dd if=/dev/hda1 bs=1024|nc -l -p 1234 -c
远程主机:
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能把它转换成相对路径,但不是所有的平台都能做到,所以如果不想把你的文件系统搞乱的话,就使用相对路径吧!]


…………

这里的server和client的组合是可以互换的,以第六节中例1来说明:
你也可以这样:
干净主机: nc -l -p 1234 -c |md5sum -c -|grep -v OK
被入侵主机:find /etc -type f|xargs md5sum|nc 192.168.0.2 1234

其实,这些都不是固定的程式,根据你的实际需要,你可以想出更多的使用方法。因为,你是在使用UNIX,这就是UNIX。
that's all.抛砖引玉,写到这里吧,这就是"瑞士军刀",觉得怎么样?其实netcat还有许多许多其他的用法,唯一限制就是你的想象力,把你知道的告诉我,OK?

当然还有些方面我没有写出来,比如,netcat中继的问题.某些黑客就拿netcat中继功能用做跳板来躲避追踪的
这方面没有怎么研究过,再者也没有时间,如果哪位高手知道,请告诉我.

你可能感兴趣的:(net)