Nuevamente tenemos un fichero pcap que analizándolo con Wireshark nos desvela que contiene paquetes CUPS, ICMP y NBNS. Un vistazo rápido por el panel de la Codegate nos proporciona las siguientes pistas:
- Se utiliza una codificación XOR.
- La clave que se ha utilizado para codificar los mensajes no se muestra en texto plano.
Posteriormente dieron otra pista más:
- La clave usada en el cifrado se podía obtener directamente desde el fichero.
Revisando el pcap observamos que hay tres paquetes ICMP con un contenido raro:
#Paquete 2 0000 02 00 00 00 45 00 00 3b a7 08 00 00 40 01 00 00 ....E..;....@... 0010 7f 00 00 01 c0 a8 3c f7 00 00 8a 9b ff ff 00 00 ......<......... 0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0030 00 00 00 00 02 00 00 00 00 00 00 00 69 64 0a ............id.
#Paquete 10
0000 02 00 00 00 45 00 00 53 1a 0d 00 00 40 01 00 00 ....E..S....@...
0010 7f 00 00 01 7f 00 00 01 00 00 ad 19 ff ff 00 00 ................
0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0030 00 00 00 00 02 00 00 00 00 00 00 00 52 53 43 0e ............RSC.
0040 1f 7b 43 4b 43 42 1d 59 1e 56 4f 44 4b 1e 42 5d .{CKCB.Y.VODK.B]
0050 5b 58 1e 5a 48 5a 3b [X.ZHZ;
#Paquete 11 0000 02 00 00 00 45 00 00 52 74 4f 00 00 40 01 00 00 ....E..RtO..@... 0010 7f 00 00 01 7f 00 00 01 00 00 3e 57 ff ff 01 00 ..........>W.... 0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0030 00 00 00 00 00 00 00 00 00 00 00 00 5a 57 4e 14 ............ZWN. 0040 10 4d 00 58 02 43 46 54 46 51 40 5e 4b 5d 54 4a .M.X.CFTFQ@^K]TJ 0050 03 43 40 42 55 24 .C@BU$
De aquí podemos extraer qué:
- El string id. se corresponde con los valores hex: 69 64 0a.
- El string RSC..{CKCB.Y.VODK.B][X.ZHZ; se corresponde con los valores hex: 52 53 43 0e 1f 7b 43 4b 43 42 1d 59 1e 56 4f 44 4b 1e 42 5d 5b 58 1e 5a 48 5a 3b
- El string ZWN..M.X.CFTFQ@^K]TJ.C@BU$ se corresponde con los valores hex: 5a 57 4e 14 10 4d 00 58 02 43 46 54 46 51 40 5e 4b 5d 54 4a 03 43 40 42 55 24
Se tratan de las cadenas que han sido cifradas con XOR, si tratamos de usarlas directamente obtendremos strings incorrectos debidos a los caracteres que no aparecen y se representan con . así que vamos a utilizar el método binascii.unhexlify(hexstr) para obtener la representación binaria de los valores hexadecimales.
>>> import binascii
>>> binascii.unhexlify(''.join('52 53 43 0e 1f 7b 43 4b 43 42 1d 59 1e 56 4f 44 4b 1e 42 5d 5b 58 1e 5a 48 5a 3b'.split()))
'RSC\x0e\x1f{CKCB\x1dY\x1eVODK\x1eB][X\x1eZHZ;'
>>> binascii.unhexlify(''.join('5a 57 4e 14 10 4d 00 58 02 43 46 54 46 51 40 5e 4b 5d 54 4a 03 43 40 42 55 24'.split()))
'ZWN\x14\x10M\x00X\x02CFTFQ@^K]TJ\x03C@BU$'
Ahora que tenemos los strings bien formados el resto es aplicar el proceso inverso y descifrarlos, utilizando como clave 127.0.0.1 y el siguiente script en python:
class PEcrypt:
def __init__(self, aKey):
self.key = aKey
self.crc = 0
for x in self.key:
intX = ord(x)
self.crc = self.crc ^ intX
def Crypt(self, aString):
kIdx = 0
cryptStr = ""
for x in range(len(aString)):
cryptStr = cryptStr + \
chr( ord(aString[x]) ^ ord(self.key[kIdx]))
kIdx = (kIdx + 1) % len(self.key)
return cryptStr
if __name__ == "__main__":
def strToHex(aString):
hexStr = ""
for x in aString:
hexStr = hexStr + "%02X " % ord(x)
return hexStr
keyStr = "127.0.0.1"
testStr = "RSC\x0e\x1f{CKCB\x1dY\x1eVODK\x1eB][X\x1eZHZ;"
testStr2 = "ZWN\x14\x10M\x00X\x02CFTFQ@^K]TJ\x03C@BU$"
pe = PEcrypt(keyStr)
testStr = pe.Crypt(testStr)
testStr2 = pe.Crypt(testStr2)
print "\nDecrypted String"
print "Ascii : ", testStr
print "Hex : ", strToHex(testStr)
print "Ascii : ", testStr2
print "Hex : ", strToHex(testStr2)
Obteniendo el siguiente resultado:
sebas@Penetraitor:~/roote/Lab/codegate2011/network/200$ python xor.py Decrypted String Ascii : cat /Users/n0fate/solv.txt Hex : 63 61 74 20 2F 55 73 65 72 73 2F 6E 30 66 61 74 65 2F 73 6F 6C 76 2E 74 78 74 0A Ascii : key: c0v3rtchannelex4mple Hex : 6B 65 79 3A 20 63 30 76 33 72 74 63 68 61 6E 6E 65 6C 65 78 34 6D 70 6C 65 0A
Siendo el token: c0v3rtchannelex4mple