天天看點

nc - 網絡工具箱中的「瑞士軍刀」

nc 是 Linux下強大的網絡指令行工具,主要用于 TCP、UDP、UNIX域套接字 相關的操作

它被設計成可以由其他程式靈活驅動可靠的背景工具,擁有 "瑞士軍刀" 的美稱,每個系統管理者都應該掌握它

安裝

以下是 nc工具的安裝,完成後執行 ​

​ nc --version​

​指令, 如果傳回nc的版本資訊表示安裝成功

yum install nc
[root@ecs-centos-7 ~]# nc --version
Ncat: Version 7.50 ( https://nmap.org/ncat )
      

掃描端口

有時需要測試伺服器的端口連通性,下面是測試伺服器(IP:10.3.3.3 22) 22 端口是否開啟的例子

[root@ecs-centos-7 ~]# nc -z -v -w 3 10.3.3.3 22
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.3.3.3 22:22.
Ncat: 0 bytes sent, 0 bytes received in 0.03 seconds.
[root@ecs-centos-7 ~]# nc -z -v -w 3 10.3.3.3 22 6000
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connection refused.
      

-z 選項是報告連接配接狀态(隻連接配接不發送資料)

-v 選項是輸出指令過程資訊,

-w 是設定逾時時間,預設是秒,如果要設定毫秒的話,可以在數字後面加上 ms, 比如:-w 3 是3秒逾時,-w 300ms 表示逾時時間是300毫秒

從上面的結果可以看出,目标伺服器上 22 端口是開啟的,6000 端口是關閉的

例子中掃描的是 TCP 協定的端口,如果要掃描 UDP 協定的端口,需要加上 -u 選項,如果換成 UDP端口的話,上面的指令就會變成 ​

​nc -uz -v -w 3 10.3.3.3 22 ​

聊天伺服器

機器A的終端開啟端口偵聽,機器B連接配接A偵聽的端口并向A發送資料。具體過程如下:

nc - 網絡工具箱中的「瑞士軍刀」

63機器相當于一個簡易的指令行聊天伺服器,64機器相當于用戶端的功能,預設使用 TCP 協定連接配接伺服器

可以看到,63機器在本地開啟一個偵聽8000端口的服務,64機器連接配接63機器的8000端口,連接配接成功之後可以互相發送資料了

傳輸檔案

機器A和機器B之間可以通過 nc 指令傳輸檔案,具體步驟如下:

nc - 網絡工具箱中的「瑞士軍刀」

63機器作為伺服器,偵聽8000端口并重定向到 out.txt 檔案,64機器連接配接63成功之後,自動把 input.txt 檔案傳輸到伺服器

建立後門

可以在系統中建立後門執行bash指令的服務,因為涉及到系統安全性問題,是以生産環境要慎用,不過平時在内網開發環境中用來測試的話就很友善了,具體的使用步驟如下:

nc - 網絡工具箱中的「瑞士軍刀」

上面的例子中,63機器開啟端口 8000 的本地服務,服務會使用 /bin/bash 執行收到的指令,64機器用戶端連上63機器後,輸入任意的指令,都相當于在63機器上執行,指令結果傳回給64機器

說明:-e 選項預設使用的是 /bin/bash 執行指令, 這裡的 -e 也可以換成 -c ,唯一差別是 -c 預設使用的是 /bin/sh 執行指令

遠端執行腳本

nc 支援遠端執行 shell 腳本和 lua 腳本

  • shell 腳本

    腳本 s.sh 腳本内容如下:

#!/bin/sh

echo "this is a shell programming..."
      

伺服器端

nc -l 192.168.70.63 8000 --sh-exec ./s.sh  
      

用戶端

[cgyx@cghost35 ~]$ nc 192.168.70.63 8000
this is a shell programming...
      
  • lua 腳本

    腳本 t.lua 内容如下:

x = 5
y = 3
h = x + y
print('this is a lua test..h:',h)
      
nc -l 192.168.70.63 8000 --lua-exec t.lua 
      
[cgyx@cghost35 ~]$ nc 192.168.70.63 8000
this is a lua test..h:  8

      

Web伺服器

nc 可以當做簡易的 web 伺服器,現伺服器本地有一個 index.html 檔案,内容如下

HTTP/1.0 200 OK
<html>
        <head>
              <title>Test Page</title>
        </head>
        <body>
                <p>This is a Netcat Basic HTTP server!</p>
        </body>
</html>
      

伺服器執行 ​

​ nc -k -l 192.168.70.63 8080 < index.html​

​ 指令監聽8080端口

打開浏覽器,位址欄輸入 ​

​192.168.70.63:8080​

​,具體效果如下圖:

nc - 網絡工具箱中的「瑞士軍刀」

此時,伺服器端的輸出如下:

nc - 網絡工具箱中的「瑞士軍刀」

注意:-k 選項是指監聽模式接受多個連接配接,如果沒有指定 -k 選項的話,浏覽器通路一次,伺服器就會退出了

作為浏覽器

nc 不僅可以當作web伺服器,還可以當作浏覽器發送HTTP請求

以百度首頁為例, 輸入 ​

​nc www.baidu.com 80​

​,回車之後,再次輸入 ​

​GET / HTTP/1.0​

​ 再次敲擊兩次回車,即可獲得百度首頁的 HTML 文檔内容,由于百度首頁HTML太長,下面的例子隻是文檔的部分内容

[cgyx@cghost35 ~]$ nc www.baidu.com 80
GET / HTTP/1.0

HTTP/1.0 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 14615
Content-Type: text/html
Date: Thu, 16 Jul 2020 06:49:16 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
      

查找運作在端口上的服務

nc 可以掃描指定IP上指定端口是否開啟,那能否查找到指定IP上運作于指定端口上的服務呢? 答案是肯定的,以下的例子是擷取指定IP上 22 号端口上運作的服務

[root@ecs-centos-7 ~]# nc -v -n 10.3.3.3 22
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.3.3.3 22.
SSH-2.0-OpenSSH_6.6.1
      

從上面的例子中可以看出,機器(IP:10.3.3.3)上22号端口上運作的是SSH服務

通路控制

伺服器端可以隻接受指定的IP的連接配接或者隻拒絕指定IP的連接配接

注意 :

1、下面的例子中 增加 -k 選項是讓伺服器接受多個連接配接,避免接受一個用戶端連接配接就退出了

2、--lua-exec t.lua 為了用戶端連上伺服器之後傳回一個列印字元串,來表示連接配接伺服器成功

  • 隻允許指定的IP

隻允許IP為 192.168.62 用戶端連接配接

nc -k -l 192.168.63 8000 --lua-exec t.lua --allow 192.168.62
      

隻允許IP為 192.168.62 和 192.168.64 的用戶端連接配接

nc -k -l 192.168.63 8000 --lua-exec t.lua --allow 192.168.62 --allow 192.168.64
      

隻允許内網IP段的用戶端連接配接

nc -k -l 192.168.63 8000 --lua-exec t.lua --allow 192.168.62-64
      

從檔案中擷取允許通路的IP位址清單

[cgyx@cghost35 ~]$ cat allow.txt 
192.168.70.62
192.168.70.64
[cgyx@cghost35 ~]$ nc -k -l 8000 --lua-exec t.lua  --allowfile allow.txt
      
  • 隻拒絕指定的IP

隻拒絕IP為 192.168.62 的用戶端

nc -k -l 192.168.63 8000 --lua-exec t.lua --deny 192.168.62
      

隻拒絕IP為 192.168.62 和 192.168.64 的用戶端連接配接

nc -k -l 192.168.63 8000 --lua-exec t.lua --deny 192.168.62 --deny 192.168.64
      

隻拒絕内網IP段的用戶端連接配接

nc -k -l 192.168.63 8000 --lua-exec t.lua --deny 192.168.62-64
      

從檔案中擷取deny通路的IP位址清單

[cgyx@cghost35 ~]$ cat deny.txt 
192.168.70.62
192.168.70.64
[cgyx@cghost35 ~]$ nc -k -l 8000 --lua-exec t.lua  --denyfile deny.txt
      

繼續閱讀