如何利用殭屍掃描來發現服務器的開放端口

請輸入圖片描述

0x00:簡介

滲透測試信息蒐集階段,在發現目標服務器所開放端口時,掃描方式可分爲三種,分別是:隱蔽掃描,全鏈接掃描和殭屍掃描。

全鏈接掃描:即正常的請求,過程包含了三次握手,判斷端口開放的依據是第三次握手返回的信息是否爲 FIN/ACK。

請輸入圖片描述

隱蔽掃描:即只發送第一次握手的 SYN 包,判斷端口開放的依據是返回的信息是否爲 SYN/ACK,如果爲 SYN/ACK 則端口開放,否則爲未開放狀態。未開放時會返回 RST/ACK 的信息。

請輸入圖片描述

殭屍掃描:即用殭屍機(非自己的機器)對目標服務器進行端口探測,因爲使用的爲殭屍機,所以其隱蔽性高,追查不到自己的 IP,利用程度比隱蔽掃描和全鏈接掃描要大。

0x01:原理

殭屍掃描可分爲自己的機器、殭屍機和目標服務器。

請輸入圖片描述

第一步:掃描者直接向殭屍機發送第二次握手包,即 SYN/ACK,類似於隱蔽掃描,直接發送 SYN/ACK,殭屍機會返回一個 RST 包,RST 包中包含了 ipid 參數,此參數爲數據包的序列號,記錄此序列號,例如爲 x。

第二步:掃描者僞造自己的 ip 爲殭屍機的 ip,向目標服務器發送第一次握手包 SYN,發送後就關閉了鏈接,這時的目標服務器收到的是一個不正常的 SYN 包。

第三步:端口開放的情況,當目標服務器端口開放時,收到 SYN 後會返回一個 SYN/ACK,這個包是返回給殭屍機的,因爲 SYN 是自己僞造殭屍機發的,所以殭屍機會直接返回一個 RST,此時 RST 的序號爲 x+1.

第四步:端口關閉的情況,當目標服務器只收到一個 SYN 時,因爲沒有完整的後續握手,所以會返回一個 RST 包。因爲這時的殭屍機直接收到了一個 RST 包,所以後面不會再有發送其他握手包的情況,此時包序號還停留在 x。

第五步:掃描者再次直接向殭屍機發送 SYN/ACK 包,不完整的握手,還是類似於隱蔽掃描,所以殭屍機會直接返回 RST 包,此時 RST 的 ipid 序號如果是 x+1,則證明目標端口是未開放的狀態。如果是 x+2,則證明收到過目標機的 SYN/ACK 包,目標端口是開放狀態。

以上爲殭屍掃描的流程和原理,整個過程需要一個基礎就是殭屍機是一個足夠空閒的狀態,不會產生其他的數據包通信且 ipid 序號是遞增的。因爲這一點,殭屍掃描的難度大,且難利用,ipid 遞增的機器有 xp、2000、2003 等。

殭屍掃描特點爲:極度隱蔽、實施條件苛刻、可僞造源地址、需要一個殭屍機、殭屍機爲空閒系統、殭屍機的 ipid 爲遞增。

0x02:實驗

環境用來掃描的機器是 kali(ip 爲 103),win2003 爲殭屍機(ip 爲 105),metasploitable 爲目標機(ip 爲 104)。首先用 scapy 庫來實現殭屍掃描發現端口這個過程。

kali 命令行輸入 scapy 進入 scapy 環境,構造一個 SYN/ACK 包發送給殭屍機。其命令如下:

請輸入圖片描述

其中通過 IP 頭和 TCP 頭組合了一個請求包,dst 爲目標 ip 地址,也就是殭屍機的 ip 地址。dport 爲目標端口,這裏使用的是 445,445 爲 windows 中的文件共享服務,一般都是開放的狀態。最後通過 display 來查看組合好的請求包。

有了殭屍機的請求包後,需要再有一個給目標機發送的請求包。其命令如下:

請輸入圖片描述

其中 src 指定的就是發送的源地址,這裏就是僞造自己爲殭屍機的 ip,檢測的是目標服務器的 21 端口。請求包都配置完畢後,按照殭屍掃描流程,首先發送的是殭屍機,其次是目標服務器,最後需要再發一次殭屍機,在 scapy 中,發包命令使用 sr1,三次發包執行如下:

請輸入圖片描述

可以通過殭屍掃描流程圖然後對比上面的命令執行結果圖來更清晰的去理解整個過程。首先使用 sr1(rz) 命令發送了殭屍機包,可以看到 id 爲 108,其返回的 flags 爲 SA,即 SYN/ACK。其次使用 sr1(rt) 發送了目標服務器包,最後再一次向殭屍機發送了請求包。這裏需要注意的是,最後一次請求包的 id 爲 110,差爲 2,證明目標服務器 21 端口爲開放狀態。

上面爲目標端口的開放狀態,下面看一下端口未開放時 scapy 的執行過程,發送給殭屍機的包不變,需要改的是發送給目標服務器的端口號,如下圖所示:

請輸入圖片描述

