title: 僵尸掃描
date: 2016-05-27 15:36
tags: kali滲透測試 主動信息收集
0x00 碎語
僵尸掃描的極度隱蔽絕決定了它的實(shí)施條件的苛刻逊谋,魚與熊掌不可兼得笨觅,本就是宇宙法則。一個合格的僵尸機(jī)是實(shí)現(xiàn)僵尸掃描的關(guān)鍵因素亿眠,僵尸至少要保證在進(jìn)行掃描階段不會產(chǎn)生其它的IP包域滥,即是不會與我們主機(jī)之外的任何機(jī)器進(jìn)行第三層的IP通訊罚渐,至少在我們控制其進(jìn)行掃描的階段不可以唇辨,否則將直接導(dǎo)致我們掃描結(jié)果不可靠,白費(fèi)時間锉罐。
何為合適的僵尸機(jī):1)足夠閑置;2)它的IPID必須是遞增的帆竹,0和隨機(jī)都不可以。然而現(xiàn)在大部分主流的OS的IPID都是隨機(jī)產(chǎn)生的脓规,但是早期的xp栽连,比如xp200,xp2003都是遞增的IPID侨舆。
0x01 僵尸掃描的過程
最開始掃描者主機(jī)對Zombie(僵尸機(jī))發(fā)送SYN/ACK包秒紧,然后Zombie(假設(shè)此時系統(tǒng)產(chǎn)生的IPID為x)會回個主機(jī)一個RST舷暮,主機(jī)將會得到Zombie的IPID;
然后掃描主機(jī)向目標(biāo)機(jī)器發(fā)送一個SYN包噩茄,有所不同的是下面,此時掃描主機(jī)會偽造一個偽裝成Zombie的IP(即是x)向目標(biāo)主機(jī)發(fā)送SYN包。
如果目標(biāo)的端口開放绩聘,便會向Zombie返回一個SYN/ACK包沥割,但是人家Zombie并沒有發(fā)送任何的包啊,zombie會覺得莫名其妙凿菩,于是向目標(biāo)主機(jī)發(fā)送一RST過去詢問机杜,此時Zombie的IPID將會增加1(x+1)。若果目標(biāo)主機(jī)的端口并未開放衅谷,那么目標(biāo)主機(jī)也會想Zombie發(fā)送一個RST包椒拗,但是Zombie收到RST包不會有任何反應(yīng),所以IPID不會改變(依舊是x)获黔。
最后掃描者主機(jī)再向Zombie發(fā)送一個SYN/ACK蚀苛,同樣的Zombie會摸不著頭腦,然后在懵懂中向掃描者主機(jī)發(fā)送一個RST包玷氏,此時Zombie的IPID將變成(x+2)堵未。最后我們在zombies的迷惘中我們已經(jīng)知道了我們想知道的。
0x02 滲透環(huán)境
掃描主機(jī) kali: { ip:192.168.86.129 }
zombie xp: { ip:192.168.86.132 }
目標(biāo)主機(jī) metasploitable: { ip:192.168.86.130 }
0x03 Scapy實(shí)現(xiàn)方法
構(gòu)造Scapy掃描包
分步構(gòu)成
構(gòu)造request zombie包:
>>> i=IP() #構(gòu)造ip包頭
>>> t=TCP() #構(gòu)造tcp包頭
>>> rz=(i/t) #request_zombie盏触,構(gòu)造發(fā)送給僵尸機(jī)的數(shù)據(jù)包渗蟹,將發(fā)送給xp
>>> rt=(i/t) #request_target,構(gòu)造發(fā)送給目標(biāo)主機(jī)的數(shù)據(jù)包,將發(fā)送給meta
>>>rz[IP].dst="192.168.86.132"http://定義zombie的ip地址
>>>rz[TCP].dport=445 //定義發(fā)送到zombie的端口赞辩,務(wù)必確保這個端口是開啟的端口雌芽,445端口是win中默認(rèn)開啟的
>>>rz[TCP].flags="SA"http://定義向zombie發(fā)送的數(shù)據(jù)包是SYN/ACK包
>>>
構(gòu)造request target包:
>>>rt[IP].src="192.168.86.132"http://定義rt包的源ip地址,直接偽造為xp的ip
>>>rt[IP].dst="192.168.86.130"http://定義rt包的目的ip辨嗽,就是目標(biāo)ip了世落,meta
>>>rt[TCP].dport=25//定義rt包掃描的端口
>>>rt[TCP].flags="S"http://定義發(fā)送的rt包為SYN包
然后將會發(fā)送兩次rz包,一次rt包召庞,最后在對結(jié)果進(jìn)行分析岛心。
>>>az1=sr1(rz) #向zombie發(fā)的第一個包az1
Begin emission:
Finished to send 1 packets.
*
Received 1 packets, got 1 answers, remaining 0 packets
>>>at=sr1(rt,timeout=1) #向目標(biāo)機(jī)發(fā)包篮灼,由于我們不會收到回包,因?yàn)榻ozombie了徘禁,所以需要設(shè)置超時時間
Begin emission:
Finished to send 1 packets.
*
Received 1 packets, got 1 answers, remaining 0 packets
>>>az2=sr1(rz) #向zombie發(fā)送的第二個包az2
Begin emission:
Finished to send 1 packets.
*
Received 1 packets, got 1 answers, remaining 0 packets
分析az1與az2IPID:
>>> az1
<IP version=4L ihl=5L tos=0x0 len=40 id=436 flags= frag=0L ttl=128 src=192.168.86.132 dst=192.168.86.129 options=[]
>>> az2
<IP version=4L ihl=5L tos=0x0 len=40 id=438 f proto=tcp chksum=0xac5 src=192.168.86.132 dst=192.168.86.129
通過分析發(fā)現(xiàn)目標(biāo)的25是開放的诅诱。
Python腳本實(shí)現(xiàn)僵尸掃描
#!/usr/bin/python
#-*-coding:utf-8-*-
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
def ipid(zombie):#定義一個ipid函數(shù),同時定義一個zombie變量送朱。該函數(shù)的作用是探測一主機(jī)是否可以作為僵尸機(jī)
reply1 = sr1(IP(dst=zombie)/TCP(flags="SA"), timeout=2,verbose=0)#向zombie發(fā)送一個syn/ack包
send(IP(dst=zombie)/TCP(flags="SA"),verbose=0)#send()與sr1()方法的區(qū)別是:sr1發(fā)送出去一個包以后會在接收對方的一個回包娘荡,而send方法不會接收包
reply2 = sr1(IP(dst=zombie)/TCP(flags="SA"),timeout=2,verbose=0)#緊接著在向僵尸機(jī)發(fā)送一個syn/ack包
if reply2[IP].id == (reply1[IP].id+2):#根據(jù)發(fā)送的三個來判斷僵尸機(jī)是否足夠空閑,并且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": #是否使用該僵尸機(jī)執(zhí)行掃描
target = raw_input("Enter the IP address of the target system:") #輸入要掃描的目標(biāo)主機(jī)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):#掃描目標(biāo)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
#主函數(shù)內(nèi)容
print"------Zombie Scan Suite------\n" #這是僵尸掃描套件程序
print"1.----Identity Zombie Host\n" #識別僵尸機(jī)
print"2.----Preform Zombie Scan\n" #執(zhí)行掃描過程
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)
0x04 NMAP實(shí)現(xiàn)僵尸掃描
同樣的,如果使用NMAP進(jìn)行僵尸掃描炮沐,首先找到合適的僵尸機(jī)是最關(guān)鍵的争群。
除此以為,NMAP本身提供了大量用于僵尸掃描的腳本程序(大概400多種)大年,我們可以在NMAP中調(diào)用這些腳本程序來判斷一個主機(jī)是否是一個合適的僵尸機(jī)换薄。同樣這些腳本所遵循也是根據(jù)對方IPIID是否遞增來判斷的。
NMAP掃描指定端口判斷主機(jī)是否是合適的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).
PORT STATE SERVICE
445/tcp open microsoft-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
可以看到該主機(jī)的ipid是遞增的哦翔试!
僵尸找到了轻要,開始進(jìn)行掃描。
NMAP 僵尸掃描
root@kali:~# nmap 192.168.86.130 -sI 192.168.1.132 -Pn -P 0-100
Starting Nmap 7.01 ( https://nmap.org ) at 2016-05-28 05:16 EDT
Idle scan using zombie 192.168.1.132 (192.168.1.132:80); Class: Incremental
root@kali:~# nmap 192.168.86.130 -sI 192.168.86.132 -Pn -P 0-100
Starting Nmap 7.01 ( https://nmap.org ) at 2016-05-28 05:16 EDT
Idle scan using zombie 192.168.86.132 (192.168.86.132:80); Class: Incremental
Nmap scan report for bogon (192.168.86.130)
Host is up (0.051s latency).
Not shown: 977 closed|filtered ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
23/tcp open telnet
25/tcp open smtp
53/tcp open domain
80/tcp open http
111/tcp open rpcbind
139/tcp open netbios-ssn
445/tcp open microsoft-ds
512/tcp open exec
513/tcp open login
514/tcp open shell
1099/tcp open rmiregistry
1524/tcp open ingreslock
2049/tcp open nfs
2121/tcp open ccproxy-ftp