NetCat是一個非常簡單的Unix工具,可以讀、寫TCP或UDP網絡連接配接(network
connection)。它被設計成一個可靠的後端(back-end) 工具,能被其它的程式
程式或腳本直接地或容易地驅動。同時,它又是一個功能豐富的網絡調試和開
發工具,因為它可以建立你可能用到的幾乎任何類型的連接配接,以及一些非常有
意思的内建功能。NetCat,它的實際可運作的名字叫nc,應該早很就被提供,
就象另一個沒有公開但是标準的Unix工具。
GNU也有一個netcat項目,但此處學習的不是GNU的那個。
最簡單的使用方法,”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能把它轉換成相對路徑,但不
是所有的平台都能做到,是以如果不想把你的檔案系統搞亂的話,就使用相對路
徑吧!]
…………
這裡的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