python如何使用原始套接字进行TCP SYN扫描

  介绍

这篇文章主要讲解了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扫描