netcat的使用
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</span></span>
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!