python呼叫md系列演算法破解ctf題目
阿新 • • 發佈:2018-12-05
題目
某銀行客戶端以安全著稱,所有網路流量都開啟了密碼學防護機制。有一天,你抓到了區域網中的網銀登入流量。在這個流量中,密碼欄位的值為 5ef5ce92fc409703a834adabd2bc861c
根據分析,你獲得瞭如下的線索:
- 上面抓到的登入流量密碼欄位是 md系列雜湊演算法的雜湊值。
- 這個登入密碼也是銀行卡的 ATM 取款密碼。
- 登入密碼的雜湊值是加鹽之後計算的結果,根據逆向分析,鹽的值是使用者名稱的拼音,而你推測出了流量來自於鄰居 “張三丰”
有了這些線索之後,你能夠分析出密碼是什麼嗎?
flag 提交格式: flag{密碼_雜湊演算法_鹽}
舉例: flag{123456_md999_lisi} 老鐵們有什麼思路嗎
解題思路:
舉例中給的是md系列的演算法,常見的有md2、md4、md5演算法(演算法長度都與題目中的hash長度相符),其中md5使用最為廣泛
- MD2演算法產生於1989年
- MD4演算法產生於1990年
- MD5演算法產生於1991年
鑑於md5使用最為廣泛,先從md5進行解題,方法:python呼叫hashlib實現hash碰撞
具體示例如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- import hashlib #md5實現hash碰撞 for x in xrange(1,1000000): print 'password=',x,' ---> ' ,hashlib.md5(str(x)+'zhangsanfeng').hexdigest() pass
首先來看一下能不能成功執行
可以看到上面結果,已經成功執行(程式碼有待後續優化)
把我們題目中的hash放進程式碼作為判斷,看看能否碰撞出結果
#!/usr/bin/env python # -*- coding:utf-8 -*- import hashlib #md5實現hash碰撞 for x in xrange(1,1000001): if '5ef5ce92fc409703a834adabd2bc861c'==hashlib.md5(str(x)+'zhangsanfeng').hexdigest(): print 'found the key ','password=',str(x)+'zhangsanfeng',' ---> ' ,hashlib.md5(str(x)+'zhangsanfeng').hexdigest() break pass if x==1000000: print 'not found!!!'
執行結果如上,發現沒有,找到,看來採用的不是md5演算法;
我們接下來看看是否為md4
簡單修改指令碼:把md5改為md4,指令碼如下
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import hashlib
#md5實現hash碰撞
for x in xrange(1,1000001):
if '5ef5ce92fc409703a834adabd2bc861c'==hashlib.md4(str(x)+'zhangsanfeng').hexdigest():
print 'found the key ','password=',str(x)+'zhangsanfeng',' ---> ' ,hashlib.md4(str(x)+'zhangsanfeng').hexdigest()
break
pass
if x==1000000:
print 'not found!!!'
執行結果如上,WTF(這裡請分開讀 W C T,嗯,與ctf類似),竟然出錯了,找不到md4,hashlib這麼牛的一個庫,竟然沒有實現md4,太匪夷所思了,檢視官方幫助看一下
可以看到,明明包含md4、md5,但是為啥不能執行呢,仔細找找,通過構造可以實現對md4的呼叫
修改後的程式碼如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import hashlib
#md5實現hash碰撞
for x in xrange(1,1000001):
if '5ef5ce92fc409703a834adabd2bc861c'==hashlib.new('md4',str(x)+'zhangsanfeng').hexdigest():
print 'found the key ','password=',str(x)+'zhangsanfeng',' ---> ' ,hashlib.new('md4',str(x)+'zhangsanfeng').hexdigest()
break
pass
if x==1000000:
print 'not found!!!'
可以看到,已經成功找到password,構造flag--->flag{187345_md4_zhangsanfeng}
hash線上驗證連結:https://www.qqxiuzi.cn/bianma/md2.php