python3-端口扫描(TCP connect扫描,SYN扫描,FIN扫描)

2023-05-16

利用python3进行端口扫描,TCP的方式有connect扫描,SYN扫描,FIN扫描,NULL扫描,ACK扫描,Xmas,windows扫描。本次展示前三种,代码仅供参数:

  • 扫描方式 1:TCP connect扫描

扫描端与目标主机建立tcp连接,完成三次握手后,扫描端主动关闭连接(缺点:目标主机会记录下连接内容)


# -*- coding: utf-8 -*-
import queue
import socket
import threading

'''
功能介绍:
    通过TCPconnect进行端口扫描,需要用户输入ip,port,线程数(默认10)
函数介绍:
    Portscan_print(ip)                              #结果排序打印
    Portscan_Threadfun(ip)                          #线程分配函数
    Portscan_TCPconnect(ip, p)                      #扫描功能实现
    Portscan_threadnum(ip,num=10)                   #控制线程数量
    Portscan_portlist(ip,userport)                  #扫描端口处理
'''

def Portscan_Threadfun(ip):                         # 工具人
    while True:
        if q.empty():                               # 判断队列是否为空
            break
        else:
            port = q.get()                          # 取出一个端口
            Portscan_TCPconnect(ip, port)


def Portscan_TCPconnect(ip, p):                     # TCPconnect功能实现
    try:
        port = int(p)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        if port == 3306 or port == 22 or port == 23 or port == 1521:
            s.settimeout(4)
        else:
            s.settimeout(1)
        s.connect((ip, port))
        openport_list.append(port)
    except Exception as e:
        closeport_list.append(port)
    finally:
        s.close()


def Portscan_print(ip):                             # 打印函数,排序
    openport_list.sort()
    for i in openport_list:
        print(ip + "\t" + str(i) + " Open\t\t")
    closeport_list.sort()
    for i in closeport_list:
        print(ip + "\t" + str(i) + " Close")


def Portscan_threadnum(ip, num=10):                 # 控制线程函数
    thread_joinlist = []
    for i in range(0, num):                         # 控制线程数
        new_thread = threading.Thread(target=Portscan_Threadfun, args=(ip,))
        new_thread.start()
        thread_joinlist.append(new_thread)
    for i in thread_joinlist:
        i.join()                                    # 循环等待每个线程完成任务,之后在进行打印工作


def Portscan_portlist(ip, threadnum, userport=0):   # 端口处理函数
    global q
    global openport_list
    global closeport_list
    q = queue.Queue()
    openport_list = []
    closeport_list = []
    if userport:
        if ',' in userport:
            ports = userport.split(',')
        elif '-' in userport:
            ports = userport.split('-')
            tmpports = []
            [tmpports.append(i) for i in range(int(ports[0]), int(ports[1]) + 1)]
            ports = tmpports
        else:
            ports = [userport]
    else:
        print('Default Ports')
        ports = [21, 22, 23, 53, 80, 111, 139, 161, 389, 443, 445, 512, 513, 514,
                 873, 1025, 1433, 1521, 3128, 3306, 3311, 3312, 3389, 5432, 5900,
                 5984, 6082, 6379, 7001, 7002, 8000, 8080, 8081, 8090, 9000, 9090,
                 8888, 9200, 9300, 10000, 11211, 27017, 27018, 50000, 50030, 50070]
    [q.put(i) for i in ports]                       # 将端口加入queue队列
    Portscan_threadnum(ip, threadnum)
    Portscan_print(ip)                              # 打印输出函数


if __name__ == '__main__':
    ip = '104.193.88.77'
    userport = '443'
    threadnum = 20
    Portscan_portlist(ip, threadnum, userport)  

  • 扫描方式 2:SYN扫描

扫描主机主动向目标主机指定端口发送SYN数据,表示建立连接请求,如果目标主机回应SYN+ACK,说明端口活动。回复RST说明目标端口不存活。接着扫描主机回一个RST给目标主机拒绝连接。导致三次握手失败(不会留下连接记录)


