- #! /usr/bin/python
- import binascii
- import struct
- import sys, os, time
- import bluepy.btle as btle
- import itertools
-
- '''
- 42 0x2A READ Handle 0x002C takes value AABBCCDDEEFF. Fuzz a varient of this to find the flag!
- 44 0x2C NOTIFY WRITE
- 46 0x2E READ WRITE write here to goto to scoreboard
-
- Flag: f401f21d02fdd0a4fc00
- '''
-
- notificationData = ""
-
- class MyDelegate(btle.DefaultDelegate):
- def __init__(self, hndl):
- btle.DefaultDelegate.__init__(self)
- self.hndl=hndl;
-
- def handleNotification(self, cHandle, data):
- global notificationData
- notificationData = data
- #print("d: "+data)
-
- deviceMAC = open('ctf_mac.txt').read()
- p = btle.Peripheral(deviceMAC)
-
- print ("Attached to peripheral")
-
- print("Loading level 04")
- hex1 = binascii.unhexlify(str('%0*x' % (4,4)))
- p.writeCharacteristic(0x30, hex1, withResponse=False)
- p.disconnect()
-
- '''
- # of course not, this brute-force would make sense!
- charset = "01234565789ABCDEF"
- generator = itertools.chain.from_iterable((''.join(l)
- for l in itertools.product(charset, repeat=i))
- for i in range(4,5))
- '''
-
- '''
- # not this!
- print("Generating wordlist")
- charset = "01234565789ABCDEF"
- generator = itertools.chain.from_iterable((''.join(l)
- for l in itertools.product(charset, repeat=i))
- for i in range(12,13))
- '''
-
- print("Generating wordlist")
- generator = list()
- charset = list("0123456789ABCDEF")
- origPass = list("AABBCCDDEEFF")
- for x in range(len(origPass)):
- newPass = list("AABBCCDDEEFF")
- for y in range(len(charset)):
- newPass = list("AABBCCDDEEFF")
- newPass[x] = charset[y]
- generator.append("".join(newPass))
-
- for password in generator:
- hexlif2 = binascii.unhexlify(password)
- hexlif2 = str(hexlif2)
-
- deviceMAC = open('ctf_mac.txt').read()
- p = btle.Peripheral(deviceMAC)
-
- try:
- srvs = (p.getServices());
- chs=srvs[2].getCharacteristics();
- ch=chs[1];
- cccd = ch.valHandle + 1
- #print(str(ch)+str(ch.propertiesToString())); # print charchteristic's properties i.e. READ, WRITE, NOTIFY
-
- p.setDelegate(MyDelegate(ch.getHandle()));
- svc=p.getServiceByUUID(0x00FF)
- p.writeCharacteristic(cccd, b"\x01\x00");
-
- sys.stdout.write("\rTrying: %s" % password.rstrip())
- response = p.writeCharacteristic(0x2C, hexlif2)
-
- gotResponse = False
- while gotResponse == False:
- if p.waitForNotifications(1.0):
- rsp = notificationData
- hex = binascii.b2a_hex(rsp)
- hexstr = str(hex).strip("0").upper()
- #sys.stdout.write(" Response: " + hexstr) # for debugging
-
- if(password.strip("0") != hexstr):
- print("\nFlag: %s" % notificationData.rstrip())
- exit()
- else:
- gotResponse = True
- continue
- print "Waiting..."
-
- finally:
- p.disconnect()