简介

Scapy是一种用于计算机网络的数据包处理工具,由Philippe Biondi 用Python编写。它可以伪造或解码数据包,在线路上发送它们,捕获它们,并匹配请求和回复。它还可以处理扫描,跟踪路由,探测,单元测试,攻击和网络发现等任务。可以说Scpay非常强大
如果您并不是很了解Scapy,可以自行去看一下官方文档和demo:链接,因为这篇文章重点不是教您怎么用scapy的,所以这里就不多赘述了。

端口扫描

TCP Connect扫描

原理

TCP Connect扫描又称全连接扫描,此过程客户端会和服务端进行完整的3次握手。假设客户端想与服务端的80端口进行通信,首先客户端会发送一个带有SYN标识和端口号的TCP数据包给服务器,如果服务器这个端口是开放的,则会接受这个连接并返回一个带有SYNACK标识的数据包给客户端,随后客户端会发送带有ACKRST标识的数据包给服务点,此时客户端与服务器建立了连接。如果端口不开放则会返回一个RST标识的数据包给客户端。

实现

代码实现:

nmap的-sT模式

from scapy.all import *
import getopt
import sys

def scan(argv):
    opts, args = getopt.getopt(argv, "-h:")
    for opt,arg in opts:
        if opt in ("-h"):
            host=arg
    all_port=[3306,80,22]

    for port in all_port:
        send=sr1(IP(dst=host)/TCP(dport=port,flags="S"),timeout=2,verbose=0)
        if (send is None):
            print "[+] %s %d \033[91m Closed \033[0m" % (host,port)
        elif send.haslayer("TCP"):
            if send["TCP"].flags == "SA":
                send_1 = sr1(IP(dst=host) / TCP(dport=port, flags="AR"), timeout=2, verbose=0)
                print "[+] %s %d \033[92m Open \033[0m" % (host, port)
            elif send["TCP"].flags == "RA":
                print "[+] %s %d \033[91m Closed \033[0m" % (host,port)
if __name__=="__main__":
    scan(sys.argv[1:])

扫描结果如下:

TCP SYN扫描

原理

TCP SYN扫描又称半开式扫描,该过程不会和服务端建立完整的连接,首先客户端会发送一个带有SYN标识和端口号的TCP数据包给服务器,如果服务器这个端口是开放的,则会接受这个连接并返回一个带有SYNACK标识的数据包给客户端,随后客户端会返回带有RST标识的数据包而不是返回一个带有ACKRST标识的数据包。如果目标端口处于关闭状态,则服务端会返回一个RST标识的数据包。

实现

代码实现,直接把TCP Connect扫描的改一行即可,把标识位改为R

nmap的-sS模式

send_1 = sr1(IP(dst=host) / TCP(dport=port, flags="R"), timeout=2, verbose=0)

TCP ACK扫描(大多数情况下用于防火墙检测)

原理

ACK 扫描不是用于发现端口开启或关闭状态的,而是用于发现服务器上是否存在有状态防火墙的,它的结果只能说明端口是否被过滤。如果你用nmap -sA就会发现他只会返回两种结果unfilteredfiltered,因为nmap -sA就是ACK扫描的。

判断端口是否被过滤,分为两种情况:

  • 发送一个flags为ACK报文,open(开放的)和closed(关闭的) 端口 都会返回RST报文,至于他们是open还是closed状态我们无法确定。不响应的端口,或者发送特定的ICMP错误消息(类型3,代号1,2,3,9,10, 或者13)的端口,标记为 filtered(被过滤的)。大致的流程如下图:

  • 上面那种情况下是服务器REJECT掉数据包,所以客户端会有个ICMP包返回,如果是直接DROP掉的话,就会什么也不会返回,所以我们要判断该主机是否存在,因为如果一个主机存在的话,向它发送一个flags为ACK包的话,无论端口是否关闭都会有返回一个flags为RST包,如果是DROP是话就会一个数据包都不会返回,所以我们可以利用这一点去判断端口是否被过滤了,大致流程如下:

实现

iptables配置如下

代码实现

nmap -sA模式

from scapy.all import *
import getopt
import sys

def scan(argv):
    opts, args = getopt.getopt(argv, "-h:")
    for opt,arg in opts:
        if opt in ("-h"):
            host=arg
点击收藏 | 2 关注 | 2
  • 动动手指,沙发就是你的了!
登录 后跟帖