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实现端口扫描 的相关文章

  • UartAssist - 串口调试助手。

    由于项目需要用到串口 xff0c 所以我就找到一个简单易上手的串口调试助手 串口调试助手 1 助手界面 xff1a 2 设置串口 xff0c 点击 打开 3 设置发送区和接收区参数 4 输入发送内容 xff0c 点击 发送 即可
  • 网络摄像机rtsp地址详解。

    RTSP xff08 Real Time Streaming Protocol xff09 xff0c RFC2326 xff0c 实时流传输协议 xff0c 是TCP IP协议体系中的一个应用层协议 xff0c 由哥伦比亚大学 网景和Re
  • Qt 登陆界面实现

    简单的QT用户登录界面 一 项目描述 在登录界面输入用户名和密码正确之后才进入欢迎界面 用户名 xff1a xiaoxian 密码 xff1a 1240 二 效果图 三 源代码 loginform span class token punc
  • FFMPEG保存视频流数据至本地(rtsp转mp4)

    将rtsp流中的h264视频流在没解码之前获取下来 xff0c 并保存到本地文件mp4中的h264流中 xff0c h264 gt mp4 网络摄像机rtsp地址详解 流程图 xff1a 源码 xff1a span class token
  • Qt + FFmpeg实现播放器(FFmpeg可以解码的格式基本都可以播放)。

    一 开发环境的准备 Linux下移植ffmpeg开源库 二 代码实现播放功能 1 打开音视频流并获取音视频流信息 xff1b 2 查找视频流位置以及查找并打开视频解码器 xff1b 3 视频解码的同时处理图片像素数据 xff1b 4 最后要
  • SecureCRT 下的串口不能输入指令。

    1 在 SecureCRT 下的串口不能输入指令 解决方法 xff1a Session Options gt Connection gt Serial gt Flow Control xff0c 将原先默认选中的 RTS CTS取消掉即可
  • Qt实现简单密码登陆界面

    效果图 xff1a 代码实现 span class token macro property span class token directive hash span span class token directive keyword i
  • error: ‘uint8_t’,‘uint32_t’ does not name a type

    c 43 43 里用了c的代码 xff0c 确切的说 xff0c 是引用了c写的x264 h xff0c 结果报错了 xff1a 解决方法 xff1a span class token macro property span class t
  • gitlab 同时拉取整个项目

    一 xff1a 下载repo工具包 下载地址 xff1a GitHub NeutionWei repo unzip repo 刚下载的repo包解压 xff0c 其中的repo只是一个几百行的脚本 xff0c 需要repo init才可以获
  • CMakeLists.txt详解

    一 xff1a CMakeLists txt文件是cmake用来生成Makefile文件需要的一个描述编译链接的规则文件 学习cmake需要提前了解gcc等编译命令 xff0c 先来解释一条最简单的命令 gcc source c o bin
  • opencv估计两图的三维坐标变换矩阵

    cv estimateAffine3D MatFrom MatTo Transfrom inlier Transform得到的是重MatFrom到MatTo的变换矩阵 inlier给一个空矩阵就可以 MatFrom和MatTo都是点的矩阵
  • shell脚本详解

    通俗来讲shell脚本就是把shell命令放在一个 脚本 中 xff0c 脚本的第一行 xff01 bin bash 意思为这个脚本指定一款在 bin 下名叫bash的shell解释器 xff0c 来解释接下来的任何命令 xff0c 如果我
  • 车载以太网测试规范tc8下载地址

    网上只要搜到下载就要积分 xff0c VIP xff0c 其实他们也是从别处免费下载的 xff0c 拿到别处骗钱 xff0c 话不多说下载地址如下 xff1a Open Alliance 不用谢 xff01
  • ARP包解析及工作原理

    ARP数据包42字节 参照以下例子 xff1a 前12字节为以太网的目的地址 54 89 98 0f 2b be 和源地址 54 89 98 5b 5b 8a xff0c 当目的地址全为1时是以太网广播地址 xff0c 此时ARP还未建立缓
  • Jetson Xavier NX刷机安装Ubuntu20.04,配置CUDA,cuDNN,Pytorch等环境教程(英伟达官方源安装,理论适用其它Jetson设备)

    一 准备工作 硬件 xff1a Jetson Xavier NX开发板 xff08 笔者购入为带128g内存条的EMMC版 xff09 跳线帽 xff08 杜邦线 xff09 microUSB转USB数据线 电源线 软件 xff1a Ubu
  • Hadoop伪分布搭建完整步骤

    1 新建虚拟机配置网络并测试网络连接 1 鼠标单击左侧虚拟机名称 xff0c 接着单击菜单栏 编辑 xff0c 在下拉菜单中选择 虚拟网络适配器 xff0c 如图 1 2 20 所示 4 在打开的 虚拟网络编辑器 对话框 xff0c 单击
  • linux--top命令查看系统所有详情

    Linux系统可以通过top 命令查看系统的CPU 内存 运行时间 交换分区 执行的线程等信息 通过top命令可以有效的发现系统的缺陷出在哪里 是内存不够 CPU处理能力不够 IO读写过高 一 top命令的第一行 top 19 56 47
  • OPENMV巡线

    将openmv图片划分成三个ROI区域 import sensor image time lcd from pyb import UART from pyb import LED ROIS 61 0 0 160 40 0 6 0 40 16
  • C++学习笔记

    一 一些重要的常见知识点 1 函数的分文件编写 xff1a h的头文件 xff08 写函数声明 xff09 cpp的源文件 xff08 写函数功能实现 xff09 2 空指针和野指针 xff1a 0 255的内存是系统所占有的 96 int
  • 使用XTDrone遇到的问题的解决

    在使用XTDrone时 xff0c 遇到了px4包找不到的问题 xff1a RLException mavros posix sitl launch is neither a launch file in package 使用官方配置文档h

