【python安全攻防】python简易端口扫描器

2023-05-16

文章目录

  • socket套接字
  • optparse模块
  • socket解析主机进行连接
  • 获取banner
  • threading多线程
  • 端口扫描器
  • python-nmap端口扫描

对自己看python绝技的一次学习记录

socket套接字

与TCP端口进行交互,先建立TCP套接字
需要导入python的BCD套接字API模块socket
socketAPI提供了一系列的函数将用来实现TCP端口扫描

函数名称返回内容
socket.gethostbyname(hostname)这个函数将主机名换为ip地址,例如:www.xxx.com会返回IPv4地址:1.1.1.1
socket.gethostbyaddr(ip_address)这个函数传入一个IP地址将返回一个元组,其中包含主机名,别名列表和同一接口的ip地址列表
socket.socket()这个函数将产生一个新的socket,通过给定的socket地址簇和socket类型,地址簇的可以是AF_INET(默认),AF_INET6或者是AF_UNIX,另外,socket类型可以为一个TCP套接字即SCO_STREAM(默认),或者是UDP套接字即SOCK_DGRAM,或者其他的套接字类型。最后协议号通常为零,在大多数情况下省略不写。
socket.create_connection这个函数传入一个包含ip地址和端口号的二元元组返回一个socket对象,此外还可以选择超时重连

optparse模块

第一步,我们输入目标主机名和要扫描的常用端口列表,接着,我们将通过目标主机名得到目标的网络ip地址。我们将用列表里面的每一个端口去连接目标地址,最后确定端口上运行的特殊服务。我们将发送特定的数据,并读取特定应用程序返回的标识。

在我们的第一步中,我们从用户那接受主机名和端口。因此我们的程序将利用 optparse 标准库来解析命令行选项,调用 optparse.OptionParser()创建一个选项分析器,然后通过 parser.add_option()函数来指定命令选项。(注:optparse 模块在 2.7 版本后将被弃用也不会得到更新,会使用 argparse 模块来替代)下面的例子显示了一个快速解析目标主机和扫描端口的方法。
首先定义帮助以及设置参数功能
代码如下:

import optparse
parser = optparse.OptionParser('usage %prog -H <target host> -p <target port>')             #定义帮助信息
parser.add_option('-H',dest='tgtHost',type='string',help='specify target host')             #-H输入主机
parser.add_option('-p', dest='tgtPort', type='int', help='specify target port')             #-p输入端口
(options, args) = parser.parse_args()
tgtHost = options.tgtHost
tgtPort = options.tgtPort
if (tgtHost == None) | (tgtPort == None):
    print(parser.usage)
    exit(0)
else:
    print(tgtHost)
    print(tgtPort)

返回结果:
在这里插入图片描述

socket解析主机进行连接

接下来,我们将构建两个函数connscan和portscan,portscan函数需要主机名和端口作为参数。它首先尝试通过gethostbyname函数解析出ip地址,接着打印,然后connscan作用为连接主机,需要两个参数tgtHost和tgtport
代码如下:

import socket
def connScan(tgtHost, tgtPort):
    try:
        connSkt = socket.socket(socket.AF_INET,socket.SOCK_STREAM)      #实例化socket
        connSkt.connect((tgtHost, tgtPort))                             #建立连接
        print('[+]%d/tcp open' % tgtPort)                               #输出
        connSkt.close()                                                 #关闭连接
    except:
        print('[-]%d/tcp closed' % tgtPort)
def portScan(tgtHost,tgtPorts):
    try:
        tgtIP = socket.gethostbyname(tgtHost)                           #获取传入主机名的ip
    except:
        print("[-] Cannot resolve '%s': Unknown host" %tgtHost)         #获取不了ip的化直接输出无法获取结束运行
        return
    try:
        tgtName = socket.gethostbyaddr(tgtIP)                           #获取ip的主机名、别名、ip
        print('\n[+] Scan Results for: ' + tgtName[0])                  #索引0获取主机名
    except:
        print('\n[+] Scan Results for: ' + tgtIP)                       #为获取则输出ip
    socket.setdefaulttimeout(1)
    for tgtPort in tgtPorts:
        print('Scanning port ' + str(tgtPort))                          #遍历输出正在查询的端口
        connScan(tgtHost, int(tgtPort))                                 #调用connScan函数,传入主机和端口
print portScan('www.baidu.com',[80,443,3389,1433,23,445])

返回结果:

[+] Scan Results for: 39.156.66.14
Scanning port 80
[+]80/tcp open
Scanning port 443
[+]443/tcp open
Scanning port 3389
[-]3389/tcp closed
Scanning port 1433
[-]1433/tcp closed
Scanning port 23
[-]23/tcp closed
Scanning port 445
[-]445/tcp closed

获取banner

也可以在程序中加上收发端口banner信息的代码,这样就可以尝试识别端口具体信息
代码如下:

connSkt.send('SanSs\r\n')                                       #发送数据
results = connSkt.recv(100)                                     #接收数据

返回结果:

[+]80/tcp open
[+] HTTP/1.1 400 Bad Request

threading多线程

因为我们在扫描中是使用单线程进行扫描的,在速度方面存在一定问题,我们可以引入python线程,在迭代的过程中产生的每一个线程将在同时执行。

for tgtPort in tgtPorts:
    print('Scanning port ' + str(tgtPort))                        	    #遍历输出正在查询的端口
    t = threading.Thread(target=connScan, args=(tgtHost,int(tgtPort)))  #多线程处理connScan函数
    t.start()					      									#开启进程

端口扫描器

多线程在速度上有很大优势,但是再打印屏幕内容的时候如果在同一时刻打印就可能会出现乱序,为了让函数完整正确输入信息我们可以用screenLock.acquire()来加锁,如果锁打开,信号量将允许线程继续运行然后打印输出,如果锁定,我们将要等到控制信号量的进程释放锁。利用信号量,我们可以保证在任何个定的时间只有一个线程在打印屏幕输出。
将所有代码结合:

# -*- coding: utf-8 -*-
import optparse
import socket
import threading
screenLock = threading.Semaphore(value=1)
def connScan(tgtHost, tgtPort):
    try:
        connSkt = socket.socket(socket.AF_INET,socket.SOCK_STREAM)      #实例化socket
        connSkt.connect((tgtHost, tgtPort))                             #建立连接
        connSkt.send('SanSs\r\n')                                       #发送数据
        results = connSkt.recv(100)                                     #接收数据
        screenLock.acquire()
        print('[+]%d/tcp open' % tgtPort)
        print('[+] ' + str(results))
    except:
        screenLock.release()
        print('[-]%d/tcp closed' % tgtPort+'\n')
    finally:
        screenLock.release()
        connSkt.close()
def portScan(tgtHost,tgtPorts):
    try:
        tgtIP = socket.gethostbyname(tgtHost)                           #获取传入主机名的ip
    except:
        print("[-] Cannot resolve '%s': Unknown host" %tgtHost)         #获取不了ip的化直接输出无法获取结束运行
        return
    try:
        tgtName = socket.gethostbyaddr(tgtIP)                           #获取ip的主机名、别名、ip
        print('\n[+] Scan Results for: ' + tgtName[0])                  #索引0获取主机名
    except:
        print('\n[+] Scan Results for: ' + tgtIP)                       #为获取则输出ip
        socket.setdefaulttimeout(1)
    for tgtPort in tgtPorts:
        print('Scanning port ' + str(tgtPort))                          #遍历输出正在查询的端口
        t = threading.Thread(target=connScan, args=(tgtHost,int(tgtPort)))
        t.start()
def main():
    parser = optparse.OptionParser('usage %prog -H <target host> -p <target port>')  # 定义帮助信息
    parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')  # -H输入主机
    parser.add_option('-p', dest='tgtPort', type='int', help='specify target port')  # -p输入端口
    (options, args) = parser.parse_args()
    tgtHost = options.tgtHost
    tgtPort = options.tgtPort
    args.append(tgtPort)
    if (tgtHost == None) | (tgtPort == None):
        print(parser.usage)
        exit(0)
    else:
        portScan(tgtHost,args)
if __name__ == '__main__':
    main()

返回结果:
在这里插入图片描述

python-nmap端口扫描

使用python-nmap进行python调用nmap端口扫描
代码如下

# coding=UTF-8
import optparse
import nmap
def nmapScan(tgtHost, tgtPort):
    nmScan = nmap.PortScanner()
    results = nmScan.scan(tgtHost, tgtPort)
    state = results['scan'][tgtHost]['tcp'][int(tgtPort)]['state']
    print(" [*] " + tgtHost + " tcp/" + tgtPort + " " + state)
def main():
    parser = optparse.OptionParser('usage %prog –H <target host> -p <target port>')
    parser.add_option('-H', dest='tgtHost', type='string',help='specify target host')
    parser.add_option('-p', dest='tgtPort', type='string',help='specify target port')
    (options, args) = parser.parse_args()
    tgtHost = options.tgtHost
    tgtPort = options.tgtPort
    args.append(tgtPort)
    if (tgtHost == None) | (tgtPort == None):
        print('[-] You must specify a target host and port[s]!')
        exit(0)
    for tgport in args:
        nmapScan(tgtHost, tgport)
if __name__ == '__main__':
    main()

返回结果:

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

【python安全攻防】python简易端口扫描器 的相关文章

随机推荐

  • Windows11安装docker

    docker官方网站 xff1a Docker Accelerated Containerized Application Development Win11下安装docker win11安装dockerwindow11安装docker小白
  • 光照强度传感器BH1750

    一 芯片介绍 BH1750FVI是一款数字型光强度传感器集成芯片 BH1750的内部由光敏二极管 运算放大器 ADC采集 晶振等组成 结构图 PD二极管通过光生伏特效应将输入光信号转换成电信号 xff0c 经运算放大电路放大后 xff0c
  • VSCode 安装教程(超详细)

    文章目录 VSCode 安装使用教程 xff08 图文版 xff09 那么 xff0c 什么是 IDE 呢 xff1f 目前 xff0c 前端开发主流的 IDE 有以下 5 个下边我们开始玩转 VSCodeVSCode 下载 安装Windo
  • 没有为字符串添加终止符;初始化为‘\0‘

    使用VS2019遇到问题 1 没有为字符串添加终止符 19条消息 消除VS中C6054 可能没有为字符串 34 XXX 34 添加字符串零终止符的警告 wowpH的博客 CSDN博客 可能没有为字符串添加零终止符 2 char a 10 6
  • 安装vue-element-admin报错git clone --mirror -q git://github.com/adobe-webplatform/eve.git C:\Users\Admin

    问题描述 vue element admin项目 执行安装操作时 xff1a 安装依赖 npm install 建议不要直接使用cnpm安装依赖 xff0c 会出现bug xff0c 可以通过如下操作解决npm下载速度慢的问题 由于淘宝 N
  • 添加启动页

    添加启动页 2021 5 7 实验内容 1 为学号后一位同学编写一个简单app 新建一个emptyactivity 在layout的activity main xml中添加如下代码 span class token number 1 spa
  • Python求最大公约数和最小公倍数

    使用辗转相除法求得最大公约数 xff0c 再利用最大公约数求得最小公倍数 辗转相除法求最大公约数 def gcd num1 num2 if num1 num2 61 61 0 return num2 else num1 num2 61 nu
  • matlab实现梯度下降法

    前记 xff1a 大三上学期学了 运筹学 课程 xff0c 里面包含了许多算法和模型 模型就是线性规划及线性规划的对偶理论 xff0c 单纯形法以及它的实际应用 xff1b 整数规划及其解法 xff08 分支定界法 割平面法匈牙利算法 xf
  • 互斥锁、条件变量、信号量浅析

    互斥锁 条件变量 信号量浅析 互斥锁与条件变量 条件变量是为了保证同步 条件变量用在多线程多任务同步的 xff0c 一个线程完成了某一个动作就通过条件变量告诉别的线程 xff0c 别的线程再进行某些动作 xff08 大家都在semtake的
  • Linux中的tty、pts、pty等概念辨析

    Linux中的tty pts pty等概念辨析 基本概念 tty pty pts ptmx tty xff08 终端设备的统称 xff09 xff1a tty一词源于Teletypes xff0c 或teletypewriters xff0
  • 树莓派4B (aarch64) 安装PyTorch 1.8 的可行方案

    树莓派4B aarch64 安装PyTorch 1 8 的可行方案 最终可行方案 试了一堆方案 xff08 源码编译 Fast ai的安装文件等 xff09 之后 xff0c 终于找到一个可行的方案 是在 PyTorch 官方讨论社区的一个
  • Nvidia CUDA初级教程1 CPU体系架构综述

    Nvidia CUDA初级教程1 CPU体系架构综述 视频 xff1a https www bilibili com video BV1kx411m7Fk p 61 2 讲师 xff1a 周斌 本节内容 xff1a 了解现代CPU的架构和性
  • 解决VNC远程连接树莓派,窗口显示不全的问题

    1 vnc连接 xff0c sudo raspi config中7 A5选分辨率就好 或2 通过SSH命令行的方式连接树莓派 xff0c 在命令行输入 xff1a vncserver geometry 1080x1024
  • qt官网下载指导(新手易犯错误)

    一 获取资源 注意这里不要直接百度qt的官网 xff0c 如果直接百度下载会让你注册一个qt的账号 xff0c 并且一般没人下载最新版的qt6 当然也可以下载旧的版本 xff0c 但是由于本人比较愚笨 xff0c 还没有在官网找到qt旧版本
  • AI智能呼叫中心系统,主要应用场景有哪些?

    互联网智能时代 xff0c 销售人员不再每天拨打数百个电话 xff0c 当前呼叫中心电话系统被企业常用在电销行业 金融行业 保险 贷款催收行业等外呼销售行业 由传统的呼叫中心基础上不断的进行升级和改善 xff0c 逐渐演变为人工智能电话外呼
  • ROS:geometry_msgs中 Point32 , Point ,PointStamped 的定义和转换

    ROS geometry msgs中Point32 Point PointStamped 的定义和转换 Point32和Point的定义Point32和Point的转换PointStamped 的定义和转换 本文所用ROS为kinetic版
  • ROS:回调函数不执行

    最近在写一个接收图片消息的节点时 xff0c 遇到了两次回调函数不调用的情况 xff0c 记录一下 循环中有continue被跳过了 具体代码如下 xff1a while ros ok if mat data 61 61 nullptr s
  • Python猜拳游戏

    关键点在于 user input 43 1 3与computer input的值进行比较 xff0c 这样就省掉了对于边界值0和2的单独判断 xff0c 简化了代码 from random import choice def finger
  • ROS:节点发布消息无对应话题名称

    最近在写一个发布里程的节点的时候遇到了 xff0c 发布了消息 xff0c 在ros却没有对应话题情况 通过rostopic list 和 rosnode info 节点名 命令查看 xff0c 均没有对应话题 xff0c 大致代码如下 x
  • 【python安全攻防】python简易端口扫描器

    文章目录 socket套接字optparse模块socket解析主机进行连接获取bannerthreading多线程端口扫描器python nmap端口扫描 对自己看python绝技的一次学习记录 socket套接字 与TCP端口进行交互