Kali学习笔记11:僵尸扫描案例

什么是僵尸扫描?本质也是端口扫描,不过是一种极其隐蔽的扫描方式

所以几乎不会被发现,不过也有着很大缺陷:扫描条件很高

 

首先需要有一台僵尸机,这里我找好一台win10僵尸机器,IP地址为:10.14.4.252

我当前的Kali系统机器的IP地址:192.168.22.130

扫描的目标机器IP地址:192.168.22.129

 

僵尸扫描是一种非常巧妙的方法,不过不可以用Linux操作系统作为僵尸机,因为Linux的IPID不是递增的

过程:

1:最开始扫描者主机对Zombie(僵尸机)发送SYN/ACK包,然后Zombie(假设此时系统产生的IPID为x)会回个主机一个RST,主机将会得到Zombie的IPID;

2:然后扫描主机向目标机器发送一个SYN包,有所不同的是,此时扫描主机会伪造一个伪装成Zombie的IP(即是x)向目标主机发送SYN包。

3:如果目标的端口开放,便会向Zombie返回一个SYN/ACK包,但是人家Zombie并没有发送任何的包啊,zombie会觉得莫名其妙,于是向目标主机发送一RST过去询问,此时Zombie的IPID将会增加1(x+1)。若果目标主机的端口并未开放,那么目标主机也会想Zombie发送一个RST包,但是Zombie收到RST包不会有任何反应,所以IPID不会改变(依旧是x)。

4:最后扫描者主机再向Zombie发送一个SYN/ACK,同样的Zombie会摸不着头脑,然后在懵懂中向扫描者主机发送一个RST包,此时Zombie的IPID将变成(x+2)。最后我们在zombies的迷惘中我们已经知道了我们想知道的。

 

好的,接下里,开始僵尸扫描:

 

先用Scapy做一个演示,为后边的脚本做铺垫:

这里是先发送给僵尸机的数据包

 

而这里端口设置成445是因为win10默认开启445端口,flags是SYN+ACK

 

接下来定义向目标机器发送的数据包

这里我直接伪造源地址是win10的IP,扫描目标机器的25端口

 

发送数据包:

 

查看下结果:

 

 

OK,发现IP相差为2,证明目标端口开启,这里的僵尸扫描就完成了!

 

如果我们扫描的是一个不开放端口呢?

 

OK,发现这里ID相差为1,说明这个端口没有开放!

 

在这个的基础上,可以写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 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:")
            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):
        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)

 

使用脚本:

如果脚本是从windows移过来的:

vi xxx.py

:set fileformat=unix

:wq

chmod u+x xxx.py

./xxx.py

 

使用:

 

效果还是非常不错的!

这个脚本其实已经是一个比较完善的了,可以实际使用了,不过还是有更不错的方法

 

强大的Nmap工具:NMAP本身提供了大量用于僵尸扫描的脚本程序(大概400多种)

我们可以在NMAP中调用这些脚本程序来判断一个主机是否是一个合适的僵尸机。

同样这些脚本所遵循也是根据对方IPIID是否递增来判断的。

 

首先判断是否是一个好僵尸:

 

Incremental!!!可以使用的僵尸机

接下来就使用这个僵尸机来扫描:

 

扫描结果和我们脚本扫描的结果一样!

成功

 

posted @ 2018-09-15 12:35  4ra1n  阅读(2016)  评论(0编辑  收藏  举报