(Des)Implementacion AES GCM + RSA OAEP - Hybrid Encryption - Python

(0 comments)

Caso:
me encontre con la siguiente implementacion en un sitio web Cifrado carga útil AES-GCM - NodeJs  

Las preguntas fueron:

  • Que es esto? (entendiendo que a ese link de node llegue cuando ya estaba programado el script python)
  • Como audito correctamente este sitio?
  • Donde mas he visto esto?
  • Que hago para trabajar comodo sobre el objetivo?

Cifrados hibridos?

Cada vez mas comunes para comunicaciones web y mobile, utilizando RSA+AES y asi agregar una capa de seguridad para la privacidad de datos (e.e)

Comunicacion cifrada sobre el cliente?

siempre mantengamos la premisa que todo lo que esta del lado del cliente es manipulable y este tambien es el caso.

El cifrado se produce en mayor parte desde el lado del cliente (eyy por que debo llevarme la carga del CPU?), se obtiene una llave precompartida (Public RSA), posteriormente el cliente genera una llave aleatoria de X bytes (investiguen su caso) y aqui viene lo hibrido... esta llave se utiliza para cifrar con AES-XXX (cbc, gcm, loquesea) el contenido que se enviara al servidor.
Y como lo interpreta el servidor si no tiene la llave?!
Para que el servidor pueda descifrar el contenido, el cliente envia por medio de una cabecera u otro parametro POST, la llave de descifrado (genius!), pero esta llave que es la que se genero aleatoriamente, va cifrada... :O con que?- con la llave Public RSA, de esta manera solo el servidor puede descifrar el contenido utilizando su llave privada y de esta forma obtener la llave para descifrar el contenido AES.

Como auditar?

  • Apoyarse en el depurador del cliente web
  • Obtener los payloads originales antes del cifrado
  • Utilizar un proxy para enviar la nueva informacion, usando tu implementacion para realizar modificaciones (cifrar/descifrar)

(Des)implementacion en Python

referencias:
https://gist.github.com/rjz/15baffeab434b8125ca4d783f4116d81
https://pycryptodome.readthedocs.io/en/latest/src/cipher/aes.html
https://www.sohamkamani.com/nodejs/rsa-encryption/

ofrezco algunos comentarios en el codigo para fijarse en que cambiar dependiendo de los escenarios, psss, cada developer le pondra distintos parametros al cifrado

cipher

  • utilizamos una random key de 16 bytes
  • nonce a veces descrito como IV de 12 bytes, de valor estatico (zeros)
  • hash de cifrado de 256 (SHA256)
  • observar en el resultado devuelto (return), quizas el orden de los valores concatenados en su logica es distinto

  • re check de los 12 bytes estaticos
  • el tag son los ultimos 16 bytes como el resultado devuelto
  • el mensaje es todo menos los ultimos 16 bytes, pss tambien existen casos de mensajes vacios, un mensaje vacio en este caso seria de 16 bytes, entonces solo estaria presente el tag

y por ultimo una pequena implementacion para usar en su proxy (burp, mitm, zap?)

Codigo: https://gitlab.com/gvillegas/python-aes-gcm

Currently unrated

Comments

There are currently no comments

New Comment

required

required (not published)

optional

required

captcha

required