Codegate 2011 Write up Network 200

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:

  1. Se utiliza una codificación XOR.
  2. La clave que se ha utilizado para codificar los mensajes no se muestra en texto plano.

Posteriormente dieron otra pista más:

  1. 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

Codegate 2011 – Write Up – Network 100

El reto consistía en calcular el MD5 correcto e introducirlo en mayúsculas. Para ello se partía de un fichero llamado

117A1160EC201EB79D2331A3E3C2979D

Analizándolo con el comando file obtenemos que se trata de un fichero PCAP:

sebas@Penetraitor:~/roote/Lab/codegate2011/network/100$ file 117A1160EC201EB79D2331A3E3C2979D
117A1160EC201EB79D2331A3E3C2979D: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 65535)

Jugando un poco con Wireshark vemos que hay bastante tráfico HTTP, y uno de los ficheros que se piden por GET es H1A1.exe (la extensión hace levantar un poco de sospechas).

Una posible solución para recuperar el paquete es reconstruirlo para analizarlo posteriormente con la opción:

File > Export > Object > HTTP

Si comprobamos el MD5 y lo pasamos a mayúsculas obtendremos la solución al reto:

sebas@Penetraitor:~/roote/Lab/codegate2011/network/100$ md5sum H1A1.exe
7a5807a5144369965223903cb643c60e  H1A1.exe
>>> string = "7a5807a5144369965223903cb643c60e"
>>> print string.upper()
7A5807A5144369965223903CB643C60E
>>> string = "7a5807a5144369965223903cb643c60e"
>>> print string.upper()7A5807A5144369965223903CB643C60E