1.scapy这个库轻松实现构造数据包、发送数据包、分析数据包
2.scapy安装:
pip install scapy ======> scapy不是内置模块,故需要额外安装
3.导入scapy方式:
from scapy.all import *
函数使用:
sr1 函数来发送和接收第三层的数据包 sr1 表示一次只发送一次
SYN扫描:
1.向目标主机发送请求连接SYN包,扫描器收到SYN/ACK后,不是发送ACK应答而是发送RST请求断开连接
判断端口开放:1.Client发送SYN 2.Server端发送SYN/ACK 3.Client发送RST断开
端口关闭: 1.Client发送SYN 2.Server端发送RST(表示端口断开)
TCP3次握手:
在TCP/IP协议中,TCP协议提供可靠的连接服务,
采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,
并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),
即SYN+ACK包,此时服务器进入SYN_RECV状态;
#!/usr/bin/python from scapy.all import * import socket import time #syn扫描 def syn_scan(target_ip,start,end): print('扫描主机:%s ......'%target_ip) i = 0 for port in range(start, end): #sr1 向目标发送一个SYN分组(packet) a = sr1(IP(dst=target_ip) / TCP(dport=port), timeout=1, verbose=0) if a == None: pass else: #接收返回的数据包验证flags 的值 即ACK+SYN回包的16进制数据转为10进制 0X12 # 转成int 来判断是否回包是ACK+SYN的值18是表示端口开放 if int(a[TCP].flags) == 18: print('[*]'+ target_ip+' '+ str(port)+' 端口开放 ') i+=1 else: pass print('[*]总共开放了 %s 个端口'%i) #核验ip是否输入合格,还是网址 def checkip(hostip): pat = re.compile(r'([0-9]{1,3})\.') r = re.findall(pat, hostip + ".") if len(r) == 4 and len([x for x in r if int(x) >= 0 and int(x) <= 255]) == 4: return hostip else : domain_ip = socket.getaddrinfo(hostip,None)[0][4][0] return domain_ip def run(): print(' '*35+'SYN扫描器') print(' '*30+'退出程序请输入exit'+' '*30) while True: host_ip = input("请输入网址或者ip地址:") if host_ip=='exit': exit() else: if checkip(host_ip) != None: target_ip = checkip(host_ip) inputs = input('端口范围eg:50-80: ') ports = inputs.split('-') start = int(ports[0]) end = int(ports[1]) syn_scan(target_ip, start, end) time.sleep(0.01) print('[*]主机:%s 扫描完成!'%target_ip) if __name__ == '__main__': run()