python 使用raw socket进行TCP SYN扫描实例


Posted in Python onMay 05, 2020

1. TCP 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 洪泛,封装多个函数使其模块化和易于理解。利用结构体可以方便的使用格式化字符串和变量列表来编码数据包。

#!/usr/bin/env python
# -*- coding: UTF-8 -*- 

# 必须以root权限运行

import socket
import sys
import time

from struct import *

# 计算校验和
def checksum(msg):
  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
  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 )
  hl_version = (version << 4) + headerlen
  ip_header = pack('!BBHHHBBH4s4s', hl_version, tos, tot_len, id, frag_off, ttl, protocol, check, saddr, daddr)

  return ip_header

# 创建TCP头部
def create_tcp_syn_header(source_ip, dest_ip, dest_port):
  # tcp 头部选项
  source = random.randrange(32000,62000,1)  # 随机化一个源端口
  seq = 0
  ack_seq = 0
  doff = 5
  # tcp flags
  fin = 0
  syn = 1
  rst = 0
  psh = 0
  ack = 0
  urg = 0
  window = socket.htons (8192)  # 最大窗口大小
  check = 0
  urg_ptr = 0
  offset_res = (doff << 4) + 0
  tcp_flags = fin + (syn<<1) + (rst<<2) + (psh<<3) + (ack<<4) + (urg<<5)
  tcp_header = pack('!HHLLBBHHH', source, dest_port, seq, ack_seq, offset_res, tcp_flags, window, check, urg_ptr)
  # 伪头部选项
  source_address = socket.inet_aton( source_ip )
  dest_address = socket.inet_aton( dest_ip )
  placeholder = 0
  protocol = socket.IPPROTO_TCP
  tcp_length = len(tcp_header)
  psh = pack('!4s4sBBH', source_address, dest_address, placeholder, protocol, tcp_length);
  psh = psh + tcp_header;
  tcp_checksum = checksum(psh)

  # 重新打包TCP头部,并填充正确地校验和
  tcp_header = pack('!HHLLBBHHH', source, dest_port, seq, ack_seq, offset_res, tcp_flags, window, tcp_checksum, urg_ptr)
  return tcp_header

def range_scan(source_ip, dest_ip, start_port, end_port) :
  syn_ack_received = []  # 开放端口存储列表

  for j in range (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)
    packet = ip_header + tcp_header

    s.sendto(packet, (dest_ip, 0))

    data = s.recvfrom(1024) [0][0:]

    ip_header_len = (ord(data[0]) & 0x0f) * 4
    ip_header_ret = data[0: ip_header_len - 1]
    tcp_header_len = (ord(data[32]) & 0xf0)>>2
    tcp_header_ret = data[ip_header_len:ip_header_len+tcp_header_len - 1]

    if ord(tcp_header_ret[13]) == 0x12: # SYN/ACK flags 
      syn_ack_received.append(j)
  return syn_ack_received

# 程序从这里开始:
open_port_list = []
ipsource = '192.168.1.95'
ipdest = '192.168.1.31'
start = 100
stop = 450
step = (stop-start)/10
scan_ports = range(start, stop, step)
if scan_ports[len(scan_ports)-1] < stop:
  scan_ports.append(stop)
for i in range(len(scan_ports)-1):
  opl = range_scan(ipsource, ipdest, scan_ports[i], scan_ports[i+1])
  open_port_list.append(opl)
for i in range(len(open_port_list)):
  print 'Process #: ',i,' Open ports: ',open_port_list[i]
print 'A list of all open ports found: '
for i in range(len(open_port_list)):
  for j in range(len(open_port_list[i])):
    print open_port_list[i][j],', '

以上这篇python 使用raw socket进行TCP SYN扫描实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅析Python中的多重继承
Apr 28 Python
Python中不同进制的语法及转换方法分析
Jul 27 Python
浅谈Python中的私有变量
Feb 28 Python
将Dataframe数据转化为ndarry数据的方法
Jun 28 Python
python 3.3 下载固定链接文件并保存的方法
Dec 18 Python
Python类的继承用法示例
Jan 31 Python
Django缓存系统实现过程解析
Aug 02 Python
详解Django配置优化方法
Nov 18 Python
Python数组并集交集补集代码实例
Feb 18 Python
Python实现Word表格转成Excel表格的示例代码
Apr 16 Python
用python绘制樱花树
Oct 09 Python
Pytorch中TensorBoard及torchsummary的使用详解
May 12 Python
Python之变量类型和if判断方式
May 05 #Python
Python实现CAN报文转换工具教程
May 05 #Python
python TCP包注入方式
May 05 #Python
python构造IP报文实例
May 05 #Python
python3通过udp实现组播数据的发送和接收操作
May 05 #Python
解决python使用list()时总是报错的问题
May 05 #Python
python requests.get带header
May 05 #Python
You might like
火影忍者:三大瞳力之一的白眼,为什么没有写轮眼那么出色?
2020/03/02 日漫
PHP4在WinXP下IIS和Apache2服务器上的安装实例
2006/10/09 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
php获取POST数据的三种方法实例详解
2016/12/20 PHP
php设计模式之职责链模式定义与用法经典示例
2019/09/19 PHP
JS trim去空格的最佳实践
2011/10/30 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
2013/07/18 Javascript
JavaScript实现的encode64加密算法实例分析
2015/04/15 Javascript
jQuery右下角悬浮广告实例
2016/10/17 Javascript
ajax图片上传,图片异步上传,更新实例
2016/12/30 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
jQuery插件artDialog.js使用与关闭方法示例
2017/10/09 jQuery
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
Python和php通信乱码问题解决方法
2014/04/15 Python
Python base64编码解码实例
2015/06/21 Python
Python制作爬虫采集小说
2015/10/25 Python
Python首次安装后运行报错(0xc000007b)的解决方法
2016/10/18 Python
Django 接收Post请求数据,并保存到数据库的实现方法
2019/07/12 Python
Python+Selenium使用Page Object实现页面自动化测试
2019/07/14 Python
Python如何读取文件中图片格式
2020/01/13 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
化工机械应届生求职信
2013/11/04 职场文书
优秀信贷员先进事迹
2014/01/31 职场文书
保护环境建议书300字
2014/05/13 职场文书
安全生产标语大全
2014/10/06 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
上诉答辩状范文
2015/05/22 职场文书
同意转租证明
2015/06/24 职场文书
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js
详解CSS中的特指度和层叠问题
2021/07/15 HTML / CSS