descifrar un mensaje de jabón usando openssl

1

He intentado hacer lo mismo que se encuentra en ¿Cómo descifrar manualmente un mensaje SOAP usando openssl?

Desafortunadamente sin éxito ...  Aquí está mi situación: Intento hacer lo mismo, solo que mis datos son ligeramente diferentes:

 <xenc:EncryptedKey xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" Id="EK-a976c8a8-a6b7-4225-b6fc-e42390c62e5f">    
      <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"/>    
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">    
        <wsse:SecurityTokenReference xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">    
          <wsse:KeyIdentifier EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier">mtqvpfcMviptZakL3P7rflMzR3g=</wsse:KeyIdentifier>    
        </wsse:SecurityTokenReference>    
      </ds:KeyInfo>    
      <xenc:CipherData>    
        <xenc:CipherValue>YUv9YKmNg[...]2kyMZei4oYw=</xenc:CipherValue>    
      </xenc:CipherData>    
    </xenc:EncryptedKey>    
    <xenc:ReferenceList xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">    
      <xenc:DataReference URI="#ED-7d85b663-7237-47f0-9637-0a2496cd8bb6"/>    
    </xenc:ReferenceList>    
    <xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" Id="ED-7d85b663-7237-47f0-9637-0a2496cd8bb6" Type="http://www.w3.org/2001/04/xmlenc#Element">    
      <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>    
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">    
        <wsse:SecurityTokenReference xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsse11="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd" wsse11:TokenType="http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#EncryptedKey">    
          <wsse:Reference URI="#EK-a976c8a8-a6b7-4225-b6fc-e42390c62e5f"/>    
        </wsse:SecurityTokenReference>    
      </ds:KeyInfo>    
      <xenc:CipherData>    
        <xenc:CipherValue>1LzEGX0lc[...]tDFbIa0lXQ==</xenc:CipherValue>    
      </xenc:CipherData>    
    </xenc:EncryptedData>

Esto es parte de un sobre de jabón enviado desde un servicio web de cliente a un servicio de seguridad (SecurityTokenService). Espero que esto contenga un UsernameToken pero me gustaría estar seguro y verificar la estructura de los datos cifrados.

Primero que todo, tenía curiosidad por ver cuál era el valor de "mtqvpfcMviptZakL3P7rflMzR3g=" en EncryptedKey / SecurityTokenReference / KeyIdentifier Así que traté de seguir el mismo procedimiento que @BazzaDP (en la publicación referida):

  1. decodificando la base64 a un archivo

    echo "mtqvpfcMviptZakL3P7rflMzR3g=" | base64 -d -i > subjectKeyIdentifier.decoded

  2. descifre los datos con la clave privada del STS:

    openssl rsautl -decrypt -in subjectKeyIdentifier.decoded -out subjectKeyIdentifier.decrypted  -inkey ../idpsts-pK.pem
    Enter pass phrase for ../idpsts-pK.pem:
    RSA operation error
    140242236282536:error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02:rsa_pk1.c:190:
    140242236282536:error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed:rsa_eay.c:616:
    
  3. considerando el. Intenté agregar el parámetro de relleno -oaep sin éxito

    openssl rsautl -decrypt -in subjectKeyIdentifier.decoded -out subjectKeyIdentifier.decrypted -oaep -inkey ../idpsts-pK.pem
    
    
    Enter pass phrase for ../idpsts-pK.pem:
    
    RSA operation error
    140724669945512:error:0407A079:rsa routines:RSA_padding_check_PKCS1_OAEP:oaep decoding error:rsa_oaep.c:181:
    140724669945512:error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed:rsa_eay.c:616:
    

Renunciar Traté de descifrar al menos el EncryptedData / CipherData / CipherValue usando el mismo procedimiento que @BazzaDP pero tampoco funcionó.

¿Alguien sabe lo que estoy haciendo mal? Gracias

=========== EDIT: Dave Explica que el trabajo superior es inútil: tratar de descifrar un hash =======

Generé algunos intercambios de datos nuevos con algunos certificados falsos para poder intercambiar todo mi contenido con el propósito de eliminar errores.

Ella es lo que hice. En realidad lo mismo que BazzaDP en el otro post. Solo para descifrar SessionKey, agregué el "relleno" -oaep "al comando openssl. Sin embargo no puedo pasar por el proceso ...

  1. Decodificación en base64 de la clave de sesión:
echo "Pfk3yVFoiGnO9DEWQzuDmB32dnZ1xSyVQnl9NK6I/Vfj5zhiEjFA1uHYFKrJr8w+BjLjtUg7q7mUzctycIdXZ/RNtegLa4tyIKouoyWp5zJaZuEbfqwCbjy0QDEjYto8RJmC3rjlhHPjYt1nY6f6OBdkXoa0P1kkAKMrwp2tAHw=" | base64 -i -d > key/key.bin
  1. descifrando la clave de sesión:
openssl rsautl -decrypt -in key/key.bin -out key/key.dec -aoep -inkey idpsts-pK.pem
  1. Decodificación en base64 de los datos:
echo "rnUUUmey/lFhxHHRJhVeJCrS3J3UPz12fZ7+selkTdVwYSjcZK+kIUFhypuWx4W900LBGuwQPVI8g/EwsXcUzb7wfMkYjx6dcQt0wmLJGbFs+wERjCR78qgVF0RB10SKZvmKT1Q5mM+9fJZU+o9tTkwdxvDkjio9I6GnqmoqPy62fl1J7GjqGlRiqSkJx/k+ERlCrJUcMCc0KplBHJXnyhaE90hHDXr1JL4o6+o0klmStW87aurpzuewK9VB6RhWU8grKrNunUvS9H5dxWyGSfHW0/fIth4v/hRwg0vWfFNcGYXBSzYaKd+fNmWfj4/pCDuuVQpn6i9zGe8kcNtNx2AG0MUGPUarn1WabQJyRy0d6/va2aySKjo2l8keluPKf6iS1rzD1s1wVGQi2PrRuA==" | base64 -d -i > data/data.enc
  1. Obtención de la clave de sesión en hexadecimal:
xxd -p key/key.dec 
a8abcd783445c8db00d1ae8332439930ff1875700bec098fa3493439edad114a
  1. Obtención de los datos como hexadecimal para extraer los primeros 16 bits como el IV:
hexdump -C data/data.enc 
00000000  ae 75 14 52 67 b2 fe 51  61 c4 71 d1 26 15 5e 24  |.u.Rg..Qa.q.&.^$|
00000010  2a d2 dc 9d d4 3f 3d 76  7d 9e fe b1 e9 64 4d d5  |*....?=v}....dM.|
00000020  70 61 28 dc 64 af a4 21  41 61 ca 9b 96 c7 85 bd  |pa(.d..!Aa......|
00000030  d3 42 c1 1a ec 10 3d 52  3c 83 f1 30 b1 77 14 cd  |.B....=R|
00000090  11 19 42 ac 95 1c 30 27  34 2a 99 41 1c 95 e7 ca  |..B...0'4*.A....|
000000a0  16 84 f7 48 47 0d 7a f5  24 be 28 eb ea 34 92 59  |...HG.z.$.(..4.Y|
000000b0  92 b5 6f 3b 6a ea e9 ce  e7 b0 2b d5 41 e9 18 56  |..o;j.....+.A..V|
000000c0  53 c8 2b 2a b3 6e 9d 4b  d2 f4 7e 5d c5 6c 86 49  |S.+*.n.K..~].l.I|
000000d0  f1 d6 d3 f7 c8 b6 1e 2f  fe 14 70 83 4b d6 7c 53  |......./..p.K.|S|
000000e0  5c 19 85 c1 4b 36 1a 29  df 9f 36 65 9f 8f 8f e9  |\...K6.)..6e....|
000000f0  08 3b ae 55 0a 67 ea 2f  73 19 ef 24 70 db 4d c7  |.;.U.g./s..$p.M.|
00000100  60 06 d0 c5 06 3d 46 ab  9f 55 9a 6d 02 72 47 2d  |'....=F..U.m.rG-|
00000110  1d eb fb da d9 ac 92 2a  3a 36 97 c9 1e 96 e3 ca  |.......*:6......|
00000120  7f a8 92 d6 bc c3 d6 cd  70 54 64 22 d8 fa d1 b8  |........pTd"....|
00000130
  1. El intento fallido de descifrar los datos:
openssl enc -d -aes-256-cbc -in data/data.enc -K a8abcd783445c8db00d1ae8332439930ff1875700bec098fa3493439edad114a -iv ae75145267b2fe51 -out data/data.dec
bad decrypt
140050628507304:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:546:

La clave privada que usé con la contraseña: "idpsts"

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQI9VWjFBW8ySICAggA
MBQGCCqGSIb3DQMHBAjSv2ZsjvQ8bASCAoBNQwCaZu5/FuwxQlbkR3QGpCuf6orV
FMW6ZIS1l2ubHuHQOiBRFj1t85uUeDPKBIuZBCPg7J0P8RpHwg55VV4lIVHdiCcq
MY0QsOVkqibcnwhRzlNgy6kw0zVrdtXaklD4chmPrTOO7ngWUm1KPqmOafZheBfW
WE9ZlxbHjxszHQZ3ZFO/nuP09MdP0nO8cdzz/NXW8bdfnrfLUCxCbVnTdzbtZoBe
3CyIGPHpp4HsXrEMZikjHRGLjxt576KXUjY6RTkqZI0rn3PQkce1gs3BVWpuUmqe
4zesDl/uYfmfGKcsp7yK93SdRVGHjVDzVi9wk56KCKnVJAl/IZmeS+pF6YQxFhRE
mjUDELxk/YVjIDP6zbp3x9p5qYsei8lhOVJaIxeq6j3tDs9J4LP7yr7zDTjy1+Sq
pFJhPtgyvkBD6wO2Lr6R9L6ts4ALw64a8BzM97l5mb/IRpuo6KM+z3uTkQNOSpgP
4WMIjibJ0amAhDjcWIOT6qBirMFiw5njeg7G0VdpzQovwJJM1MOFrFpJVmGKBnjY
F5nLnH0fLmTFyiL46yjtg7YMnTi0ZBhcxdRa8SUZlSmeTC+KDDzKc0vwK0MUlV9O
gBdUyxC1zY6k33Pqe6pFEYBf5kieZviOZvGgkYtAIBtPEZ2iSS3SSjor9+ey0lox
GS8Oo+QCWreB/D9FcdQsYYB1ZS7PRYjvpsP5kSTXpQcx0ObvijlhzekqzEQHbqDP
z1O9xoKpIxNQOXPQMA15GwsyMENfzi9CL0+jHFkng1MRcFvJvGJpQw+THE8zVg88
LI2vBD6k9BDBPLD913sbkoRWSQsvA+tf3onGC3GPSpepp+dQdD69xT7n
-----END ENCRYPTED PRIVATE KEY-----
    
