Python 端口扫描器

2023-05-16

目录

  • 前言
  • 一、TCP全连接
  • 二、程序编写
    • 1.获得主机名和端口
    • 2.解析主机名和端口
    • 3.抓取应用的Banner
    • 4.线程扫描
    • 5.信号量机制
  • 总结


前言

任何一个靠谱的网络攻击都是起步于侦查的。在这里,我们将使用Python来编写一个扫描目标主机或服务器开放的TCP端口的侦查脚本程序。


一、TCP全连接

所以成功的网络攻击一般都是以端口扫描拉开序幕的,因此在此我们使用TCP全连接扫描来确定目标主机的端口开放情况。

TCP连接的基本概念:

三次握手:

1、第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

2、第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

3、第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

则顾名思义,TCP全连接就是完成三次握手步骤的过程。

二、程序编写

1.获得主机名和端口

为了实现从用户方获取数据,我们在程序中使用optparse库解析命令行参数。调用optparse.OptionParser(usage)会生成一个参数解析器类的实例。接着在parser.add_option中指定这个脚本具体要解析哪个命令行参数。
代码实例:

	usage="usage %prog -H <target host> -p/-P <target ports>"
    parser=optparse.OptionParser(usage)  #创建对象实例
    parser.add_option('-H',dest='Host',type='string',help='target host')   ##需要的命令行参数
    parser.add_option('-P','-p',dest='Ports',type='string',help='target ports')

2.解析主机名和端口

接下来,我们要生成两个函数:ConnScan和portScan。portScan函数以参数形式接收主机名和目标端口列表。它首先会尝试用gethostbyname()函数确定主机名对应的IP地址。接下来,它会实验ConnScan函数输出主机名(或IP地址),并使用ConnScan()函数尝试逐个建立与目标端口的连接。如果成功,则打印一个端口开放的信息,如果失败,则打印端口关闭的信息。

代码:

def connScan(tgtHost,tgtPort):
    try:
        conn=socket(AF_INET,SOCK_STREAM)
        conn.connect((tgtHost,tgtPort))
        screenLock.acquire()                      #加锁
        print('[+]%d/tcp open'% tgtPort)
        conn.close()
    except Exception as e:
        screenLock.acquire()
        print(e)
        print('[-]%d/tcp closed'% tgtPort)
    finally:
        screenLock.release()           #释放锁
        conn.close()


def portScan(tgtHost,tgtPorts):
    try:
        tgtIP=gethostbyname(tgtHost)          ##获得对应主机的ip地址
    except:
        print("[-] Cannot resolve '%s':Unknown host" %tgtHost)
        return
    try:
        Name=gethostbyaddr(tgtIP)     ##获得ip对应主机的信息
        print ("\n[+] Scan Results for:"+Name[0])
    except:
        print ("\n[+] Scan Results for:"+tgtIP)
    setdefaulttimeout(1)
    for Port in tgtPorts:
        t = Thread(target=connScan,args=(tgtHost,int(Port)))
        t.start()

3.抓取应用的Banner

为了抓取目标主机上的应用的Banner,我们必须在ConnScan函数中插入一些新增的代码。找到开放的端口后,我们向它发送一个数据串并等待响应。跟进收集到的响应,我们就推断出目标主机和端口上运行的应用。
代码:

		conn.send('test message\r\n'.encode("utf-8"))             #发送测试信息给端口
        results=conn.recv(100)                    #接收主机返回的信息
		print('[+] '+results.decode("utf-8"))

4.线程扫描

根据套接字中timeout变量的值,每扫描一个套接字都会花费几秒钟,看上去微不足道。但如果一旦要扫描的主机和端口多起来时,就会造成效率的严重下降。因此我们引入Python线程,线程是一种能提供这类同时执行多项任务的方法。具体到我们的脚本代码中,即我们要修改portScan()函数中迭代循环的代码。
代码:

    for Port in tgtPorts:
        t = Thread(target=connScan,args=(tgtHost,int(Port)))
        t.start()

这让我们的速度有了显著提升。

5.信号量机制

增加线程机制后程序的运行效率得到了提升,但这又有一个缺点。ConnScan()函数会在屏幕上打印一个输出。如果多个线程同时打印输出,就可能出现乱码和失序。为了让输出按正常顺序流程实现,我们需要使用信号量机制(semaphare)。一个简单的信号量就能阻止其他线程运行。注意,在打印输出前,我们用Lock.acquire()执行一个加锁操作。如果信号量还没有被锁上,线程就有权继续运行,并打印输出到屏幕上。如果信号量被锁定,当前线程只能等待正在持有信号量的线程释放信号量。通过利用信号量,我们确保了任何时间段只能有一个线程打印屏幕。

