【Python】nmap扫描文件端口提取工具V3

用法参考
http://www.jianshu.com/p/3e49ff2ffa24
我的github:
https://github.com/ucstone/codelib

#!/usr/bin/env python
# -*-encoding: utf-8 -*-
__author__ = 'M1k3'

import argparse
import sys
import os

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET
reload(__import__('sys')).setdefaultencoding('utf-8')

# 提取nmap扫描结果文件
def deal_nmap_xml(xml_name, save_name):
    tree = ET.parse(xml_name)
    # res_file = open(save_name + '-all.txt', 'w') #生成过程文件
    root = tree.getroot()
    count = []  # 统计存活IP地址数量
    IP_ALL = []  # 开放端口总数
    IP = ''

    for child in root:
        if child.tag == 'host':  # 查找host标签
            for xx in child:
                for state in xx.iter('status'):
                    if state.attrib.get('state') == "up":  # 判断主机是否存活
                        for ports in child:
                            for neighbor in ports.iter('address'):  # 提取主机IP地址
                                IP = neighbor.attrib['addr']
                                count.append(IP)
                            for port in ports:  # 端口信息 ports标签
                                for neighbor in port.iter('state'):
                                    # print neighbor.attrib['state']
                                    if neighbor.attrib['state'] == "open":  # 判断端口是否开放
                                        if port.attrib.has_key('portid'):
                                            # print IP + ":" + port.attrib.get('portid')
                                            lll = IP + ":" + port.attrib.get('portid') + '\n'
                                            # res_file.write(lll)
                                            IP_ALL.append(lll)

    print "There are  %d surviving!" % len(count)
    print "Open port has: %d" % len(IP_ALL)
    # res_file.close()
    return IP_ALL


# 根据端口提取相应的IP
def get_ip(ALL, ports):
    port_file = []
    for port in ports.split(','):
        for line in ALL:
            if len(line.split(':'))>2:
                print line.strip()+" Exception"
            if port == line.split(':')[1].strip():
                 # print line,
                 port_file.append(line)
    print "Port extraction is complete!"
    return port_file


# 比较新发现资产和合规平台资产
def nmap_platform_cmp(file, pfile):
    f1 = file  # sys.argv[1]  # 新发现资产比对
    f2 = pfile  # sys.argv[2]  # 合规平台资产导出的全部资产,整理到一个txt文档中

    os.chdir(f1)
    file_list = []

    if os.path.exists('res'):
        pass
    else:
        os.mkdir('res')

    for txt_file in os.listdir('.'):
        if txt_file.endswith('.txt'):
            file_list.append(txt_file)

    for txt_file in file_list:
        result = []
        if txt_file.endswith('.txt'):
            with open(txt_file, 'r') as xx_file:  # 打开新扫描的资产
                xx_ip = xx_file.readlines()
                print u"Before being removed", len(xx_ip)
                with open(f2, 'r') as yy_file:  # 打开合规平台导出的资产
                    yy_ip = yy_file.readlines()
                    for xx in xx_ip:
                        if xx in yy_ip:  # 若新扫描的资产在合规平台中,则说明已经上报并剔除
                            result.append(xx)
                            xx_ip.remove(xx)  # 删除已经报备过的IP

                # print xx_ip
                print u"After removal", len(xx_ip)
                # 将新发现的资产提取出来
                with open(f1 + os.path.sep + 'res' + os.path.sep + txt_file.split('-')[0] + '-res.txt',
                          'w+') as zz_file:
                    for ip in xx_ip:
                        zz_file.writelines(ip)

        print u"Has been reported:%d" % len(result)
        with open(txt_file, 'r') as xx:
            # xx.readlines()
            print u"%s 未报备资产 %s 个" % (txt_file, str(len(xx.readlines()) - len(result)))
        print 15 * '###'


if __name__ == '__main__':
    # 接受cmd参数
    parser = argparse.ArgumentParser()

    group1 = parser.add_argument_group(u'处理nmap扫描文件')
    group1.add_argument("-xpath", type=str, help=u"批量转换,输入nmap扫描结果xml文件所在的目录")
    group1.add_argument("-xml", type=str, help=u"转换单个xml文件,输入nmap扫描结果xml文件")
    group1.add_argument("-port", type=str, default='21', help=u'要提取的端口;提取多个的格式为"21,80,445"')

    group2 = parser.add_argument_group(u'与合规平台文件比对')
    group2.add_argument("-pfile", type=str, help=u"合规平台已经上报的资产")
    # parser.add_argument("-tfile", type=str, help=u'get ips or domains for this file')
    group2.add_argument("-tpath", type=str, help=u"新扫描的资产文件,只接受目录")
    args = parser.parse_args()

    # nmap扫描结果处理相关参数
    xml_path = args.xpath
    xml_file = args.xml
    ports = args.port
    # 合规平台资产比较相关参数
    platform_file = args.pfile
    # txt_file = args.tfile
    txt_path = args.tpath

    if xml_file and ports:
        save_name = xml_file.split('.')[0]
        # print save_name
        print 'Began to extract %s open port IP' % xml_file
        IP_ALL = deal_nmap_xml(xml_file, save_name)
        get_ip(IP_ALL, ports)

    if xml_path and ports:
        os.chdir(xml_path)
        ALL = []
        for i in os.listdir(xml_path.strip()):
            if i.endswith('.xml'):
                xml_path_file = xml_path + os.path.sep + i
                save_name = i.split('.')[0]
                # print save_name
                print 'Began to extract %s open port IP' % i
                IP_ALL = deal_nmap_xml(xml_path_file, save_name)
                ALL = ALL+IP_ALL
        with open('port-res.txt','w+') as xx:
            for ip in get_ip(ALL, ports):
                xx.write(ip)
                # print ip,

    if txt_path and platform_file:
        try:
            if os.path.isfile(txt_path):
                print u"请输入要处理文件的目录"
            else:
                nmap_platform_cmp(txt_path, platform_file)
        except:
            print u"请输入要处理文件所在目录"
    else:
        pass
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容

  • 作为一个前端程序猿,下面这些站会让你眼前一亮。 amazeui框架组建丰富 http://amazeui.org...
    欧巴冰冰阅读 8,814评论 18 303
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,900评论 25 707
  • 晚上陪孩子学习,在旁边的书店闲逛,两个半小时,说长不长,倒也能看点喜欢的东西。于是我慢慢沿着分类书架寻找着自己想看...
    且癫狂且芬芳阅读 303评论 2 0