① 埠掃描原理及工具 - 安全工具篇
"埠"是英文port的意譯,可以認為是設備與外界通訊交流的出口。埠可分為虛擬埠和物理埠,其中虛擬埠指計算機內部埠,不可見。例如計算機中的80埠、21埠、23埠等。
一台擁有IP地址的主機可以提供許多服務,比如Web服務、FTP服務、SMTP服務等,這些服務完全可以通過1個IP地址來實現。那麼,主機是怎樣區分不同的網路服務呢?顯然不能只靠IP地址,因為IP 地址與網路服務的關系是一對多的關系。實際上是通過「IP地址+埠號」來區分不同的服務的。
因此,一個開放的埠代表一個提供的服務,不同的服務具有不同的埠號, 因此要對服務進行測試,首先要確定是否開放對應埠號 。
TCP埠和UDP埠。由於TCP和UDP 兩個協議是獨立的,因此各自的埠號也相互獨立,比如TCP有235埠,UDP也 可以有235埠,兩者並不沖突。
1、周知埠
周知埠是眾所周知的埠號,范圍從0到1023,其中80埠分配給WWW服務,21埠分配給FTP服務等。我們在IE的地址欄里輸入一個網址的時候是不必指定埠號的,因為在默認情況下WWW服務的埠是「80」。
2、動態埠
動態埠的范圍是從49152到65535。之所以稱為動態埠,是因為它 一般不固定分配某種服務,而是動態分配。
3、注冊埠
埠1024到49151,分配給用戶進程或應用程序。這些進程主要是用戶安裝的程序。
1、使用Nmap工具查找ip的tcp埠
-O :獲取操作系統版本信息
2、使用Nmap工具查找udp埠
-sU :表示udp scan , udp埠掃描
-Pn :不對目標進行ping探測(不判斷主機是否在線)(直接掃描埠)
對於udp埠掃描比較慢,掃描完6萬多個埠需要20分鍾左右
3、使用Nmap工具獲取埠Banner
只會返回有Banner信息的,沒有則不會返回。
4、使用Nmap嗅探服務版本信息
如果沒有返回banner信息的,也可以使用該方法嘗試嗅探服務版本信息。
5、利用nmap對目標進行完整測試
在針對內容測試時,有授權的情況下,可以利用nmap對目標進行完整測試
② 用java如何實現UDP埠掃描器
使用 DatagramSocket(int port) 建立socket(套間字)服務。
將數據打包到DatagramPacket中去
通過socket服務發送 (send()方法)
關閉資源
public static void main(String[] args) {
DatagramSocket ds = null; //建立套間字udpsocket服務
try {
ds = new DatagramSocket(8999); //實例化套間字,指定自己的port
} catch (SocketException e) {
System.out.println("Cannot open port!");
System.exit(1);
}
byte[] buf= "Hello, I am sender!".getBytes(); //數據
InetAddress destination = null ;
try {
destination = InetAddress.getByName("192.168.1.5"); //需要發送的地址
} catch (UnknownHostException e) {
System.out.println("Cannot open findhost!");
System.exit(1);
}
DatagramPacket dp =
new DatagramPacket(buf, buf.length, destination , 10000);
//打包到DatagramPacket類型中(DatagramSocket的send()方法接受此類,注意10000是接受地址的埠,不同於自己的埠!)
try {
ds.send(dp); //發送數據
} catch (IOException e) {
}
ds.close();
}
}
接收步驟:
使用 DatagramSocket(int port) 建立socket(套間字)服務。(我們注意到此服務即可以接收,又可以發送),port指定監視接受埠。
定義一個數據包(DatagramPacket),儲存接收到的數據,使用其中的方法提取傳送的內容
通過DatagramSocket 的receive方法將接受到的數據存入上面定義的包中
使用DatagramPacket的方法,提取數據。
關閉資源。
import java.net.*;
public class Rec {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(10000); //定義服務,監視埠上面的發送埠,注意不是send本身埠
byte[] buf = new byte[1024];//接受內容的大小,注意不要溢出
DatagramPacket dp = new DatagramPacket(buf,0,buf.length);//定義一個接收的包
ds.receive(dp);//將接受內容封裝到包中
String data = new String(dp.getData(), 0, dp.getLength());//利用getData()方法取出內容
System.out.println(data);//列印內容
ds.close();//關閉資源
}
}
希望能夠幫助到你,望採納!
③ 認識nc,tcp/udp網路測試
什麼是nc
nc是netcat的簡寫,有著網路界的瑞士軍刀美譽。因為它短小精悍、功能實用,被設計為一個簡單、可靠的網路工具
nc的作用
(1)實現任意TCP/UDP埠的偵聽,nc可以作為server以TCP或UDP方式偵聽指定埠
(2)埠的掃描,nc可以作為client發起TCP或UDP連接
(3)機器之間傳輸文件
(4)機器之間網路測速
nc的控制參數不少,常用的幾個參數如下所列:
1) -l
用於指定nc將處於偵聽模式。指定該參數,則意味著nc被當作server,偵聽並接受連接,而非向其它地址發起連接。
2) -p <port>
暫未用到(老版本的nc可能需要在埠號前加-p參數,下面測試環境是centos6.6,nc版本是nc-1.84,未用到-p參數)
3) -s
指定發送數據的源IP地址,適用於多網卡機
4) -u
指定nc使用UDP協議,默認為TCP
5) -v
輸出交互或出錯信息,新手調試時尤為有用
6)-w
超時秒數,後面跟數字
7)-z
表示zero,表示掃描時不發送任何數據
前期准備
准備兩台機器,用於測試nc命令的用法
主機A:ip地址 10.0.1.161
主機B:ip地址 10.0.1.162
兩台機器先安裝nc和nmap的包
yum install nc -y
yum install nmap -y
如果提示如下-bash: nc: command not found 表示沒安裝nc的包
nc用法1,網路連通性測試和埠掃描
nc可以作為server端啟動一個tcp的監聽(注意,此處重點是起tcp,下面還會講udp)
先關閉A的防火牆,或者放行下面埠,然後測試B機器是否可以訪問A機器啟動的埠
在A機器上啟動一個埠監聽,比如 9999埠(注意:下面的-l 是小寫的L,不是數字1)
默認情況下下面監聽的是一個tcp的埠
nc -l 9999
客戶端測試, 測試方法1
在B機器上telnet A機器此埠,如下顯示表示B機器可以訪問A機器此埠
客戶端測試,測試方法2
B機器上也可以使用nmap掃描A機器的此埠
nmap 10.0.1.161 -p9999
客戶端測試,測試方法3
使用nc命令作為客戶端工具進行埠探測
nc -vz -w 2 10.0.1.161 9999
(-v可視化,-z掃描時不發送數據,-w超時幾秒,後面跟數字)
上面命令也可以寫成
nc -vzw 2 10.0.1.161 9999
客戶端測試,測試方法4(和方法3相似,但用處更大)
nc可以可以掃描連續埠,這個作用非常重要。常常可以用來掃描伺服器埠,然後給伺服器安全加固
在A機器上監聽2個埠,一個9999,一個9998,使用&符號丟入後台
在客戶端B機器上掃描連續的兩個埠,如下
nc作為server端啟動一個udp的監聽(注意,此處重點是起udp,上面主要講了tcp)
啟動一個udp的埠監聽
nc -ul 9998
復制當前窗口輸入 netstat -antup |grep 9998 可以看到是啟動了udp的監聽
客戶端測試,測試方法1
nc -vuz 10.0.1.161 9998
由於udp的埠無法在客戶端使用telnet去測試,我們可以使用nc命令去掃描(前面提到nc還可以用來掃描埠)
(telnet是運行於tcp協議的)
(u表示udp埠,v表示可視化輸出,z表示掃描時不發送數據)
上面在B機器掃描此埠的時候,看到A機器下面出現一串XXXXX字元串
客戶端測試,測試方法2
nmap -sU 10.0.1.161 -p 9998 -Pn
(它暫無法測試nc啟動的udp埠,每次探測nc作為server端啟動的udp埠時,會導致對方退出偵聽,有這個bug,對於一些程序啟動的udp埠在使用nc掃描時不會有此bug)
下面,A機器啟動一個udp的埠監聽,埠為9998
在復制的窗口上可以確認已經在監聽了
B機器使用nmap命令去掃描此udp埠,在掃描過程中,導致A機器的nc退出監聽。所以顯示埠關閉了(我推測是掃描時發數據導致的)
nmap -sU 10.0.1.161 -p 9998 -Pn
-sU :表示udp埠的掃描
-Pn :如果伺服器禁PING或者放在防火牆下面的,不加-Pn 參數的它就會認為這個掃描的主機不存活就不會進行掃描了,如果不加-Pn就會像下面的結果一樣,它也會進行提示你添加上-Pn參數嘗試的
注意:如果A機器開啟了防火牆,掃描結果可能會是下面狀態。(不能確定對方是否有監聽9998埠)
既然上面測試無法使用nmap掃描nc作為服務端啟動的埠,我們可以使用nmap掃描其餘的埠
(額,有點跑題了,講nmap的用法了,沒關系,主要為了說明nmap是也可以用來掃描udp埠的,只是掃描nc啟動的埠會導致對方退出埠監聽)
下面,A機器上rpcbind服務,監聽在udp的111埠
在B機器上使用nmap掃描此埠,是正常的檢測到處於open狀態
客戶端測試,測試方法3
nc掃描大量udp埠
掃描過程比較慢,可能是1秒掃描一個埠,下面表示掃描A機器的1到1000埠(暫未發現可以在一行命令中掃描分散的幾個埠的方法)
nc -vuz 10.0.1.161 1-1000
nc用法2,使用nc傳輸文件和目錄
方法1,傳輸文件演示(先啟動接收命令)
使用nc傳輸文件還是比較方便的,因為不用scp和rsync那種輸入密碼的操作了
把A機器上的一個rpm文件發送到B機器上
需注意操作次序,receiver先偵聽埠,sender向receiver所在機器的該埠發送數據。
步驟1,先在B機器上啟動一個接收文件的監聽,格式如下
意思是把賴在9995埠接收到的數據都寫到file文件里(這里文件名隨意取)
nc -l port >file
nc -l 9995 >zabbix.rpm
步驟2,在A機器上往B機器的9995埠發送數據,把下面rpm包發送過去
nc 10.0.1.162 9995 < zabbix-release-2.4-1.el6.noarch.rpm
B機器接收完畢,它會自動退出監聽,文件大小和A機器一樣,md5值也一樣
方法2,傳輸文件演示(先啟動發送命令)
步驟1,先在B機器上,啟動發送文件命令
下面命令表示通過本地的9992埠發送test.mv文件
nc -l 9992 <test.mv
步驟2,A機器上連接B機器,取接收文件
下面命令表示通過連接B機器的9992埠接收文件,並把文件存到本目錄下,文件名為test2.mv
nc 10.0.1.162 9992 >test2.mv
方法3,傳輸目錄演示(方法發送文件類似)
步驟1,B機器先啟動監聽,如下
A機器給B機器發送多個文件
傳輸目錄需要結合其它的命令,比如tar
經過我的測試管道後面最後必須是 - ,不能是其餘自定義的文件名
nc -l 9995 | tar xfvz -
步驟2,A機器打包文件並連接B機器的埠
管道前面表示把當前目錄的所有文件打包為 - ,然後使用nc發送給B機器
tar cfz - * | nc 10.0.1.162 9995
B機器這邊已經自動接收和解壓
nc用法3,測試網速
測試網速其實利用了傳輸文件的原理,就是把來自一台機器的/dev/zero 發送給另一台機器的/dev/null
就是把一台機器的無限個0,傳輸給另一個機器的空設備上,然後新開一個窗口使用dstat命令監測網速
在這之前需要保證機器先安裝dstat工具
yum install -y dstat
方法1,測試網速演示(先啟動接收命令方式)
步驟1,A機器先啟動接收數據的命令,監聽自己的9991埠,把來自這個埠的數據都輸出給空設備(這樣不寫磁碟,測試網速更准確)
nc -l 9991 >/dev/null
步驟2,B機器發送數據,把無限個0發送給A機器的9991埠
nc 10.0.1.161 9991 </dev/zero
在復制的窗口上使用dstat命令查看當前網速,dstat命令比較直觀,它可以查看當前cpu,磁碟,網路,內存頁和系統的一些當前狀態指標。
我們只需要看下面我選中的這2列即可,recv是receive的縮寫,表示接收的意思,send是發送數據,另外注意數字後面的單位B,KB,MB
可以看到A機器接收數據,平均每秒400MB左右
B機器新打開的窗口上執行dstat,看到每秒發送400MB左右的數據
方法2,測試網速演示(先啟動發送命令方式)
步驟1,先啟動發送的數據,誰連接這個埠時就會接收來自zero設備的數據(二進制的無限個0)
nc -l 9990 </dev/zero
步驟2,下面B機器連接A機器的9990埠,把接收的數據輸出到空設備上
nc 10.0.1.161 9990 >/dev/null
同樣可以使用dstat觀察數據發送時的網速
:https://www.cnblogs.com/nmap/p/6148306.html
④ 如何用tcpudp測試工具傳輸文件
劃分為使用TCP埠(面向連接如打電話)和使用UDP埠(無連接如寫信)兩種。網路中可以被命名和定址的通信埠是操作系統的一種可分配資源。由網路OSI(開放系統互聯參考模型,)七層協議可知,傳輸層與網路層最大的區別是傳輸層提供進程通信能力,網路通信的最終地址不僅包括主機地址,還包括可描述進程的某種標識。所以TCP/IP協議提出的協議埠,可以認為是網路通信進程的一種標識符。應用程序(調入內存運行後一般稱為:進程)通過系統調用與某埠建立連接(binding,綁定)後,傳輸層傳給該埠的數據都被相應的進程所接收,相應進程發給傳輸層的數據都從該埠輸出。在TCP/IP協議的實現中,埠操作類似於一般的I/O操作,進程獲取一個埠,相當於獲取本地唯一的I/O文件,可以用一般的讀寫方式訪問類似於文件描述符,每個埠都擁有一個叫埠號的整數描述符,用來區別不同的埠。由於TCP/IP傳輸層的TCP和UDP兩個協議是兩個完全獨立的軟體模塊,因此各自的埠號也相互獨立。如TCP有一個255號埠,UDP也可以有一個255號埠,兩者並不沖突。埠號有兩種基本分配方式:第一種叫全局分配這是一種集中分配方式,由一個公認權威的中央機構根據用戶需要進行統一分配,並將結果公布於眾,第二種是本地分配,又稱動態連接,即進程需要訪問傳輸層服務時,向本地操作系統提出申請,操作系統返回本地唯一的埠號,進程再通過合適的系統調用,將自己和該埠連接起來(binding,綁定)。TCP/IP埠號的分配綜合了以上兩種方式,將埠號分為兩部分,少量的作為保留埠,以全局方式分配給服務進程。每一個標准伺服器都擁有一個全局公認的埠叫周知口,即使在不同的機器上,其埠號也相同。剩餘的為自由埠,以本地方式進行分配。TCP和UDP規定,小於256的埠才能作為保留埠。按埠號可分為3大類:(1)公認埠(WellKnownPorts):從0到1023,它們緊密綁定(binding)於一些服務。通常這些埠的通訊明確表明了某種服務的協議。例如:80埠實際上總是HTTP通訊。(2)注冊埠(RegisteredPorts):從1024到49151。它們鬆散地綁定於一些服務。也就是說有許多服務綁定於這些埠,這些埠同樣用於許多其它目的。例如:許多系統處理動態埠從1024左右開始。(3)動態和/或私有埠(Dynamicand/orPrivatePorts):從49152到65535。理論上,不應為服務分配這些埠。實際上,機器通常從1024起分配動態埠。但也有例外:SUN的RPC埠從32768開始。系統管理員可以"重定向"埠:一種常見的技術是把一個埠重定向到另一個地址。例如默認的HTTP埠是80,不少人將它重定向到另一個埠,如8080。如果是這樣改了,要訪問本文就應改用這個地址.cn:8080。埠漏洞:8080埠可以被各種病毒程序所利用,比如BrownOrifice(BrO)特洛伊木馬病毒可以利用8080埠完全遙控被感染的計算機。另外,RemoConChubo,RingZero木馬也可以利用該埠進行攻擊。操作建議:一般我們是使用80埠進行網頁瀏覽的,為了避免病毒的攻擊,我們可以關閉該埠。埠:21服務:FTP說明:FTP伺服器所開放的埠,用於上傳、下載。最常見的攻擊者用於尋找打開anonymous的FTP伺服器的方法。這些伺服器帶有可讀寫的目錄。木馬DolyTrojan、Fore、InvisibleFTP、WebEx、WinCrash和BladeRunner所開放的埠。埠:22服務:Ssh說明:PcAnywhere建立的TCP和這一埠的連接可能是為了尋找ssh。這一服務有許多弱點,如果配置成特定的模式,許多使用RSAREF庫的版本就會有不少的漏洞存在。埠:23服務:Telnet說明:遠程登錄,入侵者在搜索遠程登錄UNIX的服務。大多數情況下掃描這一埠是為了找到機器運行的操作系統。還有使用其他技術,入侵者也會找到密碼。木馬TinyTelnetServer就開放這個埠。埠:25服務:SMTP說明:SMTP伺服器所開放的埠,用於發送郵件。入侵者尋找SMTP伺服器是為了傳遞他們的SPAM。入侵者的帳戶被關閉,他們需要連接到高帶寬的E-MAIL伺服器上,將簡單的信息傳遞到不同的地址。木馬Antigen、EmailPasswordSender、HaebuCoceda、ShtrilitzStealth、WinPC、WinSpy都開放這個埠。埠:80服務:HTTP說明:用於網頁瀏覽。木馬Executor開放此埠。埠:102服務:Messagetransferagent(MTA)-X.400overTCP/IP說明:消息傳輸代理。埠:109服務:PostOfficeProtocol-Version3說明:POP3伺服器開放此埠,用於接收郵件,客戶端訪問伺服器端的郵件服務。POP3服務有許多公認的弱點。關於用戶名和密碼交換緩沖區溢出的弱點至少有20個,這意味著入侵者可以在真正登陸前進入系統。成功登陸後還有其他緩沖區溢出錯誤。埠:110服務:SUN公司的RPC服務所有埠說明:常見RPC服務有rpc.mountd、NFS、rpc.statd、rpc.csmd、rpc.ttybd、amd等埠:119服務:NetworkNewsTransferProtocol說明:NEWS新聞組傳輸協議,承載USENET通信。這個埠的連接通常是人們在尋找USENET伺服器。多數ISP限制,只有他們的客戶才能訪問他們的新聞組伺服器。打開新聞組伺服器將允許發/讀任何人的帖子,訪問被限制的新聞組伺服器,匿名發帖或發送SPAM。埠:135服務:LocationService說明:Microsoft在這個埠運行DCERPCend-pointmapper為它的DCOM服務。這與UNIX111埠的功能很相似。使用DCOM和RPC的服務利用計算機上的end-pointmapper注冊它們的位置。遠端客戶連接到計算機時,它們查找end-pointmapper找到服務的位置。HACKER掃描計算機的這個埠是為了找到這個計算機上運行ExchangeServer嗎?什麼版本?還有些DOS攻擊直接針對這個埠。埠:137、138、139服務:NETBIOSNameService說明:其中137、138是UDP埠,當通過網上鄰居傳輸文件時用這個埠。而139埠:通過這個埠進入的連接試圖獲得NetBIOS/SMB服務。這個協議被用於windows文件和列印機共享和SAMBA。還有WINSRegisrtation也用它。埠:161服務:SNMP說明:SNMP允許遠程管理設備。所有配置和運行信息的儲存在資料庫中,通過SNMP可獲得這些信息。許多管理員的錯誤配置將被暴露在Internet。Cackers將試圖使用默認的密碼public、private訪問系統。他們可能會試驗所有可能的組合。SNMP包可能會被錯誤的指向用戶的網路埠:177服務:說明:許多入侵者通過它訪問X-windows操作台,它同時需要打開6000埠。埠:389服務:LDAP、ILS說明:輕型目錄訪問協議和共用這一埠。限制埠防非法入侵[分享]一般來說,我們採用一些功能強大的反黑軟體和防火牆來保證我們的系統安全,本文擬用一種簡易的法——通過限制埠來幫助大家防止非法入侵。非法入侵的方式簡單說來,非法入侵的方式可粗略分為4種:1、掃描埠,通過已知的系統Bug攻入主機。2、種植木馬,利用木馬開辟的後門進入主機。3、採用數據溢出的手段,迫使主機提供後門進入主機。4、利用某些軟體設計的漏洞,直接或間接控制主機。非法入侵的主要方式是前兩種,尤其是利用一些流行的黑客工具,通過第一種方式攻擊主機的情況最多、也最普遍;而對後兩種方式來說,只有一些手段高超的黑客才利用,波及面並不廣泛,而且只要這兩種問題一出現,軟體服務商很快就會提供補丁,及時修復系統。對於個人用戶來說,您可以限制所有的埠,因為您根本不必讓您的機器對外提供任何服務;而對於對外提供網路服務的伺服器,我們需把必須利用的埠(比如WWW埠80、FTP埠21、郵件服務埠25、110等)開放,其他的埠則全部關閉。這里,對於採用Windows2000或者WindowsXP的用戶來說,不需要安裝任何其他軟體,可以利用「TCP/IP篩選」功能限制伺服器的埠。具體設置如下:1、右鍵點擊「網上鄰居」,選擇「屬性」,然後雙擊「本地連接」(如果是撥號上網用戶,選擇「我的連接」圖標),彈出「本地連接狀態」對話框。2、點擊[屬性]按鈕,彈出「本地連接屬性」,選擇「此連接使用下列項目」中的「Internet協議(TCP/IP)」,然後點擊[屬性]按鈕。3、在彈出的「Internet協議(TCP/IP)」對話框中點擊[高級]按鈕。在彈出的「高級TCP/IP設置」中,選擇「選項」標簽,選中「TCP/IP篩選」,然後點擊[屬性]按鈕。4、在彈出的「TCP/IP篩選」對話框里選擇「啟用TCP/IP篩選」的復選框,然後把左邊「TCP埠」上的「只允許」選上。這樣,您就可以來自己添加或刪除您的TCP或UDP或IP的各種埠了。添加或者刪除完畢,重新啟動機器以後,您的伺服器就被保護起來了。最後,提醒個人用戶,如果您只上網瀏覽的話,可以不添加任何埠。但是要利用一些網路聯絡工具,比如OICQ的話,就要把「4000」這個埠打開,同理,如果發現某個常用的網路工具不能起作用的時候,請搞清它在您主機所開的埠,然後在「TCP/IP「里把此埠打開以上來源於網路,不過分析得很好了相同點:都處於傳輸層不同點:TCP~面向連接、可靠、傳輸慢、保證數據的順序UDP~面向無連接、不可靠、傳輸快、數據按照不同路徑到,不保證數據順序且兩者傳輸的模式不一樣
⑤ superscan掃描不到UDP埠
題主是否想詢問「superscan掃描不到UDP埠怎麼辦?」安裝一個SuperScan埠掃描工具,因為電腦本身是不帶有掃描功能的,需要一個單獨的掃描工具才可以識別到UDP的埠,並且進行下一步的操作。
⑥ 怎麼在Linux伺服器上測試TCP/UDP埠的連通性
翻譯自:
How to Test Port[TCP/UDP] Connectivity from a Linux Server (文檔 ID 2212626.1)
適用於:
Linux OS - Version Oracle Linux 5.0 to Oracle Linux 6.8 [Release OL5 to OL6U8]
Information in this document applies to any platform.
目標:
在Linux伺服器上檢查TCP/UDP埠的連通性。
解決方案:
telnet和nc 是用來測試埠連通性的一般工具。
telnet可以測試tcp埠的連通性。
nc可以測試tcp和udp埠的連通性。
請確保telnet和nc工具已經安裝
在CODE上查看代碼片派生到我的代碼片
# yum install nc
# yum install telnet
測試tcp埠的連通性:
語法如下:
在CODE上查看代碼片派生到我的代碼片
telnet <hostname/IP address> <port number>
如下是連通成功的例子:
在CODE上查看代碼片派生到我的代碼片
# telnet 192.118.20.95 22
Trying 192.118.20.95...
Connected to 192.118.20.95.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.6.1
Protocol mismatch.
Connection closed by foreign host.
如下是連通不成功的例子:
在CODE上查看代碼片派生到我的代碼片
# telnet 192.118.20.95 22
Trying 192.118.20.95...
telnet: connect to address 192.118.20.95: No route to host
使用nc命令來測試tcp埠的連通性:
語法:
在CODE上查看代碼片派生到我的代碼片
nc -z -v <hostname/IP address> <port number>
如下是連通成功的例子:
在CODE上查看代碼片派生到我的代碼片
# nc -z -v 192.118.20.95 22
Connection to 192.118.20.95 22 port [tcp/ssh] succeeded!
如下是連通不成功的例子:
在CODE上查看代碼片派生到我的代碼片
# nc -z -v 192.118.20.95 22
nc: connect to 192.118.20.95 port 22 (tcp) failed: No route to host
使用nc命令來測試udp埠的連通性:
語法:
在CODE上查看代碼片派生到我的代碼片
nc -z -v -u <hostname/IP address> <port number>
在CODE上查看代碼片派生到我的代碼片
# nc -z -v -u 192.118.20.95 123
Connection to 192.118.20.95 123 port [udp/ntp] succeeded!
nc檢測埠的用法
nc -z -w 10 %IP% %PORT%
-z表示檢測或者掃描埠
-w表示超時時間
-u表示使用UDP協議
⑦ 如何用Scapy寫一個埠掃描器
常見的埠掃描類型有:
1. TCP 連接掃描
2. TCP SYN 掃描(也稱為半開放掃描或stealth掃描)
3. TCP 聖誕樹(Xmas Tree)掃描
4. TCP FIN 掃描
5. TCP 空掃描(Null)
6. TCP ACK 掃描
7. TCP 窗口掃描
8. UDP 掃描
下面先講解每種掃描的原理,隨後提供具體實現代碼。
TCP 連接掃描
客戶端與伺服器建立 TCP 連接要進行一次三次握手,如果進行了一次成功的三次握手,則說明埠開放。
客戶端想要連接伺服器80埠時,會先發送一個帶有 SYN 標識和埠號的 TCP 數據包給伺服器(本例中為80埠)。如果埠是開放的,則伺服器會接受這個連接並返回一個帶有 SYN 和 ACK 標識的數據包給客戶端。隨後客戶端會返回帶有 ACK 和 RST 標識的數據包,此時客戶端與伺服器建立了連接。如果完成一次三次握手,那麼伺服器上對應的埠肯定就是開放的。
當客戶端發送一個帶有 SYN 標識和埠號的 TCP 數據包給伺服器後,如果伺服器端返回一個帶 RST 標識的數據包,則說明埠處於關閉狀態。
代碼:
#! /usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
dst_ip = "10.0.0.1"
src_port = RandShort()
dst_port=80
tcp_connect_scan_resp = sr1(IP(dst=dst_ip)/TCP(sport=src_port,dport=dst_port,flags="S"),timeout=10)
if(str(type(tcp_connect_scan_resp))=="<type 'NoneType'>"):
print "Closed"
elif(tcp_connect_scan_resp.haslayer(TCP)):
if(tcp_connect_scan_resp.getlayer(TCP).flags == 0x12):
send_rst = sr(IP(dst=dst_ip)/TCP(sport=src_port,dport=dst_port,flags="AR"),timeout=10)
print "Open"
elif (tcp_connect_scan_resp.getlayer(TCP).flags == 0x14):
print "Closed"
TCP SYN 掃描
這個技術同 TCP 連接掃描非常相似。同樣是客戶端向伺服器發送一個帶有 SYN 標識和埠號的數據包,如果目標埠開發,則會返回帶有 SYN 和 ACK 標識的 TCP 數據包。但是,這時客戶端不會返回 RST+ACK 而是返回一個只帶有 RST 標識的數據包。這種技術主要用於躲避防火牆的檢測。
如果目標埠處於關閉狀態,那麼同之前一樣,伺服器會返回一個 RST 數據包。
代碼:
#! /usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
dst_ip = "10.0.0.1"
src_port = RandShort()
dst_port=80
stealth_scan_resp = sr1(IP(dst=dst_ip)/TCP(sport=src_port,dport=dst_port,flags="S"),timeout=10)
if(str(type(stealth_scan_resp))=="<type 'NoneType'>"):
print "Filtered"
elif(stealth_scan_resp.haslayer(TCP)):
if(stealth_scan_resp.getlayer(TCP).flags == 0x12):
send_rst = sr(IP(dst=dst_ip)/TCP(sport=src_port,dport=dst_port,flags="R"),timeout=10)
print "Open"
elif (stealth_scan_resp.getlayer(TCP).flags == 0x14):
print "Closed"
elif(stealth_scan_resp.haslayer(ICMP)):
if(int(stealth_scan_resp.getlayer(ICMP).type)==3 and int(stealth_scan_resp.getlayer(ICMP).code) in [1,2,3,9,10,13]):
print "Filtered"
TCP 聖誕樹(Xmas Tree)掃描
在聖誕樹掃描中,客戶端會向伺服器發送帶有 PSH,FIN,URG 標識和埠號的數據包給伺服器。如果目標埠是開放的,那麼不會有任何來自伺服器的回應。
如果伺服器返回了一個帶有 RST 標識的 TCP 數據包,那麼說明埠處於關閉狀態。
但如果伺服器返回了一個 ICMP 數據包,其中包含 ICMP 目標不可達錯誤類型3以及 ICMP 狀態碼為1,2,3,9,10或13,則說明目標埠被過濾了無法確定是否處於開放狀態。
代碼:
#! /usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
dst_ip = "10.0.0.1"
src_port = RandShort()
dst_port=80
xmas_scan_resp = sr1(IP(dst=dst_ip)/TCP(dport=dst_port,flags="FPU"),timeout=10)
if (str(type(xmas_scan_resp))=="<type 'NoneType'>"):
print "Open|Filtered"
elif(xmas_scan_resp.haslayer(TCP)):
if(xmas_scan_resp.getlayer(TCP).flags == 0x14):
print "Closed"
elif(xmas_scan_resp.haslayer(ICMP)):
if(int(xmas_scan_resp.getlayer(ICMP).type)==3 and int(xmas_scan_resp.getlayer(ICMP).code) in [1,2,3,9,10,13]):
print "Filtered"
TCP FIN掃描
FIN 掃描會向伺服器發送帶有 FIN 標識和埠號的 TCP 數據包。如果沒有伺服器端回應則說明埠開放。
如果伺服器返回一個 RST 數據包,則說明目標埠是關閉的。
如果伺服器返回了一個 ICMP 數據包,其中包含 ICMP 目標不可達錯誤類型3以及 ICMP 代碼為1,2,3,9,10或13,則說明目標埠被過濾了無法確定埠狀態。
代碼:
#! /usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
dst_ip = "10.0.0.1"
src_port = RandShort()
dst_port=80
fin_scan_resp = sr1(IP(dst=dst_ip)/TCP(dport=dst_port,flags="F"),timeout=10)
if (str(type(fin_scan_resp))=="<type 'NoneType'>"):
print "Open|Filtered"
elif(fin_scan_resp.haslayer(TCP)):
if(fin_scan_resp.getlayer(TCP).flags == 0x14):
print "Closed"
elif(fin_scan_resp.haslayer(ICMP)):
if(int(fin_scan_resp.getlayer(ICMP).type)==3 and int(fin_scan_resp.getlayer(ICMP).code) in [1,2,3,9,10,13]):
print "Filtered"
TCP 空掃描(Null)
在空掃描中,客戶端發出的 TCP 數據包僅僅只會包含埠號而不會有其他任何的標識信息。如果目標埠是開放的則不會回復任何信息。
如果伺服器返回了一個 RST 數據包,則說明目標埠是關閉的。
如果返回 ICMP 錯誤類型3且代碼為1,2,3,9,10或13的數據包,則說明埠被伺服器過濾了。
代碼:
#! /usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
dst_ip = "10.0.0.1"
src_port = RandShort()
dst_port=80
null_scan_resp = sr1(IP(dst=dst_ip)/TCP(dport=dst_port,flags=""),timeout=10)
if (str(type(null_scan_resp))=="<type 'NoneType'>"):
print "Open|Filtered"
elif(null_scan_resp.haslayer(TCP)):
if(null_scan_resp.getlayer(TCP).flags == 0x14):
print "Closed"
elif(null_scan_resp.haslayer(ICMP)):
if(int(null_scan_resp.getlayer(ICMP).type)==3 and int(null_scan_resp.getlayer(ICMP).code) in [1,2,3,9,10,13]):
print "Filtered"
TCP ACK掃描
ACK 掃描不是用於發現埠開啟或關閉狀態的,而是用於發現伺服器上是否存在有狀態防火牆的。它的結果只能說明埠是否被過濾。再次強調,ACK 掃描不能發現埠是否處於開啟或關閉狀態。
客戶端會發送一個帶有 ACK 標識和埠號的數據包給伺服器。如果伺服器返回一個帶有 RST 標識的 TCP 數據包,則說明埠沒有被過濾,不存在狀態防火牆。
如果目標伺服器沒有任何回應或者返回ICMP 錯誤類型3且代碼為1,2,3,9,10或13的數據包,則說明埠被過濾且存在狀態防火牆。
#! /usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
dst_ip = "10.0.0.1"
src_port = RandShort()
dst_port=80
ack_flag_scan_resp = sr1(IP(dst=dst_ip)/TCP(dport=dst_port,flags="A"),timeout=10)
if (str(type(ack_flag_scan_resp))=="<type 'NoneType'>"):
print "Stateful firewall presentn(Filtered)"
elif(ack_flag_scan_resp.haslayer(TCP)):
if(ack_flag_scan_resp.getlayer(TCP).flags == 0x4):
print "No firewalln(Unfiltered)"
elif(ack_flag_scan_resp.haslayer(ICMP)):
if(int(ack_flag_scan_resp.getlayer(ICMP).type)==3 and int(ack_flag_scan_resp.getlayer(ICMP).code) in [1,2,3,9,10,13]):
print "Stateful firewall presentn(Filtered)"
TCP窗口掃描
TCP 窗口掃描的流程同 ACK 掃描類似,同樣是客戶端向伺服器發送一個帶有 ACK 標識和埠號的 TCP 數據包,但是這種掃描能夠用於發現目標伺服器埠的狀態。在 ACK 掃描中返回 RST 表明沒有被過濾,但在窗口掃描中,當收到返回的 RST 數據包後,它會檢查窗口大小的值。如果窗口大小的值是個非零值,則說明目標埠是開放的。
如果返回的 RST 數據包中的窗口大小為0,則說明目標埠是關閉的。
代碼:
#! /usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
dst_ip = "10.0.0.1"
src_port = RandShort()
dst_port=80
window_scan_resp = sr1(IP(dst=dst_ip)/TCP(dport=dst_port,flags="A"),timeout=10)
if (str(type(window_scan_resp))=="<type 'NoneType'>"):
print "No response"
elif(window_scan_resp.haslayer(TCP)):
if(window_scan_resp.getlayer(TCP).window == 0):
print "Closed"
elif(window_scan_resp.getlayer(TCP).window > 0):
print "Open"
UDP掃描
TCP 是面向連接的協議,而UDP則是無連接的協議。
面向連接的協議會先在客戶端和伺服器之間建立通信信道,然後才會開始傳輸數據。如果客戶端和伺服器之間沒有建立通信信道,則不會有任何產生任何通信數據。
無連接的協議則不會事先建立客戶端和伺服器之間的通信信道,只要客戶端到伺服器存在可用信道,就會假設目標是可達的然後向對方發送數據。
客戶端會向伺服器發送一個帶有埠號的 UDP 數據包。如果伺服器回復了 UDP 數據包,則目標埠是開放的。
如果伺服器返回了一個 ICMP 目標不可達的錯誤和代碼3,則意味著目標埠處於關閉狀態。
如果伺服器返回一個 ICMP 錯誤類型3且代碼為1,2,3,9,10或13的數據包,則說明目標埠被伺服器過濾了。
但如果伺服器沒有任何相應客戶端的 UDP 請求,則可以斷定目標埠可能是開放或被過濾的,無法判斷埠的最終狀態。
代碼:
#! /usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
dst_ip = "10.0.0.1"
src_port = RandShort()
dst_port=53
dst_timeout=10
def udp_scan(dst_ip,dst_port,dst_timeout):
udp_scan_resp = sr1(IP(dst=dst_ip)/UDP(dport=dst_port),timeout=dst_timeout)
if (str(type(udp_scan_resp))=="<type 'NoneType'>"):
retrans = []
for count in range(0,3):
retrans.append(sr1(IP(dst=dst_ip)/UDP(dport=dst_port),timeout=dst_timeout))
for item in retrans:
if (str(type(item))!="<type 'NoneType'>"):
udp_scan(dst_ip,dst_port,dst_timeout)
return "Open|Filtered"
elif (udp_scan_resp.haslayer(UDP)):
return "Open"
elif(udp_scan_resp.haslayer(ICMP)):
if(int(udp_scan_resp.getlayer(ICMP).type)==3 and int(udp_scan_resp.getlayer(ICMP).code)==3):
return "Closed"
elif(int(udp_scan_resp.getlayer(ICMP).type)==3 and int(udp_scan_resp.getlayer(ICMP).code) in [1,2,9,10,13]):
return "Filtered"
print udp_scan(dst_ip,dst_port,dst_timeout)
下面解釋下上述代碼中的一些函數和變數:
RandShort():產生隨機數
type():獲取數據類型
sport:源埠號
dport:目標埠號
timeout:等待相應的時間
haslayer():查找指定層:TCP或UDP或ICMP
getlayer():獲取指定層:TCP或UDP或ICMP
以上掃描的概念可以被用於「多埠掃描」,源碼可以參考這里:https://github.com/interference-security/Multiport
Scapy 是一個非常好用的工具,使用它可以非常簡單的構建自己的數據包,還可以很輕易的處理數據包的發送和相應。
(譯者註:上述所有代碼均在Kali 2.0下測試通過,建議讀者在Linux環境下測試代碼,如想在Windows上測試,請參見 Scapy官方文檔 配置好scapy環境)
⑧ 求助高手vb6.0用winsock的TCP/UDP進行埠掃描和一對多通訊的問題怎麼解決
Private Sub Form_Load()
'將 LocalPort 屬性設置為一個整數。然後調用 Listen 方法。
tcpServer.LocalPort = 1001
tcpServer.Listen
frmClient.Show '顯示客戶端的窗體。
End Sub
Private Sub tcpServer_ConnectionRequest _
(ByVal requestID As Long)
'檢查控制項的 State 屬性是否為關閉的。如果不是,在接受新的連接之前先關閉此連接。
If tcpServer.State <> sckClosed Then
tcpServer.Close
End If
'接受具有 requestID 參數的連接。
tcpServer.Accept requestID
End Sub
Private Sub txtSendData_Change()
'名為 txtSendData 的 TextBox 控制項中
'包含了要發送的數據。當用戶往文本框中鍵入數據時,使用 SendData 方法發送輸入的字元串。
tcpServer.SendData txtSendData.Text
End Sub
Private Sub tcpServer_DataArrival _
(ByVal bytesTotal As Long)
'為進入的數據聲明一個變數。
'調用 GetData 方法,並將數據賦予名為 txtOutput的 TextBox 的 Text 屬性。
Dim strData As String
tcpServer.GetData strData
txtOutPut.Text = strData
End Sub
frmClient:
Private Sub Form_Load()
'Winsock 控制項的名字為 tcpClient。
'注意:要指定遠程主機,可以使用
' IP 地址(例如:"121.111.1.1"),也可以使用
'計算機的「好聽的名字」如下所示。
tcpClient.RemoteHost = "127.0.0.1"
tcpClient.RemotePort = 1001
End Sub
Private Sub cmdConnect_Click()
'調用 Connect 方法,初始化連接。
tcpClient.Connect
End Sub
Private Sub txtSend_Change()
tcpClient.SendData txtSend.Text
End Sub
Private Sub tcpClient_DataArrival _
(ByVal bytesTotal As Long)
Dim strData As String
tcpClient.GetData strData
txtOutPut.Text = strData
End Sub
⑨ 向一個沒有監聽UDP的埠發送UDP數據,伺服器怎麼回應
首先在UDP上講,伺服器是不會發送任何響應的,畢竟沒有任何程序應該響應它。但是在某些系統中,會對對方發送一個表達"數據不可達"的ICMP報文。由此可以製造出UDP埠掃描工具
⑩ 什麼是埠探查
就是掃描一下埠。
埠掃描的原理就是通過往某一個IP發送制定的網路信息
設置的埠數目
比如 1-8000埠 發送數據
返回正常代表埠存在。
在網路技術中,埠(Port)大致有兩種意思:一是物理意義上的埠,比如,ADSL Modem、集線器、交換機、路由器用於連接其他網路設備的介面,如RJ-45埠、SC埠等等。二是邏輯意義上的埠,一般是指TCP/IP協議中的埠,埠號的范圍從0到65535,比如用於瀏覽網頁服務的80埠,用於FTP服務的21埠等等。我們這里將要介紹的就是邏輯意義上的埠。
埠掃描原理
"埠掃描"通常指用同一信息對目標計算機的所有所需掃描的埠進行發送,然後根據返回埠狀態來分析目標計算機的埠是否打開、是否可用。"埠掃描"行為的一個重要特徵是:在短時期內有很多來自相同的信源地址傳向不同的目的地埠的包。
對於用埠掃描進行攻擊的人來說,攻擊者總是可以做到在獲得掃描結果的同時,使自己很難被發現或者說很難被逆向跟蹤。為了隱藏攻擊,攻擊者可以慢慢地進行掃描。除非目標系統通常閑著(這樣對一個沒有listen埠的數據包都會引起管理員的注意),有很大時間間隔的埠掃描是很難被識別的。隱藏源地址的方法是發送大量的欺騙性的埠掃描包(1000個),其中只有一個是從真正的源地址來的。這樣,即使全部包(1000)都被察覺,被記錄下來,也沒有人知道哪個是真正的信源地址。能發現的僅僅是"曾經被掃描過"。也正因為這樣那些黑客們才樂此不彼地繼續大量使用這種埠掃描技術來達到他們獲取目標計算機信息、並進行惡意攻擊。
通常進行埠掃描的工具目前主要採用的是埠掃描軟體,也通稱之為"埠掃描器",埠掃描可以為提供三個用途:
(1)識別目標系統上正在運行的TCP協議和UDP協議服務。
(2)識別目標系統的操作系統類型(Windows 9x, Windows
NT,或UNIX,等)。
(3)識別某個應用程序或某個特定服務的版本號。
埠掃描器是一種自動檢測遠程或本地計算機安全性弱點的程序,通過使用掃描器你可不留痕跡的發現遠程伺服器的各種TCP協議埠的分配及提供的服務,還可以得知它們所使用的軟體版本!這就能讓間接的了解到遠程計算機所存在的安全問題。
埠掃描器通過選用遠程TCP/IP協議不同的埠的服務,記錄目標計算機埠給予的回答的方法,可以搜集到很多關於目標計算機的各種有用信息(比如:是否有端口在偵聽?是否允許匿名登陸?是否有可寫的FTP目錄,是否能用TELNET等。
埠掃描器並不是一個直接攻擊網路漏洞的程序,它僅僅能幫助發現目標機的某些內在的弱點。一個好的掃描器還能對它得到的數據進行分析,幫助查找目標計算機的漏洞。但它不會提供一個系統的詳細步驟。
埠掃描器在掃描過程中主要具有以下三個方面的能力:
(1) 發現一個計算機或網路的能力;
(2)
一旦發現一台計算機,就有發現目標計算機正在運行什麼服務的能力;
(3)
通過測試目標計算機上的這些服務,發現存在的漏洞的能力。
編寫掃描器程序必須要很多TCP/IP協議程序編寫和C,Perl和或SHELL語言的知識。需要一些Socket編程的背景,一種在開發客戶/服務應 埠服務。)。