2018年金融業CTF競賽 “Encrypted Traffic” 雜湊加鹽爆破
阿新 • • 發佈:2019-01-08
密碼欄位值:ac22543d5382cbf48b6ebcf6e40f123d9ca4b91f9998e4c2f2422402
拿到這道題先看條件,逐條分析
1.題目提示是SHA的雜湊演算法,雜湊演算法的一條特點是固定長度輸出,不同雜湊演算法輸出長度不同
HASH演算法 | 長度 |
md2 | 32 |
md4 | 32 |
md5 | 32 |
sha1 | 40 |
sha224 | 56 |
sha256 | 64 |
sha384 | 96 |
sha512 | 128 |
ripemd128 | 32 |
ripemd160 | 40 |
ripemd256 |
64 |
ripemd320 | 80 |
whirlpool | 128 |
tiger128,3 | 32 |
tiger160,3 | 40 |
tiger192,3 | 48 |
tiger128,4 | 32 |
tiger160,4 | 40 |
tiger192,4 | 48 |
snefru | 64 |
snefru256 | 64 |
gost | 64 |
adler32 | 8 |
crc32 | 8 |
crc32b | 8 |
fnv132 | 8 |
fnv164 | 16 |
joaat | 8 |
haval128,3 | 32 |
haval160,3 | 40 |
haval192,3 | 48 |
haval224,3 | 56 |
haval256,3 | 64 |
haval128,4 | 32 |
haval160,4 | 40 |
haval192,4 | 48 |
haval224,4 | 56 |
haval256,4 | 64 |
haval128,5 | 32 |
haval160,5 | 40 |
haval192,5 | 48 |
haval224,5 | 56 |
haval256,5 | 64 |
題目中欄位長度為56,所以演算法為 sha224
筆者本以為網上會有大牛做這種工具,所以想找到工具之後複製貼上即可解題,度娘蒐羅無數遍之後無果(還是太天真)
因筆者用python較多,所以決定自做指令碼爆破解題
python中有個 hashlib 模組,這就讓指令碼變得容易多了
廢話不多說,直接上指令碼
import hashlib
with open('superdic_back.txt','r') as f: #superdic_back.txt 為字典名
a = f.readlines()
for i in a:
#print(i[:-1])
sha224 = hashlib.sha224()
sha224.update(i[:-1].encode("utf-8")) #Unicode-objects must be encoded before hashing 寫指令碼過程中會有報錯,修改編碼即可解決問題
#print(sha224.hexdigest())
if sha224.hexdigest() == 'ac22543d5382cbf48b6ebcf6e40f123d9ca4b91f9998e4c2f2422402':
print('FOUND:', i[:-1])
break
現在爆破指令碼有了,第一個條件解決了,我們分析第二條
2.ATM取款機的密碼
那就是6為數字啊
那我們現在就能做一個字典用來爆破
筆者之前寫過生成字典的python指令碼,這裡正好可以用上
# -*- coding=utf-8 -*-
#生成字典檔案
import itertools
#提取包含字元,去重
def cancel_repeat(origin):
origin_list=list(origin)
_char=[]
for i in origin_list:
if i not in _char:
_char.append(i)
char=''.join(_char)
return char
#確定字串長度
def get_length():
while 1:
try:
length=int(input('請輸入要求密碼長度:'))
except:
print('輸入不正確,請繼續輸入')
continue
break
return length
#生成字典
def create_dictionary(origin):
char=cancel_repeat(origin)
length=get_length()
pwd=itertools.product(char, repeat=length)
for i in pwd:
with open('dictionary.txt','a') as fp:
fp.write(''.join(i)+'\n')
print('字典已生成')
if __name__ == '__main__':
origin=input('請輸入需要包含的字元:')
create_dictionary(origin)
這裡安利一個強大的生成字典的工具 superdic
現在密碼問題解決了,最後就是選擇哪個密碼才是真正的密碼
3.雜湊值是密碼加鹽之後的結果,而且題目已經告訴我們“鹽”是什麼內容了
我們就可以優化剛剛做的字典,把各個密碼前或後加上“鹽”,即“zhangsanfeng”
用 superdic 裡的 “修改字典”模組即可進行優化
三個條件都滿足了,現在就能用本文第一個指令碼進行爆破了,爆破內容不多,執行指令碼之後馬上就能得到答案
flag{877295_SHA224_zhangsanfeng}