使用python-nmap 搭建基本端口扫描器
一、前言
注意: 本文相关教程仅供个人学习使用,切勿用于非法用途,否则造成的相关损失及影响,作者不承担任何责任
林子大了什么鸟都有。网络发达了,什么人都有。开源程序也是人开发的,漏洞在所难免。当不正当的人遇到开源程序的漏洞,那就会引发服务器入侵。
尽可能的避免此类事件的发生。一个企业或者说一个网络管理员,需要知道自己提供服务的服务器上开放着哪些端口,提供着什么服务。这样就能在漏洞发生的时候,及时修补,避免不必要的损失。
ok,必要性说完了,我们来说我们怎么做这件事儿。
二、开发环境
需要的环境简介:
python 2.7
端口扫描,现在行业内比较通用的开源组件是: nmap , github 开源地址: https://github.com/nmap/nmap
这个开源工具给大家提供了一个shell 使用环境。但是当服务器成千上万,服务也成千上万,就需要一定的结构来处理开放的相关的端口及服务了。 很庆幸的,开源社区还提供了 nmap 的python api
https://bitbucket.org/xael/python-nmap
当然有比较小白的安装方法: pip install python-nmap (注意是python-nmap 不是nmap)
三、实现过程
扫描器的基本流程图及简单的配置介绍如下:

四、代码介绍如下:
- 启动进程池:
python 接口给多进程应用程序提供了丰富的使用,这里给大家提供一个多进程的教程 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431927781401bb47ccf187b24c3b955157bb12c5882d000
使用如下的代码初始化进程池:
from multiprocessing import Pool
p = Pool(4) # 这里可以根据机器的性能状况设置进程池中的进程数
- 获取IP 地址库:
IP 地址库一般是企业内部的资产列表,可以是单个的机器,也可能是单个的网段。本实例为简单起见,用一个文本文件来充当相应的IP地址库, ip.txt 。其中,一行一个IP 资源 (IP 地址或者网段)。遍历文本文件即可:
hosts = open(config.host_file)
for host in hosts:
print host
- 扫描单个项目,根据python-nmap的api 扫描单个的IP资源,简单代码如下:
import nmap
nm = nmap.PortScanner()
ret = nm.scan(ip,config.scan_port_range,config.scan_options,config.scan_sudo)
- 获取扫描结果:
单个IP 条目的扫描结果如下:

其中scan 属性对应的字典即是扫描结果,key 为IP , value 为扫描结果,value 中tcp 为对应的tcp 扫描条目。
了解结构以后,我们就可以写遍历结果代码了。
ret = nm.scan(ip,config.scan_port_range,config.scan_options,config.scan_sudo)
scan_host_count = len(ret['scan'].keys())
if scan_host_count != 0:
for ip,result in ret['scan'].items():
tcp_result = result.get('tcp')
for port,detail in tcp_result.items():
gotOneResult(ip,port,detail)
其中gotOneResult 为我们的最终处理结果,接收参数ip,port,detail ,
detail 的情况如下:
result sample : {'status': {'state': 'up', 'reason': 'echo-reply'}, 'hostnames': [{'type': '', 'name': ''}], 'vendor': {}, 'addresses': {'ipv4': ''}, ' tcp': {80: {'product': 'Apache httpd', 'state': 'open', 'version': '', 'name': 'http', 'conf': '10', 'extrainfo': '', 'reason': 'syn-ack', 'cpe': 'cpe:/a:apache:http_se rver'}, 443: {'product': 'OpenSSL', 'state': 'open', 'version': '', 'name': 'ssl', 'conf': '10', 'extrainfo': 'SSLv3', 'reason': 'syn-ack', 'cpe': 'cpe:/a:openssl:opens sl'}}}
注:本实例只关心tcp的端口扫描:
简单封装我们的gotOneResult ,按照不同端口存储扫描结果,方便我们做进一步处理:
def gotOneResult(ip,port,detail):
if detail.get('state') == 'open':
print ip,port,detail
report_file = "reports/port_%d" % (int(port))
open(report_file,"a").write("%s %d %s \n" % (ip,int(port),detail))
四、运行效果
最后展示一下扫描结果

demo 运行配置简介:
- 扫描的是常见端口 : 22,80,21,6379,3306,443
- ip地址 为随便掰的几个IP
- 进程池4
五、项目结构以及使用注意点
项目结构图如下

使用说明:
修改一下ip.txt 放入自己的IP地址,app.py 修改 gotOneResult 为需要的处理方式就可以正常使用了。使用python-nmap 搭建基本端口扫描器
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
使用python-nmap 搭建基本端口扫描器的更多相关文章
- 使用Python编写简单的端口扫描器的实例分享【转】
转自 使用Python编写简单的端口扫描器的实例分享_python_脚本之家 http://www.jb51.net/article/76630.htm -*- coding:utf8 -*- #!/ ...
- 用python编写的简易端口扫描器
#coding = utf-8 ''' python 3.4 通过简单的TCP端口连接来判断指定IP是否开放了指定端口. ''' import socket import optparse impor ...
- Python与Hack之window下运行带参数的Python脚本,实现一个简单的端口扫描器
1.前提是:windows已经配置好Python的环境变量: 2.进入cmd命令行模式: **输入python命令,检测是否环境配置好:显示这样说明配置环境变量没问题 **用cd命令进入Python脚 ...
- Python开发端口扫描器
首先是最常用的端口扫描器: 虽说有nmap等强大的工具,不过如果由于条件限制无法安装Nmap呢? 我这个脚本写的比较简单,默认扫描1-65535全部的端口 实际的话,可以根据需要自己修改脚本来实现定制 ...
- python实现FTP弱口令扫描器与简单端口扫描器
python实现FTP弱口令扫描器与简单端口扫描器 目录 FTP弱口令扫描器 简单端口扫描器 参考: https://blog.csdn.net/rebelqsp/article/details/22 ...
- Python脚本写端口扫描器(socket,python-nmap)
目录 Socket模块编写 扫描给定主机是否开放了指定的端口 python-nmap模块编写 扫描给定ip或给定网段内指定端口是否开放 一个用python写的简单的端口扫描器,python环境为 3. ...
- python端口扫描器
吃了个火鸡面后感觉到了怀疑人生!!!!!!!!!妈耶,在也不吃了.思路都给辣没了!!! python端口扫描器代码如下: #-*-coding:utf-8 from socket import * i ...
- python实现端口扫描器/DoS/DDoS
整理github,梳理下Python小工具.以下是python实现的DoS/DDoS/端口扫描器(github). 一.DoS SYN Flood是当前最流行的DoS(拒绝服务攻击)与DdoS(分布式 ...
- 『Python』 多线程 端口扫描器
0x 00 Before Coding 当端口打开时,向端口发送 TCP SYN 请求,会返回一个 ACK 响应: 当端口关闭,返回的是 RST 响应: 0x 01 Coding 可以用 socke ...
随机推荐
- **Git本地仓库图解
Git基本概念 在Git中,我们将需要进行版本控制的文件目录叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过Git来实现版本管理,Git都能跟踪并记录 ...
- [BZOJ4199][Noi2015]品酒大会 树形DP+后缀自动机
由于要找后缀的前缀,所以先用反串建立SAM. link边组成了后缀树. 两个子串的最长公共前缀是LCA的step 树形dp即可. #include<iostream> #include&l ...
- Response 部分功能
设置状态码的方法: void setStatus(int sc) void setStatus(int sc, String sm) 设置响应头的方法: void setHeade ...
- BZOJ 1185: [HNOI2007]最小矩形覆盖-旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标-备忘板子
来源:旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标 BZOJ又崩了,直接贴一下人家的代码. 代码: #include"stdio.h" #include"str ...
- HDU 2824.The Euler function-筛选法求欧拉函数
欧拉函数: φ(n)=n*(1-1/p1)(1-1/p2)....(1-1/pk),其中p1.p2…pk为n的所有素因子.比如:φ(12)=12*(1-1/2)(1-1/3)=4.可以用类似求素数的筛 ...
- 9、Flask实战第9天:类视图
之前我们接触的视图都是函数,所以一般简称为视图函数.其实视图函数也可以基于类来实现,类视图的好处是支持继承,写完类视图需要通过app.add_url_rule(url_rule, view_func) ...
- RPD Volume 168 Issue 4 March 2016 评论3
Design and fabrication of a multipurpose thyroid phantom for medical dosimetry and calibration Abs ...
- Codeforces 786A Berzerk(博弈论)
[题目链接] http://codeforces.com/problemset/problem/786/A [题目大意] 有两个人,每个人有一个数集,里面有一些数,现在有一个环,有个棋子放在1, 有个 ...
- [Contest20171102]简单数据结构题
给一棵$n$个点的数,点权开始为$0$,有$q$次操作,每次操作选择一个点,把周围一圈点点权$+1$,在该操作后你需要输出当前周围一圈点点权的异或和. 由于输出量较大,设第$i$个询问输出为$ans_ ...
- 【莫队算法】【权值分块】poj2104 K-th Number / poj2761 Feed the dogs
先用莫队算法保证在询问之间转移的复杂度,每次转移都需要进行O(sqrt(m))次插入和删除,权值分块的插入/删除是O(1)的. 然后询问的时候用权值分块查询区间k小值,每次是O(sqrt(n))的. ...