# -*- coding: utf-8 -*-
import queue
import threading
from scapy.sendrecv import sr
from scapy.layers.inet import IP, TCP

'''
功能介绍:
    通过TCPSYN进行端口扫描,需要用户输入ip,port,线程数(默认10)
'''


def Portscan_Threadfun(ip):                         # 工具人
    while True:
        if q.empty():                               # 判断队列是否为空
            break
        else:
            port = q.get()                          # 取出一个端口
            Portscan_SYN(ip, port)


def Portscan_SYN(ip, port):
    try:
        temp = sr(IP(dst=ip) /
                  TCP(dport=(int(port)), flags='S'),
                  timeout=2, verbose=False)
        if temp[0].res:
            result = temp[0].res                    # temp分回复和无回显
            if (result[0][1].payload.flags) == 'SA':
                print('端口开放')
                openport_list.append(port)
                return 1
            else:
                closeport_list.append(port)
        else:
            closeport_list.append(port)
            return 0
    except:
        closeport_list.append(port)
        return 0

def Portscan_print(ip):                             # 打印函数,排序
    openport_list.sort()
    for i in openport_list:
        print(ip + "\t" + str(i) + " Open\t\t")
    closeport_list.sort()
    for i in closeport_list:
        print(ip + "\t" + str(i) + " Close")


def Portscan_threadnum(ip, num=10):                 # 控制线程函数
    thread_joinlist = []
    for i in range(0, num):                         # 控制线程数
        new_thread = threading.Thread(target=Portscan_Threadfun, args=(ip,))
        new_thread.start()
        thread_joinlist.append(new_thread)
    for i in thread_joinlist:
        i.join()                                    # 循环等待每个线程完成任务,之后在进行打印工作

def Portscan_synport(ip,userport,threadnum=50):
    global q
    global openport_list
    global closeport_list
    openport_list = []
    closeport_list = []
    q = queue.Queue()
    if userport:
        if ',' in userport:
            ports = userport.split(',')
        elif '-' in userport:
            ports = userport.split('-')
            tmpports = []
            [tmpports.append(i) for i in range(int(ports[0]), int(ports[1]) + 1)]
            ports = tmpports
        else:
            ports = [userport]
    else:
        print('Default Ports')
        ports = [21, 22, 23, 53, 80, 111, 139, 161, 389, 443, 445, 512, 513, 514,
                 873, 1025, 1433, 1521, 3128, 3306, 3311, 3312, 3389, 5432, 5900,
                 5984, 6082, 6379, 7001, 7002, 8000, 8080, 8081, 8090, 9000, 9090,
                 8888, 9200, 9300, 10000, 11211, 27017, 27018, 50000, 50030, 50070]

    [q.put(i) for i in ports]                           #将端口加入队列
    Portscan_threadnum(ip,threadnum)
    Portscan_print(ip)



if __name__ == '__main__':
    ip = '192.168.0.110'
    port = '400-500'
    Portscan_synport(ip,port)  

  • 扫描方式 3:FIN扫描

FIN扫描和NULL扫描类似,将标志位FIN置1,如果端口开放,则没有反应,端口关闭,目标主机会发送RST,同样在windows上不适用


from scapy.layers.inet import IP, TCP
from scapy.sendrecv import sr, sr1

'''
适用于Linux设备
通过设置flags位为'FIN',不回复则表示端口开启,回复并且回复的标志位为RST表示端口关闭
'''
def fin_scan(ip, port):
    p = IP(dst=ip) / TCP(dport=int(port), flags="F")
    ans = sr1(p, timeout=1, verbose=1)
    print(ans)
    if ans == None:
        print(ip, "port", port, "is open.")
    elif ans != None and ans[TCP].flags == 'RA':
        ans.display()
        print(ip, "port", port, "is closed.")

if __name__ == '__main__':
    ip = '192.168.0.112'
    port = 55
    fin_scan(ip,port)  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python3-端口扫描(TCP connect扫描,SYN扫描,FIN扫描) 的相关文章

  • JavaScript生成指定范围的随机数和随机数序列

    在JavaScript中我们经常使用Math random 方法生成随机数 xff0c 但是该方法生成的随机数只是0 1之间的随机数 先看如下常用方法的特征 xff1a 1 Math random 结果为0 1间的一个随机数 包括0 不包括
  • JavaScript生成指定范围随机数和随机序列

    在JavaScript中我们经常使用Math random 方法生成随机数 xff0c 但是该方法生成的随机数只是0 1之间的随机数 先看如下常用方法的特征 1 Math random 结果为0 1间的一个随机数 包括0 不包括1 2 Ma
  • 【React Native】JavaScript 中 bind 方法

    这个问题其实是一个 JavaScript 中的问题 JavaScript中jQury的bind方法为选定元素添加事件处理程序 xff0c 规定事件发生时运行的函数 语法为 xff1a selector bind event data fun
  • 瑞利信道:从原理到实现

    瑞利信道模型 瑞利信道模型是无线通信信道最重要 最基础的的仿真模型 无线信道中的平坦衰落信道基本上都是在瑞利信道模型的基础上修改而成 xff0c 比如应用同样广泛的莱斯信道就可以通过在瑞利信道的基础上简单的添加直流分量实现 xff0c 而频
  • N个数中的第k个最大值

    确定一组N个数中的第k个最大值 xff0c 这是数据结构和算法分析 java语言描述 中讨论的第一个问题 书中第一章也已给处两种常规思路 xff1a 1 xff0d 先将N个数的数组整体进行递减排序 xff0c 然后返回位置k 数组索引为k
  • 【React Native】app\build\intermediates\res\merged\debug\values-v24\values-v24.xml中错误

    昨天在项目中使用了 react native svg 库 xff0c 配置完成正在正常启动的时候 xff0c 却出现四个错误 xff0c 全部来源于app build intermediates res merged debug value
  • 【React Native】定位获取经纬度,当前城市等地址信息

    2019 8 21 使用内置对象 navigator 来获取经纬度信息 xff0c 参见 定位获取经纬度 xff0c 获取到经纬度等位置信息后需要用到第三方api位置解析 xff08 本文后半段 xff09 2019 7 20更新 xff1
  • 【React Native】定位获取经纬度

    RN 文档上的定位功能需要谷歌框架支持 xff0c 无疑带来了一些麻烦 github 上也有一些开源库 xff0c react native geolocation service等 但是这里还有一个更简便的位置获取 API 使用内置对象n
  • centos7系统下Python2.7升级到Python3.6踩的坑(yum失效,并非简单修改yum文件头)

    centos系统自带的Python2 7用的好好的 xff0c 我非手贱要去升级 xff0c 结果很严重 xff0c 正在运行服务器里面的yum崩了 xff0c 反复尝试了网上提到的几乎完全一致的解决方法 xff1a 将 usr bin y
  • 关于 Android Studio 4.0 创建新的activity和fragment 发现不存在

    1 在 app文件下面的 build gradle里面 注释以下代码
  • RAR文件格式-笔记

    RAR RAR 文件头 52 61 72 21 1A 07 00RAR 文件尾 C4 3D 7B 00 40 07 00 Rar 文件主要由标记块 xff0c 压缩文件头块 xff0c 文件头块 xff0c 结尾块组成 其每一块大致分为以下
  • pptv电话面试

    1 8种基本数据类型 2 String是基本数据类型吗 3 try return 1 catch return 2 finally return3 4 线程池 5 spring实现原理 6 s
  • Linux之systemd服务配置及自动重启

    Linux之systemd服务配置及自动重启 0 背景 在linux上开发时 xff0c 往往需要将自己的程序做成服务 xff0c 并且实现服务开机自动重启 xff0c 以及服务崩溃后自动重启功能 xff0c 本文就对该功能的实现做简单介绍
  • C++中类与对象的关系

    C 43 43 是一门面向对象的编程语言 xff0c 理解C 43 43 xff0c 首先要理解类 xff08 Class xff09 和对象 xff08 Object xff09 这两个概念 C 43 43 中的类 xff08 Class
  • 主定理的证明及应用举例

    主定理 主定理最早出现在 算法导论 中 xff0c 提供了分治方法带来的递归表达式的渐近复杂度分析 规模为n的问题通过分治 xff0c 得到a个规模为n b的问题 xff0c 每次递归带来的额外计算为c n d T n lt 61 aT n
  • Java设计模式 | 观察者模式解析与实战

    概述 观察者模式是一个使用率非常高的模式 xff0c 它最常用的地方是 GUI 系统 订阅 发布系统 这个模式的一个重要作用就是解耦 xff0c 将被观察者和观察者解耦 xff0c 使得它们之间的依赖性更小 xff0c 甚至做到毫无依赖 以
  • blob excel文件导出

    vue 项目中excel文件导出 xff1a exportData 点击方法名称 jjrExport this years then res 61 gt this years为请求参数 console log res const type
  • 知识管理——学习篇

    你的知识需要管理 田志刚 2009年11月 现在 xff0c 根据本书的理念 xff0c 你的使命不仅仅是获取该书的知识 xff08 获取什么 xff1f 他的前瞻性思考判断 xff0c 人家10年前有这种知识管理预见和意识 xff01 作
  • dependencyManagement_前进的火车_新浪博客

    dependencyManagement使用简介 Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式 在dependencyManagement元素中声明所依赖的jar包的版本号等信息 xff0c 那么
  • 【Redis】Redis简介与基本特性

    简介 Redis 全称为 Remote DIctionary Server xff0c 本质上是一个 key value 存储系统 xff0c 属于跨平台的非关系型数据库 Redis 官方对它的定义是 xff1a Redis is an o

