Linunx 指令 nc 用法
Posted on May 18, 2017 in Unix-like 命令列教學 by Amo Chen ‐ 3 min read
nc (netcat) 是 Linux 系統中十分好用的 TCP/UDP 網路程式,從它的 man page 裡面就可以發現 nc 其實有很多種用途,例如通訊埠掃描(port scan)、檔案傳輸、聊天,甚至是透過遠端執行 Shell 都可以。
p.s. 基於系統安全,並不建議利用 nc 作為遠端執行 Shell 的工具
本文整理了幾種 nc 常見的用法。
簡易聊天室(Chat Server)
nc -l ip_address port_number
nc 指令只要加上 -l 做為參數,就能就轉變成監聽(listen)模式,成為伺服器,其他利用 nc 連線的客戶端(client)都可以送出訊息至 nc 伺服端(server),同樣地,伺服端也能夠回送文字訊息,就像聊天室一樣。
範例:
Server
$ nc -l localhost 8888
Client
$ nc localhost 8888
通訊埠掃瞄(port scan)
$ nc -z -v -n ip_address port1-port2
雖然功能不像 nmap 那般完整,但 nc 確實可以利用來做簡易的通訊埠掃瞄。
以下是 port scan 參數的解釋:
-z 只進行掃描, 不進行任何的資料傳輸 -v 顯示掃瞄訊息 -n 不進行 DNS 查詢
掃描 127.0.0.1 port 21 到 25 的範例:
$ nc -z -v -n 127.0.0.1 21-25
執行結果:
nc: connect to 127.0.0.1 port 21 (tcp) failed: Connection refused
Connection to 127.0.0.1 22 port [tcp/*] succeeded!
nc: connect to 127.0.0.1 port 23 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 24 (tcp) failed: Connection refused
nc: connect to 127.0.0.1 port 25 (tcp) failed: Connection refused
檔案傳輸(File Transfer)
傳送檔案端指令
$ nc -l localhost port_number < file_path
接收檔案端指令
$ nc -n ip_address port > save_file_path
p.s. 反向也可以,改個資料流的方向就可以了
nc 的檔案傳輸,就像串流(stream)一樣,因此在下一個用法,就可以看到 nc 可以變成影音檔案的串流伺服器。
上述指令,檔案傳輸完之後伺服端就會關閉。
影音串流(Video Streaming)
直接看以下範例:
Server
$ cat video.avi | nc -l 4321
Client
$ nc l27.0.0.1 4321 | mplayer -vo x11 -cache 3000 -
資料夾傳輸
類似影音串流的應用,可以將得到的串流資料利用管道(pipe, | )把資料流導到其他指令進行處理。同樣地,也可以利用管道將資料流導到 nc 進行傳輸,例如資料夾的傳輸就是先壓縮成一個 tar 檔後,再利用 nc 進行傳輸,而接收端則是先利用 nc 進行接收,再利用管道將接收到的資料給 tar 指令進行解壓縮。
範例如下:
傳送端:
$ tar -cvf – dir_name | nc -l 4321
接收端:
$ nc -n 127.0.0.1 4321 | tar -xvf -
傳輸加密 (Encrypt)
有些時候,有些傳輸內容可能不想給給知道,因此搭配管道跟加解密指令,nc 也可以做到簡易的傳輸加密。原則上可以選擇你想要的指令進行加密後傳輸,不過,接收端也必須知道如何解密才行。
本範例利用 mcrypt 加密後傳輸。
傳輸端
$ mcrypt –flush –bare -F -q -m ecb < file.txt | nc -l 1567
接收端
$ nc localhost 1567 | mcrypt –flush –bare -F -q -d -m ecb > file.txt
mcrypt 參數解釋:
-flush 刷新輸出 -bare 不將重要資訊(加密演算法、模式、原始檔的CRC32等)寫到加密後的檔案內 -q 不顯示警告訊息 -d 解密 -m [mode] 加密模式,預設是CBC(Cipher Block Chaining)
取得網頁原始碼
範例:
$ printf "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
利用 SMTP 寄信
範例:
$ nc smtp_server_ip_address 25 << EOF
HELO host.example.com
MAIL FROM:<[email protected]>
RCPT TO:<[email protected]>
DATA
Body of email.
.
QUIT
EOF
複製裝置(device)到遠端
這也是類似串流的用法。例如,把序列埠 (serial port) 訊號送到遠端,只要把以下範例的 if=/dev/sda
及 of=/dev/sad
分別改成 if=/dev/ttyS*
及 of=/dev/ttyS*
即可。
傳送端:
$ dd if=/dev/sda | nc -l 1567
接收端:
$ nc -n nc_server_ip_address 1567 | dd of=/dev/sda
遠端執行 Shell (危險,使用前請三思)
由於安全性考量,大部份的 Linux nc 指令現應已不具備 nc 直接執行 shell 的參數。不過,在 man page 上還是有提到如何用 mkfifo 指令建立與 Shell 的管道,達成遠端執行 Shell 的方式。
作法是利用 mkfifo
建立 FIFO,接著利用管道(pipe)把 FIFO 的資料流導給 /bin/sh
互動模式,同時把 /bin/sh
的標準錯誤(stderr)重新導向到標準輸出(stdout),再把標準輸出的資料流導到 nc ,最後把 nc 接收或產生的資料流導回 FIFO,如此一來 nc 的客戶端就可以執行指令並且看到指令執行的結果。
Server
$ rm -f /tmp/f; mkfifo /tmp/f
$ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f
Client
$ nc host.example.com 1234
** 進行完本範例後,請記得將 /tmp/f
給刪除! **
rm -f /tmp/f
其他常用的 nc 參數
-p port 指定來源通訊埠(source port) -s ip_address 指定來源IP(source ip) -x ipaddress[:port] 指定代理伺服器(proxy server) -P proxy_username 指定代理伺服器的使用者名稱
參考資料
http://linux.die.net/man/1/nc