Python 使用python-nmap模块实现端口扫描器

对线上服务器进行端口扫描是一件很有用的事,可以验证你的防火墙规则,避免暴漏不需要的服务。也可以知道你机器上开了哪些服务,不用等乌云爆出来了才知道,有人黑进内网玩了好几个月。哈哈,真事,服务器被通过zabbix黑进来,开了一个socket5的进程,自由进出。反正,这玩意很有用,本着奉献精神,把代码放出来,共同学习。

功能很简单,对服务器进行扫描,生成html格式的扫描结果,对扫描结果发邮件。格式方面做了点处理,定义端口白名单,正常端口显示绿色,异常端口显示红色。算是一种告警。对服务器进行全端口扫描是很耗时的一件事,每台6万多个端口,而且还取决于扫描机器到目标机的网络连接情况。受不了这个蜗牛速度,开发了第一版的单线程版本后,又实现了一个多进程的版本,果然爽了好多。整个人都好了……

mytools.py 这是定义的一个函数库,截取了用到的一个函数,这个sendemail的发邮件的函数,当然当前场景可以定义的一个文件中,不过,对程序按模块拆分是个好的习惯。哈哈,我有点pythonic了。

#-*- coding:utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
def sendemail(sender,receiver,subject,content,smtpserver,smtpuser,smtppass):
    msg = MIMEText(content,‘html‘,‘utf-8‘)#中文需参数‘utf-8‘,单字节字符不需要
    msg[‘Subject‘] = Header(subject, ‘utf-8‘)
    msg[‘From‘] = ‘<%s>‘ % sender
    msg[‘To‘] = ";".join(receiver)
    try:
        smtp = smtplib.SMTP()
        smtp.connect(smtpserver)
        smtp.login(smtpuser, smtppass)
        smtp.sendmail(sender, receiver, msg.as_string())
        smtp.quit()
    except Exception,e:
        print e

nmscan.py 实现端口扫描的程序,单线程版本,代码有点长,慎入

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

import nmap
import re
import mytools as tool
import sys  

reload(sys)  
sys.setdefaultencoding(‘utf8‘)

def nmScan(hostlist,portrange,whitelist):
        p = re.compile("^(\d*)\-(\d*)$")
	if type(hostlist) != list:
            help()
        portmatch = re.match(p,portrange)
	if not portmatch:
            help()
        l = []
        for host in hostlist:
            result = ‘‘
	    nm = nmap.PortScanner()
            tmp = nm.scan(host,portrange)
            result = result + "<h2>ip地址:%s 主机名:[%s]  ......  %s</h2><hr>" %(host,tmp[‘scan‘][host][‘hostname‘],tmp[‘scan‘][host][‘status‘][‘state‘])
            try:
                ports = tmp[‘scan‘][host][‘tcp‘].keys()
            except KeyError,e:
                if whitelist:
                    whitestr = ‘,‘.join(whitelist)
                    result = result + "未扫到开放端口!请检查%s端口对应的服务状态" %whitestr 
                else:
                    result = result + "扫描结果正常,无暴漏端口"
                    continue
            for port in ports:
               info = ‘‘
               if port not in whitelist:
                   info = ‘<strong><font color=red>Alert:非预期端口</font><strong>&nbsp;&nbsp;‘ 
               else:
                   info = ‘<strong><font color=green>Info:正常开放端口</font><strong>&nbsp;&nbsp;‘
               portinfo = "%s <strong>port</strong> : %s &nbsp;&nbsp;<strong>state</strong> : %s &nbsp;&nbsp;<strong>product<strong/> : %s <br>" %(info,port,tmp[‘scan‘][host][‘tcp‘][port][‘state‘],
                                                                        tmp[‘scan‘][host][‘tcp‘][port][‘product‘])
               result = result + portinfo
            l.append([host,str(result)])
	return l

def help():
	print "Usage: nmScan([‘127.0.0.1‘,],‘0-65535‘)" 

if __name__ == "__main__": 
    hostlist = [‘10.10.10.10‘,‘10.10.10.11‘]
    portrange = ‘0-65535‘
    whitelist = [80,443]
    l = nmScan(hostlist,portrange,whitelist)
    sender = ‘[email protected]‘
    receiver = [‘[email protected]‘,‘[email protected]‘]
    subject = ‘服务器端口扫描‘
    smtpserver = ‘smtp.exmail.qq.com‘
    smtpuser = ‘[email protected]‘
    smtppass = ‘gccmx163‘
    mailcontent = ‘‘
    for i in range(len(l)):
        mailcontent = mailcontent + l[i][1]
    tool.sendemail(sender,receiver,subject,mailcontent,smtpserver,smtpuser,smtppass)

mutinmscan.py 端口扫描的多进程版本,比照单线程版本最大的一个变化是nmscan函数的实现上,单线程传递一个服务器列表,在函数内部循环该列表,读取扫描结果,生成报告邮件。mutinmscan版的函数是接受一个ip地址,循环这一部分使用了mutiprocess库的Pool,并使用其map函数实现对服务器ip列表的迭代。多线程,一节更比五节强……

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

import nmap
import re
import mytools as tool
import sys
from multiprocessing import Pool
from functools import partial

reload(sys)
sys.setdefaultencoding(‘utf8‘)

def nmScan(host,portrange,whitelist):
        p = re.compile("^(\d*)\-(\d*)$")
        # if type(hostlist) != list:
        #     help()
        portmatch = re.match(p,portrange)
        if not portmatch:
            help()

        if host == ‘121.42.32.172‘:
            whitelist = [25,]
        result = ‘‘
        nm = nmap.PortScanner()
        tmp = nm.scan(host,portrange)
        result = result + "<h2>ip地址:%s 主机名:[%s]  ......  %s</h2><hr>" %(host,tmp[‘scan‘][host][‘hostname‘],tmp[‘scan‘][host][‘status‘][‘state‘])
        try:
            ports = tmp[‘scan‘][host][‘tcp‘].keys()
            for port in ports:
                info = ‘‘
                if port not in whitelist:
                   info = ‘<strong><font color=red>Alert:非预期端口</font><strong>&nbsp;&nbsp;‘
                else:
                   info = ‘<strong><font color=green>Info:正常开放端口</font><strong>&nbsp;&nbsp;‘
                portinfo = "%s <strong>port</strong> : %s &nbsp;&nbsp;<strong>state</strong> : %s &nbsp;&nbsp;<strong>product<strong/> : %s <br>" %(info,port,tmp[‘scan‘][host][‘tcp‘][port][‘state‘],                                                                       tmp[‘scan‘][host][‘tcp‘][port][‘product‘])
                result = result + portinfo
        except KeyError,e:
            if whitelist:
                whitestr = ‘,‘.join(whitelist)
                result = result + "未扫到开放端口!请检查%s端口对应的服务状态" %whitestr                
            else:
                result = result + "扫描结果正常,无暴漏端口"           
        return result

def help():
        print "Usage: nmScan([‘127.0.0.1‘,],‘0-65535‘)"
        return None

if __name__ == "__main__":   
    hostlist = [‘10.10.10.1‘,‘10.10.10.2‘]
    pool = Pool(5)
    nmargu = partial(nmScan,portrange=‘0-65535‘,whitelist=[])
    results = pool.map(nmargu,hostlist)
    #send email
    sender = ‘[email protected]‘
    receiver = [‘[email protected]‘,]
    subject = ‘服务器端口扫描‘
    smtpserver = ‘smtp.exmail.qq.com‘
    smtpuser = ‘[email protected]‘
    smtppass = ‘gccmx163‘
    mailcontent = ‘<br>‘.join(results)
    tool.sendemail(sender,receiver,subject,mailcontent,smtpserver,smtpuser,smtppass)

扫描结果:马赛克阻碍了人类文明的进步,尤其是在欣赏岛国动作片的时候,但是,亲,我不能把俺们的服务器给你看的,你懂的!

时间: 2024-10-13 06:13:24

Python 使用python-nmap模块实现端口扫描器的相关文章

python学习-python-nmap实现高效的端口扫描器

python的第三方模块,python-nmap实现高效的端口扫描. 一.准备工作 yum -y install nmap #安装nmap工具 pip install python-nmap==0.4.0   #python2.7环境使用pip安装0.4.0版本的第三方模块 二.模块常用方法说明 这里我们主要接受python-nmap模块的两个常用类,一个是PortScanner()类,实现一个nmap工具的端口扫描功能封装;另一个为PortScannerHostDict()类,实现存储与访问主

运维python进行(一) nmap扫描端口

介绍 python-nmap是基于系统nmap命令的一个端口扫描工具,使用简单方便. 最近为了加强服务器安全性和监管,需要每天把公司服务器开放端口扫描记录,一旦出现增加减少能发现. 之前使用shell写过一个https://github.com/bashhu/monitor-shell/blob/master/python-script/scan_port.sh 最近打算完善一下我们的运维平台,重新编写了脚本,方便平台的调用 https://github.com/bashhu/monitor-s

端口扫描器--利用python的nmap模块

安装nmap模块挺麻烦的,搞了半天 不仅要安装pip install nmap 还要sudo apt install nmap 给出代码,没有设多线程,有点慢,注意端口的类型转换,搞了很久 #!/usr/bin/env python # -*- coding:UTF-8 -*- import optparse import nmap #usage:python scan.py -H 119.75.217.26 -p 3306 80 22 def nampScan(tgtHost,tgPort):

python模块学习----nmap模块

安装nmap模块: pip install python_nma nmap模块说明: python-nmap是一个帮助使用nmap端口扫描器的python库.它允许轻松操纵nmap扫描结果,并且将是一个完美的选择,为需要自动完成扫描任务的系统管理员提供的工具并报告.它也支持nmap脚本输出. nmap模块类: ET:Python的轻量级XML支持 PortScanner:端口扫描 PortScannerAsync:异步进行端口扫描 PortScannerError:nmap的异常错误类 Port

python端口扫描器

吃了个火鸡面后感觉到了怀疑人生!!!!!!!!!妈耶,在也不吃了.思路都给辣没了!!! python端口扫描器代码如下: #-*-coding:utf-8 from socket import * import threading import argpars lock=threading.lock() openNUm=0 threads=[] def portScanner(host,port): global openNum try: s=socket(AF_INET,SOCK_STREAM

python实现FTP弱口令扫描器与简单端口扫描器

python实现FTP弱口令扫描器与简单端口扫描器 目录 FTP弱口令扫描器 简单端口扫描器 参考: https://blog.csdn.net/rebelqsp/article/details/22109925 https://www.aliyun.com/jiaocheng/434055.html?spm=5176.100033.2.10.3571581eheCuHX FTP弱口令扫描器 # Ftp匿名扫描器的实现,需要使用FTP这个类 # Ftp这个类实现了Ftp客户端的大多数功能,比如连

Python开发端口扫描器

首先是最常用的端口扫描器: 虽说有nmap等强大的工具,不过如果由于条件限制无法安装Nmap呢? 我这个脚本写的比较简单,默认扫描1-65535全部的端口 实际的话,可以根据需要自己修改脚本来实现定制化扫描 # -*- coding:utf-8 -*- __author__ = "Yiqing" import socket import time import thread import optparse import re socket.setdefaulttimeout(3) de

python(nmap模块、多线程模块)

http://xael.org/pages/python-nmap-en.html       nmap模块 http://www.tutorialspoint.com/python/python_multithreading.htm   多线程 http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html 多线程

使用Python编写简单的端口扫描器的实例分享【转】

转自 使用Python编写简单的端口扫描器的实例分享_python_脚本之家 http://www.jb51.net/article/76630.htm -*- coding:utf8 -*- #!/usr/bin/python # Python: 2.7.8 # Platform: Windows # Authro: wucl # Program: 端口扫描 # History: 2015.6.1 import socket, time, thread socket.setdefaulttim