僵尸扫描-scapy、nmap

如果不知道僵尸扫描是什么,请参考我的这篇博客

实验环境:

kali(攻击者) 192.168.0.103

metasploitable2(目标主机) 192.168.0.104

win xp sp2(僵尸机) 192.168.0.106

 

scapy实现:

1.包定义:

僵尸扫描-scapy、nmap_第1张图片

图中rz和rt分别表示向僵尸机和目标主机发送的数据包。rt数据包进行了地址欺骗,将src定向到了拥有192.168.0.106的win xp主机。

2.包发送与接收:

僵尸扫描-scapy、nmap_第2张图片

图中先向僵尸机发送了一个数据包,将返回结果保存为az1;然后向目标主机发送伪造数据包;最后向僵尸机发送数据包,将返回结果保存为az2。

3.数据包对比:

僵尸扫描-scapy、nmap_第3张图片

图中两个数据包的ipid差值为2,这证明僵尸机向目标机发送了一个RST数据包,即可得知目标机的端口是开放的。

python脚本实现:

 1 #!/usr/bin/python
 2 # -*- coding: utf-8 -*-
 3 from scapy.all import *
 4 import time
 5 
 6 def IsZombie(zombieIp): #此函数用于判断僵尸机是否是一个合格的僵尸机
 7     a1 = sr1(IP(dst = zombieIp) / TCP(flags = "SA", dport = 445), timeout = 1, verbose = 0)
 8     time.sleep(1) #这里延时1秒是为了给僵尸机充足的时间,以判断僵尸机网络是否繁忙,为了更精准,可以适当增大该值
 9     a2 = sr1(IP(dst = zombieIp) / TCP(flags = "SA", dport = 445), timeout = 1, verbose = 0)
10     if a1[IP].id + 1 == a2[IP].id: #比较两次ipdi值
11         print "this is a good zombie!"
12         action = raw_input("do you want to use this zombie?(y/n)")
13         if action == "y":
14             tip = raw_input("please input the target's ip:") #目标主机ip
15             tport = int(raw_input("please input the port:")) #要扫描的端口
16             scan(zombieIp, tip, tport)
17         else:
18             sys.exit()
19     else:
20         print "this is not a good zombie!"
21 
22 def scan(zombieIp, tip, tport):
23     az1 = sr1(IP(dst = zombieIp) / TCP(flags = "SA", dport = 445), timeout = 1, verbose = 0) #给僵尸机发送第一个SYN/ACK数据包
24     send(IP(dst = tip, src = zombieIp) / TCP(sport = 445, flags = "S", dport = tport), verbose = 0) #给目标主机发送一个伪造原地址的SYN数据包
25     az2 = sr1(IP(dst = zombieIp) / TCP(flags = "SA", dport = 445), timeout = 1, verbose = 0) #给僵尸机发送第二个SYN/ACK数据包
26     if az1[IP].id + 2 == az2[IP].id: #比较ipdi值,从而判断端口是否开放
27         print "the port is open!"
28     elif az1[IP].id + 1 == az2[IP].id:
29         print "the port is closed!"
30     else:
31         print "I don't know!!"
32 
33 ip = raw_input("the zombie's ip:")
34 IsZombie(ip)
代码实现

僵尸扫描-scapy、nmap_第4张图片

博主后来拿百度做了实验,也是可以用的(但是要在24和25行之间添加一个sleep以弥补网络延时)。

僵尸扫描-scapy、nmap_第5张图片

上图是测试百度是抓取的数据包和过滤条件。

第一和第三个数据包是检测一个主机是否是一个合格的僵尸机而分别发送的SYN/ACK数据包,第二个和第四个是预备僵尸机的回复数据,通过脚本分析,该主机是一个合格的僵尸机。从5到11个数据包就是正真的僵尸扫描过程了,过程就不赘述了,如有疑惑,请参照文首的链接。

nmap实现:

使用一个简单的参数就可以实现了:nmap -p445 192.168.43.93 --script=ipidseq.nse

--script指定nmap中内置的脚本,注意"="两边不能有空格,否则会报错。

运行结果:

Starting Nmap 7.70 ( https://nmap.org ) at 2018-07-29 20:54 CST
Nmap scan report for htk90-103fe22e8 (192.168.43.93)
Host is up (0.00057s latency).

PORT    STATE SERVICE
445/tcp open  microsoft-ds
MAC Address: 00:0C:29:5D:70:02 (VMware)

Host script results:
|_ipidseq: Incremental!

Nmap done: 1 IP address (1 host up) scanned in 0.45 seconds

高亮的部分表明待选僵尸主机的ipid是递增的,符合僵尸机的要求。

既然符合僵尸机的要求,那么就可以使用这台主机进行僵尸扫描:

nmap 192.168.43.58 -sI 192.168.43.93 -Pn -p 0-100

其中-sI参数指定僵尸机。

结果:

Starting Nmap 7.70 ( https://nmap.org ) at 2018-07-29 21:03 CST
Idle scan using zombie 192.168.43.93 (192.168.43.93:80); Class: Incremental
Nmap scan report for bogon (192.168.43.58)
Host is up (0.045s latency).
Not shown: 95 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
MAC Address: 00:0C:29:D8:D7:B6 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 2.98 seconds

你可能感兴趣的:(僵尸扫描-scapy、nmap)