有關netcat的文章實在是太多了,關於它的強大我就不再復述了.我來說說它在實際中的用途.
netcat可以作為類似於telent的客戶端,也可以監聽某個端口作為服務器,還可以作為掃描工具掃描對方主機的端口,還可以用來傳輸文件,不相
信嗎?聽我慢慢道來
首先我們要弄明白netcat的工作原理,其實netcat的原理很簡單,它就是從網絡的一端讀入數據,然後輸出到網絡的另一端,它可以使用tcp和udp
協議.之所以叫做netcat,因為它是網絡上的cat,想象一下cat的功能,讀出一個文件的內容,然後輸出到屏幕上(默認的stdout是屏幕,當然可以重
定向到其他地方).netcat也是如此,它讀取一端的輸入,然後傳送到網絡的另一端,就這麼簡單.但是千萬不要小看了它,netcat可以完成很多任務,,尤其是和其他程序組合時.好了,廢話少說,進入正題吧.
網上有兩種版本的netcat,一個是@stake公司的netcat,http://www.atstake.com/research/too...work_utilities/ 也就是最初的版本,還
有一個是GNU的netcat.http://netcat.sourceforge.net/download.PHP 我個人更傾向於使用GNU的netcat,因為它的功能更多,不過GNU的沒有
windows平台的版本
至於編譯和安裝我想就不用說了,如果這關都過不了,我想也有點太……,看看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 hostnameort -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 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 www.apache.org Port 80</address>
</body></html>
呵呵,看到了什麼,我什麼也沒說哦
二.簡單服務器
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,或者是你
自己編寫的程序,通常是做為後門
指定-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 [這是很危險的,不要放在公網上,如果被我看到了,哼哼……]
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 www.somewhere.com port[,port[,port-port]]
-z 指定zero-I/O 模式,它讓netcat禁止任何來自源系統的I/O,如果不指定它,netcat會無限期的掛起端口.所以在網絡掃描時要指定-z選項.
-w 指定超時時間,單位為秒
-v 詳細模式
例: nc -z -w 2 -v -v www.somewhere.com 20-30,80,100-112,443
不過我不贊成使用netcat來掃描,因為我覺得它的速度不夠快,而且得到的信息不夠全,而且更重要的是不夠隱蔽.nmap倒是個上好的選擇,如果有
時間,我會在另一篇文章裡討論nmap的超酷功能.[做做廣告先]
六.綜合應用
unix的強大不在於其某個程序自身,而在於多個簡單工具的組合,只要發揮你的想象力,你會發現unix的世界是多麼美好.
例1.[背景]有一台主機被懷疑遭到入侵並被安裝了rootkit,現在要和另一台干淨的主機做一下比較.
被入侵主機:
find /etc -type fxargs md5sumnc -l -p 1234 -c
干淨主機:
nc 192.168.0.1 1234md5sum -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 1234md5sum -c -grep -v OK
例3. 遠程對被入侵主機做鏡像.
被入侵主機:
dd if=/dev/hda1 bs=1024nc -l -p 1234 -c
遠程主機:
nc 192.168.0.1 1234 >/check/host.disk1
然後,可以利用linux內核的loopback特性,把host.disk以只讀的方式mount上,然後就可以做取證分析了.
[如果真的做取證分析,一定不要在原始的受害主機硬盤上find和類似的操作,因為這會修改時間標記而破壞原始的證據]
例4. 將文件壓縮後再傳送.
如果你的文件很大,何不先壓縮它呢,利用管道,我們甚至不用生成壓縮後的中間文件!
源主機: tar czf - worknc -l -c -p 1234
目的主機: nc 192.168.0.1 1234tar xzvf -
[tar打包時最好不要使用絕對路徑,雖然GNU的tar能把它轉換成相對路徑,但不是所有的平台都能做到,所以如果不想把你的文件系統搞亂的話,
就使用相對路徑吧!]
…………
這裡的server和client的組合是可以互換的,以第六節中例1來說明:
你也可以這樣:
干淨主機: nc -l -p 1234 -c md5sum -c -grep -v OK
被入侵主機:find /etc -type fxargs md5sumnc 192.168.0.2 1234
其實,這些都不是固定的程式,根據你的實際需要,你可以想出更多的使用方法。因為,你是在使用UNIX,這就是UNIX。
that's all.拋磚引玉,寫到這裡吧,這就是"瑞士軍刀",覺得怎麼樣?其實netcat還有許多許多其他的用法,唯一限制就是你的想象力,把你知道的
告訴我,OK?
當然還有些方面我沒有寫出來,比如,netcat中繼的問題.某些黑客就拿netcat中繼功能用做跳板來躲避追蹤的
這方面沒有怎麼研究過,再者也沒有時間,如果哪位高手知道,請告訴我.