代码:

	screenLock.acquire()                      #加锁
        print('[+]%d/tcp open'% tgtPort)
        print('[+] '+results.decode("utf-8"))
        conn.close()
    except Exception as e:
        screenLock.acquire()
        print(e)
        print('[-]%d/tcp closed'% tgtPort)
    finally:
        screenLock.release()           #释放锁
        conn.close()

总结

综上所述,汇总在一起,并添加一些函数解析代码,这就有了我们最终的一个简单的TCP连接端口扫描器脚本。

代码:

import optparse
from socket import *
from threading import *
screenLock = Semaphore(value=1)

def connScan(tgtHost,tgtPort):
    try:
        conn=socket(AF_INET,SOCK_STREAM)
        conn.connect((tgtHost,tgtPort))
        conn.send('test message\r\n'.encode("utf-8"))             #发送测试信息给端口
        results=conn.recv(100)                    #接收主机返回的信息
        screenLock.acquire()                      #加锁
        print('[+]%d/tcp open'% tgtPort)
        print('[+] '+results.decode("utf-8"))
        conn.close()
    except Exception as e:
        screenLock.acquire()
        print(e)
        print('[-]%d/tcp closed'% tgtPort)
    finally:
        screenLock.release()           #释放锁
        conn.close()


def portScan(tgtHost,tgtPorts):
    try:
        tgtIP=gethostbyname(tgtHost)          ##获得对应主机的ip地址
    except:
        print("[-] Cannot resolve '%s':Unknown host" %tgtHost)
        return
    try:
        Name=gethostbyaddr(tgtIP)     ##获得ip对应主机的信息
        print ("\n[+] Scan Results for:"+Name[0])
    except:
        print ("\n[+] Scan Results for:"+tgtIP)
    setdefaulttimeout(1)
    for Port in tgtPorts:
        t = Thread(target=connScan,args=(tgtHost,int(Port)))
        t.start()


def main():
    usage="usage %prog -H <target host> -p/-P <target ports>"
    parser=optparse.OptionParser(usage)  #创建对象实例
    parser.add_option('-H',dest='Host',type='string',help='target host')   ##需要的命令行参数
    parser.add_option('-P','-p',dest='Ports',type='string',help='target ports')
    (options,args)=parser.parse_args()
    Host=options.Host
    Ports=str(options.Ports).split(',')
    if (Host==None)|(Ports[0]==None):         ##如果主机和端口都是空的话
        print(parser.usage)
        exit(0)
    portScan(Host,Ports)
if __name__=='__main__':
    main()


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

Python 端口扫描器 的相关文章

  • gazebo视角设置问题

    How can I make my objects robot appear in image raw topic when using Gazebo camera plugin Initial view after gazebo star
  • DISM命令使用小结

    DISM命令使用小结 文章目录 DISM命令使用小结操作WIM镜像说明演示 操作系统映像说明添加功能启用本地策略启用Hyper V 操作WIM镜像 说明 REM 制作镜像并添加一个分卷 dism capture image imagefil
  • ZYNQ7000-AXI GPIO详解

    摘要 AXI GPIO是ZYNQ的一个IP核 xff0c 它能够将PS侧的AXI4 Lite接口转成PL侧的IO口 xff0c 可解决PS侧IO口不够用的问题 本文就AXI GPIO的概念 作用 配置与使用做了详细说明 xff0c 展示了示
  • Android Dialer源码分析之去电流程

    Android的拨号流程 xff0c 从拨号盘的点击拨号按钮开始 xff0c DialpadFragment java span class token annotation punctuation 64 Override span spa
  • 区块链-PancakeSwap抢跑机器人

    核心思路 监听txpool xff0c 直到检测匹配符合我们的条件时购买提高gas费实现插队 核心技术 ethers或web3 xff0c 本文采用etherserc20 核心方法 1 通过ehters提供的监听方法 xff0c 监听链上的
  • ubuntu下载安装python

    背景 fuzzbench最近又重新更新了python的版本要求是python3 10 8及以上版本 xff0c 但直接使用apt get install 无法下载这一版本 xff0c 会报错无法找到 xff0c 因此记录一下解决这一问题的全
  • STC USB-CDC 虚拟串口使用

    STC USB CDC 虚拟串口使用 目前该功能只能在STC8和STC32G单片机上实现该功能 比起WCH的单片机 xff0c 这一点要远强于STC的USBCDC功能了 xff37 xff23 xff28 随便一个 xff18 位单片机上都
  • kali 卡在 started gnome display manager(更新gnome导致,非磁盘满)

    手贱更新到gnome3 解决方案 xff1a 1 进入急救模式 xff0c 我的是在grub选择界面选择advanced 那个选项里面进入的 2 先卸载桌面环境 http www cnblogs com wanghuixi p 787580
  • Pyhton语音播放

    用Pyhton实现语音播放的功能 我们都知道python比较简单 xff0c 能够实现的功能比较全面 xff0c 而且 xff0c 他还有一些你可能想不到的功能呢 xff01 今天我就来说一说如何用python实现语音播放的功能 首先呢 x
  • 控制台运行java

    控制台执行java 新建java代码 新建一个记事本文件 xff0c 将文件名改为HelloWorld java xff0c 注意 xff1a 后缀是 java 若没有显示文件后缀 xff0c 可以在资源管理器打开显示后缀 xff0c 然后
  • Ubuntu系统主机如何免密登录服务器

    一 主机端操作 Ubuntu系统主机终端执行 cd 命令 xff0c 切换到用户目录下 在用户目录下执行 ll a 执行 cat ssh id rsa pub 获取公钥并复制公钥准备粘贴到服务器 二 服务器端操作 登录服务器后 xff0c
  • 【报错】GitHub 配置域名但是显示 Domain does not resolve to the GitHub Pages server... 怎么办

    应该只是域名解析需要时间 xff0c 反正我1小时后看就正常了 xff08 提示变绿了 xff09 xff0c 等等吧 xff08 24小时内都正常 xff09
  • 计算机论文常见词汇

    quantization kw nt ze n n 量子 量子化 xff1b 分层 xff1b 数字化 differentiating 英 d f ren e t 美 d f r n et v 区别 xff0c 区分 xff1b 使不同 x
  • 每日固定时间执行一次的shell实现

    在不使用crontab定时任务的情况下 xff0c 我们如何去实现每日定时执行某个任务的工作呢 xff1f 我遇到了类似问题 xff0c 遂转换思路 xff0c 花几分钟写了个小脚本实现如下 xff1a bin bash 每日7点执行 ct
  • FTPClient上传文件storeFile失败,没有异常,切换目录操作可以成功

    FTPClient上传文件storeFile失败 xff0c 没有异常 xff0c 切换目录操作可以成功 解决方法 xff1a 有没有设置被动模式 防火墙 有没有设置被动模式 要执行下面的语句 ftpClient span class to
  • 知识图谱-命名实体-关系-免费标注工具-快速打标签-Python3

    知识图谱 命名实体 关系 免费标注工具 快速打标签 Python3 一 功能介绍1 代码文件夹结构2 运行环境3 自定义命名实体 关系模板4 导入文件5 选择自定义实体和关系文件6 文本标注7 撤销和取消标注8 导出和导出并退出系统9 导出
  • Ubuntu报错:Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

    之前在Ubuntu系统安装Navicat的时候出现了这样的问题 xff0c 难为自己半天 首先是下载文件 xff0c 出现报错 xff1a navicat16 mysql cs AppImage error while loading sh
  • linux中crontab的jar文件定时任务失败原因记录

    本文章作为备忘 xff0c 若能解决朋友们的遇到的问题 xff0c 再好不过 在创建定时任务时 xff0c 所有的路径都需要写绝对路径 xff0c 包括配置文件 若定时文件为定时执行sh文件 xff0c 而sh文件中需要的配置文件也需要写绝
  • docker安装MongoDB以及redis

    一 安装Redis 以redis 4 0 9版本为例 docker pull redis 4 0 9 span class token function mkdir span usr local docker redis data span
  • linux安装好的mysql rpm -qa |grep mysql不见

    输入 xff1a rpm qa grep i mysql

随机推荐

  • MariaDB导入XXX.sql文件

    使用的 MariaDB5 5 52 开启数据库服务 xff1a systemctl start mariadb 要使用该脚本 xff0c 登录数据 xff0c mysql u root p 根据提示输入你安装数据库时需设置密码 xff0c
  • BaseOs之:Error: No available modular metadata for modular package

    文章目录 Error No available modular metadata for modular package先下载rpm包 xff1a 安装modular metadata生成工具 随便找一个目录 xff0c 执行git clo
  • BaseOs之:网络yum源部署

    文章目录 参考阿里mirror aliyum源 x86 arm source站点目录结构 简单分析 每个目录站点详细结构 x86 64为例 简单分析 制作x86 64的yum源 创建Packages与debug目录 复制x86 64 noa
  • Shell脚本加入开机自启动的方法:

    Shell脚本加入开机自启动的方法 xff1a Linux中脚本设定开机自启动 方法一 xff1a 1 xff0c 在某个目录下创建脚本 xff1a 例如 xff1a root hello wei sh span class token p
  • createrepo

    createrepo 是一个对rpm 文件进行索引建立的工具 大体功能就是对指定目录下的rpm文件进行检索 xff0c 把每个rpm文件的信息存储到指定的索引文件中 xff0c 这样方便远程yum命令在安装更新时进行检索 看下creater
  • 自动汇报错误工具(ABRT)

    ABRT 是一套抱著三个目标而开发出来的规模工具 xff1a 简化用户汇报软件问题的程序 在提交给开发者的报告中提供全面的信息 提供重要的故障数据以便排列优先次序及安排支持 假如你有兴趣协助开发者排列他们的工作的优先次序 xff0c 而你愿
  • centos8系module软件包管理仓库部署

    简述 CentOS8 引入新的module软件包管理机制 下面将介绍如何部署搭建本地module源 部署流程 xff1a 思路 xff1a 先制作nginx 1 14的module yaml xff08 需要微调 xff09 xff0c 然
  • grub rescue救援模式的处理

    grub rescue救援模式的处理 来源 xff1a https www cnblogs com itcomputer articles 4182344 html 我的linux在调整分区后 xff0c 出现了grub rescue gt
  • gitlab自定义头像设置

    这里写自定义目录标题 选一个自己喜欢的头像放在自建nginx服务中 可放在gitlab的nginx中 xff1a 设置gitlab修改配置 etc gitlab gitlab rb 重新加载gitlab配置最终效果 选一个自己喜欢的头像放在
  • 【无标题】

    https www cnblogs com liujuncm5 p 6713784 html 一 依赖安装 yum install y gcc c 43 43 pcre pcre devel zlib zlib devel openssl
  • shell:批量下载epel源rpms

    span class token keyword for span span class token for or select variable i span span class token keyword in span span c
  • linux静动态依赖

    安装glibc static usr bin ld cannot find lpthread usr bin ld cannot find lc
  • 修改ftp根目录

    修改 etc vsftpd vsftpd conf xff0c 加入如下三行 xff1a local root 61 chroot local user 61 YES anon root 61 local root表示使用本地用户登录到ft
  • 基于深度学习的医学图像配准综述

    原文转自 xff1a https blog csdn net weixin 41699811 article details 84314070 版权声明 xff1a 本文为CSDN博主 Timmymm 的原创文章 xff0c 遵循 CC 4
  • C语言实现生产者消费者模型(线程、信号量、互斥锁)

    三个概念 xff1a 生产者消费者模型 线程 信号量 1 生产者消费者模型 利用生活中的例子 xff0c 生产者生产商品 xff0c 商品放在超市 xff0c 消费者去超市购买 使用 商品 xff0c 也就是生产者消费者模型 生产者生成一定
  • Linux Deepin [解决] - 您也许需要运行“apt --fix-broken install”来修正上面的错误。

    问题来源 Os Linux Deepin 20 社区 在星火商店下载了网易云音乐的包 xff0c 用深度安装器安装 xff0c 能用能调节窗口大小 xff0c 但是字体大小不能调剂 emmm高分屏用户哭了后悔自己买那么高的玩意 于是右键卸载
  • C++判断素数(求素数)

    一个大于1的自然数 xff0c 且除了1和它本身外 xff0c 不能被其他自然数整除的数叫素数 换句话说就是 xff0c 除了1和该数本身以外不再有其他的因数的数被称为素数 判断m是否是素数的算法是 xff1a m在区间 1 xff0c s
  • Arch Linux wine 微信、heidissql、chrome - AUR heplers - yay

    Intro span class token function uname span a Linux arch 5 10 16 arch1 1 span class token comment 1 SMP PREEMPT Sat 13 Fe
  • C语言-基础例题55道

    1 简单程序设计 编程写程序 xff0c 在屏幕上输出信息 xff1a Happy New Year 输出图形 include lt stdio h gt void main printf 34 Happy New Year n 34 2
  • Python 端口扫描器

    目录 前言一 TCP全连接二 程序编写1 获得主机名和端口2 解析主机名和端口3 抓取应用的Banner4 线程扫描5 信号量机制 总结 前言 任何一个靠谱的网络攻击都是起步于侦查的 在这里 xff0c 我们将使用Python来编写一个扫描