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 相关文章推荐
关于Django显示时间你应该知道的一些问题
Dec 25 Python
Python使用一行代码获取上个月是几月
Aug 30 Python
Python实现FTP弱口令扫描器的方法示例
Jan 31 Python
Pycharm远程调试原理及具体配置详解
Aug 08 Python
python3常用的数据清洗方法(小结)
Oct 31 Python
opencv3/C++实现视频读取、视频写入
Dec 11 Python
浅谈tensorflow之内存暴涨问题
Feb 05 Python
基于python实现微信好友数据分析(简单)
Feb 16 Python
Python3 hashlib密码散列算法原理详解
Mar 30 Python
深入理解Python 多线程
Jun 16 Python
通过实例解析Python RPC实现原理及方法
Jul 07 Python
仅用几行Python代码就能复制她的U盘文件?
Jun 26 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+memcache实现消息队列案例分享
2014/05/21 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
2016/01/04 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
2019/10/16 PHP
dojo 之基础篇(三)之向服务器发送数据
2007/03/24 Javascript
js jquery数组介绍
2012/07/15 Javascript
获取客户端网卡MAC地址和IP地址实现JS代码
2013/03/17 Javascript
js单向链表的具体实现实例
2013/06/21 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
jQuery中innerHeight()方法用法实例
2015/01/19 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
2016/07/09 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
python模块smtplib实现纯文本邮件发送功能
2018/05/22 Python
django初始化数据库的实例
2018/05/27 Python
python使用turtle库绘制树
2018/06/25 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
对CSS3选择器的研究(详解)
2016/09/16 HTML / CSS
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
HTML5图片预览实例分享
2014/06/04 HTML / CSS
澳大利亚100%丝绸多彩度假装商店:TheSwankStore
2019/09/04 全球购物
Servlet的生命周期
2013/08/25 面试题
营销专业应届生求职信
2013/11/26 职场文书
迎接领导欢迎词
2014/01/11 职场文书
保护环境建议书400字
2014/05/13 职场文书
中学生旷课检讨书2篇
2014/10/09 职场文书
画展邀请函
2015/01/31 职场文书
异地恋情人节寄语
2015/02/28 职场文书
个人德育工作总结
2015/03/05 职场文书
90条交通安全宣传标语
2019/10/12 职场文书
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js
Python实现仓库管理系统
2022/05/30 Python