pregunta Dom 21.12.2014 - 02:30
fuente

1 respuesta

0

Los datos adicionales (y corregidos) en su edición me permitieron obtener el último bit. Sus primeros dos pasos, de-base64 y RSA-OAEP descifran la clave de trabajo, ahora son correctos, excepto que un error tipográfico -aeop debería ser -oaep .

El descifrado de datos no funcionó del todo porque como dice Tom Leek en el elemento vinculado (pero me perdí la primera vez) el cifrado de bloques XMLenc NO utiliza el relleno PKCS7 como lo hace OpenSSL.

Esto hace que tu trabajo sea un poco más difícil. Para su sustituto 5 y 6:

  • descifre los datos ( plus IV y el relleno) como CBC pero con -nopad :
     openssl enc -aes-256-cbc -d -nopad -in data.enc -K (key_hex) -iv (any_hex) -out data.dec
      # since we leave the IV in the ciphertext you don't need to specify it with -iv
      # but you do need some value of the correct length = 16 bytes for AES, I use all 00s
  • extraiga el resultado (data.dec) o mire los bytes con su propio programa o algo así como perl. Omita o descarte los primeros 16 bytes (para AES, 8 para TDES) que son el "descifrado IV" (sin sentido), y los últimos N bytes donde N es el valor del último byte. Para sus datos, esto es: 00000000 9155_38fc eaac_e929 430d_fd96 fe07_46f2 .U8....) C.....F. 00000010 3c77_7373 653a_5573 6572_6e61 6d65_546f <wsse:Us ernameTo 00000020 6b65_6e20 7773_753a 4964_3d22 5573_6572 ken wsu: Id="User 00000030 6e61_6d65 546f_6b65 6e2d_6664 3338_6364 nameToke n-fd38cd 00000040 3964_2d62 3562_342d 3432_3438 2d61_6661 9d-b5b4- 4248-afa 00000050 362d_3338 6233_3664 3137_6132 3661_223e 6-38b36d 17a26a"> 00000060 3c77_7373 653a_5573 6572_6e61 6d65_3e61 <wsse:Us ername>a 00000070 6c69_6365 3c2f_7773 7365_3a55 7365_726e lice</ws se:Usern 00000080 616d_653e 3c77_7373 653a_5061 7373_776f ame><wss e:Passwo 00000090 7264_2054 7970_653d 2268_7474 703a_2f2f rd Type= "http:// 000000a0 646f_6373 2e6f_6173 6973_2d6f 7065_6e2e docs.oas is-open. 000000b0 6f72_672f 7773_732f 3230_3034 2f30_312f org/wss/ 2004/01/ 000000c0 6f61_7369 732d_3230 3034_3031 2d77_7373 oasis-20 0401-wss 000000d0 2d75_7365 726e_616d 652d_746f 6b65_6e2d -usernam e-token- 000000e0 7072_6f66 696c_652d 312e_3023 5061_7373 profile- 1.0#Pass 000000f0 776f_7264 5465_7874 223e_636c 6172_696e wordText ">clarin 00000100 6574_3c2f 7773_7365 3a50_6173 7377_6f72 et</wsse :Passwor 00000110 643e_3c2f 7773_7365 3a55_7365 726e_616d d></wsse :Usernam 00000120 6554_6f6b 656e_3e2c bf85_db5b 201d_bb09 eToken>, ...[ ...

    Omitir bytes 0..F, y también 130- 09 = 127..12F. Eso deja datos que comienzan con <wsse:UsernameToken wsu:Id= y terminan con </wsse:UsernameToken> , que es un XML bien formado con contenido que uno desearía cifrar. ¡Hurra!

Algunos scripts de shell de Unix con dd se pueden usar para extraer los datos buenos, pero de forma insidiosa. Siempre que los datos entren en la memoria perl , puede leer todo el archivo y luego crear una subcadena de la parte buena enlace . Puede haber otras opciones.

    
respondido por el dave_thompson_085 26.12.2014 - 16:39
fuente

Lea otras preguntas en las etiquetas