nc [-46bCDdFhklNnrStUuvZz] [-I length] [-i interval] [-M ttl] [-m minttl]
[-O length] [-P proxy_username] [-p source_port] [-q seconds]
[-s source] [-T keyword] [-V rtable] [-w timeout] [-X proxy_protocol]
[-x proxy_address[:port]] [destination] [port]
nc 可作為基於指令稿的 Client 或 Server,可用在 TCP、UDP、或 UNIX-domain sockets,作通訊埠掃描,可處理 IPv4 和 IPv6。
destination是 IP 位址或主機名稱,當伺服器端時 (使用 -l 選項) 不指定是指本機。在 UNIX-domain 是 socket 路徑。port可以是數字或服務名稱,或數字範圍。
使用可直接看下面範例。
基本 client/server 連線
在特定埠等待連線,server 端使用選項 -l (listen 等待進來連線。不能搭配選項 -p、-s、-z 使用,-w timeout 選項沒作用。)$ nc -l 1234在另一個終端機當 client,進行連線
$ nc 127.0.0.1 1234任何一方的輸入,在另一方會出現。Ctrl-C 結束連線 (EOF (‘^D’) ?)。
nc 沒有選項將收到的資料作為指令執行 (例如其它指令的選項 -c 或 -e),但可透過輸出轉向和 fifo 解決。server 輸出導給 fifo,取出給 /bin/sh 執行,再將結果傳給 server 顯示到 client。
伺服器端:
$ rm -f /tmp/f; mkfifo /tmp/f使用者端:
$ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f
$ nc host.example.com 1234註:busybox nc 有 -e 選項。
$ (shell prompt from host.example.com)
當連線結束,nc 就結束。想要持續 listening 使用 -k 選項。
傳送檔案
接收端:$ nc -l 1234 > filename.out傳送端:
$ nc -N host.example.com 1234 < filename.in
傳送目錄
接收端:nc -l 1234 | tar xvf -
傳送端:
tar cvf - /path/to/dir | nc host.example.com 1234
遠端備份硬碟
接收端:傳送端:nc -l 1234 | dd of=sdb-backup.img.gz
回復接收端:dd if=/dev/sdb | gzip -c | nc hostB.com 1234
回復傳送端:nc -l 5000 | gzip -d | sudo dd of=/dev/sdb
nc hostA.com 5000 < sdb-backup.img.gz
連線到伺服器
取網頁:(註:echo 參數,n 不送換行,e 解釋反斜線跳脫。)$ echo -ne "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80送電子郵件到 SMTP 伺服器:
$ nc [-C] localhost 25 << EOF
HELO host.example.com
MAIL FROM:<user@host.example.com>
RCPT TO:<user2@host.example.com>
DATA
Body of email.
.
QUIT
EOF
偵測通訊埠
用 -v 選項啟用 stderr verbose 輸出有開啟的話,通常 greeting banner 訊息含有伺服器執行的軟體和版本:$ nc -v host.example.com 1234nc: connect to host.example.com (tcp) failed: Connection refused
使用 -z 選項和依序掃描通訊埠範圍:$ nc -v host.example.com 22Connection to host.example.com 22 port [tcp/ssh] succeeded! SSH-2.0-OpenSSH_6.0p1 Debian-4
$ nc -zv host.example.com 20-30指定掃描的埠:
Connection to host.example.com 22 port [tcp/ssh] succeeded!
Connection to host.example.com 25 port [tcp/smtp] succeeded!
$ nc -zv host.example.com 80 20 22掃描通訊埠範圍取得 greeting banners 才斷開連線,可透過 -w 指定短 timeout 或送「QUIT」指令給伺服器:
nc: connect to host.example.com 80 (tcp) failed: Connection refused
nc: connect to host.example.com 20 (tcp) failed: Connection refused
Connection to host.example.com port [tcp/ssh] succeeded!
$ echo "QUIT" | nc host.example.com 20-30使用 -uz 選項的 UDP port 掃描不論有沒有都會回報成功 (有送出就成功?),可用 traffic sniffer 查看封包。
SSH-1.99-OpenSSH_3.6.1p2
Protocol mismatch.
220 host.example.com IMS SMTP Receiver Version 0.84 Ready
送測試 UDP 封包
接收:echo -n "foo" | nc -u -w1 host.example.com 1234
nc -lu 1234
其它範例
TCP 連線到 host.example.com:42,使用 31337 最為來源埠,timeout 5 秒:$ nc -p 31337 -w 5 host.example.com 42UDP 連線到 host.example.com:53:
$ nc -u host.example.com 53TCP 連線到 host.example.com:42,使用 10.1.2.3 作為來源 IP:
$ nc -s 10.1.2.3 host.example.com 42接收 UNIX-domain stream socket 的連線:
$ nc -lU /var/tmp/dsocket透過 HTTP proxy 10.2.3.4:8080 連線到 host.example.com:42。見 ssh_config 的 ProxyCommand directive 搭配 ssh 使用。
$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42透過有認證的 HTTP proxy 連線:
$ nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42
其它選項說明
- -4:只用 IPv4 位址
- -6:只用 IPv6 位址
- -b:允許廣播
- -C:送 CRLF 作為 line-ending
- -D:啟用 socket 除錯
- -d:不嘗試讀取 stdin
- -F:使用 sendmsg() Pass the first connected socket 到 stdout 後離開。使用 -X 選項跟 proxy 進行連線後,把連線留給其它程式,例如 ssh() 使用 ssh_config ProxyUseFdpass 選項。
- -h:印出 help
- -I length:指定 TCP 接收 buffer 大小。
- -i interval:指定每行送收間的延遲時間。同時導致連線多個通訊埠的延遲時間。
- -k:連線結束後持續等待其它連線,需搭配 datagram 選項 (-u) 使用。
- -M ttl:設送出封包的 TTL。
- -m minttl:請求 kernel 拋棄進來封包 TTL 小於 minttl 的。
- -N:輸入 EOF 後 shutdown() 網路 socket。有些伺服器需要這樣才能完成工作。
- -n:不對指定的位址、主機名稱、或通訊埠進行 DNS service lookup。
- -O length:指定 TCP 傳送 buffer 大小。
- -P proxy_username:指定 HTTP proxy 認證的使用者名稱。
- -p source_port:指定使用的來源通訊埠。subject to privilege restrictions and availability。
- -q seconds:在 stdin 的 EOF 後,等候後才離開 (implies -N)。如果是負數,wait forever。
- -r:在範圍內,以亂數方式選擇通訊埠。
- -S:啟用 RFC 2385 TCP MD5 signature 選項。
- -s source:指定來源 IP 或 UNIX-domain socket 檔案。
- -T keyword:設定 IPv4 ToS 值,可以是 critical、inetcontrol、lowcost、lowdelay、netcontrol、throughput、reliability、或 DiffServ Code Point (ef、af11、...、af43、cs0、...、cs7)、或十六進位或十進位數字。
- -t:送 RFC 854 DON'T and WON'T response to RFC 854 DO and WILL 請求,讓 nc script telnet session。
- -U:使用 UNIX-domain socket。
- -u:使用 datagram。
- -V rtable:設定使用的 routing table。
- -v:verbose 輸出。
- -w timeout:對外連線的 timeout。
- -X proxy_protocol:使用的 proxy 協定,4 是 SOCKS v.4、5 是 SOCKS v.5、connect 是 HTTPS proxy。預設是使用 SOCKS v.5。
- -x proxy_address[:port]:proxy 的位址。
- -Z:DCCP 模式。
- -z:進行掃描。
參考來源
延伸閱讀
- /usr/share/doc/netcat-openbsd/examples/:有一些範例
- netstat -tlunp
- GAPING_SECURITY_HOLE
- 自動 telnet
沒有留言:
張貼留言