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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM