原理简述:
端口扫描常见的一般有以下两种
- 基于socket的connect全连接扫描(速度快,但是会在对方系统日志留下痕迹)
- 基于scapy的SYN半连接扫描(不会被扫描的主机发现,速度慢。现在好像防火墙会有痕迹)
注意
-
connect全连接扫描,基于socket套接字的connect方法,它的参数是一个元组(ip, port),此扫描试图与每一个TCP端口进行“三次握手”通信。如果能够成功建立接连,则证明端口开发,否则为关闭。准确度很高。缺点:最容易被防火墙和IDS检测到,并且在目标主机的日志中会记录大量的连接请求以及错误信息。优点:另一优点是扫描速度快。如果对每个目标端口以线性的方式,使用单独的connect()调用,可以通过同时打开多个套接字,从而加速扫描。
-
SYN半连接扫描,扫描IP段的全部端口部分的实现,基于scapy构造SYN数据包向目标主机的一个端口发送连接请求,当我们收到SYN/ACK包后,不发送的ACK应答而是发送RST包请求断开连接。这样,三次握手就没有完成,无法建立正常的TCP连接,因此,这次扫描就不会被记录到系统日志中,但是可能会在防火墙上留下痕迹。
-
1、Client发送SYN
2、Server端发送SYN/ACK
3、Client发送RST断开(只需要前两步就可以判断端口开放) -
1、Client发送SYN
2、Server端回复RST(表示端口关闭)
输入:
是一个ip的list文件(按行存储的都可以),例如下面这样:
104.168.0.0/16,pcapname
104.28.0.0/16,pcapname
134.29.0.0/16,pcapname
21.61.127.231,pcapname_port
221.17.0.0/16,pcapname
23.25.36.58,pcapname_port
输出:
对应的IP和开放的PORT及其pcapname和扫描时间插入mysql,日志输出
- 单个ip进行全端口扫描或指定端口扫描(日志输出,mysql插入,和传入的pcap包的name解析)
# 单个IP全端口扫描
import time
import socket
import threading
from scapy.all import *
class SingelIP_Scan:
def connScan(self, tgtHost, tgtPort, name):
try:
# SYN扫描
syn = IP(dst=tgtHost)/TCP(dport=tgtPort, flags=2)
result_raw = sr(syn, iface='enp6s0f0', timeout=1, verbose=False) # Linux下少了iface参数,需要加上
result_list = result_raw[0].res
for i in range(len(result_list)):
if result_list[i][1].haslayer(TCP):
TCP_fields = result_list[i][1].getlayer(TCP).fields
if TCP_fields['flags