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 相关文章推荐
基于python3 类的属性、方法、封装、继承实例讲解
Sep 19 Python
python 以16进制打印输出的方法
Jul 09 Python
Django进阶之CSRF的解决
Aug 01 Python
python3 拼接字符串的7种方法
Sep 12 Python
python中多个装饰器的执行顺序详解
Oct 08 Python
python实现二维数组的对角线遍历
Mar 02 Python
Python实例方法、类方法、静态方法的区别与作用详解
Mar 25 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
Python将文字转成语音并读出来的实例详解
Jul 15 Python
Django实现文件上传和下载功能
Oct 06 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 Python
如何用 Python 子进程关闭 Excel 自动化中的弹窗
May 07 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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
php桌面中心(二) 数据库写入
2007/03/11 PHP
一个PHP验证码类代码分享(已封装成类)
2011/07/17 PHP
解析thinkphp import 文件内容变量失效的问题
2013/06/20 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
PHP中类的自动加载的方法
2017/03/17 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
2019/02/27 PHP
php中的钩子理解及应用实例分析
2019/08/30 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
javascript URL锚点取值方法
2009/02/25 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
基于KMP算法JavaScript的实现方法分析
2013/05/03 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
JQuery点击行tr实现checkBox选中的简单实例
2016/05/26 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
JavaScrpt的面向对象全面解析
2017/05/09 Javascript
Javascript 严格模式use strict详解
2017/09/16 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
windows下python安装小白入门教程
2018/09/18 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
python urllib和urllib3知识点总结
2021/02/08 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
联想中国官方商城:Lenovo China
2017/10/18 全球购物
宪法宣传周工作方案
2014/05/26 职场文书
防汛工作情况汇报
2014/10/28 职场文书
python实现简单倒计时功能
2021/04/21 Python
Pygame Time时间控制的具体使用详解
2021/11/17 Python
Grafana可视化监控系统结合SpringBoot使用
2022/04/19 Redis
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js