netcat號稱網絡工具中的瑞士軍刀,它能經過TCP和UDP在網絡中讀寫數據。經過與其餘工具結合和重定向,你能夠在腳本中以多種方式使用它。使用netcat命令所能完成的事情使人驚訝。linux
netcat所作的就是在兩臺電腦之間創建連接並返回兩個數據流,在這以後所能作的事就看你的想像力了。你能創建一個服務器,傳輸文件,與朋友聊天,傳輸流媒體或者用它做爲其它協議的獨立客戶端。nginx
下面是一些使用netcat的例子.git
A (172.31.100.7) github
B (172.31.100.23)shell
Linux netcat 命令實例:安全
端口掃描常常被系統管理員和黑客用來發如今一些機器上開放的端口,幫助他們識別系統中的漏洞。bash
nc -z -v -n 10.9.17.100 21-25 nc: connect to 10.9.17.100 port 21 (tcp) failed: Connection refused Connection to 10.9.17.100 22 port [tcp/*] succeeded! nc: connect to 10.9.17.100 port 23 (tcp) failed: Connection refused nc: connect to 10.9.17.100 port 24 (tcp) failed: Connection refused nc: connect to 10.9.17.100 port 25 (tcp) failed: Connection refused
能夠運行在TCP或者UDP模式,默認是TCP,-u參數調整爲udp.服務器
z 參數告訴netcat使用0 IO,鏈接成功後當即關閉鏈接, 不進行數據交換網絡
v 參數指使用冗餘選項(譯者注:即詳細輸出)ssh
n 參數告訴netcat 不要使用DNS反向查詢IP地址的域名
這個命令會打印21到25 全部開放的端口。Banner是一個文本,Banner是一個你鏈接的服務發送給你的文本信息。當你試圖鑑別漏洞或者服務的類型和版本的時候,Banner信息是很是有用的。可是,並非全部的服務都會發送banner。
一旦你發現開放的端口,你能夠容易的使用netcat 鏈接服務抓取他們的banner。
nc -v 10.9.17.100 22 Connection to 10.9.17.100 22 port [tcp/ssh] succeeded! SSH-2.0-OpenSSH_5.3 Protocol mismatch.
netcat 命令會鏈接開放端口22而且打印運行在這個端口上服務的banner信息。
假如你想和你的朋友聊聊,有不少的軟件和信息服務能夠供你使用。可是,若是你沒有這麼奢侈的配置,好比你在計算機實驗室,全部的對外的鏈接都是被限制的,你怎樣和成天坐在隔壁房間的朋友溝通那?不要鬱悶了,netcat提供了這樣一種方法,你只須要建立一個Chat服務器,一個預先肯定好的端口,這樣子他就能夠聯繫到你了。
Server
nc -l 1567
netcat 命令在1567端口啓動了一個tcp 服務器,全部的標準輸出和輸入會輸出到該端口。輸出和輸入都在此shell中展現。
Client
nc 172.31.100.7 1567
無論你在機器B上鍵入什麼都會出如今機器A上。
大部分時間中,咱們都在試圖經過網絡或者其餘工具傳輸文件。有不少種方法,好比FTP,SCP,SMB等等,可是當你只是須要臨時或者一次傳輸文件,真的值得浪費時間來安裝配置一個軟件到你的機器上嘛。假設,你想要傳一個文件file.txt 從A 到B。A或者B均可以做爲服務器或者客戶端,如下,讓A做爲服務器,B爲客戶端。
Server
nc -l 1567 < <(seq 5)
Client
nc -n 10.9.17.100 1567 1 2 3 4 5
這裏咱們建立了一個服務器在A上而且重定向netcat的輸入爲文件file.txt,那麼當任何成功鏈接到該端口,netcat會發送file的文件內容。
在客戶端咱們重定向輸出到file.txt,當B鏈接到A,A發送文件內容,B保存文件內容到file.txt.
沒有必要建立文件源做爲Server,咱們也能夠相反的方法使用。像下面的咱們發送文件從B到A,可是服務器建立在A上,此次咱們僅須要重定向netcat的輸出而且重定向B的輸入文件。
B做爲Server
Server
nc -l 1567 > file.txt
Client
nc 172.31.100.23 1567 < file.txt
發送一個文件很簡單,可是若是咱們想要發送多個文件,或者整個目錄,同樣很簡單,只須要使用壓縮工具tar,壓縮後發送壓縮包。
若是你想要經過網絡傳輸一個目錄從A到B。
Server
tar -cvf – dir_name | nc -l 1567
Client
nc -n 172.31.100.7 1567 | tar -xvf -
這裏在A服務器上,咱們建立一個tar歸檔包而且經過-在控制檯重定向它,而後使用管道,重定向給netcat,netcat能夠經過網絡發送它。
在客戶端咱們下載該壓縮包經過netcat 管道而後打開文件。
若是想要節省帶寬傳輸壓縮包,咱們可使用bzip2或者其餘工具壓縮。
Server
tar -cvf – dir_name| bzip2 -z | nc -l 1567
經過bzip2壓縮
Client
nc -n 172.31.100.7 1567 | bzip2 -d |tar -xvf -
使用bzip2解壓
若是你擔憂你在網絡上發送數據的安全,你能夠在發送你的數據以前用如mcrypt的工具加密。
服務端
nc localhost 1567 | mcrypt –flush –bare -F -q -d -m ecb > file.txt
使用mcrypt工具加密數據。
客戶端
mcrypt –flush –bare -F -q -m ecb < file.txt | nc -l 1567
使用mcrypt工具解密數據。
以上兩個命令會提示須要密碼,確保兩端使用相同的密碼。
這裏咱們是使用mcrypt用來加密,使用其它任意加密工具均可以。
雖然不是生成流視頻的最好方法,但若是服務器上沒有特定的工具,使用netcat,咱們仍然有但願作成這件事。
服務端
cat video.avi | nc -l 1567
這裏咱們只是從一個視頻文件中讀入並重定向輸出到netcat客戶端
nc 172.31.100.7 1567 | mplayer -vo x11 -cache 3000 -
這裏咱們從socket中讀入數據並重定向到mplayer。
若是你已經安裝配置一臺Linux機器而且須要重複一樣的操做對其餘的機器,而你不想在重複配置一遍。不在須要重複配置安裝的過程,只啓動另外一臺機器的一些引導能夠隨身碟和克隆你的機器。
克隆Linux PC很簡單,假如你的系統在磁盤/dev/sda上
Server
dd if=/dev/sda | nc -l 1567
Client
nc -n 172.31.100.7 1567 | dd of=/dev/sda
dd是一個從磁盤讀取原始數據的工具,我經過netcat服務器重定向它的輸出流到其餘機器而且寫入到磁盤中,它會隨着分區表拷貝全部的信息。可是若是咱們已經作過度區而且只須要克隆root分區,咱們能夠根據咱們系統root分區的位置,更改sda 爲sda1,sda2.等等。
咱們已經用過telnet和ssh使用過遠程shell,可是若是這兩個命令沒有安裝而且咱們沒有權限安裝他們,咱們也可使用netcat建立遠程shell。
假設你的netcat支持 -c -e 參數(默認 netcat)
Server
注意:是否有 -e,是否須要帶 -p 均視版本而定
root@ecdata-master 10.9.17.100 02:47:55 ~/tmp/10.2.3.5 > nc -lp 1567 -e '/bin/bash -i'
Client
root@ecdata-slave-01 10.9.17.101 02:47:45 ~/tmp/10.2.3.5 > nc 10.9.17.100 1567 bash: .HOST_NAME: No such file or directory -------------------------------------------------------------------- Welcome to you: 10.2.3.5 ! Your login dir is: /root/tmp/10.2.3.5 ! -------------------------------------------------------------------- root@ 10.9.17.100 02:48:06 ~/tmp/10.2.3.5 >
這裏咱們已經建立了一個netcat服務器而且表示當它鏈接成功時執行/bin/bash
假如netcat 不支持-c 或者 -e 參數(openbsd netcat),咱們仍然可以建立遠程shell
Server
mkfifo /tmp/tmp_fifo cat /tmp/tmp_fifo | /bin/sh -i 2>&1 | nc -l 1567 > /tmp/tmp_fifo
這裏咱們建立了一個fifo文件,而後使用管道命令把這個fifo文件內容定向到shell 2>&1中。是用來重定向標準錯誤輸出和標準輸出,而後管道到netcat 運行的端口1567上。至此,咱們已經把netcat的輸出重定向到fifo文件中。
說明:
從網絡收到的輸入寫到fifo文件中
cat 命令讀取fifo文件而且其內容發送給sh命令
sh命令進程受到輸入並把它寫回到netcat。
netcat 經過網絡發送輸出到client
至於爲何會成功是由於管道使命令平行執行,fifo文件用來替代正常文件,由於fifo使讀取等待而若是是一個普通文件,cat命令會盡快結束並開始讀取空文件。
在客戶端僅僅簡單鏈接到服務器
Client
nc -n 172.31.100.7 1567
你會獲得一個shell提示符在客戶端
反向shell是指在客戶端打開的shell。反向shell這樣命名是由於不一樣於其餘配置,這裏服務器使用的是由客戶提供的服務。
服務端
root@ecdata-master 10.9.17.100 02:44:34 ~/tmp/10.2.3.5 > nc -l -p 1567 hostname ecdata-slave-01
在客戶端,簡單地告訴netcat在鏈接完成後,執行shell。
客戶端
root@ecdata-slave-01 10.9.17.101 02:44:36 ~/tmp/10.2.3.5 > nc -v 10.9.17.100 1567 -e /bin/bash echo 111 ecdata-master [10.9.17.100] 1567 (jlicelmd) open
如今,什麼是反向shell的特別之處呢
反向shell常常被用來繞過防火牆的限制,如阻止入站鏈接。例如,我有一個專用IP地址爲172.31.100.7,我使用代理服務器鏈接到外部網絡。若是我想從網絡外部訪問 這臺機器如1.2.3.4的shell,那麼我會用反向外殼用於這一目的。
假設你的防火牆過濾除25端口外其它全部端口,你須要使用-p選項指定源端口。
服務器端
nc -l 1567
客戶端
nc 172.31.100.7 1567 -p 25
使用1024之內的端口須要root權限。
該命令將在客戶端開啓25端口用於通信,不然將使用隨機端口。
假設你的機器有多個地址,但願明確指定使用哪一個地址用於外部數據通信。咱們能夠在netcat中使用-s選項指定ip地址。
服務器端
nc -u -l 1567 < file.txt
客戶端
nc -u 172.31.100.7 1567 -s 172.31.100.5 > file.txt
該命令將綁定地址172.31.100.5。
這僅僅是使用netcat的一些示例。
其它用途有:
使用-t選項模擬Telnet客戶端,
HTTP客戶端用於下載文件,
鏈接到郵件服務器,使用SMTP協議檢查郵件,
使用ffmpeg截取屏幕並經過流式傳輸分享,等等。其它更多用途。
簡單來講,只要你瞭解協議就可使用netcat做爲網絡通信媒介,實現各類客戶端。
十二、nc 傳送文件或文件夾
直接用nc傳送文件,真的很方便。可省得壓縮解壓縮,也省得有權限問題。
接受端:nc -l 1234 | tar -xzvf - 發送端:tar -czvf - www | nc 192.168.0.200 1234
接受方:nc -l 1234 > /etc/nginx/nginx.conf 發送方:cat /etc/nginx/nginc.conf | nc 192.169.0.200 1234
[1] Netcat手冊
[2] Linux Netcat command – The swiss army knife of networking
http://mylinuxbook.com/linux-netcat-command/
[3] TSWS, A Totally Simple Web Server in Bash and Netcat