nc – 網路工具箱中的「瑞士軍刀」
nc 是 Linux下強大的網路命令行工具,主要用於 TCP、UDP、UNIX域套接字 相關的操作
它被設計成可以由其他程式靈活驅動可靠的後台工具,擁有 “瑞士軍刀” 的美稱,每個系統管理員都應該掌握它
安裝
以下是 nc工具的安裝,完成後執行 nc --version
命令, 如果返回nc的版本資訊表示安裝成功
yum install nc
[root@ecs-centos-7 ~]# nc --version
Ncat: Version 7.50 ( //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 ( //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 ( //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發送數據。具體過程如下:
63機器相當於一個簡易的命令行聊天伺服器,64機器相當於客戶端的功能,默認使用 TCP 協議連接伺服器
可以看到,63機器在本地開啟一個偵聽8000埠的服務,64機器連接63機器的8000埠,連接成功之後可以互相發送數據了
傳輸文件
機器A和機器B之間可以通過 nc 命令傳輸文件,具體步驟如下:
63機器作為伺服器,偵聽8000埠並重定向到 out.txt 文件,64機器連接63成功之後,自動把 input.txt 文件傳輸到伺服器
創建後門
可以在系統中創建後門執行bash命令的服務,因為涉及到系統安全性問題,所以生產環境要慎用,不過平時在內網開發環境中用來測試的話就很方便了,具體的使用步驟如下:
上面的例子中,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
,具體效果如下圖:
此時,伺服器端的輸出如下:
注意:-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 ( //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