Informe técnico
Procedimiento de encriptación con AES y testeo de software con Fuzzer
para identificar vulnerabilidades en su código de programación
Integrantes
Guerra Guerra, José
León Panti, Gerardo Bruno
2
Índice
I.Objetivos………………………………………………......................................................... 2
1.1. Objetivos Generales……………………………………………………………. 2
II. Marco teórico (Procedimiento de encriptación con AES y testeo de software con Fuzzer
para identificar vulnerabilidades en su código de programación)…….............................. 6
2.1. Información……………………………………………………………………………........ 6
3
2.5.1.1. Función Rotword………………………………………………..……………… 12
2.5.1.2. Función ShiftRow……………………………………………….……………… 12
2.5.1.3. Función Inverse ShiftRow……………..……………………………………… 13
2.5.1.4. Función SubByte y tablas S-Box……………………………….…………….. 13
2.5.1.4.1. Función InverseSubBytes y tabla Inverse S-Box……………….………..……. 14
2.5.1.5. Función XOR………...…………………………………………………………. 15
2.5.1.6. Función MixColumn……………………………………………………………. 16
2.5.1.6.1. Inverse MixColumn ………..…………………………………………..…… 16
2.5.1.6.2. Operador multiplicación [⨂] en 𝐺𝐹(28 ) ………….….………………….……….. 16
2.5.1.7. Función AddRoundKey………….…………………………………………….. 17
2.5.1.8. Tabla RCON…………….……………………………………………………… 17
2.5.2. Llaves y sub llaves………...…………………………………………………………… 18
2.5.3. Proceso de cifrado…………….……………………………………………………….. 20
2.5.4. Proceso de descifrado. ………………………..………………………………………. 21
2.6. Proceso de testeo con fuzzer para identificar vulnerabilidades en el software...... 21
2.6.1. Obtención de datos…………………………………………………….………………. 21
2.6.2. Proceso de datos…………………………………..…………………………………… 21
2.6.3. Obtención y análisis de resultados…………………………………………………… 21
2.7. Importancia del AES en la Informática……………..……..…………………………. 22
2.8. Importancia del Fuzzer en la informática………………...……….………………….. 22
2.9. Seguridad informática en la actualidad con AES y Fuzzer…………………………. 22
2.9.1. Supremacía del fuzzer mutativo sobre el generativo…………………………….… 22
2.9.2. Usos del AES en la Internet y en contexto de la vida real…………………………. 23
V. Resultados y Análisis……………………………………………………………………..…. 35
VI. Observaciones………………………………………………………………………………. 37
VIII. Conclusiones…………………………………………………………………….…………. 39
Bibliografía……………………………………………………………………………………..… 40
Anexos……………………………………………………………………………………………. 41
4
Introducción
Los métodos de cifrado, como el AES, han existido desde los albores de la
civilización; mientras que los testeos, o comprobaciones, de rigurosidad de un
medio de comunicación, como los actuales fuzzing, siempre han sido una
constante en la seguridad y confidencialidad. Con la evolución de las
computadoras y el inmenso flujo de contenido que, en otras palabras, es
información, lograr proteger la información se ha convertido en una prioridad no
solo para un gobierno, sino también para todas las personas. Decía ya un militar
nazi: “La información es el arma más poderosa que existe”, y no era para menos
ya que los ataques de su escuadra eran impredecibles y sus mensajes para sus
tropas, indescifrables; hasta que el famosísimo Alex Turing, padre de la criptografía
moderna, logró, para el bando de los Aliados, descifrar el mecanismo de la
máquina Enigma, el dispositivo alemán que transmitía mensajes encriptados. Es
así como se aprecia la magnitud de importancia de la seguridad de la información,
en un contexto actual, donde la mayor parte, sino toda, de la información se registra
en computadores, pasando a ser seguridad informática. Citando otro
acontecimiento más cercano a nuestros días, el viernes 21 de octubre del presente
año se perpetuó un ataque masivo a escala mundial a los grandes servidores
proveedores de los recursos informáticos más usados por la generación actual.
Debido a este ataque DDoS (Denegación de servicio en castellano), servicios
como Twitter, Spotify, Netflix y otros no pudieron ser utilizados ya que un grupo de
computadoras saturó el sistema hasta el punto de hacerlo colapsar. Dicho todo lo
anterior, se da paso describir el parámetro de cifrado global actual, AES, y un
método muy popular de testeo de software, los fuzzers, con el propósito de conocer
los procesos de encriptación AES y los procedimientos con los cuales se prueba
la rigurosidad del diseño de un software como comunicador de mensajes.
5
II. Marco teórico (Procedimiento de encriptación con AES; testeo de software con
Fuzzer para determinar vulnerabilidades en su código de programación )
2.1. Información
Los protocolos de seguridad son un conjunto de reglas que gobiernan dentro de la transmisión
de datos entre dispositivos para ejercer una confidencialidad, integridad, autenticación y la
aceptación de la información. Están compuestas por
Es la ciencia que estudia los métodos, técnicas y procesos con el fin de almacenar, procesar
y transmitir información por medios digitales.
2.2. Criptografía
Del griego criptos y grafe que juntos significan literalmente <escritura oculta>. Se define como
la ciencia que estudia las técnicas cifradas o codificadas para la alteración de
representaciones lingüísticas de los mensajes, con el fin de hacerlos imposibles de leer para
los receptores no autorizados. Como lo señala:
6
2.2.1. La criptografía en la informática
2.2.2. AES
2.2.2.1. Definición
2.2.2.2. Antecedentes
En 1997, el NIST llama a un concurso a nivel mundial para establecer el nuevo estándar de
cifrado AES, el cual permitiera proteger los datos confidenciales del gobierno de EEUU, así
como la información de los ciudadanos.
Ese mismo año se presentaron los criterios de evaluación y requisitos mínimos que todos los
algoritmos debían cumplir para ganar el concurso:
7
Debía ser ejecutable tanto en software como en hardware.
Seguridad
Eficiencia computacional
Requisitos de memoria
Implementación en HW y SW
Simplificación de diseño
Flexibilidad
El 2 de octubre del 2000, el NIST anuncio el algoritmo ganador de entre todos los finalistas.
Las votaciones del concurso se establecieron en el siguiente ranking:
RIJNDAEL 86 votos
SERPENT 59 votos
TWOFISH 31 votos
RC6 23 votos
MARS 13 votos
El algoritmo Rijndael ganó el concurso por tener la mejor combinación de seguridad, velocidad
de procesamiento, eficiencia, sencillez y flexibilidad, destacando, sobre todo, su sencillez.
Por tanto en octubre del 2000, quedó establecido que el AES (algoritmo Rijndael) sería el
estándar de cifrado de las comunicaciones de EEUU y, por consiguiente, de todo el mundo.
En su última sesión, la organización solicito (sic) una valoración de los candidatos a través
de un cuestionario. El cifrado preferido de los asistentes resulto (sic) Rijndael, el
criptosistema de los investigadores belgas. El mismo que el NIST eligió como vencedor
del concurso, cuyo anuncio oficial tuvo lugar el 2 de octubre de 2000 (Ortega, López, &
García del castillo, 2005, pág. 222).
8
2.2.4. Especificación del algoritmo
La estructura del AES está conformada por un conjunto de “rondas”, estas son reiteraciones
de 4 funciones o procesos diferentes e invertibles. Esto define el proceso como la aplicación
de un número de rondas a una información determinada para producir una información cifrada.
Se llama “estado” a una matriz rectangular de bytes, conformado por 4 filas y N (b) columnas,
siendo estas igual a:
En este caso, se trabaja en una matriz de 4x4, ya que es la estructura estándar de cifrado del
AES.
La clave del sistema se representa de manera similar a la del “estado”, es decir, en una matriz
de 4 por N (k), donde:
N (k)=tamaño de la clave/32
Los autores definieron que, para tamaños de bloques y claves entre 128 y 256 bits, el número
de vueltas Nr es determinado por la siguiente expresión.
El alfabeto hexadecimal es un sistema de numeración posicional que tiene base 16; este fue
introducido en el ámbito computacional por primera vez por IBM en 1963, dando la siguiente
asignación.
S={0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}
Esta es la representación básica, la completa consta de 255 valores asignados a cada símbolo
conocido del teclado estándar de una computadora.
9
2.3. Software
El código fuente de un software es un conjunto de líneas de texto con los pasos que debe
seguir la computadora para ejecutar dicho programa.
Un error de software, también llamado bug (que en castellano significa pulgas o garrapatas),
es un error o fallo de programa de computador o sistema de software que desencadena un
resultado inesperado.
2.4. Fuzzer
El fuzzer es un programa que lleva a cabo el proceso de fuzzing, el cual tiene como objetivo
poner a prueba el buen diseño de la estructura de un programa a través del tráfico abusivo de
datos de ingreso. De la misma manera en que lo confirma la siguiente cita: “Fuzzing is well
established as an excellent technique for locating vulnerabilities in software” (Knudsen &
Varpiola, 2015); el fuzzing es una herramienta efectiva para encontrar errores en el programa.
2.4.1. Historia
10
entonces. Este objetivo se cumpliría con la inserción de datos aleatorios, masivos e
inesperados en el sistema, lo cual hacían que se comportaran de manera inesperada.
2.4.2. Tipos
A pesar de que hoy en día, el fuzzing es posible de realizar por medio de una desconocida
cantidad de fuzzers, esto debido a que todo conocedor de programación puede crear su propio
fuzzer, se puede clasificarlos en dos tipos. Aunque todos los fuzzer cumplen con las
características definidas por la siguiente cita: “[…] las herramientas semiautomáticas que
utilizan estas técnicas se llaman fuzzers. Son semiautomáticas porque pese a ser un proceso
automatizado de envío de datos, se necesita de una persona que analice los resultados y
verifique las posibles vulnerabilidades encontradas.” (Esparza, 2007):
El fuzzer mutativo toma los datos de una biblioteca, los inserta como datos de entrada en el
programa puesto a prueba y luego arroja resultados de la respuesta del programa. A este tipo
de ataques se los conocen como ataques de fuerza bruta. Un ejemplo de este tipo de fuzzer
sería el protocolo GET, en el cual se añadirá elementos de manera aleatoria y descontrolada.
Ejemplo:
Antes de emplear un fuzzer generativo, es necesario comprender bien el diseño del programa
que se pondrá a prueba: saber el tipo de archivos que recibe, por ejemplo. Una vez que se
conozca esto, el fuzzer generativo se encargará de extraer la gramática de los archivos válidos
del programa. Luego, comenzará a generar otros archivos que cumplan con tal gramática,
pero con elementos anormales, en grandes cantidades, que, de haber algún bug en el código
del programa, harán que colapse el sistema o responda de manera inesperada.
11
2.4.2.3. Procesos
b) Repetición: Se conoce primero el tipo de dato (String, int, char, long, etc.) que procesa
el programa y se repite un carácter de este tipo para generar algún buffer overflow.
El proceso de cifrado se hará con un texto de 128 bits y una clave de igual longitud.
Sea 𝐶𝑖 , donde 𝑖 ∈ [1, 𝑛] la columna enésima de una matriz ∈ Κ 𝑚×𝑛 , donde los elementos
son valores del alfabeto hexadecimal. La función Rotword toma el primer byte de la columna
y la posiciona en último lugar, desplazando los demás bytes una posición hacia arriba.
09 𝐶𝐹
𝐶𝐹 ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗ 4𝐹
𝐶𝑛 = [4𝐹 ] 𝑅𝑜𝑡𝑤𝑜𝑟𝑑 [3𝐶 ]
3𝐶 09
Sea 𝑓𝑖 , donde 𝑖 ∈ [2, 𝑛] es la fila i-ésima de una matriz ∈ Κ 𝑛×𝑚 , donde los elementos son
valores del alfabeto hexadecimal. La función ShiftRow no modifica la primera fila, pero si las
demás 𝑓𝑖 , reubicando los primeros 𝑖 − 1 bytes en la posición final de la misma, desplazando
a las demás 𝑖 − 1 posiciones a la izquierda.
12
𝑓2 = [09 𝐶𝐹 4𝐹 3𝐶 ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
𝑆ℎ𝑖𝑓𝑡𝑅𝑜𝑤 [𝐶𝐹 4𝐹 3𝐶 09]
𝑓4 = [09 𝐶𝐹 4𝐹 3𝐶 ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
𝑆ℎ𝑖𝑓𝑡𝑅𝑜𝑤 [3𝐶 09 𝐶𝐹 4𝐹 ]
Sea 𝑓𝑖 , donde 𝑖 ∈ [2, 𝑛] es la fila i-ésima de una matriz ∈ Κ 𝑛×𝑚 , donde Los elementos son
valores del alfabeto hexadecimal. La función ShiftRow no modifica la primera fila, pero si las
demás 𝑓𝑖 , reubicando los últimos 𝑖 − 1 bytes en la posición inicial de la misma, desplazando
a las demás 𝑖 − 1 posiciones a la derecha.
𝑓2 = [09 𝐶𝐹 4𝐹 3𝐶 ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
𝐼𝑛𝑣𝑒𝑟𝑠𝑒 𝑆ℎ𝑖𝑓𝑡𝑅𝑜𝑤 [3𝐶 09 𝐶𝐹 4𝐹 ]
𝑓3 = [09 𝐶𝐹 4𝐹 3𝐶 ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
𝐼𝑛𝑣𝑒𝑟𝑠𝑒 𝑆ℎ𝑖𝑓𝑡𝑅𝑜𝑤 [4𝐹 3𝐶 09 𝐶𝐹 ]
𝑓4 = [09 𝐶𝐹 4𝐹 3𝐶 ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
𝐼𝑛𝑣𝑒𝑟𝑠𝑒 𝑆ℎ𝑖𝑓𝑡𝑅𝑜𝑤 [𝐶𝐹 4𝐹 3𝐶 09]
Sea 𝑀𝑚𝑥𝑛 un matriz ∈ Κ 𝑚×𝑛 , donde los elementos son símbolos del alfabeto hexadecimal. La
función SubBytes consiste en sustituir cada byte de la matriz por los valores de la tabla S-Box.
Esta tabla, lógicamente, es invertible.
2𝐵 28 𝐴𝐵 09 𝐹1 34 62 01
𝑀4𝑥4 = [7𝐵 𝐴𝐸 𝑆𝑢𝑏𝐵𝑦𝑡𝑒𝑠 [21 𝐸4
𝐹7 𝐶𝐹 ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗ 68 8𝐴 ]
15 𝐷2 15 4𝐹 59 𝐵5 59 84
16 𝐴6 88 3𝐶 47 24 𝐶4 𝐸𝐵
13
La función SubBytes transforma el Byte 2B o también 20 + B asignando el valor de la tabla S-
box correspondiente a la columna 20 y la fila B.
Sea 𝑀𝑚𝑥𝑛 un matriz ∈ Κ 𝑚×𝑛 , donde los elementos son símbolos del alfabeto hexadecimal. La
función SubBytes consiste en sustituir cada byte de la matriz por los valores de la tabla Inverse
S-Box.
2𝐵 28 𝐴𝐵 09 𝐹1 34 62 01
𝑀4𝑥4 = [7𝐵 𝐴𝐸 𝐼𝑛𝑣𝑒𝑟𝑠𝑒𝑆𝑢𝑏𝐵𝑦𝑡𝑒𝑠 [21 𝐸4
𝐹7 𝐶𝐹 ] ⃖⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗ 68 8𝐴 ]
15 𝐷2 15 4𝐹 59 𝐵5 59 84
16 𝐴6 88 3𝐶 47 24 𝐶4 𝐸𝐵
14
Tabla 2 Suma Inverse XOR
Nos muestra la suma de los valores hexadecimales con la función Inverse XOR
2𝐵 8𝐴
7𝐸
𝐶𝑖 = [ ] 𝑦 𝐶𝑗 = [ 84 ]
15 𝐸𝐵
16 01
2𝐵 8𝐴 𝐴1
7𝐸 84 𝐹𝐴
𝐶𝑖 ⨁𝐶𝑗 = [ ] ⨁ [ ] = [ ]
15 𝐸𝐵 𝐹𝐸
16 01 17
Otra forma de expresar esta función es trabajando la suma de bytes como suma de bits, donde
la función XOR operaría ceros y unos.
𝐴 𝐵 𝑋𝑂𝑅
0 0 0
0 1 || 1
1 0 1
1 1 0
Ejemplo:
15
2.5.1.6. Función MixColumn
Sea 𝑀4𝑥4 un matriz ∈ Κ 4𝑥4 y Sea 𝐶𝑖 y 𝐹𝑖 donde 𝑖 ∈ [1,4], columna y fila, respectivamente, de
la i-ésima posición de una matriz ∈ Κ 4𝑥4, donde los elementos pertenecen al alfabeto
hexadecimal. La función MixColumn modifica cada columna de la matriz multiplicándola, por
la izquierda, con una matriz 𝑁4𝑥4 constante predeterminada invertible, este proceso será
dentro del Cuerpo de Galois 𝐺𝐹(28 ):
𝐷4 𝐸0 𝐵8 1𝐸
𝐵𝐹 𝐵4 41 27 ]
𝑀4𝑥4 =[
5𝐷 52 11 98
30 𝐴𝐸 𝐹1 𝐸5
02 03 01 01
𝑁 = [01 02 03 01]
01 01 02 03
01 01 01 02
Entonces
𝐷4 02 03 01 01 𝐷4 02 ⋅ 𝐷4 ⨁ 03 ⋅ 𝐵𝐹 ⨁ 01 ⋅ 5𝐷 ⨁ 01 ⋅ 30
𝐵𝐹 𝑀𝑖𝑥𝐶𝑜𝑙𝑢𝑚𝑛 [01
[ ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
02 03 01] ⨂ [𝐵𝐹 ] = [01 ⋅ 𝐷4 ⨁ 02 ⋅ 𝐵𝐹 ⨁ 03 ⋅ 5𝐷 ⨁ 01 ⋅ 30]
5𝐷 01 01 02 03 5𝐷 01 ⋅ 𝐷4 ⨁ 01 ⋅ 𝐵𝐹 ⨁ 02 ⋅ 5𝐷 ⨁ 03 ⋅ 30
30 01 01 01 02 30 01 ⋅ 𝐷4 ⨁ 01 ⋅ 𝐵𝐹 ⨁ 01 ⋅ 5𝐷 ⨁ 02 ⋅ 30
Tiene el mismo proceso que el de MixColumn, solo que la matriz 𝐶 es reemplaza por 𝐶𝑖𝑚𝑣𝑒𝑟𝑠𝑒 :
14 11 13 09
𝐶𝑖𝑛𝑣𝑒𝑟𝑠𝑒 = [09 14 11 13]
13 09 14 11
11 13 09 14
Multiplicar bytes en el cuerpo de Galois significa representar cada byte como un polinomio de
grado 7, donde cada coeficiente está representado por los bytes respectivos del mismo; y
luego de multiplicar algebraicamente mod (2) determinar el resto de dividir por el polinomio
primo 𝑚(𝑥) = 𝑥 4 + 1:
𝐷2 ≃ 11010010 ≃ 𝑥 7 + 𝑥 6 + 𝑥 4 + 𝑥 2
16
02 ≃ 00000010 ≃ 𝑥
Entonces:
10111000 ≃ 𝐵8
Por lo tanto
02 ⋅ 𝐷4 = 𝐵8
Sea 𝑀4𝑥4 y 𝑵4𝑥4 matrices ∈ Κ 4𝑥4, donde sus elementos pertenecen al alfabeto hexadecimal.
La función AddRoundKey se define como XOR la suma de matrices, en este caso 2, byte a
byte.
𝐷4 𝐸0 𝐵8 1𝐸 𝐹1 34 62 01
𝐵𝐹 𝐵4 41 27 ] ⋀ 𝑵 21 𝐸4 68 8𝐴 ]
𝑀4𝑥4 =[ 4𝑥4 = [
5𝐷 52 11 98 59 𝐵5 59 84
30 𝐴𝐸 𝐹1 𝐸5 47 24 𝐶4 𝐸𝐵
Entonces
Donde
𝐷4⨁𝐹 = 11010100⨁11110001 = 25
25 𝐷4 𝐷𝐴 1𝐹
𝑀⨁𝑁 = [ 9𝐸 50 29 𝐴3 ]
04 𝐸7 48 1𝐶
77 8𝐴 35 0𝐸
La tabla RCON es una matriz 𝑀9𝑥10 ∈ Κ 𝑚×𝑛 , donde los elementos son símbolos del alfabeto
hexadecimal, definido especialmente para este sistema de cifrado:
01 02 04 08 10 20 40 80 1𝐵 36
00 00 00 00 00 00 00 00 00 00 ]
[
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
17
Donde 𝐶1 se le asigna la columna 1, así sucesivamente para los 𝐶𝑖 siguientes.
Un requerimiento para el proceso de cifrado es el de generar 10 sub llaves con la llave inicial
de 128 bits. Para esto se sigue el siguiente proceso:
Sea la clave de 128 bits, se ordena en una matriz cuadrada de 4x4 teniendo como elementos
bytes en cada bloque de arriba hacia abajo. Esto se puede comparar a cifrar 16 caracteres
entre letras y símbolos, siempre y en cuando estas tengan una representación en el alfabeto
hexadecimal, incluyendo el carácter de espacio.
Llave inicial:
𝑒 𝑒 𝑛 𝑎
𝑥 𝑠 𝑙
𝐾 = [𝑝 𝑖 𝑜 ]
𝑟 𝑜 𝑟
Para hallar la sub llave 𝐾1 se trabajara con la llave inicial 𝐾 como sigue:
[ ] [ ] [ ] [ ]
[ ] [ ] [ ] [ ]
𝐾1 =
[ ] [ ] [ ] [ ]
[[ ] [ ] [ ] [ ]]
61 6𝐶
6𝐶 𝑅𝑜𝑡𝑤𝑜𝑟𝑑 [ 20 ]
𝐶4 = [ ] ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
20 20
20 61
18
6𝐶 50
20
[ ]→ 𝐵7
[ ]
20 𝑆𝑢𝑏𝐵𝑦𝑡𝑒𝑠 𝐵7
61 𝐸𝐹
c) Aplicar función XOR a este nuevo resultado con la primera columna de la llave inicial;
y a este resultado XOR con la columna 1 de la tabla RCOM
50 65 01 34
[𝐵7 ] ⨁ [78] ⨁ [00] = [𝐶𝐹 ] = 𝑃1
𝐵7 70 00 𝐶7
𝐸𝐹 72 00 9𝐷
Donde:
Entonces:
65 34 51
73 𝐶𝐹 𝐵𝐹
𝐶2 (𝑙𝑙𝑎𝑣𝑒) = [ ] 𝑋𝑂𝑅 [ ] = [ ] = 𝐶2 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)
69 𝐶7 𝐴𝐸
6𝐹 9𝐷 𝐹2
65 6𝐸 0𝐵
𝐶3 (𝑙𝑙𝑎𝑣𝑒) = [ 73 ] 𝑋𝑂𝑅 [ ] = [ 53 ] = 𝐶3 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)
20
69 6𝐹 06
6𝐹 72 𝐹2
65 61 04
𝐶4 (𝑙𝑙𝑎𝑣𝑒) = [ 73 ] 𝑋𝑂𝑅 [6𝐶 ] = [1𝐹 ] = 𝐶4 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)
69 20 49
6𝐹 20 4𝐹
Quedándonos finalmente:
19
34 51 0𝐵 04
𝐾1 = [ 𝐶𝐹 𝐵𝐹 53 1𝐹 ]
𝐶7 𝐴𝐸 06 49
9𝐷 𝐹2 𝐹2 4𝐹
f) El proceso se repite para las demás sub claves usando la matriz obtenida anterior,
para la 𝐾2 se calcula con la 𝐾1.
Quedando así, la llave 𝐾 con las 10 sub llaves restantes 𝐾1. , 𝐾2 , 𝐾3 , 𝐾4 , 𝐾5 , 𝐾6 , 𝐾7 , 𝐾8 , 𝐾9 𝑦 𝐾10,
necesarias para el cifrado del mensaje.
1. Ronda inicial
I. El texto a cifrar de 128 bits (16 caracteres) será expresado en el alfabeto hexadecimal.
𝑀𝑒𝑛𝑠𝑎𝑗𝑒 𝑎 𝑐𝑖𝑓𝑟𝑎𝑟 = 𝑚𝑎𝑡ℎ 𝑖𝑠 𝑡ℎ𝑒 𝑏𝑒𝑠𝑡
II. Asignar estos valores en una matriz de 4x4= 𝑀 .
𝑚 𝑡 𝑏 6𝐷 20 74 62
𝑎 𝑖 ℎ 𝑒 61 69 68 65
𝑀 = [𝑡 𝑠 𝑒 𝑠] = [ ]
74 73 65 73
ℎ 𝑡 68 20 20 74
III. Aplicar AddRoundKey a esta matriz 𝑀 con la llave inicial 𝐾 , para así obtener la matriz
de la ronda estándar, a esta se le llamara 𝑬𝟏 .
𝑀 ⨁ 𝐾 = 𝐸1
2. Ronda estándar
Ronda intermedia del proceso consiste en operar 𝐸𝑖 con tres funciones y una AddRoundkey
con la llave 𝐾𝑖 correspondiente, 9 rondas en total:
20
Para la última ronda solo se aplicaran 2 funciones a 𝐸10 ,y al resultado un AddRoundKey con
𝐾10 , obteniéndose al final el mensaje cifrado:
Para descifrar el mensaje se tiene que hacer el proceso inverso, seguir el camino hacia atrás,
usando AddRoundKey, InverseAddRoundKey, InverseShiftRow e InverseSubByte.
Antes de empezar un fuzzer, se debe conocer qué tipo de fuzzing se desea realizar: si uno
bruto, para lo cual serviría un fuzzer mutativo; o si uno inteligente, para lo cual se recomienda
un fuzzer generativo. Además, es necesario también conocer algo del software a testear. Uno
de los conocimientos básicos que se debe tener del software a prueba antes de iniciar un
fuzzing es saber qué tipo de datos acepta como entrada. A continuación, se detalla más a
profundidad sobre cada uno de los tres pasos que toma ejecutar un fuzzer:
Una vez listo el fuzzer con la biblioteca seleccionada para el fuzzing, se procede al envío de
datos. Para ello, será necesario elegir una aplicación como objetivo del testeo: o bien todo el
programa o solo una función de esta. Con el objetivo claro, se inicia el fuzzing.
Como ya se tendrá estudiado el software objetivo, se conoce que debe reaccionar de una
manera ya predeterminada. Sin embargo, la misión del fuzzer es contradecir este
comportamiento normal y estable del programa. En este paso del fuzzing se analiza los
21
resultados obtenidos del testeo realizado, en busca de algún comportamiento extraño e
inestable del sistema.
El estándar de cifrado AES, es uno de los algoritmos más seguros y más utilizados en la
actualidad, disponible para uso público. Esto está avalado por la Agencia de Seguridad
Nacional (NSA), de los Estados Unidos para la seguridad de información secreta “Top Secret”.
Muchos describen el fuzzer como una herramienta básica, pero, a la vez, innegablemente de
mucha utilidad cuando se trata de iniciar un testeo de software. Realizar un fuzzing a un
programa ayuda a identificar errores que saltarían a la vista si uno se dedicase a revisar el
código fuente línea tras línea, lo cual tomaría demasiado tiempo. Para ello, el fuzzing destaca
como proceso de detección de bugs rápido y efectivo.
El fuzzer mutativo, en comparación al generativo, carece de una comprensión del tipo de datos
de entrada que recibe y procesa, esta última acción muy importante, el programa a ser
testeado ya que si el programa recibe un dato que no puede procesar, el fuzzing bruto no
generará nunca ningún problema, ergo tal esfuerzo será en vano. Por otra parte, el fuzzer
generativo, o también fuzzer inteligente, comprende la gramática que compone los datos de
entrada válidos para el sistema; con este conocimiento, genera datos pseudoválidos, los
cuales generarán estrés en el sistema, haciéndolo comportarse de una manera inesperada.
Es tanto así el desarrollo del fuzzer inteligente que, hoy en día, se utiliza ampliamente el fuzzer
de algoritmo genético, el cual aplica los mismos conceptos de la biología con respecto a la
selección natural, para poder generar sus datos pseudoválidos y poner en una situación
extrema al sistema en caso de que este tenga vulnerabilidades. El portal de matemática,
MathWorks, explica el algoritmo genético: “The algorithm then creates a sequence of new
populations. At each step, the algorithm uses the individuals in the current generation to create
the next population” (Mathworks, 2016). Con esto, nos dice que este algoritmo es capaz de
crear sus propios datos y luego ir evolucionándolos a través de ensayo, error y mutación.
22
2.9.2. Usos del AES en la Informática y el contexto de la vida real
Seguridad de redes Inalámbricas
Por ser el cifrado por excelencia, este se puede usar para cifras mensajes por vía tradicional
como los de mensajería.
En la internet
En la programación
23
III. Herramientas – Materiales – Equipo
MATERIALES DEFINICION
HERRAMIENTAS DEFINICION
Disponible en:
http://www.computerhope.com/jargon/r/rijndael-encryption.htm
24
Imagen 4 wfuzz fuzzer Wfuzz fuzzer: programa
que realiza fuzzing, de
Extraído de:
libre circulación y
http://www.edge-security.com/img/logo-wfuzz.jpeg gratuito.
Librerías: conjunto de
datos aleatorios,
Imagen 5 Librería de datos necesarios para el fuzzer
Extraído de: fuente personal
EQUIPOS DEFINICION
Extraído de:
http://www.notebookcheck.org/uploads/tx_nbc2/asusG550JK_4.png
25
IV. Procedimiento Experimental
Fuzzer Software(Pagina
web) Cifrado AES
Medio de
comunicacion
inseguro,
mensaje
protegio
Para llevar a cabo estos dos procesos se debe tener definidos tanto el mensaje como la llave;
donde la llave irá al proceso obtención de sub llaves y el mensaje al proceso de cifrado
Rijndael. Se hará uso del lápiz y papel; se hará uso del software “Rijndaelinspector” solo
para mostrar de forma didáctica los resultados de cada proceso del algoritmo, pero no para el
encriptado en sí, ya que todo software compromete seriamente la seguridad del algoritmo
AES.
26
Tanto la llave como el mensaje a cifrar deben constar de 16 caracteres, 128 bits, cada uno (el
espacio se cuenta como tal)
𝑒 𝑒 𝑛 𝑎
𝑥 𝑠 𝑙
𝐾 = [𝑝 𝑖 𝑜 ]
𝑟 𝑜 𝑟
𝑒 𝑒 𝑛 𝑎 65 65 6𝐸 61
𝑥 𝑠 𝑙 = 78 73 20 6𝐶 ]
𝐾 = [𝑝 𝑖 𝑜 ] [
70 69 6𝐹 20
𝑟 𝑜 𝑟 72 6𝐹 72 20
Para hallar la sub llave 𝐾1 se trabajará con la llave inicial 𝐾 como sigue:
[ ] [ ] [ ] [ ]
[ ] [ ] [ ] [ ]
𝐾1 =
[ ] [ ] [ ] [ ]
[[ ] [ ] [ ] [ ]]
61 6𝐶
𝐶4 = [ ] 𝑅𝑜𝑡𝑤𝑜𝑟𝑑 [ 20 ]
6𝐶 ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
20 20
20 61
6𝐶 50
[ 20 ] → [𝐵7 ]
20 𝑆𝑢𝑏𝐵𝑦𝑡𝑒𝑠 𝐵7
61 𝐸𝐹
5.-Seguido, aplicar función XOR a este nuevo resultado con la primera columna de la llave
inicial; y a este resultado XOR con la columna 1 de la tabla RCOM
27
50 65 01 34
𝐵7 78 00 𝐶𝐹
[ ] ⨁ [ ] ⨁ [ ] = [ ] = 𝑃1
𝐵7 70 00 𝐶7
𝐸𝐹 72 00 9𝐷
34 [ ] [ ] [ ]
𝐶𝐹 [ ] [ ] [ ]
𝐾1 =
𝐶7 [ ] [ ] [ ]
[ 9𝐷 [ ] [ ] [ ]]
De manera general
Donde:
65 34 51
73 𝐶𝐹 𝐵𝐶
𝐶2 (𝑙𝑙𝑎𝑣𝑒) = [ ] 𝑋𝑂𝑅 [ ] = [ ] = 𝐶2 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)
69 𝐶7 𝐴𝐸
6𝐹 9𝐷 𝐹2
6𝐸 34 3𝐹
𝐶3 (𝑙𝑙𝑎𝑣𝑒) = [ ] 𝑋𝑂𝑅 [ ] = [9𝐶 ] = 𝐶3 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)
20 𝐶𝐹
6𝐹 𝐶7 𝐶1
72 9𝐷 80
61 34 5𝐸
6𝐶 𝐶𝐹
𝐶4 (𝑙𝑙𝑎𝑣𝑒) = [ ] 𝑋𝑂𝑅 [ ] = [𝐹0 ] = 𝐶4 (𝑠𝑢𝑏 𝑙𝑙𝑎𝑣𝑒)
20 𝐶7 𝐸1
20 9𝐷 𝐴0
34 51 3𝐹 5𝐸
𝐾1 = [ 𝐶𝐹 𝐵𝐶 9𝐶 𝐹0 ]
𝐶7 𝐴𝐸 𝐶1 𝐸1
9𝐷 𝐹2 80 𝐴0
7.-Finalmente, para determinar las 9 sub llaves restantes, se procederá a repetir el ciclo con
el único cambio en la suma de la tabla RCOM asignando el número de columna con el número
de sub llave.
28
Resultado del proceso número 1:
34 51 3𝐹 5𝐸 𝐵𝐴 𝐸𝐵 𝐷4 8𝐴 2𝐴 𝐶1 15 9𝐹
𝐾1 = [ 𝐶𝐹 𝐵𝐶 9𝐶 𝐹0 ] 𝐾 = [ 37 8𝐵 17 𝐸7] 𝐾 = [ 𝐸4 6𝐹 78 9𝐹 ]
𝐶7 𝐴𝐸 𝐶1 𝐸1 2 27 89 48 𝐴9 3 𝐷7 5𝐸 16 𝐵𝐹
9𝐷 𝐹2 80 𝐴0 𝐶5 37 𝐵7 17 𝐵𝐵 8𝐶 3𝐵 2𝐶
𝐹9 38 2𝐷 𝐵2 𝐴𝐴 92 𝐵𝐹 0𝐷 77 𝐸5 5𝐴 57
𝐾4 = [ 𝐸𝐶 83 𝐹𝐵 64 ] 𝐾 = [3𝐷 𝐵𝐸 45 21 ] 𝐾 = [15 𝐴𝐵 𝐸𝐸 𝐶𝐹 ]
𝐴6 𝐹8 𝐸𝐸 51 5 𝐴9 51 𝐵𝐹 𝐸𝐸 6 21 70 𝐶𝐹 21
60 𝐸𝐶 𝐷7 𝐹𝐵 57 𝐵𝐵 6𝐶 97 80 3𝐵 57 𝐶0
𝐵𝐷 58 02 55 97 𝐶𝐹 𝐶𝐷 98 𝐹𝐴 35 𝐹8 60
𝐾7 = [ 𝐸8 43 𝐴𝐷 62] 𝐾 = [ 83 𝐶0 6𝐷 0𝐹 ] 𝐾 = [ 𝐶𝐴 0𝐴 67 68 ]
9𝐵 𝐸𝐵 24 05 8 6𝐸 85 𝐴1 𝐴4 9 𝐴𝐵 2𝐸 8𝐹 2𝐵
𝐷𝐵 𝐸0 𝐵7 77 27 𝐶𝐹 70 07 61 𝐴6 𝐷6 𝐷1
89 𝐵𝐶 44 24
𝐾10 = [3𝐵 31 56 3𝐸 ]
95 𝐵𝐵 34 1𝐹
𝐵1 17 𝐶1 10
2° Proceso de cifrado
Este proceso está consta de 11 rondas, en las cuales se hará uso de 4 funciones definidas
anteriormente.
29
Figura 1 Imagen detallada de las rondas y sus respectivas funciones a emplearse.
𝐷 ñ 𝑆 𝑤
𝑜 𝑎
𝐸=[𝑖 𝑜 ]
𝑠 𝐷 𝑓 𝑟
𝑒 𝑒 𝑡 𝑒
𝐷 ñ 𝑆 𝑤 44 𝐹1 53 77
𝑖 𝑜 𝑜 𝑎 6𝐴 6𝐹 6𝐹 61
𝐸=[ ]=[ ]
𝑠 𝐷 𝑓 𝑟 73 44 66 72
𝑒 𝑒 𝑡 𝑒 65 65 74 65
3.-Despues se inicia con la ronda 0, haciendo uso de la función AddRoundKey con la llave 𝐸
y la matriz estado (mensaje a cifrar)
44 𝐹1 53 77 65 65 6𝐸 61
𝐸 = [6𝐴 6𝐹 6𝐹 61 𝑦 𝐾 = 78 73 20 6𝐶
] [ ]
73 44 66 72 70 69 6𝐹 20
65 65 74 65 72 6𝐹 72 20
30
Entonces:
44 𝐹1 53 77 65 65 6𝐸 61 21 94 3𝐷 16
6𝐴 6𝐹 6𝐹 61 73 20 6𝐶 ] = [11 1𝐶 4𝐹
[ ] ⨁ [78 0𝐷 ]
73 44 66 72 70 69 6𝐹 20 03 2𝐷 09 52
65 65 74 65 72 6𝐹 72 20 17 0𝐴 06 45
21 94 3𝐷 16 𝐹𝐷 22 27 47
11 1𝐶 4𝐹 0𝐷 82 9𝐶 84 𝐷7]
4.1 𝑆𝑢𝑏𝐵𝑦𝑡𝑒 [ ]=[
03 2𝐷 09 52 7𝐵 𝐷8 01 00
17 0𝐴 06 45 𝐹0 67 6𝐹 6𝐸
𝐹𝐷 22 27 47 𝐹𝐷 22 27 47
4.2 𝑆ℎ𝑖𝑓𝑡𝑅𝑜𝑤𝑠 [82 9𝐶 84 𝐷7]=[9𝐶 84 𝐷7 82]
7𝐵 𝐷8 01 00 01 00 7𝐵 𝐷8
𝐹0 67 6𝐹 6𝐸 6𝐸 𝐹0 67 6𝐹
𝐹𝐷 22 27 47 31 23 30 𝐴4
9𝐶 84 𝐷7 82] = [ 𝐵3 𝐶1 78 44 ]
4.3 𝑀𝑖𝑥𝐶𝑜𝑙𝑢𝑚𝑛𝑠 [
01 00 7𝐵 𝐷8 𝐷1 𝐴𝐷 𝐴𝐹 𝐷𝐹
6𝐸 𝐹0 67 6𝐹 5𝐷 19 0𝐵 4𝐷
4.4 Por último, para esta ronda 1 se aplica AddRoundKey[⨁], con la sub llave 𝐾1 y el
resultado anterior.
31 23 30 𝐴4 34 51 3𝐹 5𝐸 05 72 0𝐹 𝐹𝐴
𝐵3 𝐶1 78 44 ⨁ 𝐶𝐹 𝐵𝐶 9𝐶 𝐹0 ] = [7𝐶 7𝐷 𝐸4 𝐵4 ]
[ ] [
𝐷1 𝐴𝐷 𝐴𝐹 𝐷𝐹 𝐶7 𝐴𝐸 𝐶1 𝐸1 16 03 6𝐸 3𝐸
5𝐷 19 0𝐵 4𝐷 9𝐷 𝐹2 80 𝐴0 𝐶0 𝐸𝐵 8𝐵 𝐸𝐷
5.- A este resultado se procesa a través de la ronda 2 que consiste en hacer el mismo proceso
que la ronda 1, con la diferencia que se usara la sub llave 2.
6.- Se repite este proceso hasta la ronda 9, donde se obtiene la matriz siguiente:
58 𝐴0 60 2𝐴
[ 𝐸𝐴 32 65 9𝐷 ]
𝐸𝐶 𝐴𝐹 0𝐵 𝐴8
𝐶𝐵 83 0𝐴 79
31
58 𝐴0 60 2𝐴 6𝐴 𝐸0 𝐷0 𝐸5
7.1 𝑆𝑢𝑏𝐵𝑦𝑡𝑒 [ 𝐸𝐴 32 65 9𝐷 ] = [ 87 23 4𝐷 5𝐸 ]
𝐸𝐶 𝐴𝐹 0𝐵 𝐴8 𝐶𝐸 79 2𝐵 𝐶2
𝐶𝐵 83 0𝐴 79 1𝐹 𝐸𝐶 67 𝐵6
6𝐴 𝐸0 𝐷0 𝐸5 6𝐴 𝐸0 𝐷0 𝐸5
7.2 𝑆ℎ𝑖𝑓𝑡𝑅𝑜𝑤𝑠 [ 87 23 4𝐷 5𝐸 ] = [ 23 4𝐷 5𝐸 87 ]
𝐶𝐸 79 2𝐵 𝐶2 2𝐵 𝐶2 𝐶𝐸 79
1𝐹 𝐸𝐶 67 𝐵6 𝐵6 1𝐹 𝐸𝐶 67
6𝐴 𝐸0 𝐷0 𝐸5 89 𝐵𝐶 44 24 𝐸3 5𝐶 94 𝐶1
[ 23 4𝐷 5𝐸 87 ] ⨁ [3𝐵 31 56 3𝐸 ] = [ 18 7𝐶 08 𝐵9]
2𝐵 𝐶2 𝐶𝐸 79 95 𝐵𝐵 34 1𝐹 𝐵𝐸 79 𝐹𝐴 66
𝐵6 1𝐹 𝐸𝐶 67 𝐵1 17 𝐶1 10 07 08 2𝐷 77
𝐸3 5𝐶 94 𝐶1
𝐹 = [ 18 7𝐶 08 𝐵9]
𝐵𝐸 79 𝐹𝐴 66
07 08 2𝐷 77
32
Figura 2 Tomado del software Rijndaelinspector, donde se puede apreciar la matriz estado así como la clave y la
matriz salida (mensaje cifrado), debajo en color plomo 3 de las 10 sub llaves de cifrado, como en color azul la clave
que se usara en la ronda 0(entrada).
4.2 Fuzzer
1.- Una vez encendido la computadora con sistema operativo Kali Linux, se inicia el
navegador de internet y se descarga wfuzz de la siguiente página:
https://github.com/xmendez/wfuzz
2.- Luego se abre el terminal de Kali Linux y se escribe el siguiente comando para abrir el
menú de wfuzz: root@kali:~# wfuzz -h.
3.- A continuación, se verá el menú de opciones de wfuzz: de entre todas las opciones se
utilizará -c (el cual activa la impresión de los resultados), -z (el cual será el payload o
librería con el que actuará el fuzz), y –hc (el cual significa “Hide responses with the
specified code”, en español, “Esconder las respuestas con el siguiente código”).
33
4.- Se identifica el elemento de la página web en el cual se quiere realizar el fuzzing, y lo
se reemplaza el elemento en el URL por la palabra “FUZZ”, quedando un comando como
el siguiente: root@kali:~# wfuzz -c -z file,wordlist/Injections/All_attack.txt –hc 404
http://www.mysite.com/list.asp?id=FUZZ
6.- Una vez culminado el fuzzing, el fuzzer arroja resultados, mostrando el ID de los
intentos o peticiones, las respuestas del programa objetivo a estas, las líneas de código
afectadas, la cantidad de palabras insertadas, los chars capturados y la petición explícita.
Al final de todo, se apreciará algún crash o bug detectado; además, se apreciará el tiempo
que tardó el fuzzing, el total de peticiones, el total de peticiones denegadas y la rapidez de
peticiones por segundo.
Figura 3 En la captura de pantalla se observa parte de los resultados del fuzzing, el cual muestra: 468
comandos, de los cuales 367 se filtraron.
34
Figura 4 Como se aprecia, se comprobó la estabilidad y funcionalidad del programa web y se obtuvo un error
DDoS o Denegación de servicio ante el chequeo, lo cual evidencia la vulnerabilidad ante un ataque fuzzer.
V. Resultados y análisis
Se realizó el proceso de fuzzing cuatro veces en dos aplicaciones web provenientes de una
misma página web. A continuación, se presenta la librería fuzz utilizada, la función o programa
objetivo, las peticiones filtradas, las peticiones totales, el hallazgo de vulnerabilidades y
observaciones:
35
All_attack www.mysite.com/list.asp?i 30 468 Si Error DDoS
.txt d=FUZZ (Denegació
n de
Servicio)
Del total de fuzzings realizados, dos tuvieron éxito en generar errores críticos para el sistema
puesto a prueba. Los errores DDoS ocurren cuando un sistema o programa recibe tantas
peticiones que colapsa y se ve en la obligación de denegar el acceso a los usuarios de tal
programa.
Se puede observar también la librería wfuzz text_ext.txt fue la que más rápido ocasionó que
colapsara el programa objetivo.
36
VI. Observaciones
6.1 No todo texto hexadecimal se puede traducir al alfabeto romano (latino) porque no
todo el alfabeto hexadecimal existe en el alfabeto romano, consecuencia de asignar
ciertas teclas acciones que solo una computadora puede entender.
6.2 Se generó una deficiencia en el cifrado a causa de condiciones humanas como la
mala caligrafía y un inadecuado orden al momento de operar el algoritmo.
37
VII. Sugerencias y recomendaciones
7.1 Se debe mantener el mensaje cifrado en el alfabeto hexadecimal y si se hace
su transmisión, hacerlo en este formato alfabético.
7.2 Mantener un detallado orden al efectuar el cifrado AES, escritura legible y tener
un software de respaldo, solo para corroborar el proceso (Cryp Tool).
38
VIII. Conclusiones
Se describió completamente el funcionamiento del algoritmo de encriptación de
información con AES, en este, se detalla minuciosamente sobre cada función que
integra a ésta.
Se identificó con claridad la diferencia entre los dos tipos generales de fuzzers, siendo
uno de formato predigitado y bruto; mientras que el segundo, es autogenerado por el
mismo fuzzer e inteligente.
Se reconoció la importancia del algoritmo AES, a la vez que se reafirmó la utilidad del
fuzzer al detectar vulnerabilidades de un software objetivo. Con esto, se concluye que
ambas herramientas son importantes: primero, para proteger la información que se
envíe a través de un medio (software); segundo, para poner a prueba el buen diseño
del software que sirve como medio de transmisión de datos; siendo ambos atributos
de suma importancia para el contexto de la seguridad informática actual.
Al observar los distintos usos que se le pueda dar a ambas herramientas, AES y fuzzer,
se concluyó que el algoritmo AES garantiza la encriptación del mensaje de forma
unánime será para cifrar un texto en claro o un software, ya que este último también
está basado en líneas de texto, y que el fuzzer probará indeterminadas veces la
rigurosidad del diseño del software con el cual se transmite el mensaje cifrado en AES.
39
Bibliografía
Knudsen, J., & Varpiola, M. (7 de Enero de 2015). What is Fuzzing: the Poet, the Courier, and
the Orcale. Obtenido de http://www.codenomicon.com/files/pdf/WhatisFuzzing.pdf
Ortega, J., López, M., & García del castillo, E. (2005). Introducción a la criptografia: historia y
actualidad. España: Universidad de Castilla La Mancha.
Sutton, M., Greene, A., & Amini, P. (2007). Fuzzing - Brute Force Vulnerability Discovery.
Donneley: Addison-Wesley.
40
Anexos:
(fuente propia)
41
Ilustración 2: Captura de pantalla de la aplicación web objetivo
(fuente propia)
42