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基础教程之简单入门说明(变量和控制语言使用方法)
Mar 25 Python
python计算方程式根的方法
May 07 Python
python实现决策树ID3算法的示例代码
May 30 Python
python文件操作之批量修改文件后缀名的方法
Aug 10 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
Dec 06 Python
python删除列表元素的三种方法(remove,pop,del)
Jul 22 Python
Python使用Pandas库常见操作详解
Jan 16 Python
python orm 框架中sqlalchemy用法实例详解
Feb 02 Python
python中的 zip函数详解及用法举例
Feb 16 Python
如何使用python切换hosts文件
Apr 29 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
Nov 17 Python
OpenCV全景图像拼接的实现示例
Jun 05 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初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
php中执行系统命令的方法
2015/03/21 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
封装好的省市地区联动控件附下载
2007/08/13 Javascript
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
jQuery对象和DOM对象使用说明
2010/06/25 Javascript
『jQuery』取指定url格式及分割函数应用
2013/04/22 Javascript
IE下Ajax缓存问题的快速解决方法(get方式)
2014/01/09 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
AngularJS directive返回对象属性详解
2016/03/28 Javascript
浅析创建javascript对象的方法
2016/05/13 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
JS中的phototype详解
2017/02/04 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
分析javascript原型及原型链
2018/03/18 Javascript
浅谈开发eslint规则
2018/10/01 Javascript
微信小程序API—获取定位的详解
2019/04/30 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
JavaScript链式调用原理与实现方法详解
2020/05/16 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
基于javascript的无缝滚动动画实现2
2020/08/07 Javascript
python中kmeans聚类实现代码
2018/02/23 Python
Python爬虫实现“盗取”微信好友信息的方法分析
2019/09/16 Python
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
如何写出好的Java代码
2014/04/25 面试题
单位实习鉴定评语
2015/01/04 职场文书
2015年教育实习工作总结
2015/04/24 职场文书
心灵点滴观后感
2015/06/02 职场文书
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL