1. 程式人生 > >2018年金融業CTF競賽 “Encrypted Traffic” 雜湊加鹽爆破

2018年金融業CTF競賽 “Encrypted Traffic” 雜湊加鹽爆破

密碼欄位值: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}