Python实现端口扫描

2023-05-16

原理

向远端指定服务器的某一个端口提出建立一个连接的请求,如果对方有此项服务,就会应答,如果对方没有此项服务时,对方就无应答。利用这个原理,我们可以指定一些端口,然后针对这些接口分别建立连接,并获取对方是否应答,便可知道对方哪些端口是开放的。
调用socket.connect_ex((ip, port)函数对指定ip和端口发出连接请求,如果返回0则证明该端口是开放的,返回错误代码说明该接口是不开放的。

socket概念

套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。

socket基本用法

在Python中,我们导入socket包,使用socket()函数来创建套接字

import socket
socket.socket(family, type)

函数socket.socket()创建一个socket套接字,该函数带有两个参数:

  • family(地址簇),可供选择的有socket.AF_INET(默认) 为IPv4,socket.AF_INET6,为IPv6,还有socket.AF_UNIX,为UNIX域协议族,只能够⽤于单⼀的Unix系统进程间通信。
  • type(socket类型),如socket.SOCK_STREAM为TCP(默认),SOCK_DGRAM为UDP。

socket内建方法如下:

  • 服务器端套接字
函数描述
s.bind()绑定地址(host, port)到套接字, 在AF_INET下,以元组(host, port)的形式表示地址。
s.listen()开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量,该值⾄少为1。
s.accept()被动接受TCP客户端连接,(阻塞式)等待连接的到来。
  • 客户端套接字
函数描述
s.connect()主动初始化TCP服务器连接,。⼀般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
s.connect_ex()connect()函数的扩展版本,出错时返回出错码,⽽不是抛出异常。
  • 公共⽤途的套接字函数
函数描述
s.recv()接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最⼤数据 量。flag提供有关消息的其他信息,通常可以忽略。
s.send()发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送 的字节数量,该数量可能⼩于string的字节⼤⼩。
s.sendall()完整发送TCP数据,完整发送TCP数据。将string中的数据发送到连接的 套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
s.recvfrom()接收UDP数据,与recv()类似,但返回值是(data,address)。其中data 是包含接收数据的字符串,address是发送数据的套接字地址。
s.sendto()发送UDP数据,将数据发送到套接字,address是形式为(ipaddr, port)的元组,指定远程地址。返回值是发送的字节数。
s.close()关闭套接字
s.getpeername()返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
s.getsockname()返回套接字⾃⼰的地址。通常是⼀个元组(ipaddr,port) 。
s.setsockopt(level,optname,value)设置给定套接字选项的值。
s.getsockopt(level,optname,buflen)返回套接字选项的值。
s.settimeout(timeout)设置套接字操作的超时期,timeout是⼀个浮点数,单位是秒。值为 None表示没有超时期。⼀般,超时期应该在刚创建套接字时设置,因为 它们可能⽤于连接的操作(如connect())
s.gettimeout()返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。 s.fileno()
s.setblocking(flag)如果flag为0,则将套接字设为⾮阻塞模式,否则将套接字设为阻塞模式 (默认值)。⾮阻塞模式下,如果调⽤recv()没有发现任何数据,或 send()调⽤⽆法⽴即发送数据,那么将引起socket.error异常。
s.makefile()创建⼀个与该套接字相关连的⽂件。

实现端口扫描

端口扫描是渗透测试中很重要的一步,可以根据开放的端口进行攻击。
现在我们写一个端口扫描程序,为其指定一个要扫描的主机和端口,判断此端口是否开放

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip = '192.168.32.180'
port = 80 
res = s.connect_ex((ip, port))
if res == 0:      # return is 0, so port open
    print('Ip: {} Port: {} IS OPEN'.format(ip, port))
else:              # else port is closed
    print('Ip: {} Port: {} IS NOT OPEN'.format(ip, port))

这里扫描的主机IP为 192.168.32.180, 端口为80, 运行结果如下:
请添加图片描述下面我们将其加上异常捕获,并封装到函数中

import socket

def scan_port(ip, port):
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # ip = '192.168.32.180'
        # port = 80
        res = s.connect_ex((ip, port))
        if res == 0:
            print('Ip: {} Port: {} IS OPEN'.format(ip, port))
        else:
            print('Ip: {} Port: {} IS NOT OPEN'.format(ip, port))
    except Exception as e:
        print(e)
    finally:
        s.close()

ip = '192.168.32.180'
port = 53
scan_port(ip, port)

运行结果如下
请添加图片描述下面我们对其进一步优化,将其封装到类中,代码如下

import socket
from datetime import datetime
from multiprocessing.dummy import Pool as ThreadPool

class ScanPort:
	def __init__(self):
		self.ip = None

	def scan_port(self, port):
		try:
			s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
			# ip = '192.168.32.180'
			# port = 80
			res = s.connect_ex((self.ip, port))
			if res == 0:
				print('Ip: {} Port: {} IS OPEN'.format(self.ip, port))
			else:
				pass
				# print('Ip: {} Port: {} IS NOT OPEN'.format(self.ip, port))
		except Exception as e:
			print(e)
		finally:
			s.close()

	def start(self):
		host = input("please input the host want to scan: ")
		# self.ip = host
		# print(type(host))
		self.ip = socket.gethostbyname(host)
		# print(self.ip)
		ports = [i for i in range(1, 1025)]
		socket.setdefaulttimeout(0.5)
		startime = datetime.now()
		threads = []
		pool = ThreadPool(processes=8)
		pool.map(self.scan_port, ports)
		pool.close()
		pool.join()
		print("port scan has done, use time:", datetime.now() - startime)

ScanPort().start()

上面的程序中,将端口扫描封装到类中,可以自定义要扫描的主机域名,迭代扫描1到1025端口号,并引入了线程,加快了运行速度并能计算出具体扫描所用时间。运行结果如下:在这里插入图片描述

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

Python实现端口扫描 的相关文章

  • MySQL数据类型

    目录 一 MySQL中的数据类型 常见数据类型的属性 关于属性 1 创建数据库时指明字符集 2 创建表的时候 xff0c 指明表的字符集 3 创建表 xff0c 指明表中的字段时 xff0c 可以指定字段的字符集 二 整数类型 xff08
  • 批量插入

    目录 一 批量插入数据 JDBC的批量处理语句的方法 二 高效的批量插入 1 举例 xff1a 向goods表中插入20000条数据 goods表的创建 方式一 xff1a 使用Statement 方式二 xff1a 使用PreparedS
  • Gateway新一代网关

    目录 一 概述 1 官网 2 介绍 3 作用 4 微服务架构中网关的位置 5 有Zuul了怎么又出来了gateway 我们为什么选择Gateway xff1f Zuul1 x模型 x1f41f Servlet的生命周期 gateway模型
  • android tensorflow文字识别身份证识别ocr文字识别商用源码

    一 xff0c 文字识别简介 计算机文字识别 xff0c 俗称光学字符识别 xff0c 英文全称是Optical Character Recognition 简称OCR xff0c 它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来
  • idea报错:无法访问org.springframework.web.bind.annotation.RestController和程序包com.sun.org.slf4j.internal不存在

    目录 1 错误具体信息 报错日志 2 原因 3 修改过程 4 程序包com sun org slf4j internal不存在 o 解决 1 错误具体信息 报错日志 INFO INFO maven compiler plugin 3 10
  • Java基础 —— 编程入门

    一 比特 bit 和字节 byte 一个0或者一个1存储为一个比特 bit xff0c 是计算机中最小的存储单位 计算机中是最基本的存储单元是字节 byte 每个字节由8个比特构成 计算机就是一系列的电路开关 每个开关存在两种状态 关 of
  • JDK、JRE、JVM的关系

    参考文章 xff1a 面试官 xff1a JDK JRE JVM 三者什么关系 xff1f 腾讯云开发者社区 腾讯云 tencent com 一 什么是JDK JDK xff1a Java Development Kit的简称 xff0c
  • 问题解决:Mybatis-Plus自增主键超级大!

    1 先瞅瞅是不是自增主键没加注解 xff1f xff08 加了哇 xff0c 没问题哇 xff0c 怎么还那么大呢 xff09 2 奥对 xff0c 看看是不是包导错了 似乎也没问题 再添几条数据试试 xff0c id越来越大 突然想到 x
  • FTP匿名登录

    介绍 从一个服务到另一个服务的目标 凭据可能会丢失在可公开访问的文件夹中的某个位置 xff0c 这将允许我们通过一个远程shell登录 xff0c 该shell不受监控 配置错误的服务可能会泄露信息 xff0c 使我们能够模拟受害者的数字身
  • Unable to start ServletWebServerApplicationContext due to missing ServletWeb解决办法

    当在springboot启动项目的时候报这种错误 xff1a 仔细一看 xff0c 报错原因是因为缺少ServletWebServerFactory的bean 既然是跟Servlet有关 xff0c 那么很可能是在web层面出现了问题 那么
  • 数据库锁概述

    行锁和表锁 主要是针对锁粒度划分的 xff0c 一般分为行锁 表锁 库锁 行锁 xff1a 访问数据库的时候 xff0c 锁定整个行数据 xff0c 防止并发错误 表锁 xff1a 访问数据库的时候 xff0c 锁定整个表数据 xff0c
  • Spring 常用注解

    Spring 常用注解 64 Component xff08 任何层 xff09 64 Controller 64 Service 64 Repository xff08 dao xff09 xff1a 用于实例化对象 64 Autowir
  • MyBatis 传递多个参数的4种方式

    MyBatis 传递多个参数的4种方式 方式1 xff1a 顺序传参 xff08 不推荐 xff09 span class token class name Employee span span class token function s
  • Java中String类的常用方法

    文章目录 Java 中 String 类的常用方法一 String 类的概念二 常用的构造方法三 常用方法1 toString 2 length 3 getBytes 4 toCharArray 5 charAt int index 6 i
  • ASR项目实战-数据

    使用机器学习方法来训练模型 xff0c 使用训练得到的模型来预测语音数据 xff0c 进而得到识别的结果文本 xff0c 这是实现语音识别产品的一般思路 本文着重介绍通用语音识别产品对于数据的诉求 对数据的要求 训练集 相关要求 xff0c
  • 如何写一棵简单的二叉查找树

    二叉查找树 完整代码 xff1a https github com problemin Algorithm blob master src Tree BSTree java 二叉排序树 xff08 Binary Sort Tree xff0
  • Redis常见的数据类型命令

    文章目录 Redis 常见的数据类型及命令一 常见的NoSQL二 Redis 简介三 key 键的一些操作命令四 Redis的五种基本数据结构1 String xff08 字符串 xff09 介绍常用命令1 1 set get1 2 app
  • Redis 的主从复制机制

    文章目录 Redis 的主从复制机制主从复制概述主从复制的作用主从复制环境的搭建主从复制的原理 哨兵模式概述哨兵模式的作用哨兵模式环境的搭建哨兵模式的原理 Cluster 模式 Redis 的主从复制机制 主从复制 概述 主从复制 xff0
  • Nginx 详解

    文章目录 Nginx 详解一 简介二 四大应用场景1 HTTP 服务器2 反向代理3 负载均衡4 动静分离 三 Linux 环境下安装Nginx四 Nginx 服务常用命令五 Nginx 配置文件1 全局块1 1 user1 2 worke
  • RabbitMQ 详解

    文章目录 RabbitMQ 详解一 MQ 简介1 MQ优缺点2 MQ应用场景3 AMQP 和 JMS4 常见的 MQ 产品 二 RabbitMQ 工作原理三 Linux环境安装RabbitMQ1 安装 Erlang2 安装 RabbitMQ

随机推荐

  • AndroidStudio卸载删除干净

    文章目录 前言一 卸载AndroidStudio程序二 删除目录 android三 xff0c 删除AndroidStudio xff0c Sdk目录在这里插入图片描述 这样文件目录就删除干净了 xff0c 接下来的教程是将配置删除 xff
  • 视图绑定ActivityMainBinding

    使用视图绑定 xff0c 可以更轻松的写与视图交互的代码 在模块中启动视图绑定之后 xff0c 系统会为每个模块中的每个XML布局文件生成一个绑定类 绑定类的实例包含对在相应布局中具有ID的所有视图的直接引用 可以代替findViewByI
  • 【FTP服务搭建】使用windows虚拟机搭建ftp服务,并能够使用ftp进行传输文件的操作

    参考了两位大佬写的教程 xff0c 自己实践了一下 xff0c 整理了一下操作步骤 使用机器 xff1a win10虚拟机 win7虚拟机 实验准备 win10下载filezilla下载地址 win10虚拟机关闭防火墙 两台机器可以相互 p
  • 操作系统经典问题——消费者生产者问题

    今日在学习操作系统的过程中遇到了这个问题 xff0c 实在是很苦恼一时间对于这种问题以及老师上课根据这个问题衍生的问题实在是一头雾水 在网络上寻找了一些大佬的讲解之后算是暂时有了点茅塞顿开的感觉 首先第一点什么是生产者 消费者问题 xff1
  • jar包的运行结果和源代码运行结果不一样

    问题 xff1a 我的A模块依赖了B模块 xff0c B模块更新了代码之后 xff0c 把A模块打包成jar包 xff0c 但是运行的时候我的B模块还是我修改之前的样子 报错 原因 xff1a 是因为我的B模块在更新了之后没有把它放到mav
  • Tensorflow数据读取篇之一 ——字节与张量的区别

    前言 字节串 xff08 bytes xff09 类型和张量 xff08 tensor xff09 类型是两种不同的数据类型 xff0c 它们在数据类型 内存分配和计算方式等方面有所不同 一 区别 数据类型 xff1a 字节串是一种特殊的不
  • O3DE社区发布2305.0版本

    O3DE社区发布了23年的第一个版本 xff0c 版本号为2305 0 2305 0版本对应的代码标签 xff0c 见链接 2305 0版本发布说明 xff0c 见链接 直接下载标签2305 0对应的源码 xff0c 命令如下 xff1a
  • 【机器学习】周志华西瓜书第八章集成学习习题8.3--编程实现AdaBoost模型,以不剪枝决策树为基学习器,在西瓜数据集3.0a上训练一个AdaBoost集成,并与教材图8.4进行比较

    xff08 1 xff09 问题理解与分析 编程实现AdaBoost模型 xff0c 不剪枝决策树为基学习器 xff0c 在西瓜数据集3 0a上训练一个AdaBoost集成 xff0c 并与教材图8 4进行比较 xff08 2 xff09
  • 【机器学习】周志华西瓜书第七章贝叶斯分类器习题--实现AODE分类器,以西瓜数据集3.0为训练集,对“测1”进行判别。

    from numpy import import numpy as np import pandas as pd 读取文件格式为xlsx的数据 def dataLoad filename df 61 pd read excel fliena
  • linux ubuntu版本下桌面图标过小或过大调整

    最近用虚拟机弄了个ubuntu系统 xff0c 但是在全屏状态下系统的桌面图标很小 xff08 如下图 xff09 后来发现是虚拟机的分辨率设置过大 xff08 大分辨率一般对应比较大的屏幕 xff09 xff0c 所以导致图标过小 更改方
  • css选择器定位元素

    CSS选择器是CSS语言的基本组成部分 xff0c 用于选择HTML或XML文档中要应用样式的元素 以下是一些常用的CSS选择器及其用法介绍 xff1a 元素选择器 xff1a 选择所有指定元素类型的元素 例如 xff1a p选择所有的段落
  • Spring Framework 学习

    Spring Framework 学习 1 Spring 核心概念1 1 IOC IOC容器 Bean DI 2 入门案例2 1 IOC入门案例2 2 DI 入门案例 3 IOC 基本内容3 1 bean 基础配置3 2 bean 实例化
  • POJ-2453

    As we known data stored in the computers is in binary form The problem we discuss now is about the positive integers and
  • Ubuntu系统下离线安装依赖包

    目录 一 离线安装Ubuntu依赖包 二 离线安装Python第三方库 为了解决在无网或局域网的条件下 xff0c 无法进行环境的安装部署问题 xff0c 使用将依赖包抽取出来 xff0c 再进行本地安装的方法 一 离线安装Ubuntu依赖
  • node:internal/modules/cjs/loader:936

    使用express的时候 xff0c 执行node app js时 xff0c 终端报了标题上面的错误 node internal modules cjs loader 936 throw err Error Cannot find mod
  • Uncaught TypeError: XXX is not a function的解决方法

    今天在学习JS的时候 xff0c 在学函数时 xff0c 发现了一个有点意思的问题 xff1a 在网上找了很多方法 xff0c 无果 xff0c 毕竟不是每个人的原因都相同 再回看了一下笔记 xff0c 对比了一下代码 xff0c 找到了可
  • 计算机组成原理测试习题集2

    1 某机用32位表示一个数 xff0c 阶码部分占8位 xff08 含一个符号位 xff09 xff0c 尾数部分占24位 xff08 含一个符号位 xff09 设X1 61 256 5 xff0c X2 61 127 256 xff0c
  • DNS的资料

    如下是部分资料 DNS 原理入门什么是DNS xff1f 36 张图详解 DNS xff1a 网络世界的导航Linux DNS 查询剖析 xff08 第一部分 xff09 Linux DNS 查询剖析 xff08 第二部分 xff09 Li
  • 无法从静态上下文中引用非静态方法

    原因 xff1a 1 用static修饰的方法称为静态方法 xff0c 修饰变量则为静态变量 xff0c 又分别叫做类方法或者类变量 静态方法中不能直接调用非静态方法 因为非静态方法不是独立存在的 xff0c 它是依附于对象存在 即只有申明
  • Python实现端口扫描

    原理 向远端指定服务器的某一个端口提出建立一个连接的请求 xff0c 如果对方有此项服务 xff0c 就会应答 xff0c 如果对方没有此项服务时 xff0c 对方就无应答 利用这个原理 xff0c 我们可以指定一些端口 xff0c 然后针