Python实现TCP SYN扫描
"这篇文档主要讨论了网络攻防中的TCP SYN扫描技术,并提供了一个使用Python进行TCP SYN扫描的简单示例。" 在网络安全领域,网络攻防是至关重要的一个方面,它涉及到保护网络免受攻击者侵入以及发现并应对潜在威胁的过程。TCP SYN扫描是一种常见的网络扫描技术,用于检测网络上的开放端口和服务。在这个过程中,攻击者或安全研究人员发送TCP SYN包到目标主机,这些包模拟建立TCP连接的初始阶段。如果目标主机响应了一个SYN-ACK包,那么这表明目标端口是开放的;如果返回RST包,则表示端口关闭。 TCP SYN扫描的工作原理如下: 1. 攻击者发送一个SYN包给目标主机,请求建立一个TCP连接。 2. 目标主机收到SYN包后,如果没有防火墙阻止,会回应一个SYN-ACK包,表示同意建立连接。 3. 正常情况下,攻击者会回应一个ACK包以完成三次握手,但在此扫描中,攻击者不发送ACK,而是停止通信,这样可以避免实际连接的建立。 4. 如果目标主机对SYN包回应了SYN-ACK,但没有收到ACK,它可能会重试SYN-ACK或者最终发送RST包来结束连接尝试。 Python代码通常使用socket库来创建原始套接字(raw socket),以便可以自定义TCP头部信息并执行SYN扫描。下面的Python代码片段展示了如何创建一个原始套接字,设置IP头部包含选项,以及构建一个基本的IP和TCP头部结构: ```python import socket import sys import time from struct import * def checksum(msg): # 计算校验和 ... def CreateSocket(source_ip, dest_ip): try: s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) except socket.error as msg: print('Socket create error:', str(msg[0]), 'message:', msg[1]) sys.exit() # 设置IP头包含选项 s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) return s def CreateIpHeader(source_ip, dest_ip): # 构建IP头部 packet = '' headerlen = 5 version = 4 tos = 0 tot_len = 20 + 20 id = random.randrange(18000, 65535, 1) frag_off = 0 ttl = 255 protocol = socket.IPPROTO_TCP check = 10 saddr = socket.inet_aton(source_ip) daddr = socket.inet_aton(dest_ip) ... ``` 这段代码定义了两个函数,`checksum`用于计算IP头部的校验和,而`CreateSocket`则创建一个原始套接字并设置相应的选项。`CreateIpHeader`函数用于构建IP头部信息,包括源和目标IP地址。然而,代码中并未给出完整的TCP头部构建部分,这通常会包括序列号、确认号、标志字段等,其中标志字段会被设置为SYN (0x02) 来执行SYN扫描。 在实际应用中,还需要处理网络异常、错误检查、多线程以扫描多个目标等复杂情况。此外,对于合法的安全测试,应遵守相关法律法规,确保扫描活动不会对目标造成损害或违反其网络政策。
端口扫描常用于用于探测服务器或主机开放端口情况,被计算机管理员用于确认安全策略,同时被攻击者用于识别目标主机上的可运作的网络服务。端口扫描是向一定范围的服务器端口发送对应请求,以此确认可使用的端口。虽然其本身并不是恶意的网络活动,但也是网络攻击者探测目标主机服务,以利用该服务的已知漏洞的重要手段。
TCP SYN扫描是端口扫描众多方式中的一种,其他方式包括TCP扫描,UDP扫描,ACK扫描,窗口扫描和FIN扫描等。
TCP SYN扫描是另一种TCP扫描。端口扫描工具不使用操作系统原生网络功能,而是自行生成、发送IP数据包,并监控其回应。这种扫描模式被称为“半开放扫描”,因为它从不建立完整的TCP连接。端口扫描工具生成一个SYN包,如果目标端口开放,则会返回SYN-ACK包。扫描端回应一个RST包,然后在握手完成前关闭连接。如果端口关闭了但未使用过滤,目标端口应该会持续返回RST包。
TCP SYN扫描优点:
给扫描工具全权控制数据包发送和等待回应时长的权力,允许更详细的回应分析。
SYN扫描从不会建立完整的连接。
2. python 代码
使用raw socket进行SYN 洪泛,封装多个函数使其模块化和易于理解。利用结构体可以方便的使用格式化字符串和变量列表来编码数据包。
/bin/env python
# -*- coding: UTF-8 -*-
# 必须以root权限运行
import socket
import sys
import time
from struct import *
# 计算校验和
s = 0
# 每次取2个字节
for i in range(0,len(msg),2):
w = (ord(msg[i]) << 8) + (ord(msg[i+1]))
s = s+w
s = (s>>16) + (s & 0xffff)
s = ~s & 0xffff
return s
def CreateSocket(source_ip,dest_ip):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
except socket.error, msg:
print 'Socket create error: ',str(msg[0]),'message: ',msg[1]
sys.exit()
# 设置手工提供IP头部
s.setsockopt(socket.IPPROTO_TCP, socket.IP_HDRINCL, 1)
return s
# 创建IP头部
def CreateIpHeader(source_ip, dest_ip):
packet = ''
# ip 头部选项
headerlen = 5
version = 4
剩余5页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