Python實現對一個網路段掃描及埠掃描
阿新 • • 發佈:2019-02-09
近日網路安全老師佈置了一個題目,讓搞一個埠掃描器,心想沒有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()