介绍
这篇文章主要讲解了python如何使用原始套接字进行TCP SYN扫描,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
<强> 1。TCP SYN扫描强>
端口扫描常用于用于探测服务器或主机开放端口情况,被计算机管理员用于确认安全策略,同时被攻击者用于识别目标主机上的可运作的网络服务。端口扫描是向一定范围的服务器端口发送对应请求,以此确认可使用的端口,虽然其本身并不是恶意的网络活动,但也是网络攻击者探测目标主机服务,以利用该服务的已知漏洞的重要手段。
TCP SYN扫描是端口扫描众多方式中的一种,其他方式包括TCP扫描,UDP扫描,ACK扫描,窗口扫描和鳍扫描等。
TCP SYN扫描是另一种TCP扫描。端口扫描工具不使用操作系统原生网络功能,而是自行生成,发送IP数据包,并监控其回应。这种扫描模式被称为“半开放扫描”,因为它从不建立完整的TCP连接。端口扫描工具生成一个SYN包,如果目标端口开放,则会返回SYN-ACK包。扫描端回应一个RST包,然后在握手完成前关闭连接。如果端口关闭了但未使用过滤,目标端口应该会持续返回RST包。
TCP SYN扫描优点:
给扫描工具全权控制数据包发送和等待回应时长的权力,允许更详细的回应分析。
SYN扫描从不会建立完整的连接。
<强> 2。python代码强>
使用原始套接字进行SYN洪泛,封装多个函数使其模块化和易于理解。利用结构体可以方便的使用格式化字符串和变量列表来编码数据包。
# !/usr/bin/env python # - * -编码:utf - 8 - * #必须以根权限运行 进口套接字 导入系统 导入的时间 从结构导入* #计算校验和 def校验和(味精): s=0 #每次取2个字节 因为我在范围(0,len(味精),2): w=(奥德(味精[我])& lt; & lt;8)+(奥德(味精(i + 1))) s=s + w s=(, s>的在16)+(年代,0 xffff)=~年代,0 xffff 返回年代 def CreateSocket (source_ip、dest_ip): 试一试: s=socket.socket(套接字。AF_INET,插座。SOCK_RAW socket.IPPROTO_TCP) 除了插座。错误,味精: 打印& # 39;套接字创建错误:& # 39;str(味精[0]),& # 39;信息:& # 39;味精[1] sys.exit () #设置手工提供IP头部 s.setsockopt(套接字。IPPROTO_TCP,插座。IP_HDRINCL, 1) 返回年代 #创建IP头部 def CreateIpHeader (source_ip、dest_ip): 包=& # 39;& # 39; # ip头部选项 headerlen=5 版本=4 tos=0 tot_len=20 + 20 id=random.randrange (18000、65535、1) frag_off=0 ttl=255 协议=socket.IPPROTO_TCP 检查=10 saddr=套接字。inet_aton (source_ip) daddr=套接字。inet_aton (dest_ip) hl_version=(版本& lt; & lt;4)+ headerlen ip_header=包(& # 39;! BBHHHBBH4s4s& # 39;, hl_version,服务条款,tot_len, id, frag_off, ttl,协议,检查,saddr, daddr) 返回ip_header #创建TCP头部 def create_tcp_syn_header (source_ip dest_ip dest_port): # tcp头部选项 源=random.randrange(32000、62000、1) #随机化一个源端口 seq=0 ack_seq=0 脱=5 # tcp标志 鳍=0 syn=1 rst=0 psh=0 ack=0=0开始 窗口=套接字。htons(8192) #最大窗口大小 检查=0 urg_ptr=0 offset_res=(脱& lt; & lt;4)+ 0 tcp_flags=鳍+ (syn<& lt; 1) + (rst<& lt; 2) + (psh<& lt; 3) + (ack<& lt; 4) + (urg<& lt; 5) tcp_header=包(& # 39;! HHLLBBHHH& # 39;,来源,dest_port, seq, ack_seq, offset_res, tcp_flags,窗口,检查,urg_ptr) #伪头部选项 source_address=套接字。inet_aton (source_ip) dest_address=套接字。inet_aton (dest_ip) 占位符=0 协议=socket.IPPROTO_TCP tcp_length=len (tcp_header) psh=包(& # 39;! 4 s4sbbh& # 39;, source_address, dest_address,占位符,协议,tcp_length); psh=psh + tcp_header; tcp_checksum=校验和(psh) #重新打包TCP头部,并填充正确地校验和 tcp_header=包(& # 39;! HHLLBBHHH& # 39;,来源,dest_port, seq, ack_seq, offset_res, tcp_flags,窗口,tcp_checksum, urg_ptr) 返回tcp_header def range_scan (source_ip dest_ip、start_port end_port): syn_ack_received=[] #开放端口存储列表 j的范围(start_port end_port): s=CreateSocket (source_ip、dest_ip) ip_header=CreateIpHeader (source_ip dest_ip) tcp_header=create_tcp_syn_header (source_ip、dest_ip j) 包=ip_header + tcp_header 年代。sendto(包(dest_ip, 0)) data=https://www.yisu.com/zixun/s.recvfrom (1024) [0] [0:] ip_header_len=(奥德(数据[0])& 0 x0f) * 4 ip_header_ret=数据[0 ip_header_len - 1): tcp_header_len=(奥德(数据[32])& 0 xf0)> 2 tcp_header_ret=数据[ip_header_len ip_header_len + tcp_header_len - 1): 如果奥德(tcp_header_ret [13])==0 x12: # SYN/ACK标志 syn_ack_received.append (j) 返回syn_ack_received #程序从这里开始: open_port_list=[] ipsource=' 192.168.1.95 ' ipd=' 192.168.1.31 ' 开始=100 停止=450=(即停)/10步 scan_ports=范围(启动、停止、步骤) 如果scan_ports (len (scan_ports) 1]python如何使用原始套接字进行TCP SYN扫描