英文原文: Linux Netcat command – The swiss army knife of networking,編譯:oschina
netcat是網路工具中的瑞士軍刀,它能通過TCP和UDP在網路中讀寫資料。通過與其他工具結合和重定向,你可以在指令碼中以多種方式使用它。使用netcat命令所能完成的事情令人驚訝。
netcat所做的就是在兩臺電腦之間建立連結並返回兩個資料流,在這之後所能做的事就看你的想像力了。你能建立一個伺服器,傳輸檔案,與朋友聊天,傳輸流媒體或者用它作為其它協議的獨立客戶端。
下面是一些使用netcat的例子.
[A(172.31.100.7) B(172.31.100.23)]
Linux netcat 命令例項:
1,埠掃描
埠掃描經常被系統管理員和黑客用來發現在一些機器上開放的埠,幫助他們識別系統中的漏洞。
1 |
$nc -z -v -n 172.31.100.7 21-25 |
可以執行在TCP或者UDP模式,預設是TCP,-u引數調整為udp.
z 引數告訴netcat使用0 IO,連線成功後立即關閉連線, 不進行資料交換(謝謝@jxing 指點)
v 引數指使用冗餘選項(譯者注:即詳細輸出)
n 引數告訴netcat 不要使用DNS反向查詢IP地址的域名
這個命令會列印21到25 所有開放的埠。Banner是一個文字,Banner是一個你連線的服務傳送給你的文字資訊。當你試圖鑑別漏洞或者服務的型別和版本的時候,Banner資訊是非常有用的。但是,並不是所有的服務都會傳送banner。
一旦你發現開放的埠,你可以容易的使用netcat 連線服務抓取他們的banner。
1 |
$ nc -v 172.31.100.7 21 |
netcat 命令會連線開放埠21並且列印執行在這個埠上服務的banner資訊。
Chat Server
假如你想和你的朋友聊聊,有很多的軟體和資訊服務可以供你使用。但是,如果你沒有這麼奢侈的配置,比如你在計算機實驗室,所有的對外的連線都是被限制的,你怎樣和整天坐在隔壁房間的朋友溝通那?不要鬱悶了,netcat提供了這樣一種方法,你只需要建立一個Chat伺服器,一個預先確定好的埠,這樣子他就可以聯絡到你了。
Server
1 |
$nc -l 1567 |
netcat 命令在1567埠啟動了一個tcp 伺服器,所有的標準輸出和輸入會輸出到該埠。輸出和輸入都在此shell中展示。
Client
1 |
$nc 172.31.100.7 1567 |
不管你在機器B上鍵入什麼都會出現在機器A上。
3,檔案傳輸
大部分時間中,我們都在試圖通過網路或者其他工具傳輸檔案。有很多種方法,比如FTP,SCP,SMB等等,但是當你只是需要臨時或者一次傳輸檔案,真的值得浪費時間來安裝配置一個軟體到你的機器上嘛。假設,你想要傳一個檔案file.txt 從A 到B。A或者B都可以作為伺服器或者客戶端,以下,讓A作為伺服器,B為客戶端。
Server
1 |
$nc -l 1567 < file.txt |
Client
1 |
$nc -n 172.31.100.7 1567 > file.txt |
這裡我們建立了一個伺服器在A上並且重定向netcat的輸入為檔案file.txt,那麼當任何成功連線到該埠,netcat會傳送file的檔案內容。
在客戶端我們重定向輸出到file.txt,當B連線到A,A傳送檔案內容,B儲存檔案內容到file.txt.
沒有必要建立檔案源作為Server,我們也可以相反的方法使用。像下面的我們傳送檔案從B到A,但是伺服器建立在A上,這次我們僅需要重定向netcat的輸出並且重定向B的輸入檔案。
B作為Server
Server
1 |
$nc -l 1567 > file.txt |
Client
1 |
nc 172.31.100.23 1567 < file.txt |
4,目錄傳輸
傳送一個檔案很簡單,但是如果我們想要傳送多個檔案,或者整個目錄,一樣很簡單,只需要使用壓縮工具tar,壓縮後傳送壓縮包。
如果你想要通過網路傳輸一個目錄從A到B。
Server
1 |
$tar -cvf – dir_name | nc -l 1567 |
Client
1 |
$nc -n 172.31.100.7 1567 | tar -xvf - |
這裡在A伺服器上,我們建立一個tar歸檔包並且通過-在控制檯重定向它,然後使用管道,重定向給netcat,netcat可以通過網路傳送它。
在客戶端我們下載該壓縮包通過netcat 管道然後開啟檔案。
如果想要節省頻寬傳輸壓縮包,我們可以使用bzip2或者其他工具壓縮。
Server
1 |
$tar -cvf – dir_name| bzip2 -z | nc -l 1567 |
通過bzip2壓縮
Client
1 |
$nc -n 172.31.100.7 1567 | bzip2 -d |tar -xvf - |
使用bzip2解壓
5. 加密你通過網路傳送的資料
如果你擔心你在網路上傳送資料的安全,你可以在傳送你的資料之前用如mcrypt的工具加密。
服務端
1 |
$nc localhost 1567 | mcrypt –flush –bare -F -q -d -m ecb > file.txt |
使用mcrypt工具加密資料。
客戶端
1 |
$mcrypt –flush –bare -F -q -m ecb < file.txt | nc -l 1567 |
使用mcrypt工具解密資料。
以上兩個命令會提示需要密碼,確保兩端使用相同的密碼。
這裡我們是使用mcrypt用來加密,使用其它任意加密工具都可以。
6. 流視訊
雖然不是生成流視訊的最好方法,但如果伺服器上沒有特定的工具,使用netcat,我們仍然有希望做成這件事。
服務端
1 |
$cat video.avi | nc -l 1567 |
這裡我們只是從一個視訊檔案中讀入並重定向輸出到netcat客戶端
1 |
$nc 172.31.100.7 1567 | mplayer -vo x11 -cache 3000 - |
這裡我們從socket中讀入資料並重定向到mplayer。
7,克隆一個裝置
如果你已經安裝配置一臺Linux機器並且需要重複同樣的操作對其他的機器,而你不想在重複配置一遍。不在需要重複配置安裝的過程,只啟動另一臺機器的一些引導可以隨身碟和克隆你的機器。
克隆Linux PC很簡單,假如你的系統在磁碟/dev/sda上
Server
1 |
$dd if=/dev/sda | nc -l 1567 |
Client
1 |
$nc -n 172.31.100.7 1567 | dd of=/dev/sda |
dd是一個從磁碟讀取原始資料的工具,我通過netcat伺服器重定向它的輸出流到其他機器並且寫入到磁碟中,它會隨著分割槽表拷貝所有的資訊。但是如果我們已經做過分割槽並且只需要克隆root分割槽,我們可以根據我們系統root分割槽的位置,更改sda 為sda1,sda2.等等。
8,開啟一個shell
我們已經用過遠端shell-使用telnet和ssh,但是如果這兩個命令沒有安裝並且我們沒有許可權安裝他們,我們也可以使用netcat建立遠端shell。
假設你的netcat支援 -c -e 引數(預設 netcat)
Server
1 |
$nc -l 1567 -e /bin/bash -i |
Client
1 |
$nc 172.31.100.7 1567 |
這裡我們已經建立了一個netcat伺服器並且表示當它連線成功時執行/bin/bash
假如netcat 不支援-c 或者 -e 引數(openbsd netcat),我們仍然能夠建立遠端shell
Server
1 2 |
$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
1 |
$nc -n 172.31.100.7 1567 |
你會得到一個shell提示符在客戶端
反向shell
反向shell是指在客戶端開啟的shell。反向shell這樣命名是因為不同於其他配置,這裡伺服器使用的是由客戶提供的服務。
服務端
1 |
$nc -l 1567 |
在客戶端,簡單地告訴netcat在連線完成後,執行shell。
客戶端
1 |
$nc 172.31.100.7 1567 -e /bin/bash |
現在,什麼是反向shell的特別之處呢
反向shell經常被用來繞過防火牆的限制,如阻止入站連線。例如,我有一個專用IP地址為172.31.100.7,我使用代理伺服器連線到外部網路。如果我想從網路外部訪問 這臺機器如1.2.3.4的shell,那麼我會用反向外殼用於這一目的。
10. 指定源埠
假設你的防火牆過濾除25埠外其它所有埠,你需要使用-p選項指定源埠。
伺服器端
1 |
$nc -l 1567 |
客戶端
1 |
$nc 172.31.100.7 1567 -p 25 |
使用1024以內的埠需要root許可權。
該命令將在客戶端開啟25埠用於通訊,否則將使用隨機埠。
11. 指定源地址
假設你的機器有多個地址,希望明確指定使用哪個地址用於外部資料通訊。我們可以在netcat中使用-s選項指定ip地址。
伺服器端
1 |
$nc -u -l 1567 < file.txt |
客戶端
1 |
$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作為網路通訊媒介,實現各種客戶端。
參考文件