nmap实现对某网段的简单扫描

本次实现对某个网段的主机端口(0—65535)扫描,因为端口较多进而耗时较长,可根据实际情况指定扫描的范围

import nmap
import os
import threading
import time

from concurrent.futures import ThreadPoolExecutor
from concurrent.futures import ProcessPoolExecutor

IP_list = []
lock = threading.Lock()
pool = ThreadPoolExecutor(5)


# 写入文件操作
def openfile(path, content):
    with open(path, 'W+')as f:
        f.write(content+'\n')


# 查看当前主机操作系统
def find_os(ip):
    ret = os.popen("nmap -O %s" % ip).read().split('\n')
    for i in ret:
        if 'Running' in i:
            return i
        continue
    return 'noting'


# 局域网存活的主机
def ping_ip(ip):
    output = os.popen('ping -n 1 %s' % ip).readlines()
    for w in output:
        if str(w).upper().find('TTL') >= 0:
            print(ip)
            IP_list.append(ip)
            pool.submit(nmapScan, ip)


def Alive_host(ip):
    wd_ip = '.'.join(ip.split('.')[:-1])
    for i in range(1, 256):
        new_ip = wd_ip + '.' + str(i)
        t = threading.Thread(target=ping_ip, args=(new_ip,))
        t.start()
        time.sleep(0.01)


def nmapScan(ip):
    port_list = []
    nm = nmap.PortScanner()
    ret = nm.scan(hosts=ip, arguments='-v -n -A')['scan'][ip]['tcp']
    for port in ret:
        port_list.append(str(port))

    content = ip+" "+find_os(ip)+" "+','.join(port_list)
    print(content)
    openfile('./result', content)


if __name__ == '__main__':
    Alive_host('192.168.16.0/24')

 关于对“192.168.0.0/24” 的理解

24是CIDR值。简单说就是一个CIDR值对应一个子网掩码,然后对网络就行分段。

/24对应的是255.255.255.0,与ip作位运算,将挡住的部分作为网段,其余部分做电脑的地址,如 192.168.0 属于网段

192.168.0.0/24就代表了192.168.0.0至192.168.0.255

一直分下去有 192.168.1.0至192.168.1.255

192.168.2.0至192.168.2.255等等

每个IP地址的长度为32位(bit),分4段,每段8位(1个字节)。简单的说24代表从前往后有24个1,就是11111111.11111111.11111111.00000000

posted @ 2019-01-07 20:07  神神气气  阅读(7106)  评论(0编辑  收藏  举报