網絡利器netcat

netcat

netcat具有“網絡瑞士軍刀“之稱,支持從命令行跨網絡讀取和寫入數據。

netcat 有 GNU 版本和 OpenBSD版本。兩者都可以在 Linux下面安裝,但是 Windows 下面只有 GNU 版本。 不管是 GNU 版本還是 OpenBSD 版本,都有新老的區別,主要是傳送文件時 stdin 發生 EOF 了,老版本會自動斷開,而新的 gnu/openbsd 還會一直連着 。

NcatNmap項目套件中有一個ncat程序。Ncat最初是用來支持Nmap而開發的,是對古老的Netcat重新實現的一個大大改進。它與netcat類似,使用TCP和UDP進行通信,可爲其他應用程序和用戶提供網絡連接。這三個版本功能類似,都簡稱nc。

readlink -f $(which nc) 查看nc版本。兩個版本在使用時常用功能區別不大,如果遇到什麼問題,查看系統自帶手冊(網上教程、博客可能不準)。

軟件使用思路

netcat 可以操作 tcp/udp 進行原始的監聽、連接、數據傳輸等工作。然後搭配管道,實現靈活多樣的功能,或者進行各種網絡測試。 下面是nc常用功能。

端口測試

測試端口第一個想到的是telnet,但是有一定侷限性:telnet不一定安裝,需要有額外主機測試。

使用nc可以在本機測試端口是否監聽nc -l -p port 。如果報端口已佔用,表示端口已經監聽。

本機端口已監聽,如果還以網絡不通,可在第二臺主機上執行nc -vz ip port 。v 表示verbose,顯示多點信息。z 表示不發送數據。

nc 命令後面的 8080 可以寫成一個範圍進行掃描: nc -v -v -w3 -z ip port1-port2 。兩次 v 會顯示更詳細的內容,w3是設置掃描超時時間爲3秒。

傳輸測試

在A主機(192.168.1.2)上執行nc -l -p 8080 ,開始監聽本地8080端口。然後在B主機上連接A:nc 192.168.1.2 8080 。 兩邊就可以會話了,隨便輸入點什麼按回車,另外一邊應該會顯示出來 。

openbsd 版本 netcat 用了 -l 以後可以省略 -p 參數,寫做:nc -l 8080 ,但在 GNU netcat 下面無法運行,所以推薦寫法是加上 -p 參數,兩個版本都通用。 老版本的 nc 只要 CTRL+D 發送 EOF 就會斷開,新版本一律要 CTRL+C 結束,不管是服務端還是客戶端只要任意一邊斷開了,另一端也就結束了,但是 openbsd 版本的 nc 可以加一個 -k 參數讓服務端持續工作。

測試UDP

排查兩臺主機 UDP 數據發送不通問題。在A主機(192.168.1.2)上執行nc -u -l -p 8080 ,監聽udp的8080端口。然後B主機測試連接nc -u 192.168.1.2 8080

類似上面測試,看看一邊輸入消息另外一邊能否收到,收得到的話可能是你自己的服務原因,收不到的話,檢查網關、防火牆等配置。

文件傳輸

兩臺服務器傳輸文件,可以用scp、szrz,也可以安裝FTP服務,甚至可以動手用Python實現http上傳。用nc也可以輕鬆實現。

在A主機(192.168.1.2)上監聽端口nc -l -p 8080 > image.jpg 。然後在B主機上發送文件 nc 192.168.1.2 8080 < image.jpg

注意,老版本 GNU / OpenBSD 的 netcat 再文件結束(標準輸入碰到 EOF),發送文件一端就會關閉連接,而新版本不會,需要驗證傳輸文件和源文件是否大小一致。openbsd版可以使用-N 參數,指明stdin遇到EOF就關閉連接(完成傳輸),GNU版本可以用-q0 參數。

nc進行文件傳輸,在極端環境下很有用。

網速吞吐量測試

GNU版本使用-v -v 參數,在結束時會統計接受和發送的字節。

在A主機(192.168.1.2)上監聽8080 nc -v -v -n -l -p 8080 > /dev/null 。-n是不要解析域名,避免解析域名造成時間誤差。然後在B主機上執行 time nc -n 192.168.1.2 8080 < /dev/zero 。執行一段時間後 CTRL+C 結束,就可以在A主機上查看字節數,在根據B主機的時長就可以計算。

對於 OpenBSD 版本的 nc 我們可以用管道搭配 dd 命令進行統計,服務端運行:

nc -l -p 8080 > /dev/null

客戶端運行 dd 搭配 nc,結束以後會有結果出來:

dd if=/dev/zero bs=1MB count=100 | /bin/nc.openbsd -n -N 192.168.1.2 8080

其實上面兩種方法都把建立連接的握手時間以及 TCP 窗口慢啓動的時間給計算進去了,不是特別精確,最精確的方式是搭配 pv 命令(監控統計管道數據的速度),在 A 主機運行:

nc -l -p 8080 | pv

然後再 B 主機運行:

nc 192.168.1.2 8080 < /dev/zero

此時 A 主機那端持續收到 B 主機發送過來的數據並通過管道投遞給 pv 命令後,你就能看到實時的帶寬統計了,pv 會輸出一個實時狀態:

353MiB 0:00:15 [22.4MiB/s] [          <=>  ]

讓你看到最新的帶寬吞吐量,這是最準確的吞吐量測試方法,在不需要 iperf 的情況下,直接使用 nc 就能得到一個準確的數據。

系統後門

假設A 主機十分原始,包管理系統都沒有,sshd/telnetd 都跑不起來,這時候可以用nc 來實現B 主機通過網絡登錄 A 主機。

GNU 版本的 netcat 有一個 -e 參數,可以在連接建立的時候執行一個程序,並把它的標準輸入輸出重定向到網絡連接上來,於是我們可以在 A 主機上 -e 一下 bash:

/bin/nc.traditional -l -p 8080 -e /bin/bash

按回車打開系統後門,然後再 B 主機那裏照常:

nc 192.168.1.2 8080

你就可以在 B 主機上登錄 A 主機的 shell 了,操作完成 CTRL+C 結束。

對於 openbsd 版本的 netcat,-e 命令被刪除了,沒關係,我們可以用管道來完成,和剛纔一樣,在 A 主機上:

mkfifo /tmp/fcat /tmp/f | /bin/bash 2>&1 | /bin/nc.openbsd -l -p 8080 > /tmp/f

然後 B 主機和剛纔一樣:

nc 192.168.1.2 8080

即可訪問,用完注意將 /tmp/f 這個 fifo 文件刪除。

還有很多用途

還有很多其他用法,比如可以用 netcat + shell script 寫一個 http 服務器,使用 fifo 搭配兩層 nc 可以實現 tcp 端口轉發,搭配 openssl 命令行工具和 nc 加管道可以把 ssl 的套接字解碼並映射成裸的 socket 端口供沒有 ssl 功能的工具訪問。 這些功能比較考驗基本能力,可能有些複雜,可以在極端惡劣環境下使用,平時用專用軟件很容易實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章