Python实现端口扫描

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python实现端口扫描相关的知识,希望对你有一定的参考价值。

误删了之前的shell脚本,之前的shell脚本因为扩展性不强,就打算用python来重新实现。

端口扫描的方法特别多,我这里是把结果处理成json格式,交给后端的django来处理。


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

"""
Date:2018-05-14
Author:Bob
Description:Processing nmap scan results
"""

import os
import time
import json
import requests
import subprocess
from xml.etree import ElementTree as ET


url = 'http://10.200.56.80:8000/portscan/portScanInterface/'

def remove_file(del_file):
    if os.path.exists(del_file):
        os.remove(del_file)
        return del_file

def alive_ip():
    # Detecting live ip
    with open('ip_subnet.txt', 'r') as f:
        for ip in f:
            ip = ip.strip()
            cmd = '/usr/bin/nmap -sP -PI -PT %s >> alive_ip.txt' %ip
            p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
            print p.stdout.read(),

    # Scan live ip
    ips = []
    with open('alive_ip.txt', 'r') as f:
        for lines in f:
            if lines.startswith('Nmap scan'):
                ip = lines.split(' ')
                ip = ip[4].strip()
                ips.append(ip)
    ip_str = ' '.join(ips)
    nmap_scan = 'nmap -sV -oX nmap_scan_output.xml %s > /dev/null 2>&1' %ip_str
    p = subprocess.Popen(nmap_scan, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
    print p.stdout.read(),

def deal_scan_xml(xml_file):
    # Processing nmap scan results
    bd = open(xml_file, 'r').read()
    root = ET.fromstring(bd)

    data = []
    for host in root.findall('host'):
        # Print the number of child elements in the host tag
        # print len(host),

        # Get ip address
        ip_ = host[1].get('addr')
        # Get ports, protocols, and other information
        if len(host) == 5:
            for port in host[3][0:]:
                # print port
                port_ = str(port.get('portid'))
                protocol_ = str(port.get('protocol'))
                if port[0].tag == 'extrareasons':
                    continue
                state_ = port[0].get('state')
                service_ = str(port[1].get('name'))
                product_ = str(port[1].get('product'))
                version_ = str(port[1].get('version'))
                extrainfo_ = str(port[1].get('extrainfo'))
                ip_ = ip_
                data.append({"ip": ip_, "port": port_, "protocol": protocol_, "state": state_, "service": service_,
                             "product": product_, "version": version_, "extrainfo": extrainfo_})

    json_data = json.dumps({"detail": data})
    json_data = requests.post(url, {"detail": json_data})
    print json_data.text

def main():
    remove_file('alive_ip.txt')
    remove_file('nmap_scan_output.xml')
    alive_ip()
    deal_scan_xml('nmap_scan_output.xml')

if __name__ == '__main__':
    main()


以上是关于Python实现端口扫描的主要内容,如果未能解决你的问题,请参考以下文章

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

Python实现端口扫描

Python3实现TCP端口扫描

Python实现端口扫描,只需做这几步走战略

Python 实现端口扫描

扫描端口占用情况的python脚本