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/sdaof=/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

FOLLOW US

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!