2018年7月18日 星期三

nc

netcat 在 Linux 中的指令為 nc,網路的 cat 工具程式,透過網路連結 stdin 和 stdout,原汁原味傳送資料。另外也可以掃描通訊埠。

     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
    $ (shell prompt from host.example.com)
    註:busybox nc 有 -e 選項。

    當連線結束,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 輸出
    $ nc -v host.example.com 1234
    nc: connect to host.example.com (tcp) failed: Connection refused
    有開啟的話,通常 greeting banner 訊息含有伺服器執行的軟體和版本:
    $ nc -v host.example.com 22
    Connection to host.example.com 22 port [tcp/ssh] succeeded!
    SSH-2.0-OpenSSH_6.0p1 Debian-4
    使用 -z 選項和依序掃描通訊埠範圍:
    $ 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
    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!
    掃描通訊埠範圍取得 greeting banners 才斷開連線,可透過 -w 指定短 timeout 或送「QUIT」指令給伺服器:
    $ echo "QUIT" | nc host.example.com 20-30
    SSH-1.99-OpenSSH_3.6.1p2
    Protocol mismatch.
    220 host.example.com IMS SMTP Receiver Version 0.84 Ready
    使用 -uz 選項的 UDP port 掃描不論有沒有都會回報成功 (有送出就成功?),可用 traffic sniffer 查看封包。

    送測試 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 42
    UDP 連線到 host.example.com:53:
    $ nc -u host.example.com 53
    TCP 連線到 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:進行掃描。

    參考來源

    1. man nc
    2. http://blog.gtwang.org/linux/linux-utility-netcat-examples/

    延伸閱讀

    沒有留言:

    張貼留言

    SIP header Via

    所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...