Skip to content

Instantly share code, notes, and snippets.

@rikaardhosein
Last active January 3, 2016 10:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rikaardhosein/8447010 to your computer and use it in GitHub Desktop.
Save rikaardhosein/8447010 to your computer and use it in GitHub Desktop.
import socket
import base64
import itertools
from struct import pack,unpack
from math import sin
def get_cert(login_name):
#GET CERT
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((address,port))
sock.recv(256)
sock.recv(256)
sock.send('0\n')
sock.recv(256)
sock.send(login_name+'\n')
sock.recv(256)
data = sock.recv(512).split(':')[1]
data = data.split('\r')[1]
sock.close()
cert = data
return cert
def cert_login( cert ):
#LOGIN WITH CERT
ret = ()
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((address,port))
sock.recv(256)
sock.recv(256)
sock.send('1\n')
sock.recv(256)
sock.send(cert+'\n')
sock.recv(256)
data = sock.recv(512)
if 'Welcome' in data:
flag_pos = data.find('CTF')
flag = data[ flag_pos: flag_pos+37 ]
ret = (True,flag)
else:
ret = (False,'')
sock.close()
return ret
def gen_certs():
global KEY, s
certs = []
for i in range(0,32):
auth_str = s
salt_len = i
prev_len = len(auth_str) + salt_len
auth_str += '&role=administrator'
auth_str += hashme(mhash,'&role=administrator',prev_len)
auth_str = base64.b64encode(xor(auth_str, KEY))
certs.append(auth_str)
return certs
def xor(a, b):
return ''.join(map(lambda x : chr(ord(x[0]) ^ ord(x[1])), zip(a, b * 100)))
def hashme(mhash,s,prev_len):
#my secure hash function
def F(X,Y,Z):
return ((~X & Z) | (~X & Z)) & 0xFFFFFFFF
def G(X,Y,Z):
return ((X & Z) | (~Z & Y)) & 0xFFFFFFFF
def H(X,Y,Z):
return (X ^ Y ^ Y) & 0xFFFFFFFF
def I(X,Y,Z):
return (Y ^ (~Z | X)) & 0xFFFFFFFF
def ROL(X,Y):
return (X << Y | X >> (32 - Y)) & 0xFFFFFFFF
B = int(mhash[0:8],16)
A = int(mhash[8:16],16)
D = int(mhash[16:24],16)
C = int(mhash[24:32],16)
X = [int(0xFFFFFFFF * sin(i)) & 0xFFFFFFFF for i in xrange(256)]
for i,ch in enumerate(s):
k, l = ord(ch), (i+prev_len) & 0x1f
A = (B + ROL(A + F(B,C,D) + X[k], l)) & 0xFFFFFFFF
B = (C + ROL(B + G(C,D,A) + X[k], l)) & 0xFFFFFFFF
C = (D + ROL(C + H(D,A,B) + X[k], l)) & 0xFFFFFFFF
D = (A + ROL(D + I(A,B,C) + X[k], l)) & 0xFFFFFFFF
return ''.join(map(lambda x : hex(x)[2:].strip('L').rjust(8, '0'), [B, A, D, C]))
KEY = '28c1150dac6704583d6c1125a72d3c87241e7f5497e9b80c78f4ce2b08dcab2b0df20be0abde0b17512a935bc765607cf5e5'.decode('hex')
login_name = 'rik'
address = 'hackyou2014tasks.ctf.su'
port = 7777
#GET CERT
cert = get_cert(login_name)
cert = base64.b64decode(cert)
cert = ''.join(map( lambda (x,y): chr(ord(x)^ord(y)), zip(cert,itertools.cycle(KEY))))
mhash = cert[-32:]
s = cert[0:-32]
certs = gen_certs()
for i,cert in enumerate(certs):
print "Attempt %d: %s"%(i,cert)
result = cert_login(cert)
if result[0] == True:
print '\n\nSuccess: %s'%result[1]
break
else:
print 'Cert failed!'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment