用Python解析Masscan/Nmap的扫描结果


=Start=

缘由:

做安全的一般都会用到Nmap进行端口扫描,在小范围内进行扫描时Nmap绝对是首选——丰富的扫描选项/模块、较高的准确度;在大范围的扫描中,你应该选择Masscan,因为它速度奇快,而且准确率还可以接受。它们都支持自定义结果的输出格式,其中比较通用的就是XML格式(Masscan为了尽量和Nmap做到兼容,除了扫描选项比较像之外,输出结果的XML格式也基本兼容)。扫描完了之后需要对结果进行解析,这就是本文的具体场景需求。

参考解答:
1.解析Masscan的XML格式扫描结果
#!/usr/bin/env python
# coding=utf-8

import sys, time
import xmltodict

def main():
    with open('./masscan_result.xml') as fp:
        xml_obj = xmltodict.parse(fp.read())
        nmaprun = xml_obj['nmaprun']
        host = nmaprun['host']
        for entry in host[:10]:  #调试阶段只打印前10条记录
            port = entry['ports']['port']
            if int(port['@portid']) == 80:
                name = entry['address']['@addr']
                print 'http://' + name + '/'
            elif int(port['@portid']) == 443:
                name = entry['address']['@addr']
                print 'https://' + name + '/'
            elif int(port['@portid']) == 21:
                name = entry['address']['@addr']
                print 'ftp://' + name + '/'
            else:
                name = entry['address']['@addr']
                print 'http://' + name + ':' + str(port['@portid']) + '/'

if __name__ == '__main__':
    time_start = time.time()
    try:
        main()
    except KeyboardInterrupt:
        print 'Killed by user'
        sys.exit(0)
    print "Spend {0} seconds.\n".format(time.time() - time_start)
2.解析Nmap的XML格式扫描结果
#!/usr/bin/env python
# coding=utf-8

import sys, time
import xmltodict

def main():
    fp_content = ''
    try:
        with open(sys.argv[1]) as fp:
            fp_content = fp.read().replace('\n', '')
    except IOError:
        print 'File IO Error'
        sys.exit(-1)

    nmap_xml = xmltodict.parse(fp_content)
    nmaprun = nmap_xml['nmaprun']
    scanhost = nmaprun['host']
    for i in scanhost:
        address = i['address']['@addr']
        port1 = dict(i)
        try:
            if int(port1['ports']['port']['@portid']) > 0:
                port2 = port1['ports']['port']['@portid']
                if port2 == '80':
                    print 'http://'+address+'/'
                elif port2 == '443':
                    print 'https://'+address+'/'
                else:
                    print 'http://'+address+':'+port2+'/'
        except:
            port2 = i['ports']['port']
            for z in port2:
                x = z['@portid']
                if x == '80':
                    print 'http://'+address+'/'
                elif x == '443':
                    print 'https://'+address+'/'
                else:
                    print 'http://'+address+':'+x+'/'

if __name__ == '__main__':
    time_start = time.time()
    try:
        main()
    except KeyboardInterrupt:
        print 'Killed by user'
        sys.exit(0)
    print "Spend {0} seconds.\n".format(time.time() - time_start)
参考链接:

=EOF=


《“用Python解析Masscan/Nmap的扫描结果”》 有 13 条评论

  1. Howl: 网络设备 web 服务指纹扫描与检索
    https://github.com/0xbug/Howl
    `
    利用 flask 开发 api,通过调用 api 来实现添加任务或检索数据;
    利用 celery 来进行异步调用 masscan 扫描开放端口的主机再利用 whatweb 来进行扫描,然后保存数据到 elasticsearch 方便检索;
    `

  2. 护网自动化脚本
    https://mp.weixin.qq.com/s/uHNx28XFZ5M6KwykMC4Jsg
    `
    # 前言

    为了护网需要写了这么个小脚本,本文主要介绍下这个自动化工具的实现思路,以及这个工具的使用方法。

    # 本文主要内容

    1、Masscan与NMAP联动
    2、扫描结果解析工具
    3、几款开源工具 Eyewitness、tomcat-weak-password-scanner、漏洞发现、brutespray

    NMAP是渗透测试人员广泛使用的老牌开源工具,功能强大,但扫描速度较慢。Masscan号称是世界上最快的扫描器,但功能较单一。很多经验丰富的渗透大佬都会将这两个东西结合在一起使用。

    我们在红队前期充分收集目标企业的IP资产后,即可以使用CIDR等IP的表示方法导入扫描器。目前暂不支持目标域名的导入方式有两个原因:
    1、DNS信息收集的过程有点慢
    2、为了尽量保证精准度,暂时不想加入太多功能

    ==

    1. Masscan与NMAP联动

    2. 扫描结果解析工具

    3. Eyewitness
    EyeWitness功能:
    1、它的快照可以让我们更直观地识别资产,通过网站类型快速判断网段是否属于目标。
    2、更直观的看所使用的到应用是什么。
    3、判断是否存在登陆页面,识别常见登陆后台。
    4、RDP登陆账户显示。

    4. 漏洞检测
    1、漏洞指纹(Weblogic、Shiro、Strust2、Solr等…)
    2、CMS识别(Seeyon、通达、泛微、Discuz、DeDeCms等…)
    3、服务爆破(MSSQL、SSH、VNC、FTP、TELNET等…)

    5. 服务爆破
    爆破使用的是brutespray开源工具,可以直接提取nmap的xml扫描结果,然后进行对应的服务爆破。
    `

回复 a-z 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注