端口扫描 - Scapy

0x00:简介

scapy 除了之前在二层三层四层做发现外,也可以用来扫描端口。

0x01:scapy udp 端口扫描

先说一下 scapy 根据 udp 来发现端口的原理,首先,要扫描端口的主机是在线的,可以通过之前各层的发现技术去发现目标主机是否在线。

发送 udp 包如果一个机器收到后,端口在没有开放的情况下会返回一个 icmp 包,提示端口不可达。如果端口开放的话,则没有任何返回信息,因为 udp 不像 tcp,udp 是没有返回信息的。所以可以根据这个来判断端口是否开放。

scapy 使用 udp 检测端口开放和不开放的结果对比如下:

端口扫描 - Scapy_第1张图片

53 是开放的,54 是没有开放的,可以看到 53 没有返回任何信息,54 的 icmp 包里返回了 port-unreachable 端口不可达的信息。上面是单个端口的发现,可以借助 python 写一个脚本用来批量发现端口号。

#!/usr/bin/python
# -*- coding:UTF-8 -*-
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
import time
import sys

if len(sys.argv)!=4:
    print "使用示例:./scapy-udp.py 1.1.1.1 1 100"
    sys.exit()

ip = sys.argv[1]
start = int(sys.argv[2])
end = int(sys.argv[3])

for port in range(start,end):
    a = sr1(IP(dst=ip)/UDP(dport=port),timeout=5,verbose=0)
    time.sleep(1)
    if a == None:
        print port
    else:
        pass

脚本首先需要接收 3 个参数,第一个是要检测的 ip 地址,第二个是开始的端口号,第三个是结束的端口号。然后通过 for 循环这些端口号给 scapy 进行发送 udp 包,最后根据返回的结果来判断目标端口是否在线。

time.sleep 的作用是停止 1 秒钟,怕脚本执行太快,造成结果不准确,缺点就是会慢一点。

执行结果如下:

请输入图片描述

通过 wireshark 抓包如下:

端口扫描 - Scapy_第2张图片

0x02:总结

scapy 因为可以构造很多的类型数据包,所以可以用来在二层、三层、四层去发现主机是否在线,也可以去发现目标的端口是否在线。

公众号回复数字“8”领取CIS加固全套手册。

微 信:fageweiketang,朋友圈不定期干货分享,欢迎讨论。

公众号:发哥微课堂,专注于代码审计、WEB渗透、网络安全。

 端口扫描 - Scapy_第3张图片                    端口扫描 - Scapy_第4张图片

你可能感兴趣的:(渗透测试,信息搜集)