CyberSecurityRumble | EZDSA

import socketserver
import random
import ecdsa

key = open("secp256k1-key.pem").read()
sk = ecdsa.SigningKey.from_pem(key)


def sony_rand(n):
    return random.getrandbits(8*n).to_bytes(n, "big")


def sign(data):
    if data == b"admin":
        raise ValueError("Not Permitted!")
    signature = sk.sign(data, entropy=sony_rand)
    return signature


class TCPHandler(socketserver.StreamRequestHandler):

    def handle(self):
        data = self.rfile.readline().strip()
        try:
            signature = sign(data).hex()
            self.wfile.write(b"Your token: " + data + b"," + signature.encode())
        except ValueError as ex:
            self.wfile.write(b"Invalid string submitted: " + str(ex).encode())


if __name__ == '__main__':
    server = socketserver.ForkingTCPServer(("0.0.0.0", 10101), TCPHandler)
    server.serve_forever()
import socketserver
import ecdsa
import pyjokes
from flag import FLAG


key = open("pub.pem").read()
vk = ecdsa.VerifyingKey.from_pem(key) 


def valid_signature(msg, sig):
    try:
        vk.verify(sig, msg)
        return True
    except ecdsa.BadSignatureError:
        return False


class TCPHandler(socketserver.StreamRequestHandler):

    def handle(self):
        data = self.rfile.readline().strip()
        user, signature = data.split(b",")
        sig = bytes.fromhex(signature.decode())
        try:
            if valid_signature(user, sig):
                if user == b"admin":
                    self.wfile.write(b"Hello admin! Here is your flag: " + FLAG)
                else:
                    self.wfile.write(pyjokes.get_joke().encode())
            else:
                self.wfile.write(b"Invalid signature!")
        except Exception as ex:
            self.wfile.write(b"Something went wrong!")


if __name__ == '__main__':
    server = socketserver.ForkingTCPServer(("0.0.0.0", 10100), TCPHandler)
    server.serve_forever()

sony_randという関数名からもわかるようにこれはECDSAにおけるnonce reuse attack。この中身でわかるわけないだろカス。実験をするとわかります。おそらく PYTHONHASHSEEDを外部で固定しているんだろう。カス