UDP端口掃描:
原理:回應ICMP不可達,代表端口關閉;沒有回應,端口開啟
建議了解應用層的UDP包頭結構,構建對應的UDP數據包用來提高准確度
另外:所有的掃描都存在誤判情況
我們用Scapy寫個腳本來試試:
#!/usr/bin/python import logging logging.getLogger("scapy.runtime").setLevel(logging.ERROR) from scapy.all import * import time import sys if len(sys.argv) != 4: print "./udp_scan.py [target ip] [first port] [last port]" print "example ./udp_scan.py 10.0.0.5 1 100" print "example will UDP port scan ports 1 to 100 on 10.0.0.5" ip = sys.argv[1] start = int(sys.argv[2]) end = int(sys.argv[3]) for port in range(start, end): a = sr1(IP(dst=ip) / UDP(dport=port), timeout=5, verbose=0) time.sleep(1) if a == None: print port else: pass
如果是從WINDOWS復制過去的
vi udp_scan.py
:set fileformat=unix
:wq
chmod u+x udp_scan.py
執行:./udp_scan.py 10.0.0.0 1 100
接下來看看使用最強大的Nmap:
Nmap在端口掃描方面使用-sU參數
而我們使用Nmap如果不指定任何端口的話,他會掃描定義好的1000個常用端口
當然也可以指定端口掃描:
如果你一定要掃描全部端口,也是可以的:
好的,接下來我們看TCP端口掃描:
基於連接協議掃描:
所有的掃描都是基於三次握手的變化來判斷目標端口狀態
首先我們先用SCAPY演示:
我開啟一個Metasploitable的虛擬機,查看到它的IP:192.168.22.129
再查看下Kali虛擬機的IP:192.168.22.130
打開Scapy測試:
我們主動發一個SYN包,只要回應SYN+ACK包,就代表端口開啟,
我們不能繼續回應ACK包,而要回復RST斷開連接防止被發現!
第一行的意思是發送一個TCP數據包將返回值賦給a
然后我們查看下這個a包:發現默認掃描80端口,並且返回SYN+ACK
我們為什么這里不主動回RST包呢?
原因:可以抓包發現,操作系統會自動回復給"莫名其妙"的TCP包RST
接下來我們換個端口掃描:22
這種情況也說明這里的22端口是開放的
那么如果我們掃描一個關閉的端口呢?
發現目標機器回復的是一個RST+ACK
代表:這台機器是活着的,但是當前掃描的端口(22222)是沒有開放的
我們在scapy的基礎上寫一個簡單的掃描腳本:syn_scan.py
#!/usr/bin/python import logging logging.getLogger("scapy.runtime").setLevel(logging.ERROR) from scapy.all import * import time import sys if len(sys.argv) != 4: print "./syn_scan.py [target ip] [first port] [last port]" print "example ./udp_scan.py 10.0.0.5 1 100" print "example will TCP SYN scan ports 1 to 100 on 10.0.0.5" ip = sys.argv[1] start = int(sys.argv[2]) end = int(sys.argv[3]) for port in range(start, end): a = sr1(IP(dst=ip) / TCP(dport=port), timeout=1, verbose=0) time.sleep(1) if a == None: pass else: if int(a[TCP].flags)==18: print port else: pass
難點:這里為什么flags==18?
抓包發現SYN和ACK分別是2和2的4次方即為16,加在一起恰好為18
使用這個腳本:
老規矩,如果是windows轉移過去的:
vi syn_scan.py
:set fileformat=unix
:wq
chmod u+x syn_scan.py
執行:./syn_scan.py 10.0.0.0 1 100
這里並沒有掃描完全,不過效果達到了(如果掃windows端口,1-100不會有任何開放端口)
隱蔽端口掃描這種方式其實比UDP的方式穩多了
當然,強大的Nmap也可以實現:而且效率更高
不過掃描原理就是上邊寫的內容
無參數掃描:
使用后發現比自己搞的腳本快太多,而且完善,真不愧是強大的Nmap
這里我們掃描的機器沒有防火牆,所以掃描到的端口都是open的,如果存在close或filter,我們需要一個參數才能獲取open的端口
nmap還可以加上一個參數:-sS:
其實和默認方式是一樣的,所以直接使用即可
如果需要全部掃描:nmap [ip] -p -65535
如果需要掃描指定端口:nmap [ip] -p 80,22,...,139
其他端口掃描方式:
Hping3:
-S表示用SYN掃描,flags的S,A當然就代表SYN和ACK了
下面來個有趣的:
先解釋下這行命令:-c 100發送一百個包,和-p ++1組合,意味對端口1-100分別發送SYN包,
有趣在--spoof參數,偽造源IP地址,我這台機器無法查看掃描結果,只有我登陸偽造的192.168.168.168機器才可以查看結果。
其實下邊這十幾行都沒有用
這種方式有很大的優點也有很大的缺點:
優點:非常隱蔽,基本不會被發現,在目標看來是另外一個機器發送的探測數據包
缺點:麻煩,需要另外一台機器
上邊的都是TCP半連接端口掃描
接下來,看看TCP全連接端口掃描:
下一篇博客我們繼續: