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进阶教程之模块(module)介绍
Aug 30 Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
Apr 25 Python
Python中特殊函数集锦
Jul 27 Python
python读取TXT每行,并存到LIST中的方法
Oct 26 Python
python 删除字符串中连续多个空格并保留一个的方法
Dec 22 Python
用Python逐行分析文件方法
Jan 28 Python
python实现随机漫步方法和原理
Jun 10 Python
关于python字符串方法分类详解
Aug 20 Python
在Python3 numpy中mean和average的区别详解
Aug 24 Python
浅谈Python线程的同步互斥与死锁
Mar 22 Python
python 6.7 编写printTable()函数表格打印(完整代码)
Mar 25 Python
如何通过python计算圆周率PI
Nov 11 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
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
php下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
mac下安装nginx和php
2013/11/04 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
JQuery动画和停止动画实例代码
2013/03/01 Javascript
浅谈JavaScript之事件绑定
2013/07/08 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
2015/08/10 Javascript
javascript中加var和不加var的区别 你真的懂吗
2016/01/06 Javascript
js面向对象实现canvas制作彩虹球喷枪效果
2016/09/24 Javascript
JS产生随机数的用法小结
2016/12/10 Javascript
浅谈JavaScript的计时器对象
2016/12/26 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
vue脚手架及vue-router基本使用
2018/04/09 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
Django中使用group_by的方法
2015/05/26 Python
Python实现购物程序思路及代码
2017/07/24 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
Python2/3中urllib库的一些常见用法
2017/12/19 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
用Python写一段用户登录的程序代码
2018/04/22 Python
对python3标准库httpclient的使用详解
2018/12/18 Python
Python Flask框架扩展操作示例
2019/05/03 Python
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
西海岸男士和男童服装:Johnnie-O
2018/03/15 全球购物
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
高中自我评价分享
2013/12/05 职场文书
新闻编辑求职信
2014/04/09 职场文书
工作服管理制度范本
2015/08/06 职场文书
python 爬取天气网卫星图片
2021/06/07 Python
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android