1. 程式人生 > >Python實現對一個網路段掃描及埠掃描

Python實現對一個網路段掃描及埠掃描

近日網路安全老師佈置了一個題目,讓搞一個埠掃描器,心想沒有Python解決不了的問題,因為時間緊,就簡單的做了一個,沒有使用執行緒,電腦也比較low  速度較慢,湊合著也能跟著玩(埠掃描我用的是nmap,沒有使用socket,因此大家執行時要先安裝nmap,或者把namp掃描的部分換成socket連線即可,使用nmap要記得修改nmap.py中的路徑,百度即可)

講究完美的我也簡單的使用Tkinter 做了一個小介面。方便大家看結果,GUI程式設計我也是剛開始學,就選擇了最簡單的Python自帶的  個人感覺WX更高達上一點,最近也在學,打算搞一個ssh伺服器連線口令爆破系統

不多說  先看這個埠掃面程式碼:

# -*- coding: utf-8 -*-
_author_ = 'xiao_lu'
from Tkinter import *
from ScrolledText import ScrolledText
import platform
import nmap
import tkMessageBox
import os
index=1.0
class Scan:
    def __init__(self,root):
        #頁面視覺化
        self.root=root
        self.ip = StringVar()
        frame = Frame(root)
        root.title("埠掃描")
        frame.pack(padx=8, pady=8, ipadx=4)
        iplabel = Label(frame, text="輸入IP:",font='Helvetica -15 bold')
        iplabel.grid(row=0, column=0, padx=5, pady=5, sticky=W)
        ipentry = Entry(frame, textvariable=self.ip,width=30)
        ipentry.grid(row=0, column=1, sticky='ew', columnspan=2, padx=5, pady=5)
        ok = Button(frame, text="確認", default='active',command=submit)
        ok.grid(row=0, column=3,padx=8, pady=5)
        resultlabel = Label(frame, text="掃描結果如下:", font='Helvetica -15 bold')
        resultlabel.grid(row=1, column=0, padx=5, pady=5, sticky=W,columnspan=2)
        self.resulttext=ScrolledText(frame,width=30, height=12,font=('Courier New', 13),fg='black',bg='white')
        self.resulttext.grid(row=2,column=0,columnspan=4)
        #退出
        quitscan= Button(frame, text="退出", default='active',command=quit,width=8,height=1)
        quitscan.grid(row=3, column=1, padx=8, pady=5)
        clearscan=Button(frame, text="清空", default='active',command=clear,width=8,height=1)
        clearscan.grid(row=3, column=2, padx=8, pady=5)
def nmapScan(tgtHost, tgtPort):
        global index
        nmScan = nmap.PortScanner()
        nmScan.scan(tgtHost, tgtPort)
        state = nmScan[tgtHost]['tcp'][int(tgtPort)]['state']
        theport_is_open= "[+]" + tgtHost + ':' + tgtPort + " "+ state+"\n"
        app.resulttext.tag_config('b', foreground='blue')
        app.resulttext.insert(index, theport_is_open, 'b')
        index += 1.0
        app.resulttext.update()
        return
def get_os():
        '''''
       判斷系統型別
       '''
        os = platform.system()
        if os == "Windows":
            return "n"
        else:
            return "c"
def ping_ip(ip_str):
        global index
        #ping 該主機
        cmd = ["ping", "-{op}".format(op=get_os()),
               "1", ip_str]
        output = os.popen(" ".join(cmd)).readlines()
        flag = False
        #得到PING 資料
        for line in list(output):
            if not line:
                continue
            if str(line).upper().find("TTL") >= 0:
                flag = True
                break
        #存在一個主機
        if flag:
            s="[*]IP: %s is exist\n"%ip_str
            print s
            #輸出一個主機
            app.resulttext.tag_config('a', foreground='red')
            app.resulttext.insert(index,s,'a')
            index+=1.0
            app.resulttext.update()
            #namp該主機的埠
            usalPorts={22,25,43,80,107,139,158,518,990,1863,3306,3389}
            for usalPort in usalPorts:
               nmapScan(ip_str,str(usalPort))
#掃描資料存在主機
def submit():
    #得到一個ip地址的網段
   tgrip=app.ip.get()
   args = "".join(tgrip)
   ip_prefix = '.'.join(args.split('.')[:-1])
   #搜尋主機
   for i in range(1, 255):
       ip = '%s.%s' % (ip_prefix, i)
       ping_ip(ip)
   tkMessageBox.showinfo(title='Ending', message="the scan was over")
#清空資料
def clear():
    global index
    #清空全部的資料
    app.ip.set("")
    app.resulttext.delete(1.0,index)
    index=1.0
if __name__ == '__main__':
    global app
    root = Tk()
    app = Scan(root)
    app.root.update_idletasks()
    #顯示在螢幕中間
    x = (app.root.winfo_screenwidth() - app.root.winfo_reqwidth()) / 2
    y = (app.root.winfo_screenheight() -app. root.winfo_reqheight()) / 2
    app.root.geometry("+%d+%d" % (x, y))
    #頁面大小
    app.root.geometry("400x400")
    app.root.mainloop()
    app.root.destroy()