随机推荐

  • 【Java 集合类】Collections 类源码分析

    Collections 类源码分析 包路径 xff1a jdk1 8 0 111 rt jar java util Collections java Collections是JDK提供的工具类 xff0c 同样位于java util包中 它
  • 首个Adobe XD教程丨如何用Adobe Experience Design (XD)快速设计图标

    提示 xff1a 阅读本文前建议先从 码农与产品经理看过来 教你用Adobe Xd轻松做原型设计 文章入手 xff0c 会更加学度的掌握此建模神器的精髓http www zoomla cn blog techs 3080 shtml 逐浪小
  • 关于ubuntu下终端打开一闪就退出的一种情况

    终端ctrl 43 alt 43 t后终端一闪即过 首先你换一下访客进入ubuntu查看是否可以打开终端 可以 xff0c 请接着往下看 xff0c 否则抱歉 xff01 首先请你回想一下 xff0c 在这之前你对系统有没有做过什么更改 x
  • 如何转行游戏行业及我眼中的理想游戏开发团队

    前置内容 xff1a 很久没有写文章啦 xff0c 今天就来继续和大家聊一聊关于游戏制作的一些东西 今天主要聊两个方面 xff0c 一个是其他行业转游戏行业的一些注意事项以及需要具备的东西 xff1b 第二是和大家聊一聊我心目中理想的游戏开
  • 浅谈重载new操作符

    new是C 43 43 里非常重要的一个关键词 xff0c 用于申请内存 初始化对象 俗话说 有借有还再借不难 xff0c 通过new向操作系统 借 到的内存用完后必然要 还 回去 xff0c 所以对应地还有一个delete操作符与new共
  • SettingProvider工作原理

    1 基本介绍 SettingsProvider是一个提供设置数据共享的Provider xff0c 可以简单理解为数据库 xff0c 它包含全局性 系统级别的用户编好设置 xff0c 例如在手机中的Settings应用 xff0c 用户可以
  • 多普勒失真信号重采样的Matlab仿真分析

    多普勒失真信号重采样的Matlab仿真分析 应用场景 水声通信指的是使用声信号在水中传输数据 相对而言 xff0c 电磁信号在水中吸收严重衰减过快 xff0c 光信号受水中悬浮颗粒的影响 xff0c 也无法完成远距离传输 这两种信号的传播距
  • 1——Qt安装(ubuntu16.04 + Qt 5.14.2)

    下载Qt http download qt io archive qt 注 xff1a 下载Qt 5 14 2文件夹下的 run 文件 安装Qt 进入下载文件所在位置 xff0c 打开命令行终端 chmod 777 qt opensourc
  • git设置单个仓库用户名以及密码

    有些时候我们的服务器可能要部署多个git仓库 xff0c 不同git仓库的用户名以及密码都是不一样的 xff0c 此时需要我们设置单个仓库的用户名以及密码 1 git设置用户名以及邮箱 命令如下 xff1a git config user
  • php 多版本切换

    项目开发中实际会存在 xff0c php版本不同的情况 下面看具体实现方法 以下均是在 windows 下操作完成 1 先看一下我本地的 php 版本 我这里默认版本是php7 1 xff0c 下面看一下环境变量配置 默认版本不需要改 ph
  • apt-get 安装某个包时出现各种依赖包没有安装、版本不对互相套娃的一种解决方法

    错误信息 Depends 某某包 but it is not going to be installed 或者 Depends 某某包 61 某某版本 but 某某版本 is to be installed 本人是用的树莓派raspbian
  • Python 中更优雅的日志记录方案

    在 Python 中 xff0c 一般情况下我们可能直接用自带的 logging 模块来记录日志 xff0c 包括我之前的时候也是一样 在使用时我们需要配置一些 Handler Formatter 来进行一些处理 xff0c 比如把日志输出
  • 用Python抓包工具查看周边拼车情况

    说起Python爬虫 xff0c 很多人第一个反应可能会是Scrapy或者Pyspider xff0c 但是今天文章里用到是Python下一个叫Mitmproxy的抓包工具 xff0c 对付一些非常规的数据获取还是很有效的 不过凡事都是有利
  • Origin(教育版)无法更改语言是灰色的办法

    用edu后缀的邮箱可以申请正版Origin pro xff0c 但是本人下载下来后是英文版 xff0c 绘图的时候里面很多的专有名词真的一头雾水 xff0c 查看网上的教程说修改注册表 xff0c 试了后发生错误 xff0c 再次打开还是原
  • centos虚拟机切换为命令行模式

    打开命令终端Terminal 输入以下 systemctl set default multi user target 设置成命令模式 或 systemctl set default graphical target 设置成图形模式 最后
  • ubuntu操作不当,桌面图标和菜单栏消失怎么办

    最近配置一些文件没有成功 xff0c 重启后 xff0c 桌面只剩下文件和回收站 xff0c 我们可以通过终端输入指令来解决这个问题 xff0c 亲测有效 先用apt get install指令重装桌面 xff1a 快捷键或者右键打开终端
  • 应用宝-ysdk-米大师 对接道具直购服务器端下单模式 java服务端开发日志

    用于接收回调请求的linux服务器证书配置 xff1a 回调服务器配置分三种 xff0c 前两种是当服务部署在腾讯云上时的配置方式 xff0c 第三种为服务部署在自己服务器上是的配置方式 xff1a hosting应用on CVM xff0
  • 使用python开发json、csv数据格式转换工具

    使用python开发json csv数据格式转换工具 json和xml是业界常用的数据格式 xff0c 而游戏行业经常使用csv配表 xff0c 包括本地化文本和数值 本文介绍csv和json序列化 逆序列化相关的python库 xff0c
  • 【笔记】Ubuntu字体报错

    Warning Cannotconvertstring 34 adobe helvetica medium r normal 120 75 75 p iso8859 1 34 to type FontStruct ENVI 43 IDL o
  • python3-端口扫描(TCP connect扫描,SYN扫描,FIN扫描)

    利用python3进行端口扫描 xff0c TCP的方式有connect扫描 xff0c SYN扫描 xff0c FIN扫描 xff0c NULL扫描 xff0c ACK扫描 xff0c Xmas xff0c windows扫描 本次展示前