2018/05/20

Forzando Brutalmente MD5 - parte 1 - cpu


¿Venís de leer la intro? 

En esta parte, vemos como se implementa en C, utilizando 32 bits aunque la arquitectura sea de 64. No tiene nada de especial en sí, es la implementación de la wikipedia adaptada a C.


Optimizaciones en la implementación

 

Detallo algunas optimizaciones realizadas

 

Encadenamiento

Las claves que estamos explorando miden menos de 56 bytes, entonces no hace falta hacer el proceso de encadenamiento, en el cual se va tomando lo hecho previamente y se aplica sobre cada nuevo bloque.

 

Padding

Normalmente, como los mensajes que se están hasheando tienen distintas longitudes y no suelen ser congruentes con la longitud del bloque, al último bloque se le hace un padding, esto es un relleno.

En este caso, todos los mensajes son el último y necesitan el padding por entrar sobradamente en el bloque. Pero las claves miden siempre los mismo, tienen el mismo padding, no hace falta recalcular. En realidad casi que ni hace falta calcular, se puede hardcodear, pero no hace diferencia en la performance.

 

Loop unroll

Un loop unroll consiste en tomar el cuerpo de un for y repetirlo tantas veces como se vaya a ejectuar, ajustando los valores para que el resultado sea el mismo, por ejemplo:


int accum = 0;
for (int i=0; i < 4; ++i) {
   accum += i;
}

Se convierte en

int accum = 0;
accum += 0;
accum += 1;
accum += 2;
accum += 3;


Si tenés una mínima noción de matemáticas me podrías decir que para ese cálculo se puede usar una fórmula de un solo paso, pero estoy haciendo el ejemplo más sencillo posible.

Al eliminar las decisiones, funciona mejor el pipeline de la CPU y mejora la performance, además el cáluco de i se hace en tiempo de pensarlo:



cpucpu unroll
velocidad5.79.6
rendimiento watt0.861.44
rendimiento dolar2.384


Los rendimientos por watt y por dolar son medio medio a ojo, no le prestés mucha antención.

Pero mi objetivo no es la performance en esta etapa, sino apuntar a la implementación final en FPGA donde será implementado así.



Hack rumbo a SIMD


Considerá que MD5 es un algoritmo de 32 bits y la arquitectura predominante en server/desktop/laptop es 64 bits. Esto nos deja en la situación de que se pueden calcular dos hashes simultáneos. Aun que es rehacker el rendimiento no es el esperado asi que no perdamos tiempo con esto.

 

Hack 64 bits
Hack 64 bits


Sin embargo el concepto es importante, pues nos prepara para la siguiente parte, donde tener más bits pasa de ser hack a una feature.

 

Video

  • https://www.youtube.com/channel/UCKsHdgvwvmCNnGD1Az8SSUQ

Código


  • https://github.com/cpantel/Forzando-Brutalmente-MD5/tree/master/v1_cpu
  • https://github.com/cpantel/Forzando-Brutalmente-MD5/tree/master/v1_cpu_unroll
  • https://github.com/cpantel/Forzando-Brutalmente-MD5/tree/master/v2_hack
Seguí con la parte 2

2018/05/13

Forzando Brutalmente MD5 - presentación

Forzando Brutalmente MD5 es un ciclo de charlas, probablemente cinco, en las cuales comparto la experiencia de atacar por fuerza bruta el algoritmo obsoleto de hashing MD5.

Las partes, que no necesariamente corresponden a las charlas son:

Si tiene link ya ha sido presentada públicamente, en negrita significa que ya está hecha, en itálica que la estoy elaborando. Ahora estoy sufriendo en extremo con FPGA, es muy difícil para mi. Bueh, para cualquiera.

A lo largo de las siguiente semanas y meses, iré publicando acá y en github[1] los contenidos. Acá menos técnico, en github el código.

Estos contenidos han sido presentados en vivo en

Primera parte, CPU y hack 64 bits
  • H4CK3D:  partes 1, 2 y una repasada del conjunto [2]
  • Viernes Ñoños en CADIEEL [3]
  • Charlas Ninjas, sin acceso público

Segunda parte, SIMD
  • Viernes Ñoños en CADIEEL
  • Charlas Ninjas, sin acceso público
Tercera parte, threads, forks y GPU

  • Charlas Ninjas
Cuarta parte
  • Charlas Ninjas, sin acceso público, uno de estos días. 
  • OWASP LATAM TOUR 2019[4], todo menos FPGA, vendría a ser "con computadoras"

De qué se trata


De cómo atacar por fuerza bruta un hash para obtener su preimagen utilizando distintos hardware y técnicas de programación.

En construcción desde 2017-12, pensada desde al menos un año antes.

Excusa para aprender y practicar los temas que me interesan.

Mis recursos


Libros

  • Programming with POSIX Threads – David R. Butenhof – 2009
  • Pthreads Programming – Bradford Nichols, Dick Buttlar & Jacqueline Proulx Farrell – 2009
  • Structured Computer Organization - Andrew S. Tanenbaum – ~2010
  • Distributed Systems – Andrew S. Tanenbaum – ~2010
  • Computer Architecture: A Quantitative Approach – Hennessy/Patterson – 2017
  • Computer Organization and Design: The Hardware/Software Interface ARM Edition – Patterson/Hennessy – 2017

Cursos

  • Organización del computador –  Saubidet – FIUBA 2007
  • Taller de Programación I – Veiga – FIUBA 2009
  • Programación distribuida y paralela usando MPI – Arzhan Kinzhalin – ECI 2011
  • Software Performance: Methodology and Techniques – Arzhan Kinzhalin – ECI 2007
  • Circuitos Lógicos Programables – Nicolás Álvarez – CESE 2017

Aplicabilidad


Si siguieras un camino como este estarías en mejor estado para hacer:

  • Ataques de fuerza bruta
  • Defensa ante ataques de fuerza bruta
  • Decisiones de arquitectura
  • Optimizaciones generales
  • Blockchain

Por qué MD5


  • Por que es fácil.
  • Para separar la enseñanza de la “producción”, evitando el enviciamiento que su unión produce.
  • Es obsoleto, no hay presión.
  • Es de 32 bits y me habilita el ejemplo de “hacking”

Descripción MD5


Ver wikipedia y quedarse con esto:
  • Son 64 rondas en grupos de 16 aplicadas repetidamente a buffers de 512 bits (64 bytes), aplicando un pad para completar.
  • Se aplica un valor que se calcula con una función que se puede precalcular.



[1] Github
  • https://github.com/cpantel/Forzando-Brutalmente-MD5
[2] H4CK3D
  • Sitio: https://h4ck3d.org/
[3] Viernes Ñoños en CADIEEL
  • Buscar los mensajes con el asunto [Viernes Ñoños en CADIEEL] en https://groups.google.com/forum/?hl=en#!forum/embebidos32
  • Canal en youtube: https://www.youtube.com/channel/UCKsHdgvwvmCNnGD1Az8SSUQ
  •  
[4] OWASP LATAM TOUR 2019 BsAs
  • https://www.owasp.org/index.php/LatamTour2019#tab=ARGENTINA_-_Buenos_Aires