ps.ubuntu自帶的nc是netcat-openbsd版,不帶-c/-e參數。
pss.在線Markdown編輯器的bug是怎麼回事...「#」號依然顯示着
html
想要鏈接到某處: nc [-options] hostname port[s] [ports] …
綁定端口等待鏈接: nc -l port [-options] [hostname] [port]
python
[A Server(192.168.1.1) B Client(192.168.1.2)]linux
$nc -nvv 192.168.x.x 80
連到192.168.x.x的TCP80端口.web
$nc -l 80
監聽本機的TCP80端口.shell
多數狀況咱們不但願鏈接一直保持,那麼咱們可使用 -w 參數來指定鏈接的空閒超時時間,該參數緊接一個數值,表明秒數,若是鏈接超過指定時間則鏈接會被終止。ubuntu
$nc -l 2389
$ nc -w 10 localhost 2389
該鏈接將在 10 秒後中斷。
注意: 不要在服務器端同時使用 -w 和 -l 參數,由於 -w 參數將在服務器端無效果。
瀏覽器
端口掃描常常被系統管理員和黑客用來發如今一些機器上開放的端口,幫助他們識別系統中的漏洞。安全
$nc -z -v -n 192.168.1.1 21-25
能夠運行在TCP或者UDP模式,默認是TCP,-u參數調整爲udp.
z 參數告訴netcat使用0 IO,鏈接成功後當即關閉鏈接, 不進行數據交換.
v 參數指詳細輸出.
n 參數告訴netcat 不要使用DNS反向查詢IP地址的域名.
以上命令會打印21到25 全部開放的端口。bash
$nc -v 127.0.0.1 22 localhost [127.0.0.1] 22 (ssh) open SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1.4
"SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1.4"爲Banner信息。Banner是一個文本,Banner是一個你鏈接的服務發送給你的文本信息。當你試圖鑑別漏洞或者服務的類型和版本的時候,Banner信息是很是有用的。可是,並非全部的服務都會發送banner.一旦你發現開放的端口,你能夠容易的使用netcat 鏈接服務抓取他們的banner。
服務器
假如你想和你的朋友聊聊,有不少的軟件和信息服務能夠供你使用。可是,若是你沒有這麼奢侈的配置,好比你在計算機實驗室,全部的對外的鏈接都是被限制的,你怎樣和成天坐在隔壁房間的朋友溝通那?不要鬱悶了,netcat提供了這樣一種方法,你只須要建立一個Chat服務器,一個預先肯定好的端口,這樣子他就能夠聯繫到你了。
$nc -l 20000
netcat 命令在20000端口啓動了一個tcp 服務器,全部的標準輸出和輸入會輸出到該端口。輸出和輸入都在此shell中展現。
$nc 192.168.1.1 20000
無論你在機器B上鍵入什麼都會出如今機器A上。
大部分時間中,咱們都在試圖經過網絡或者其餘工具傳輸文件。有不少種方法,好比FTP,SCP,SMB等等,可是當你只是須要臨時或者一次傳輸文件,真的值得浪費時間來安裝配置一個軟件到你的機器上嘛。假設,你想要傳一個文件file.txt 從A 到B。A或者B均可以做爲服務器或者客戶端.
$nc -l 20000 < file.txt
$nc -n 192.168.1.1 20000 > file.txt
這裏咱們建立了一個服務器在A上而且重定向netcat的輸入爲文件file.txt,那麼當任何成功鏈接到該端口,netcat會發送file的文件內容。
在客戶端咱們重定向輸出到file.txt,當B鏈接到A,A發送文件內容,B保存文件內容到file.txt.
沒有必要建立文件源做爲Server,咱們也能夠相反的方法使用。像下面的咱們發送文件從B到A,可是服務器建立在A上,此次咱們僅須要重定向netcat的輸出而且重定向B的輸入文件。
B做爲Server
$nc -l 20000 > file.txt
$nc 192.168.1.2 20000 < file.txt
發送一個文件很簡單,可是若是咱們想要發送多個文件,或者整個目錄,同樣很簡單,只須要使用壓縮工具tar,壓縮後發送壓縮包。
若是你想要經過網絡傳輸一個目錄從A到B。
$tar -cvf – dir_name | nc -l 20000
$nc -n 192.168.1.1 20000 | tar -xvf -
這裏在A服務器上,咱們建立一個tar歸檔包而且經過-在控制檯重定向它,而後使用管道,重定向給netcat,netcat能夠經過網絡發送它。
在客戶端咱們下載該壓縮包經過netcat 管道而後打開文件。
若是想要節省帶寬傳輸壓縮包,咱們可使用bzip2或者其餘工具壓縮。
$tar -cvf – dir_name| bzip2 -z | nc -l 20000
經過bzip2壓縮
$nc -n 192.168.1.1 20000 | bzip2 -d |tar -xvf -
若是你擔憂你在網絡上發送數據的安全,你能夠在發送你的數據以前用如mcrypt的工具加密。
$nc localhost 20000 | mcrypt –flush –bare -F -q -d -m ecb > file.txt
使用mcrypt工具加密數據。
$mcrypt –flush –bare -F -q -m ecb < file.txt | nc -l 20000
使用mcrypt工具解密數據。
以上兩個命令會提示須要密碼,確保兩端使用相同的密碼。
這裏咱們是使用mcrypt用來加密,使用其它任意加密工具均可以。
雖然不是生成流視頻的最好方法,但若是服務器上沒有特定的工具,使用netcat,咱們仍然有但願作成這件事。
$cat video.avi | nc -l 20000
這裏咱們只是從一個視頻文件中讀入並重定向輸出到netcat客戶端
$nc 192.168.1.1 20000 | mplayer -vo x11 -cache 3000 -
這裏咱們從socket中讀入數據並重定向到mplayer。
若是你已經安裝配置一臺Linux機器而且須要重複一樣的操做對其餘的機器,而你不想在重複配置一遍。不在須要重複配置安裝的過程,只啓動另外一臺機器的一些引導能夠隨身碟和克隆你的機器。
克隆Linux PC很簡單,假如你的系統在磁盤/dev/sda上
$dd if=/dev/sda | nc -l 20000
$nc -n 192.168.1.1 20000 | dd of=/dev/sda
dd是一個從磁盤讀取原始數據的工具,我經過netcat服務器重定向它的輸出流到其餘機器而且寫入到磁盤中,它會隨着分區表拷貝全部的信息。可是若是咱們已經作過度區而且只須要克隆root分區,咱們能夠根據咱們系統root分區的位置,更改sda 爲sda1,sda2.等等。
咱們已經用過遠程shell-使用telnet和ssh,可是若是這兩個命令沒有安裝而且咱們沒有權限安裝他們,咱們也可使用netcat建立遠程shell。
假設你的netcat支持 -c -e 參數(原生 netcat)
$nc -l 20000 -e /bin/bash -i
$nc 192.168.1.1 20000
這裏咱們已經建立了一個netcat服務器而且表示當它鏈接成功時執行/bin/bash
假如netcat 不支持-c 或者 -e 參數(openbsd netcat),咱們仍然可以建立遠程shell
$mkfifo /tmp/tmp_fifo $cat /tmp/tmp_fifo | /bin/sh -i 2>&1 | nc -l 20000 > /tmp/tmp_fifo
這裏咱們建立了一個fifo文件,而後使用管道命令把這個fifo文件內容定向到shell 2>&1中。是用來重定向標準錯誤輸出和標準輸出,而後管道到netcat 運行的端口20000上。至此,咱們已經把netcat的輸出重定向到fifo文件中。
說明:
從網絡收到的輸入寫到fifo文件中
cat 命令讀取fifo文件而且其內容發送給sh命令
sh命令進程受到輸入並把它寫回到netcat。
netcat 經過網絡發送輸出到client
至於爲何會成功是由於管道使命令平行執行,fifo文件用來替代正常文件,由於fifo使讀取等待而若是是一個普通文件,cat命令會盡快結束並開始讀取空文件。
在客戶端僅僅簡單鏈接到服務器
$nc -n 192.168.1.1 20000
你會獲得一個shell提示符在客戶端
反向shell是指在客戶端打開的shell。反向shell這樣命名是由於不一樣於其餘配置,這裏服務器使用的是由客戶提供的服務。
$nc -l 20000
在客戶端,簡單地告訴netcat在鏈接完成後,執行shell。
$nc 192.168.1.1 20000 -e /bin/bash
如今,什麼是反向shell的特別之處呢
反向shell常常被用來繞過防火牆的限制,如阻止入站鏈接。例如,我有一個專用IP地址爲192.168.1.1,我使用代理服務器鏈接到外部網絡。若是我想從網絡外部訪問 這臺機器如1.2.3.4的shell,那麼我會用反向外殼用於這一目的。
假設你的防火牆過濾除25端口外其它全部端口,你須要使用-p選項指定源端口。
$nc -l 20000
$nc 192.168.1.1 20000 25
使用1024之內的端口須要root權限。
該命令將在客戶端開啓25端口用於通信,不然將使用隨機端口。
假設你的機器有多個地址,但願明確指定使用哪一個地址用於外部數據通信。咱們能夠在netcat中使用-s選項指定ip地址。
$nc -u -l 20000 < file.txt
$nc -u 192.168.1.1 20000 -s 172.31.100.5 > file.txt
該命令將綁定地址172.31.100.5。
新建一個網頁,命名爲somepage.html;
新建一個shell script:
while true; do nc -l 80 -q 1 < somepage.html; done
用root權限執行,而後在瀏覽器中輸入127.0.0.1打開看看是否正確運行。
nc 指令一般都是給管理者進行除錯或測試等動做用的,因此若是隻是單純須要臨時的網頁伺服器,使用 Python 的 SimpleHTTPServer 模組會比較方便。
$nc www.huanxiangwu.com 80 GET / HTTP/1.1 Host: ispconfig.org Referrer: mypage.com User-Agent: my-browser HTTP/1.1 200 OK Date: Tue, 16 Dec 2008 07:23:24 GMT Server: Apache/2.2.6 (Unix) DAV/2 mod_mono/1.2.1 mod_python/3.2.8 Python/2.4.3 mod_perl/2.0.2 Perl/v5.8.8 Set-Cookie: PHPSESSID=bbadorbvie1gn037iih6lrdg50; path=/ Expires: 0 Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Cache-Control: private, post-check=0, pre-check=0, max-age=0 Set-Cookie: oWn_sid=xRutAY; expires=Tue, 23-Dec-2008 07:23:24 GMT; path=/ Vary: Accept-Encoding Transfer-Encoding: chunked Content-Type: text/html [......]
在nc命令後,輸入紅色部分的內容,而後按兩次回車,便可從對方得到HTTP Headers內容。
netcat 的 -4 和 -6 參數用來指定 IP 地址類型,分別是 IPv4 和 IPv6:
$ nc -4 -l 2389
$ nc -4 localhost 2389
而後咱們可使用 netstat 命令來查看網絡的狀況:
$ netstat | grep 2389 tcp 0 0 localhost:2389 localhost:50851 ESTABLISHED tcp 0 0 localhost:50851 localhost:2389 ESTABLISHED
接下來咱們看看IPv6 的狀況:
$ nc -6 -l 2389
$ nc -6 localhost 2389
再次運行 netstat 命令:
$ netstat | grep 2389 tcp6 0 0 localhost:2389 localhost:33234 ESTABLISHED tcp6 0 0 localhost:33234 localhost:2389 ESTABLISHED
前綴是 tcp6 表示使用的是 IPv6 的地址。
該功能使用 -d 參數,請看下面例子:
$ nc -l 2389
$ nc -d localhost 2389 Hi
你輸入的 Hi 文本並不會送到服務器端。
若是鏈接到服務器的客戶端斷開鏈接,那麼服務器端也會跟着退出。
$ nc -l 2389
$ nc localhost 2389 ^C
$ nc -l 2389 $
上述例子中,但客戶端斷開時服務器端也當即退出。
咱們能夠經過 -k 參數來控制讓服務器不會由於客戶端的斷開鏈接而退出。
$ nc -k -l 2389
$ nc localhost 2389 ^C
$ nc -k -l 2389
Netcat 客戶端能夠經過 -q 參數來控制接收到 EOF 後隔多長時間才退出,該參數的單位是秒:
$nc -q 5 localhost 2389
如今若是客戶端接收到 EOF ,它將等待 5 秒後退出。
在測試郵件伺服器是否正常時,可使用這樣的方式手動寄送 Email:
$nc localhost 25 << EOF HELO host.example.com MAIL FROM: <user@host.example.com> RCPT TO: <user2@host.example.com> DATA Body of email. . QUIT EOF
這指令會使用 10.2.3.4:8080 這個代理伺服器,連線至 host.example.com 的42端口。
$nc -x10.2.3.4:8080 -Xconnect host.example.com 42
這行指令會創建一個 Unix Domain Socket,並接收資料:
$nc -lU /var/tmp/dsocket
參考連接:
Linux Netcat 命令——網絡工具中的瑞士軍刀
nc/netcat命令
linux nc (NetCat) 命令詳解
Linux nc (netcat) 詳解
8 個實用的 Linux netcat 命令示例
Netcat(Linux nc 指令)網路管理者工具實用範例
Linux下利用nc命令來監控檢測服務器的端口使用狀況
[討論] 求解:linux下nc的轉發port的用法