殭屍掃描
一個合格的殭屍機是實現殭屍掃描的關鍵因素,殭屍至少要保證在進行掃描階段不會產生其它的IP包,即是不會與我們主機之外的任何機器進行第三層的IP通訊,至少在我們控制其進行掃描的階段不可以,否則將直接導致IPID的數值增大
何為合適的殭屍機:1)足夠閒置;2)它的IPID必須是遞增的,0和隨機都不可以。然而現在大部分主流的OS的IPID都是隨機產生的,但是早期的xp,比如xp2000,xp2003都是遞增的IPID。
殭屍掃描的過程
三次握手:
殭屍掃描過程:
掃描者主機對Zombie(殭屍機)傳送SYN/ACK包,然後Zombie(假設此時系統產生的IPID為x)會回給主機一個RST,主機將會得到Zombie的IPID,然後掃描主機向目標機器傳送一個SYN包,有所不同的是,此時掃描主機會偽造一個偽裝成Zombie的IP(即是x)向目標主機發送SYN包。如果目標的埠開放,便會向Zombie返回一個SYN/ACK包,但是Zombie並沒有傳送任何包,zombie會向目標主機發送RST,此時Zombie的IPID將會增加1:x+1,最後,掃描者主機對Zombie(殭屍機)傳送SYN/ACK包,然後Zombie會回給主機一個RST,此時IPID=x+2
若果目標主機的埠並未開放,那麼目標主機也會向Zombie傳送一個RST,但是Zombie收到RST包不會有任何反應,所以IPID不會改變(依舊是x)。最後掃描者主機再向Zombie傳送一個SYN/ACK,同樣的Zombie會向掃描者主機發送一個RST包,此時Zombie的IPID將變成(x+1).通過IPID的數值來判斷目標機器的埠是否開放
測試
掃描主機 kali: ip:192.168.0.5
zombie kali: ip:192.168.0.6
目標主機 Windows: ip:192.168.0.7
scapy實現殭屍掃描
構造request zombie包:
>>> i=IP() #構造ip包頭 >>> t=TCP() #構造tcp包頭 >>> rz=(i/t) #request_zombie,構造傳送給殭屍機的資料包,將傳送給zombie Kali >>> rt=(i/t) #request_target,構造傳送給目標主機的資料包,將傳送給windows >>> rz[IP].dst="192.168.0.6"//定義zombie的ip地址 >>> rz[TCP].dport=445 //定義傳送到zombie的埠,務必確保這個埠是開啟的埠,445埠是win中預設開啟的 >>> rz[TCP].flags="SA"//定義向zombie傳送的資料包是SYN/ACK包
構造request target包:
>>> rt[IP].src="192.168.0.6"//定義rt包的源ip地址,直接偽造為zombie Kali的IP >>> rt[IP].dst="192.168.0.7"//定義rt包的目的ip,就是目標windows的IP >>> rt[TCP].dport=25//定義rt包掃描的埠 >>> rt[TCP].flags="S"//定義傳送的rt包為SYN包
然後將會發送兩次rz包,一次rt包,最後在對結果進行分析。
>>>az1=sr1(rz) #向zombie發第一個包 Begin emission: Finished to send 1 packets. * Received 1 packets, got 1 answers, remaining 0 packets >>>at=sr1(rt,timeout=1) #向目標機發包,由於我們不會收到回包,因為給zombie了,所以需要設定超時時間 Begin emission: Finished to send 1 packets. * Received 1 packets, got 1 answers, remaining 0 packets >>>az2=sr1(rz) #向zombie傳送第二個包 Begin emission: Finished to send 1 packets. * Received 1 packets, got 1 answers, remaining 0 packets
分析az1與az2的IPID:
>>> az1 <IPversion=4L ihl=5L tos=0x0 len=40 id=436 flags= frag=0L ttl=128 src=192.168.0.6 dst=192.168.0.5 options=[] >>> az2 <IPversion=4L ihl=5L tos=0x0 len=40 id=438 f proto=tcp chksum=0xac5 src=192.168.0.6 dst=192.168.0.5
通過分析發現目標的25是開放的。
Python指令碼實現殭屍掃描
import logging logging.getLogger("scapy.runtime").setLevel(logging.ERROR) from scapy.all import * def ipid(zombie):#定義一個ipid函式,同時定義一個zombie變數。該函式的作用是探測一主機是否可以作為殭屍機 reply1 = sr1(IP(dst=zombie)/TCP(flags="SA"), timeout=2,verbose=0)#向zombie傳送一個syn/ack包 send(IP(dst=zombie)/TCP(flags="SA"),verbose=0)#send()與sr1()方法的區別是:sr1傳送出去一個包以後會在接收對方的一個回包,而send方法不會接收包 reply2 = sr1(IP(dst=zombie)/TCP(flags="SA"),timeout=2,verbose=0)#緊接著在向殭屍機發送一個syn/ack包 if reply2[IP].id == (reply1[IP].id+2):#根據傳送的三個來判斷殭屍機是否足夠空閒,並且ipid序號是否為遞增的。 print("IPID secquence is incremental and target appears to be idle,ZOMBIE LOCATED") response = raw_input("Do you want to use this zombie to perform a scan?(Y or N):") if response == "Y": #是否使用該殭屍機執行掃描 target = raw_input("Enter the IP address of the target system:") #輸入要掃描的目標主機ip zombiescan(target, zombie) else: print("Either the IPID secquence is not incremental or the target if 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):#掃描目標1-100的埠 try: start_val = 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_val = sr1(IP(dst=zombie)/TCP(flags="SA"),timeout=2,verbose=0) if end_val[IP].id == (start_val[IP].id+2): print(port) except: pass #主函式內容 print"------Zombie Scan Suite------\n" #這是殭屍掃描套件程式 print"1.----Identity Zombie Host\n" #識別殭屍機 print"2.----Preform Zombie Scan\n"#執行掃描過程 aws = raw_input("Select an Option (1 or 2):") if aws == "1": zombie = raw_input("Enter IP address to test IPID sequence:") ipid(zombie) else: if aws == "2": zombie = raw_input("Enter IP address for zombie System:\n") target = raw_input("Enter IP address for Scan Target:\n") zombiescan(target,zombie)
NMAP實現殭屍掃描
同樣的,如果使用NMAP進行殭屍掃描,首先找到合適的殭屍機是最關鍵的。
除此以為,NMAP本身提供了大量用於殭屍掃描的指令碼程式(大概400多種),可以在NMAP中呼叫這些指令碼程式來判斷一個主機是否是一個合適的殭屍機。同樣這些指令碼所遵循也是根據對方IPIID是否遞增來判斷的。
NMAP掃描指定埠判斷主機是否是合適的zombie
root@kali:~# nmap -p445 192.168.86.132 --script=ipidseq.nse Starting Nmap 7.01 ( https://nmap.org ) at 2016-05-28 05:12 EDT Nmap scan report for bogon (192.168.86.132) Host is up (0.00033s latency). PORTSTATE SERVICE 445/tcp openmicrosoft-ds MAC Address: 00:0C:29:10:88:B3 (VMware) Host script results: |_ipidseq: Incremental! Nmap done: 1 IP address (1 host up) scanned in 0.49 seconds
可以看到該主機的ipid是遞增的,殭屍找到了,開始進行掃描
NMAP 殭屍掃描
root@kali:~# nmap 192.168.0.7 -sI 192.168.0.6 -Pn -P 0-100 Starting Nmap 7.01 ( https://nmap.org ) at 2016-05-28 05:16 EDT Idle scan using zombie 192.168.0.6 (192.168.0.6:80); Class: Incremental Nmap scan report for bogon (192.168.0.7) Host is up (0.051s latency). Not shown: 977 closed|filtered ports PORTSTATE SERVICE 21/tcpopenftp 22/tcpopenssh 23/tcpopentelnet 25/tcpopensmtp 53/tcpopendomain 80/tcpopenhttp 111/tcpopenrpcbind 139/tcpopennetbios-ssn 445/tcpopenmicrosoft-ds 512/tcpopenexec 513/tcpopenlogin 514/tcpopenshell 1099/tcp openrmiregistry 1524/tcp openingreslock 2049/tcp opennfs 2121/tcp openccproxy-ftp