RuCTF 2014 Writeup (Crypto 100)
100. MD5
Server (python27.quals.ructf.org:12337) accepts only authorized messages.
It works like this:buf = c.recv(4096) digest, msg = buf.split(" ", 1) if (digest == md5(password+msg).hexdigest()): #here I send a secret else: c.send("Wrong signature\n")You have intercepted one authorized message: "b34c39b9e83f0e965cf392831b3d71b8 do test connection". Construct your own authorized message! Answer starts with 'RUCTF_'
Length extension attackを知ってるかどうかが勝負の分かれ目らしい。
IRCで変な質問してる人がいたりして面白かったです(真顔
この手の攻撃で知ってるツールはHashPumpだけだったのでそれでなんとかしました。
結果下見たいなコードになったんですが、Pythonほとんど書いたことが無くて文字列の処理周りでめっちゃ大変なことになってます。
あと、文字列周りでエラー吐く可能性があったんですが何事も無く動いたのでそのままです。
import socket import time import commands host = "python27.quals.ructf.org" port = 12337 known_sig = "b34c39b9e83f0e965cf392831b3d71b8" known_text = "do test connection" def test(sign, text): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM); sock.connect((host, port)) data = sign + " " + text sock.send(data) time.sleep(0.1) return sock.recv(4096) for i in range(1,32): cmd = "/Users/rex/CTF/tools/HashPump/HashPump" cmd += " -s " + known_sig cmd += " -d \"" + known_text + "\"" cmd += " -k " + str(i) cmd += " -a " + "AAAA" sign, text = commands.getoutput(cmd).split('\n') a, b = text.split('\\x80') b = b[:-4].replace('\\x','').decode('hex') data = a + '\x80' + b + 'AAAA' res = test(sign, data) print str(i) + ': ' + res if not 'Wrong' in res: break