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操作json的方法实例分析
Dec 06 Python
numpy concatenate数组拼接方法示例介绍
May 27 Python
Python利用sqlacodegen自动生成ORM实体类示例
Jun 04 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
Jun 27 Python
Python使用指定端口进行http请求的例子
Jul 25 Python
Python对列表的操作知识点详解
Aug 20 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
Dec 09 Python
详解pycharm连接不上mysql数据库的解决办法
Jan 10 Python
使用python客户端访问impala的操作方式
Mar 28 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
Jun 17 Python
如何在pycharm中安装第三方包
Oct 27 Python
django使用多个数据库的方法实例
Mar 04 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设计模式 Singleton(单例模式)
2011/06/26 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
PHP实现数组的笛卡尔积运算示例
2017/12/15 PHP
Prototype使用指南之hash.js
2007/01/10 Javascript
jquery 插件 人性化的消息显示
2008/01/21 Javascript
js unicode 编码解析关于数据转换为中文的两种方法
2014/04/21 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
javascript简单实现等比例缩小图片的方法
2016/07/27 Javascript
Vue方法与事件处理器详解
2016/12/01 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
BootStrap学习系列之布局组件(下拉,按钮组[toolbar],上拉)
2017/01/03 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
使用vue-resource进行数据交互的实例
2017/09/02 Javascript
vue项目中api接口管理总结
2018/04/20 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
jquery插件懒加载的示例
2020/10/24 jQuery
Python中多线程thread与threading的实现方法
2014/08/18 Python
numpy.random.seed()的使用实例解析
2018/02/03 Python
wxpython实现图书管理系统
2018/03/12 Python
python3使用smtplib实现发送邮件功能
2018/05/22 Python
python字典的常用方法总结
2019/07/31 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
2019/10/30 Python
Python Django搭建网站流程图解
2020/06/13 Python
如何利用Python 进行边缘检测
2020/10/14 Python
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
2014年办公室文秘工作总结
2014/12/09 职场文书
中班下学期个人总结
2015/02/12 职场文书
廉洁自律承诺书2016
2016/03/25 职场文书
MySQL 那些常见的错误设计规范,你都知道吗
2021/07/16 MySQL
利用python实时刷新基金估值(摸鱼小工具)
2021/09/15 Python