Python编写nmap扫描工具


Posted in Python onJuly 21, 2021

NMAP是一款开源的网络探测和安全审核的工具,他能够快速的扫描出某个服务器对外暴露的端口信息。是在安全测试领域很常见的一个工具。

今天我们用python的模拟实现一个简单版本的端口扫描工具,主要使用到socket模块,socket模块中提供了connect()和connect_ex()两个方法,其中connect_ex()方法有返回值,返回值是一个int类型的数字,标记是否连接成功,0为连接成功,其他数字表示有异常。

def connect(self, address: Union[_Address, bytes]) -> None: ...
def connect_ex(self, address: Union[_Address, bytes]) -> int: ...

第一版:

def scan_tools_v1(self):
    host = input('请输入服务器ip地址:')
    port = int(input('请输入要扫描的端口:'))

    sk = socket.socket()
    sk.settimeout(0.1)
    conn_result = sk.connect_ex((host, port))
    if conn_result == 0:
        print('服务器{}的{}端口已开放'.format(host, port))
    else:
        print('服务器{}的{}端口未开放'.format(host, port))
    sk.close()

运行结果:

D:\Software\Python\Python39\python.exe D:/MyScripts/study_srripts/SockerTools/nmap_tools.py
请输入服务器ip地址:8.129.162.225
请输入要扫描的端口:8080
服务器8.129.162.225的8080端口已开放

缺点:
1、一次只能扫描一个端口

第二版:(支持扫描多个接口)

def scan_tools_v2(self):
    host = input('请输入服务器ip地址:')
    ports = input('请输入要扫描的端口范围,格式0-65536:')
    port_start, port_end = ports.split('-')
    count = 0
    for port in range(int(port_start), int(port_end)+1):
        sk = socket.socket()
        sk.settimeout(0.1)
        conn_result = sk.connect_ex((host, port))
        if conn_result == 0:
            print('服务器{}的{}端口已开放'.format(host, port))
            count += 1
        sk.close()
    if count == 0:
        print(f'服务器{host}的{ports}端口均未开放')

输出结果只输出已开放的端口信息,如果输入的端口范围中,没有一个端口开放,那么就直接输出端口未开放。

总结:

1、以上只是一个简易的版本,如果扫描服务器全量端口的话,耗时较长,后面可以考虑用多线程的技术再进行优化。
2、代码中针对异常输入未进行校验,可以优化
3、要注意ip为字符串类型,端口为int类型,socket对象初始化要放到循环里面,并且要设置超时时间,不然默认的连接要好长时间才返回结果。\

到此这篇关于Python编写nmap扫描工具的文章就介绍到这了,更多相关Python nmap扫描工具内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python和bash统计CPU利用率的方法
Jul 10 Python
python生成器表达式和列表解析
Mar 10 Python
Python实现对象转换为xml的方法示例
Jun 08 Python
python+tkinter编写电脑桌面放大镜程序实例代码
Jan 16 Python
flask中使用蓝图将路由分开写在不同文件实例解析
Jan 19 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
May 21 Python
对Python Class之间函数的调用关系详解
Jan 23 Python
python 初始化一个定长的数组实例
Dec 02 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
Apr 13 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
Sep 11 Python
python将YUV420P文件转PNG图片格式的两种方法
Jan 22 Python
win10+anaconda安装yolov5的方法及问题解决方案
Apr 29 Python
Django模型层实现多表关系创建和多表操作
Jul 21 #Python
Python基本数据类型之字符串str
Jul 21 #Python
Python中22个万用公式的小结
Jul 21 #Python
python字典的元素访问实例详解
Jul 21 #Python
Opencv实现二维直方图的计算及绘制
python scrapy简单模拟登录的代码分析
Jul 21 #Python
python异步的ASGI与Fast Api实现
Jul 16 #Python
You might like
php通过字符串调用函数示例
2014/03/02 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
2015/12/18 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
Add Formatted Data to a Spreadsheet
2007/06/12 Javascript
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
javascript onmouseout 解决办法
2010/07/17 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
2013/06/21 Javascript
javascript arguments使用示例
2014/12/16 Javascript
原生javascript实现简单的datagrid数据表格
2015/01/02 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
使用Math.max,Math.min获取数组中的最值实例
2017/04/25 Javascript
防止Layui form表单重复提交的实现方法
2019/09/10 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
python基础教程之数字处理(math)模块详解
2014/03/25 Python
Python FTP操作类代码分享
2014/05/13 Python
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
Python将阿拉伯数字转换为罗马数字的方法
2015/07/10 Python
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
pyqt 多窗口之间的相互调用方法
2019/06/19 Python
Html5中的桌面通知Notification的实现
2018/09/25 HTML / CSS
阿提哈德航空官方网站:Etihad Airways
2017/01/06 全球购物
台湾东南旅游社网站:东南旅游
2019/02/11 全球购物
施工班组长岗位职责
2014/01/05 职场文书
电子银行业务授权委托书
2014/10/10 职场文书
2014年团支书工作总结
2014/11/14 职场文书
教师党员承诺书2015
2015/01/21 职场文书
儿童诗两首教学反思
2016/02/23 职场文书
详解Vue的列表渲染
2021/11/20 Vue.js
源码分析Redis中 set 和 sorted set 的使用方法
2022/03/22 Redis
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android