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
を外部で固定しているんだろう。カス