Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 

149 řádky
4.9 KiB

#!/usr/bin/env python
import socket
from thread import start_new_thread
from datetime import datetime
from os import urandom
from random import randrange as random
import RSAvulnerableKeyGenerator as keygen
FLAG = 'SlashRootCTF{W13nn3r_w1nn3r_RSA_d1nn3r}'
HOST = '0.0.0.0'
PORT = 6070
BUFF = 1024
BIT = 256
MAX = 10
def banner():
return '''\
_______________________________________________
| ____ ____ ____ ___ ____ _ _ ____ _ _ |
| |__/ [__ |__| | | | |_/ |___ |\ | |
| | \ ___] | | | |__| | \_ |___ | \| |
| ____ ____ _ _ ____ ____ ____ ___ ____ ____ |
| | __ |___ |\ | |___ |__/ |__| | | | |__/ |
| |__] |___ | \| |___ | \ | | | |__| | \ |
|_____________________________________________|
| [1] Generate RSA |
| [2] Generate Token |
| [3] Generate Flag |
|_____________________________________________|
>>> '''
def log(message, address, filename='RSATG.log'):
with open(filename, 'a') as log:
timestamp = datetime.now().strftime('%d/%m/%Y %H:%M:%S')
log.write('[%s][%s:%d] %s\n' % (timestamp, address[0], address[1], str(message)))
def serve_client(client, address, receive=''):
try:
client.send(banner())
token = []
while True:
data = ''
receive = client.recv(BUFF).strip()
if receive == '1':
log('<<< Generating RSA', address)
data = genRSA(client, address)
elif receive == '2':
log('<<< Generating Token', address)
data, token = genToken(client, address)
log('>>> Sending Token: %s' % format(token), address)
elif receive == '3':
log('<<< Generating flag', address)
if token:
client.send('Token : ')
if format(token) == client.recv(BUFF).strip():
ID = urandom(16).encode('hex')
log('<-> RSA ID: %s[%s]' % (ID, format(token)), address)
log('>>> Sending Flag: %s[%s]' % (ID, format(token)), address)
client.send('''\
RSA ID\t : %s
FLAG\t : %s
*Sertakan TOKEN dan RSA ID pada writeup agar poin dihitung!\n''' % (ID, FLAG))
break
else:
log('>-< Wrong Token: %s|%s' % (receive, format(token)), address)
data = 'Try Again!\nYour token is %s\n' % format(token)
else:
log('>-< Empty Token!', address)
data = 'Generate your token!\n'
token = []
client.send(data + '[1|2|3]>>> ')
log('Disconnected', address)
except Exception as message:
log(message, address, 'error.log')
log('>-< Disconnected because error: %s' % message, address)
finally:
client.close()
log('--- Disconnected', address)
def format(token):
return '-'.join(token)
def RSA(bit):
e, n, d = keygen.generateKeys(bit)
p = random(1000, 9999)
c = pow(p, e, n)
return e, n, d, p, c
def genRSA(client, address):
e, n ,d, p, c = RSA(BIT)
client.send('e = %s \nn = %s \nc = %s \np = ' % (e, n, c))
r = client.recv(BUFF).strip()
if r == str(p):
log('<-> Correct %s{e:%s,n:%s,d:%s,p:%s,c:%s)' % (r, e, n, d, p, c), address)
return '\n\m/ Correct \m/\n'
else:
log('>-< Wrong %s{e:%s,n:%s,d:%s,p:%s,c:%s)' % (r, e, n, d, p, c), address)
return '\nWrong :P is %s\n' % p
def genToken(client, address):
token = []
data = 'Token has been generated!\n'
for i in range(1, 6):
e, n ,d, p, c = RSA(BIT)
client.send('Token #%i\ne = %s \nn = %s \nc = %s \np = ' % (i, e, n, c))
r = client.recv(BUFF).strip()
if r == str(p):
log('<-> Correct #%d: %s{e:%s,n:%s,d:%s,p:%s,c:%s)' % (i, r, e, n, d, p, c), address)
token.append(str(p))
else:
token = []
data = '\nWrong :P is %s\n' % p
log('>-< Wrong #%d: %s{e:%s,n:%s,d:%s,p:%s,c:%s)' % (i, r, e, n, d, p, c), address)
break
return data, token
def main():
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((HOST, PORT))
server.listen(MAX)
log('(+) Power On Server', [HOST, PORT])
while True:
try:
client, address = server.accept()
log('<<< Client connected from IP %s with PORT %d' % (address), address)
start_new_thread(serve_client, (client, address))
except Exception as message:
log(message, [HOST, PORT], 'error.log')
except KeyboardInterrupt:
log('(-) Power Off Server', [HOST, PORT])
break
server.close()
if __name__ == '__main__':
main()