Kali學習筆記9:端口掃描詳解(上)


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全連接端口掃描:

 

下一篇博客我們繼續:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM