当前位置:   article > 正文

Linux安全:使用Python实现高效的端口扫描器_linux基线扫描python脚本

linux基线扫描python脚本

Linux安全:使用Python实现高效的端口扫描器


nmap是一款非常强大的主机发现和端口扫描工具,而且nmap运用自带的脚本,还能完成漏洞检测,同时支持多平台。

主要功能有:

  1. 检测活在网络上的主机(主机发现)

  2. 检测主机上开放的端口(端口发现或枚举)

  3. 检测到相应的端口(服务发现)的软件和版本

  4. 检测操作系统,硬件地址,以及软件版本

  5. 检测脆弱性的漏洞(Nmap的脚本)

nmap的相关网站在这里:python-nmap : nmap from python (xael.org)Download the Free Nmap Security Scanner for Linux/Mac/Windows

安装nmap

安装namp

yum install nmap
nmap -version
  • 1
  • 2
image-20240513092920678

安装nmap python模块

 pip install python-nmap
  • 1

相关网站:python-nmap · PyPI

基本用法

  1. python-nmap模块实例化

最常用的是PortScanner类,这个类实现Nmap工具功能的封装。对这个类进行实例化很简单,只需要如下语句便可实现。

import nmap
nm=nmap.PortScanner()
  • 1
  • 2

PortScannerAsync类和PortScanner类的功能相似,但是这个类可以实现异步扫描,对这个类的实例化语句如下。

import nmap
nm=nmap.PortScannerAsync()
  • 1
  • 2
  1. python-nmap中的函数

首先看一下PortScanner类,这个类中包含了如下几个函数。
scan()函数:这个函数的完整形式为scan(self,hosts=‘127.0.0.1’,ports=None,arguments=’-sV’,sudo=False),用来对指定目标进行扫描。

这里面的参数hosts的值为字符串类型,表示要扫描的主机,形式可以是IP地址,例如"192.168.1.1",也可以是一个域名,例如"www.nmap.org"

参数ports的值也是字符串类型,表示要扫描的端口。如果要扫描的是单一端口,形式可以为"80"。如果为多个端口,可以用逗号分开,例如"80,443,3389"。如果要扫描的是连续的端口范围,可以用横线,例如“1-5000” 。

参数arguments的值也是字符串类型,这个参数实际上就是Nmap扫描所用的参数。

参数作用
-O系统扫描
-V,-v,-D,-d,-pdebug信息
–fuzzy推测操作系统检测结果
-sTTCP端口扫描(完整三次握手)
-sUUDP端口扫描(不回应可能打开,回应则关闭)
-sLDNS反向解析
-sS隐藏扫描(半开SYN)
-sP发现存活主机(直连arp,非直连TCP80,ICMP)
-sO确定主机协议扫描
-sW对滑动窗口的扫描
-sATCP ACK扫描
-sN关闭主机扫描(不管是否存活直接扫描)
-sFfin扫描
-sXXmas扫描(fin psh urg为置位)
-sI完全隐藏(以一个跳板为主机(无流量)扫描另一台主机)
-sV服务器版本
-sC跟安全有关的脚本
-PN扫描自己

python脚本

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import nmap

# 输入主机和端口
input_data = input("请输入主机和端口:")
scan_row = input_data.split(" ")
if len(scan_row) != 2:
    print('输入错误,示例:192.168.1.0/24 80,22,443')
    sys.exit(0)

hosts = scan_row[0]  # 输入的主机
ports = scan_row[1]  # 输入的端口

# 创建端口扫描对象
try:
    nm = nmap.PortScanner()
except nmap.PortScannerError:
    print("Nmap 未找到!", sys.exc_info()[0])
    sys.exit(0)
except:
    print("未知的错误:", sys.exc_info()[0])
    sys.exit(0)

# 执行扫描
try:
    nm.scan(hosts=hosts, arguments='-v -sS -p' + ports)
except Exception as e:
    print("扫描错误:" + str(e))

# 遍历扫描主机
for host in nm.all_hosts():
    print('----------------------------------------')
    print(f"Host: {host} ({nm[host].hostname()})")   # 输出主机及主机名
    print(f"State: {nm[host].state()}")   # 输出主机状态,如up,down

    # 遍历协议
    for proto in nm[host].all_protocols():
        print('-------------')
        print(f"协议:{proto}")

        # 获取协议的所有扫描端口并排序
        lport = sorted(nm[host][proto].keys())
        for port in lport:  # 遍历端口以及输出端口、状态
            print(f"端口: {port} \t 状态: {nm[host][proto][port]['state']}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

效果如图:

image-20240513093018355

其中主机支持所有表达方式,如www.qq.com、192.168.1.*、192.168.1.1-20、192.168.1.0/24。端口输入也灵活,如80,22,443、80,22-443。

image-20240513101036954

参考文章:

  1. Nmap使用教程图文教程(超详细) - 知乎 (zhihu.com)
  2. Python自动化运维-第四章-刘天斯
  3. python中的nmap模块(编写扫描器) - _云中鹤 - 博客园 (cnblogs.com)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/974765
推荐阅读
相关标签
  

闽ICP备14008679号