随机推荐

  • 树莓派书籍全方位推荐

    相关书籍 python编程篇1 Python硬件开发树莓派从入门到实践 内容简介作者简介 2 Python树莓派开发从入门到精通内容简介编辑推荐 3 树莓派Python编程入门与实战书籍简介 4 树莓派Python编程指南内容简介作者简介
  • 总结几个比较常用的数学公式(新手入门)

    合理的公式可以帮助我们优化代码 xff0c 比如可以减少遍历的次数 xff0c 减少思考的难度 xff0c 提高算法效率 xff0c 此文章将持续更新 一 换底公式 Logab 61 logxb logxa 换底公式虽然不常用 xff0c
  • 【Linux/C/C++】面试题总结

    1 static关键字的作用 答 xff1a 在C语言中 xff0c 局部变量不会在诞生时被编译器自动初始化 xff0c 且生命周期终止于该变量所在的函数结束时 通过使用static关键字修饰局部变量 xff0c 可以使编译器自动为其赋初始
  • 匿名上位机V7与stm32通信协议

    一 xff0c 通信介绍 1 通信帧格式介绍 为了适应多种数据类型的传输 xff0c 保证高效的通信效率 xff0c 所有数据的通信 xff0c 均需要遵守本通信帧格式 本格式在 确保通信高效 源码简单 可移植性高的基础上 xff0c 实现
  • 酒店管理系统( JAVA)

    最近在学JAVA的数组学完之后做了一个简易的酒店管理系统 xff0c 酒店管理系统应该包含三部分 xff0c 第一部分是我们酒店管理系统的主题 xff0c 第二部分是我们酒店里的信息 xff0c 第三部分则是我们的房间信息 xff0c 具体
  • Ubuntu20.04下使用Qt5.15.2编译qgc源码

    下载QGC源码 可以在QGC官网按照教程根据自己的需求来下载源码QGC git clone recursive j8 https github com mavlink qgroundcontrol git git submodule upd
  • #ROS通讯机制:参数服务器

    参数服务器修改小海龟背景色 1 进入工作空间的src目录新建工作包 lzw08 64 ubuntu span class token operator span span class token operator span cd ros w
  • 9.19 GoogLeNet

    GoogLeNet GoogLeNet在2014年ImageNet图像识别挑战赛中大放异彩虽然NiN现在基本上没有被使用了 xff0c 但是GoogLeNet现在还是大量地被使用GoogLeNet是第一次做到快100层卷积层 xff08 第
  • react路由参数传递

    react路由的三种传参方式 1 向路由组件传递params参数 参数传递 在注册路由时接收参数 注意这里后面时冒号在前面的 在要展示的组件内接收params参数 2 第二种 xff0c 利用search传递参数 向路由组件传递参数 这种方
  • 链队列(详解)--->数据结构、C++实现

    问题引入 在数据结构中 xff0c 队列也是一种重要的线性结构 xff0c 常和栈放在一起进行学习 队列分为多种类型 xff0c 常见的如循环队列 链队列等 xff0c 如果此时此刻你对 链队列 感到困惑 xff0c 那就继续看下去 xff
  • Windows11正版下载和Windows10正版下载安装教程

    Windows11正版下载和Windows10正版下载 下载链接 xff1a https www microsoft com zh cn software download windows11 Windows11下载官网连接 https w
  • 2022-03-30 VsCode中使用clangd插件的各种设置

    最近尝试clang编译c 43 43 xff0c 所以用了clangd插件代替mscpp插件 xff0c 其中有不少问题 xff0c 都是通过各种搜索 xff0c 各种猜 xff0c 才能完善 xff0c 记录一下 xff0c 以便广大同仁
  • [Ubuntu]安装ifconfig

    apt install net tools
  • python3对接微信小程序蓝牙

    39 39 39 Created on 2019年10月15日 64 author lg 39 39 39 from Crypto Cipher import AES from binascii import b2a hex a2b hex
  • docker--Dockerfile操作指令

    docker Dockerfile操作指令 文章目录 docker Dockerfile操作指令一 FROM指令1 基本概述2 用法3 说明4 关于FROM scratch 二 RUN指令1 基本概述2 用法3 说明 三 ENV指令1 基本
  • 【监控】k8s部署prometheus + grafana

    k8s以Deployment方式部署prometheus 43 grafana xff1a 主机说明 xff1a 系统ip角色cpu内存hostnameCentOS 7 8192 168 30 128master gt 61 2 gt 61
  • 多线程以及在PYQT中的使用

    1 多线程 简单来说就是可以用多线程同时执行多个程序 在python中 xff0c 我们用的是 threading库 这个库包含了线程的方法和其他配套方法 xff08 比如锁 xff09 似乎 concurrent库会更方便更安全 xff0
  • 简单平衡小车制作过程中遇到的问题

    本人最近做了一个平衡小车 xff0c 过程中遇到不少问题 xff0c 在这里总结一下 xff0c 可能也会帮助到大家 文章目录 前言一 嫖资料 xff0c 找教程二 小车结构三 电子元件的组装四 写程序时 xff08 改嫖到的程序 xff0
  • c++高性能服务器开发01-环境搭建,相关基础概念,Linux系统相关函数

    1 安装Ubuntu18 openssh servernet toolspwdlsvscode 插件 xff1a remotec 43 43 配置公钥 windows 公钥复制到Linux的 ssh authorized keysssh k
  • Python实现端口扫描

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