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()


你可能感兴趣的:(python学习)