Web弱口令通用檢測方法探究
注意:本指令碼只是探討通用web口令破解的可行性,所有測試請自行搭建靶機環境或者在拿到目標系統相關授權後再進行測試。文中所涉及的技術、思路和工具僅供以安全為目的的學習交流使用,任何人不得將其用於非法用途以及盈利等目的,否則後果自行承擔!
工具介紹
通用的web弱口令破解指令碼,旨在批量檢測那些沒有驗證碼的管理後臺。
隨著攻防演練和一些漏洞挖掘任務的增多,有時候需要大批量快速的檢測一些網站後臺安全性,特別是測試一些管理弱口令,這種難度不大但比較費時費力的工作就需要一個自動化的指令碼來完成了。但目前的各種web口令破解工具大多是針對某個cms進行設計,或者類似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為執行緒數,預設為50
url.txt為待檢測URL地址,可以自己寫個指令碼批量從搜尋引擎獲取,也可以自己用目錄列舉工具去搜集。
功能原理
1、訪問目標地址,分析關鍵字
原理非常low,就是從頁面中提取表單,對錶單中的內容進行檢索,發現存在使用者名稱、密碼、username、pwd、pass之類的欄位則認為是登入頁面,然後提取引數組成data資料,傳送給crack函式進行破解。
由於現在各種網站的請求包的多樣性,目前沒法做到像wvs那樣能提取到所有的登入post,只是根據簡單的關鍵字進行了提取。
logins =['使用者名稱','密碼','login','denglu','登入','user','pass','yonghu','mima','pwd','zhanghao','yonghu','name','email','account']
在測試中還發現有時候搜尋框會干擾結果,所以把搜尋框又進行了排除
sous = ['檢索','搜','search','查詢','keyword','關鍵字']
另外,目前不支援自動識別驗證碼,所以對驗證碼也進行了排除
yzms = ['驗證碼','點選更換','點選重新整理','checkcode','valicode','code','captcha']
2、通過解析頁面獲取post地址及引數
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_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、在獲取相關引數和path後呼叫破解函式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: data1 = data # print data1 user_name = user_name.strip() pass_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)) num = 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表示每個資料包中都有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、如何判斷破解成功
目前使用了幾種方式相互結合的方法來共同驗證。
1、通過返回包裡有沒有Set-Cookie; 2、返回資料包的長度變化; 3、使用requests.session()進行重驗證; 4、返回頁面的內容匹配。
5、優化準確度,加入了recheck函式
在測試時發現會出現誤報情況,所以對成功的賬戶密碼進行了重驗證。比如:
1、有些系統在探測多次之後出現封ip之類的情況,這時候會干擾破解指令碼的判斷; 2、有些系統在開始的時候沒有驗證碼,但錯誤幾次後會出現驗證碼; 3、有些系統的提示資訊會出現隨機的變更,導致誤報。
工作介面
掃描過程如下
掃描成功的結果會保持在web_crack_ok.txt檔案中
掃描中識別到驗證碼、phpmyadmin等所有的日誌會儲存在web_crack_log.txt檔案中,後期可以根據log日誌再進行逐一篩查。
其他說明
其實在完成這個工具後,也開始明白為什麼市面上沒有通用的破解器,因為成功率的確不高!我測試過10000個管理後臺,破解出來弱口令的大約110個,有沒有漏報不清楚但基本沒有誤報。
成功率不高主要原因有:
1、web頁面型別繁雜,很難準確獲取並提交正確引數; 2、很多頁面都有驗證碼,目前這個小指令碼還沒法自動識別驗證碼; 3、為了平衡時間和效率,使用了比較簡單的使用者名稱和密碼字典,所以稍微複雜的密碼就破解不出來了。
我一般會使用dirsearch或之類的目錄列舉工具,配置一個比較輕便的管理後臺目錄字典,對目標地址進行批量掃描管理後臺,然後再使用 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
驗證碼識別
減少誤報率
優化編碼處理
能不那麼low
*本文作者:Tide重劍無鋒,轉載請註明來自FreeBuf.COM