檢測目標服務器的 33 端口,33 端口爲關閉狀態。發送過程同上,執行過程如下:

請輸入圖片描述

第一次給殭屍機發送的數據包返回結果中 id 爲 146,然後向目標服務器發送的數據包返回結果中 flags 不再是 SA,而變成了 RA。最後再一次像殭屍機發送的數據包其返回結果中 id 爲 147,與第一次的差值比爲 1,則證明目標端口爲關閉狀態。

scapy 通過殭屍掃描方式去發現目標服務器端口可以通過 python 腳本來實現批量檢測,其示例腳本如下:

#!/usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *

def ipid(zombie):
    reply1 = sr1(IP(dst=zombie)/TCP(flags="SA"),timeout=2,verbose=0)
    send(IP(dst=zombie)/TCP(flags="SA"),verbose=0)
    reply2 = sr1(IP(dst=zombie)/TCP(flags="SA"),timeout=2,verbose=0)
    if reply2[IP].id == (reply1[IP].id + 2):
        print "IPID sequence is incremental and target appears to be idle. zombie located"
        reponse = raw_input("Do you want to use this zombie to perform a scan? (Y or N):")
    if reponse == "Y":
        target = raw_input("Enter the IP address of the target system:")
        zombiescan(target,zombie)
    else:
        print "Either the IPID sequence is not incremental or the target is not idle. not a good zombie"

def zombiescan(target,zombie):
    print "\nScanning target " + target + " with zombie " + zombie
    print "\n----------Open Ports on Target----------\n"
    for port in range(1,100):
        try:
            start = sr1(IP(dst=zombie)/TCP(flags="SA",dport=port),timeout=2,verbose=0)
            send(IP(src=zombie,dst=target)/TCP(flags="S",dport=port),verbose=0)
            end = sr1(IP(dst=zombie)/TCP(flags="SA"),timeout=2,verbose=0)
            if end[IP].id == (start[IP].id + 2):
                print port
        except:
            pass

print "----------Zombie Scan Suite----------\n"
print "1 - Identify Zombie Host\n"
print "2 - Perform Zombie Scan\n"
ans = raw_input("Select an Option (1 or 2): ")
if ans == "1":
    zombie = raw_input("Enter IP address to test IPID sequence: ")
    ipid(zombie)
else:
    if ans == "2":
        zombie = raw_input("Enter IP address for zombie system: ")
        target = raw_input("Enter IP address for scan target: ")
        zombiescan(target,zombie)

以上腳本中 ipid 函數是檢測一個機器是否是一個合格的殭屍機,檢測方式是通過 id 的序號來進行判斷。zombiescan 函數爲殭屍掃描函數,和前面的 scapy 命令行執行流程一樣,腳本中指定了掃描端口的範圍爲 1-100。

使用過程:運行腳本首先會打印 1 爲殭屍機檢測,2 爲殭屍掃描,然後根據需求選擇 1 或 2,1 需要輸入殭屍機的 ip,2 則需要輸入殭屍機 ip 和目標機器的 ip。在殭屍機檢測完後如果合格,則會告訴你殭屍機合格,是否要進行掃描,輸入 Y 則會跳到 zombiescan 函數,其執行過程如下:

請輸入圖片描述

運行腳本後,目標服務器的 1-100 範圍的端口如果在線,則會被打印出來。爲了更清晰的瞭解殭屍掃描的過程,其腳本執行時通過 wireshark 抓包部分過程如下:

請輸入圖片描述

對於殭屍掃描,除了使用 scapy 外,nmap 也具有此檢測功能,且使用更爲簡單和方便。在檢測一個機器是否爲合格殭屍機時,nmap 提供了 ipidseq 腳本,其使用方法如下:

請輸入圖片描述

掃描結果除列出端口的開放情況和端口的服務外,也有主機的 mac 信息和系統信息,最後給出了是否可以作爲一個殭屍機,ipidseq 給出的值爲 incremental,incremental 翻譯爲遞增的意思,即表示 ipid 爲遞增,代表其合格。有了合格的殭屍機後,再次使用 nmap 進行端口發現,主要用到的參數是 sI,sI 用來指定殭屍機的 ip 地址,參數說明如下:

請輸入圖片描述

命令格式爲:nmap 192.168.123.104 -sI 192.168.123.105 -Pn -p 0-100,執行結果如下:

請輸入圖片描述

其結果和上一個 scapy 檢測結果一致。nmap 殭屍檢測端口 wireshark 抓包如下:

請輸入圖片描述

0x03:總結

在端口掃描的三種方式中,殭屍掃描是最隱蔽的一種方式,但執行難度也較高。

確認目標端口的開放情況時,不建議使用一種掃描方式的結果爲標準,建議使用多種不同的發現方式,每一種方式都會存在多多少少的誤差,並非準確無誤,在多種方式的掃描結果下,最後做總結,確定端口的開放情況。

公衆號回覆數字“8”領取CIS加固全套手冊。

微 信:fageweiketang,朋友圈不定期乾貨分享,歡迎討論。

公衆號:發哥微課堂,專注於代碼審計、WEB滲透、網絡安全。

                     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章