WPICTF - rsa-machine
14 Apr 2019
description: nc rsamachine.wpictf.xyz 31337 (or 31338 or 31339)
category: Crypto - 250
Once again this a RSA challenge, you can connect to the service rsamachine.wpictf.xyz
, it will display the public key sign anything except getflag
nc rsamachine . wpictf . xyz 31337
----- BEGIN PUBLIC KEY -----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm6U3u7cIcAvZpLoNnC7 +
Ed6AtPq8q2G + P0h9SFfF4dY10Y6qC0Q76M6YjsHnxJVjB1hHpMRRZ1xEBETDDAEd
E0Q7fkE4nmo1zIlZ + GDc1Wh8yjFP5dgUUsV + gmpHpiV8bGf7fjbOUQQsr4Tdj36r
k / MECUJ1KirI6hxwjGbiv91QOtaWxHowklEew / qjcluvRXWQSny4QbBnEiDDlcc7
LsJNWC9vSrVSdJYzOq1AHg8OAj / 9L wZBP4LKv5R1KeHmbHcA9YH7209KPRuoUq + 8
yZT5dwcDOj7CIAi5ZZTNB + 8 JFye9P5Io7KLtjNfc2LuWFcmnD1L2Jkq1uaAKlDhW
xwIDAQAB
----- END PUBLIC KEY -----
sign something
263143455915553814887752724380314073403898730047303403988419060491103813517683987149316936899917770854377052259279067668404252951681718316256673764873508758275796657584169673472618879593959868838554701949970086430857326767140906350258609046836933983182628811986955853432603640580199244364940762358967783650993395295484998136760749744014952178178481654620475181643286301429842971867932606572045849027337514537764615811040636337471022302207829370474793300200243702914208594827859646506339198480880761272715718921034602009369230231577795574179605634300263686633900298593950959943424333149187160061409252478269885226682
The author provided the challenge source code, we have to send getflag
followed by its signature which will be verified in if privkey.verify(b'getflag', (signature,)):
.
#!/usr/bin/python3
import sys
from Crypto.PublicKey import RSA
def run ( inFile , outFile ):
privkey = RSA . generate ( 2048 )
pubkey = privkey . publickey () . exportKey ()
outFile . write ( pubkey + b ' \n ' )
while not outFile . closed :
outFile . flush ()
line = inFile . readline ()
if not line : #EOF
break
line = line . rstrip ( b ' \n ' )
if not line :
continue
try :
[ cmd , param ] = line . split ( maxsplit = 1 )
except ValueError :
outFile . write ( b 'Parameter required! \n ' )
continue
if cmd == b 'sign' :
if param == b 'getflag' :
outFile . write ( b 'No cheating! \n ' )
else :
( signature ,) = privkey . sign ( param , None )
outFile . write ( str ( signature ) . encode () + b ' \n ' )
elif cmd == b 'getflag' :
signature = int ( param )
if privkey . verify ( b 'getflag' , ( signature ,)):
outFile . write ( b '[REDACTED]' )
break
else :
outFile . write ( b 'Bad signature! \n ' )
else :
outFile . write ( b 'Bad command ' + cmd + b ' \n ' )
if __name__ == '__main__' :
run ( sys . stdin . buffer , sys . stdout . buffer )
This is a classic RSA blinding attack, the full details about the attack are available at http://the2702.com/2015/09/07/RSA-Blinding-Attack.html . I made a python script based on the pwn lib to interact with the service.
import re
import codecs
import random
from Crypto.PublicKey import RSA
from binascii import unhexlify , hexlify
from pwn import *
srv = remote ( 'rsamachine.wpictf.xyz' , 31337 )
pubkey = srv . recv () . strip ()
key = RSA . importKey ( pubkey )
print ( "[!] Got public key" )
M = int ( hexlify ( "getflag" ), 16 )
N = key . n
e = key . e
r = 3 # random.randint(2, N-1)
mbis = ( M * pow ( r , e )) % N
messagebis = ( " %2 X" % mbis ) . decode ( 'hex' )
srv . send ( "sign " + messagebis + " \n " )
sbis = srv . recv ()
sbis = long ( sbis . strip ()) #sbis = pow(mbis, d) % N
print ( "[!] Got S' : {}" . format ( sbis ))
s = ( sbis / r ) % N
srv . send ( "getflag {} \n " . format ( s ))
print ( srv . recv ())
We got the flag after launching the script 3 times.
╰─$ python2 rsablind.py
[ +] Opening connection to rsamachine.wpictf.xyz on port 31337: Done
[!] Got public key
[!] Got S' : 8055189041943281850539614428987268833243977988231476308451969394241131492275713532521566856414705140678584275459454061478877916901106021929082261596304029000380356771010090392077825985126904892021860846170710444878788617553685554227251040415596010342529263252780579779283805197748539892098561765320527416126709326474068550668984482014647358415646453014451009099645828063210244579362249356356992100432879012681260104886379237896331092235634504293978157618536973885986939804073798159721968127183030650941348417673375708632952880399373025493539732962654422773982210391960030492635331940490213507770535612609263131485740
WPI{m411e4b1e_cipher5_4re_d4ngerou5}
[*] Closed connection to rsamachine.wpictf.xyz port 31337
The flag was WPI{m411e4b1e_cipher5_4re_d4ngerou5}