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的Cookie.py模块支持冒号做key的方法
Dec 28 Python
python中urllib模块用法实例详解
Nov 19 Python
python基础入门学习笔记(Python环境搭建)
Jan 13 Python
详解python3实现的web端json通信协议
Dec 29 Python
Django 多语言教程的实现(i18n)
Jul 07 Python
对python 自定义协议的方法详解
Feb 13 Python
python制作图片缩略图
Apr 30 Python
Python使用Pandas库实现MySQL数据库的读写
Jul 06 Python
numpy np.newaxis 的实用分享
Nov 30 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
Feb 27 Python
在pytorch中实现只让指定变量向后传播梯度
Feb 29 Python
python正则表达式re.match()匹配多个字符方法的实现
Jan 27 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
php学习 函数 课件
2008/06/15 PHP
基于wordpress主题制作的具体实现步骤
2013/05/10 PHP
PHP stripos()函数及注意事项的分析
2013/06/08 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
php和C#的yield迭代器实现方法对比分析
2019/07/17 PHP
jquery之Document元素选择器篇
2008/08/14 Javascript
小议javascript 设计模式 推荐
2009/10/28 Javascript
收集的10个免费的jQuery相册
2011/02/26 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
javascript 二进制运算技巧解析
2012/11/27 Javascript
canvas实现手机端用来上传用户头像的代码
2016/10/20 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
微信小程序 弹框和模态框实现代码
2017/03/10 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
基于webpack-hot-middleware热加载相关错误的解决方法
2018/02/22 Javascript
浅谈JavaScript 代码整洁之道
2018/10/23 Javascript
js仿360开机效果
2019/12/26 Javascript
JavaScript逻辑运算符相关总结
2020/09/04 Javascript
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
pycharm配置git(图文教程)
2019/08/16 Python
Python常用类型转换实现代码实例
2020/07/28 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
css3 实现圆形旋转倒计时
2018/02/24 HTML / CSS
是什么让J2EE适合用来开发多层的分布式的应用
2015/01/16 面试题
serialVersionUID具有什么样的特征
2014/02/20 面试题
教师简历自我评价
2014/02/03 职场文书
学校安全责任书范本
2014/07/23 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
正风肃纪查摆剖析材料
2014/10/10 职场文书
青年文明号创建口号大全
2015/12/25 职场文书
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript
利用Python读取微信朋友圈的多种方法总结
2021/08/23 Python
Innodb存储引擎中的后台线程详解
2022/04/03 MySQL