0x01 漏洞原理
目前,账号仍然是最主要的用户身份认证方式,但由于安全意识的淡薄,很多人仍在使用弱口令。而一旦泄漏,所有的安全防范机制都将形同虚设。
弱口令没有严格的准确的定义,通常认为容易被人猜测到或者被破解工具破解的口令均为弱口令。比如仅简单的纯数字、简单的数字与字母组合的口令,123456、123qwe等。
弱口令的产生与个人习惯与相关安全意识有关,为了避免忘记密码,通常会使用非常容易记住的密码,或者直接采用系统默认的密码等。使用弱口令可导致直接被猜解后登录系统。
0x02 代码示例
此代码为某系统后台的登录代码,可以看出用户名是admin、密码为admin888,这应该是管理员为了避免忘记密码,使用了一个非常容易记住的密码,安全意识不够。若攻击者使用弱口令TOP100对此系统进行爆破,就可以登录成功,获得后台权限。
0x03 限制绕过
所有可能存在未授权访问类的服务都有可能出现弱口令:
- 远程维护类服务:SSH、Telnet、RDP等;
- 数据库服务:Mysql、MSSQL、Oracle、MongoDB、DB2等;
- 缓存类服务:Redis、Kafka;
- 大数据相关服务;
- 云环境各类接口、Docker环境各类借口;
- 各种Web应用系统、手机程序、小程序等;
弱口令一般由以下依据组成:
1.中国常用名TOP500,常见组合;
2.姓名的全拼+数字;
3.姓全拼+名的首字母+数字;
4.姓名首字母+数字;
5.工号;
6.习惯性的利用键盘分布或者Shift+键盘布局;
7.特殊节日、纪念日、年月;
8.好记的数字组合、字母组合;
9.特殊含义的单词、好记的特殊字符组合、特殊含义的字母用数字替换等。
防御机制绕过方法
针对网站的弱口令,可以先手工进行猜解几个可能的弱口令,判断系统是否做了登录失败次数限制,若没有做此限制,就可以使用爆破工具进行爆破。收集相关信息,使用社工字典生成等工具创建针对该系统的字典,可对用户名、密码同时爆破,也可通过猜测的用户名登录失败后,系统返回的信息判断该账号是否存在,再针对存在的用户名进行密码爆破。
但现在很多网站为了防止系统遭受暴力破解、DDOS攻击、识别用户身份等攻击,会使用验证码机制。通常在网站的用户注册、密码找回、登录等页面处使用验证码,但当这些验证码具有一定的规律性并且没有做好对应的防护措施时会导致攻击者通过爆破等方式猜解/绕过验证码机制,可导致任意用户注册、批量注册无用账户、重置任意用户密码、获取系统权限等危害。
常见的验证码主要有图片验证码、邮件验证码、短信验证码、滑动验证码和语音验证码。
1. 短信验证码绕过
a. 短信验证码暴力破解
大部分情况短信验证码由4-6位纯数字组成。首先可以先抓取服务器向填写的手机号发送短信验证码的请求包,查看返回包中是否有明文的验证码,若有可直接使用。若没有可先判断验证码为4为还是6位,且判断系统是否对验证码的失效时间和尝试失败次数做限制,若没有攻击者就可以通过尝试对这个区间内所有的数字进行暴力破解。
比如,若验证码为4位,先抓取验证码验证请求包,发送至BurpSuite的Intruder模块,将验证码的范围设置为0000-9999,对验证码进行暴力破解。
b. 短信验证码重复使用:
- 系统如果在验证码认证成功后没有将session及时清空,将会导致验证码首次认证后重复使用;
- 系统只是前端JS实现验证码,后台对验证码不进行验证,这种设置如同纸老虎,可直接爆破;
- 系统将验证码泄漏在cookie中,可直接获取;
c. 验证码客户端回显
某些系统会将验证码在客户端生成而非在服务器生成。针对此类验证码,当客户端需要和服务器进行交互发送验证码时,可借助浏览器工具或抓包工具查看客户端与服务器进行交互的详细信息,可在返回包中查看到验证码。
d. 其他思路:
- 万能验证码,0000、8888等;
- 空验证码,某些系统即使不输入验证码也不影响正常的验证流程;
使用验证码识别工具(pkav、验证码识别接口);
- 获取验证码的方式为通过参数的方式去加载,如:www.xxx.com/yanzheng.php?code=xxx,可以尝试将参数值改为undefined,即设为控制,也可以通过编写脚本的方式,获取验证码并传入验证流程。
弱口令字典合集
1. 后台常见弱口令
- 弱口令TOP100:https://github.com/estell-yf/Dict/blob/master/%E7%99%BB%E5%BD%95%E8%B4%A6%E5%8F%B7/TOP100.txt
- 弱口令TOP1000:https://github.com/estell-yf/Dict/blob/master/%E7%99%BB%E5%BD%95%E8%B4%A6%E5%8F%B7/top1000.txt
- 用户名TOP500:https://github.com/estell-yf/Dict/blob/master/%E7%99%BB%E5%BD%95%E8%B4%A6%E5%8F%B7/Top500%E7%94%A8%E6%88%B7%E5%90%8D.txt
- 键盘组合TOP100:https://github.com/estell-yf/Dict/blob/master/%E7%99%BB%E5%BD%95%E8%B4%A6%E5%8F%B7/%E9%94%AE%E7%9B%98%E7%BB%84%E5%90%88TOP100.txt
- 符合条件的强弱密码合集:https://github.com/r35tart/RW_Password
2. 中间件常见弱口令
- Tomcat、Wenlogic、Jboss:https://github.com/estell-yf/Dict/tree/master/%E4%B8%AD%E9%97%B4%E4%BB%B6
3. 数据库常见弱口令
- MySQL、SQL Server、DB2、Mongo DB、Oracle、PostgreSQL:https://github.com/estell-yf/Dict/tree/master/%E6%95%B0%E6%8D%AE%E5%BA%93
- SQLServer:https://github.com/danielmiessler/SecLists/blob/master/Passwords/mssql-passwords-nansh0u-guardicore.txt
4. 端口服务类弱口令
3389、FTP、POP3、RDP、SMB、SNMP、TELNET、phpmyadmin、ssh、system等:https://github.com/estell-yf/Dict/tree/master/%E7%AB%AF%E5%8F%A3%E6%9C%8D%E5%8A%A1
5. 网络设备弱口令
- H3C、IOT、路由器、Wi-Fi、华为安全产品、国内防火墙默认密码等:https://github.com/estell-yf/Dict/tree/master/%E7%BD%91%E7%BB%9C%E8%AE%BE%E5%A4%87
6. 其他弱口令
- 万能密码:https://github.com/estell-yf/Dict/tree/master/%E4%B8%87%E8%83%BD%E5%AF%86%E7%A0%81
- 后门密码:https://github.com/estell-yf/Dict/tree/master/%E5%85%B6%E4%BB%96、https://github.com/3had0w/Fuzzing-Dicts/blob/master/WebShell-Password%EF%BC%88433616%EF%BC%89.txt
- 强弱字典组合:https://github.com/huyuanzhi2/password_brute_dictionary
- 高效手机号码:https://github.com/3had0w/Fuzzing-Dicts/blob/master/%E9%AB%98%E6%95%88%E6%89%8B%E6%9C%BA%E5%8F%B7%E7%A0%81.txt
工具
1. SNETCraker—超级弱口令检查工具
下载地址:https://github.com/shack2/SNETCracker
- windows平台的一款支持自定义服务端口和字典的弱口令检查工具。 工具采用C#开发,需要安装.NET Framework 4.0。
- 工具目前支持SSH、RDP、SMB、MySQL、SQLServer、Oracle、FTP、MongoDB、Memcached、PostgreSQL、Telnet、SMTP、SMTP_SSL、POP3、POP3_SSL、IMAP、IMAP_SSL、SVN、VNC、Redis等服务的弱口令检查工作。
工具特点:
- 支持多种常见服务的口令破解,支持RDP(3389远程桌面)弱口令检查。;
- 2.支持批量导入IP地址或设置IP段,同时进行多个服务的弱口令检查;
- 3.程序自带端口扫描功能,可以不借助第三方端口扫描工具进行检查;
- 4.支持自定义检查的口令,自定义端口。
2. WebCrack——网站后台弱口令扫描工具
下载地址:https://github.com/yzddmr6/WebCrack
使用WebCrack可以对特定后台程序进行批量的弱口令爆破,当我们有一批统一程序的后台时,可以采用此工具或类似工具进行自动化的爆破。导入URL后可以直接爆破,需提前搜集好后台地址。
3. hydra—弱口令爆破工具
下载地址:
Linux:https://www.thc.org/releases/hydra-8.3.tar.gz
Windows:https://github.com/ory/hydra
hydra是著名黑客组织thc的一款开源的自动化的爆破工具,可以在线破解多种密码,已集成到kali中。
支持:POP3、SMB、RDP、SSH、FTP、Telnet、Mysql、AFP、Cisco AAA、Cisco auth、CVS、FTP、MSSQL、NCP、NNTP、Oracle、PCNFS、IRC、LDAP等。
4. Go-x-crack—一款GO编写的常见服务的弱口令扫描工具
下载地址:https://github.com/netxfly/x-crack
支持Windows、Linux双用的弱口令爆破工具
支持:FTP、SSH、SMB、MySQL、MSSQL、PostgreSQL、Redis等。
5. domainWeakPasswdCheck—域账号弱口令审计工具
下载地址:https://github.com/chroblert/domainWeakPasswdCheck
需要满足以下条件:
- 高权限的域控账号
- 管理员权限打开powershell
- 具备python环境,安装pip
- 将domainWeakPasswdCheck放到一个杀软杀不到的地方,不然,mimikatz会被删除,无法获取到缓存的ST凭据
- 运行程序的计算机要位于域中
- 运行程序的账户需要加入域
6. WeblogicWeakPwd—Weblogic弱口令批量检测工具
下载地址:https://github.com/rabbitmask/WeblogicWeakPwd
WeblogicWeakPwd最终版仍有欠缺,在异常处理这块还需要完善,尤其是遇到非web logic的URL,所以推荐预识别中间件,可用之前发布过的weblogic识别脚本(https://github.com/rabbitmask/WhoIsWeblogic)进行识别,另外,因为多进程模块自有的小bug,尽可能在非交互界面下使用——使用命令窗口执行。
7. pydictor—字典创建工具
下载地址:https://github.com/LandGrey/pydictor
中文版使用地址:https://github.com/LandGrey/pydictor/blob/master/README_CN.md
pydictor是一个使用python语言开发,遵循GPLv3协议的开源命令行工具,功能强大、简洁实用、适用场景多。
特点:
1.完全使用python原生库写成不需要额外安装其他任何的python模块;
2.同时支持python2.7+和python3.4版本,支持Windows、Linux、macOS;
3.可自定义化程度高,留出很多可配置规则的文件;
8. 在线字典创建工具—针对单个账户的密码生成
利用https://www.bugku.com/mima/、https://www.bugku.com/mima/两个社工库密码生成工具,根据相关信息,生成一份具有针对性的密码字典。
9. 白鹿社工字典生成器—社工弱口令
下载地址:https://github.com/x311/BaiLu-SED-Tool
依据此类社工弱口令组合的规律,编写成此款灵活和易用兼顾的字典生成器。
10. BurpSuite模块
a. jsEncrypter扩展——解决密码被加密处理问题
客户端JS文件对密码做加密处理发送给服务端,推荐使用BurpSuite的扩展工具—jsEncrypter:https://github.com/bit4woo/reCAPTCHA)。
b. reCAPTCHA扩展-验证码处理
利用第三方识别服务识别验证码:https://github.com/bit4woo/reCAPTCHA)
0x04 测试过程
测试案例1:某系统未设置验证码,使用BurpSuite的Intruder模块对用户名进行爆破;
测试案例2:使用工具对某系统开放的服务进行弱口令爆破;
测试案例3:利用验证码验证一次反复使用的缺陷,绕过验证码机制;
测试案例1
系统登录界面如下图,无任何验证码机制。
使用BurpSuite的Intruder模块,设置用户名为变量,密码为123456,使用“用户名TOP500”字典进行爆破,发现大量密码为123456的弱口令用户。
测试案例2
使用超级弱口令检查工具,爆破出系统的Memcached用户名和密码均为弱口令。
测试案例3
确认验证码有效性。分别输入错误的验证码、正确的验证码,查看系统返回信息,判断系统验证码有效。
抓包,提交空验证码,返回信息如下图,验证后台是否对验证码进行了验证。
修改为错误的验证码,提示如下,说明后台对验证码也进行验证。
判断验证码是否存在过期的问题。刷新网页,获取新的验证码,将新的验证码继续输入到刚才抓取的数据包中。这时输入的是正确的验证码,系统应该返回用户名与密码不正确。
返回用户名与密码不正确
将用户名或密码随意更改一下,再进行提交,正常来说,系统应该返回验证码不正确,但系统返回信息与之前相同,为“用户名与密码不正确”。说明验证码被重复使用,一次验证反复使用,不存在过期的情况,
输入正确验证码,对用户名、密码进行爆破。
爆破成功。
0x05 风险分析
弱口令会导致:
- 进入系统管理后台修改数据,比如说考试成绩,电费水费。
- 窃取内部资料,例如OA平台中的办公文件等。
- 获取用户信息,造成个人财产损失。
- 获取视频监控权限,侵犯个人隐私;
- 获取的账户信息被攻击者用来“撞库”等;
0x06 加固建议
开发、管理角度
1. 口令强制安全策略
在口令生成的时候,需要满足一定的安全策略,才会被系统接受,比如:
(1)口令长度大于8位;
(2)口令应该为以下四类字符的组合:大写字母、小写字母、数字、特殊字符,每类字符至少包含一个;
(3)口令中不应该包含本人、父母、子女或配偶的姓名、出生日期、纪念日、登录名等与本人相关的信息,以及字典中的单词;
(4)口令不应该为用数字或符号代替某些字母的单词;
(5)口令不应该为连续的某个字符或重复某些字符的组合;
(6)不使用空口令或系统缺省口令;
(7)口令不得使用键盘上连续的数字、字母或字符;
(8)新密码不得与旧密码重复;
2. 口令管理安全策略
常见的口令安全管理策略,主要有:
(1)定期修改密码,如每三个月修改一次;
(2)建立统一账号登录系统;
(3)双因子认证;
(3)验证码机制;
以上的口令生成策略、口令管理策略并不能完全规避弱口令的生成,比如:
- 定期修改的密码,旧密码与新密码相比,可能只是对最后的尾数做了修改;
- 双因子的具体实现中,如果双重验证因子没有进行有效的限制,同样存在被爆破的可能;
- 验证码的自动识别以及人工打码,已经形成了一条黑色产业。
普通用户角度
- 尽量将办公使用密码和私人密码分别设置,避免“一损俱损”,并定期更换密码;
- 为防止忘记密码,可以采取记忆诀窍,用一句自己能够记忆的句子,例如“XX,你是最帅的”使用每个词的首字母加上标点符号来创建密码,就是“XX,nszsd”;
- 不同设备、系统等应使用不同的密码,以免遭受“撞库攻击”;
- 避免使用姓名、手机号、生日等信息做密码,远离社工危害;
- 禁止在服务器、办公电脑中存放网络设备资产信息及登录口令;
- 针对安全运维人员,应强制系统管理员账号密码强度必须达到一定的级别,并定期更换密码。
验证码机制加固
- 设置验证码失效时间,建议为180秒;
- 限制单位时间内验证码的失败尝试次数,比如,五分钟内连续失败5次即锁定该账号1小时。
- 针对验证码认证次数问题,建议验证码在一次认证成功后,服务端清空认证成功的session,可有效防止验证码一次认证反复使用的问题。
- 禁止验证码在本地客户端生成,应采用服务器验证生成机制,且验证码应随机生成,使用一次即失效,可防止验证码客户端回显问题。