lunes, 9 de septiembre de 2019

Reversing(XVIII): Solución Reto angstromCTF 2019 "I Like It"

En este post la solución a uno de los retos de 'reversing' de angstromCTF 2019.

En mi opinión este reto presenta un nivel de dificultad medio (☆☆).

Su enunciado dice lo siguiente: 'Now I like dollars, I like diamonds, I like ints, I like strings. Make Cardi like it please'.


se proporciona un archivo ejecutable ELF ('Executable and Linkable Format').

Solución: Como ya he dicho en este blog, los retos de 'reversing' no se me dan precisamente bien :), por lo que he catalogado este desafío como de dificultad media, pero seguro que cualquier persona con un poco de destreza para resolver este tipo de retos diría que presenta un nivel de dificultad muy bajo.

Para intentar resolverlo, en primer lugar ejecuto el archivo:
El que se me pida que introduzca una cadena ('string'), junto a la referencia a las mismas que se hace en el enunciado, me lleva a utilizar la utilidad 'strings' para ver si encuentro alguna en el ejecutable que se corresponda con la que hay que introducir.
Veo la cadena 'okrrrrrrr' y pruebo con ella a ver que pasa:
Por lo que parece que es la cadena correcta, pero ahora se me pide que introduzca dos números enteros separados por un espacio. Ya sospechaba que no podía ser tan fácil y que iba a tener que trabajar un poco más.

Para ver si logro dar con los números que se solicitan abro el archivo ejecutable con IDA, un desensamblador para realizar labores de ingeniería inversa:
Como se ve en la figura anterior, efectivamente se compara la cadena introducida con  "okrrrrrrr" y si ambas cadenas no son iguales se muestra el mensaje "Cardi don't like that.", mientras que si son iguales se muestra el mensaje "I said I like it like that!" y se pide que se introduzcan dos números enteros separados por un espacio.

Un poco más abajo se ven las validaciones que se harán con los dos número que se introduzcan:
La primera de ellas consiste en comparar la suma de ambos números con 88 en hexadecimal (136 en decimal). Si la suma no es igual a dicho resultado se muestra el mensaje "Cardi don't like that.", mientras que si es igual a 136 en decimal se procede a la segunda validación.

En la segunda se comprueba si la multiplicación de ambos números es 0EC7 en hexadecimal (3.783 en decimal). Si la multiplicación no es es igual a dicho resultado se muestra el mensaje "Cardi don't like that.", mientras que si es igual a 3.783 en decimal se procede a la tercera validación.

Y, finalmente, en la tercera de ellas lo único que se hace es verificar que el número menor se introduzca en primer lugar, y si es así se muestra la flag.

Por tanto:
O sea, si no me equivoco, para obtener la flag hay que introducir los números 39 y 97, en ese orden, separados por un espacio.

Compruebo si es así:
Efectivamente, es correcto y la solución a este reto es: actf{okrrrrrrr_39_97}.

jueves, 5 de septiembre de 2019

Criptografía (CLXVIII): Solución Reto FreeHackQuest "Keyboard password"

Comienzo con éste una serie de posts en los que pondré las soluciones de algunos de los retos de la plataforma FreeHackQuest; en esta primera entrada un desafío bajo la etiqueta 'hashes'.

Al igual que para los retos de este tipo de otras plataformas, los resolveré mediante scripts de python y/o la utilización de alguna herramienta.

El primero de estos retos tiene por título "Keyboard password" y, en mi opinión, presenta un nivel de dificultad bajo (☆☆☆).

Su enunciado dice lo siguiente: 'We know which keys pressed user for password and we have MD5-sum by password, please got password.
Hash: d377e0079ee9e94fc69336a01630b041'.

Como pistas ('Hints') se dan las siguientes:

"Hint 1: Keyboard is english.
Hint 2: Without 'shift'.
Hint 3: Password has 8 characters.
Hint 4: sometimes where you see 'n' possible key 'm' in another keyboards. I hope this give you shans to be successfully".

Solución:

A la vista de las pistas llego a la conclusión de que las teclas pulsadas son:
Es decir, creo que las teclas pulsadas son: 'd', 'g', 'm', 'o', 'u', '4' y '9'.

Y, como sólo se han pulsado siete teclas (además de 'Enter'), una de ellas ha tenido que ser pulsada dos veces, ya que como se dice en una de las pistas la contraseña tiene 8 caracteres.

Para resolver este reto no se me ocurre otra cosa que emplear la fuerza bruta para probar todas las posibles teclas pulsadas (las siete indicadas más una de ellas pulsada dos veces) hasta que el hash md5 sea el que se indica en el enunciado (d377e0079ee9e94fc69336a01630b041).

Para ello, en primer lugar y utilizando la herramienta 'pydictor', creo un diccionario para iniciar el ataque de fuerza bruta considerando que la tecla que se ha pulsado 2 veces es la 'd', de la siguiente manera:
Y después creo el siguiente script de python:

import hashlib

f = open('diccionario.txt', 'r')

password=''
string = f.readline().rstrip('\n')

while string != '':
   hash_md5 = hashlib.md5(string).hexdigest()
   if hash_md5 == 'd377e0079ee9e94fc69336a01630b041':
      password = string
      break
   else:
      string = f.readline().rstrip('\n')

print ''
if password != '':
   print '[+] password encontrada ...', password
else:
   print '[-] Password no encontrada.'

f.close()

Si con este diccionario no tengo éxito crearé otro suponiendo que la letra que se ha pulsado dos veces es la 'g' y volveré a ejecutar el script, y así sucesivamente hasta encontrar los ocho caracteres correctos de la contraseña.

Ejecuto el script con el diccionario generado:
Y como se observa no se ha encontrado la contraseña, por lo que parece que la tecla que se ha pulsado dos veces no es la 'd'.

Genero ahora el diccionario suponiendo que la letra que se ha pulsado dos veces es la 'g':
Y vuelvo a ejecutar el script con el nuevo diccionario generado:
Con lo que la password y, por tanto, la solución a este reto es: god94mug.

sábado, 24 de agosto de 2019

Criptografía (CLXVII): Solución Reto backdoor "easy-flipp"

En este post la solución a otro de los retos de criptografía de la plataforma backdoor.

Este reto tiene el título "easy-flipp" y mi valoración sobre su dificultad es: .

Su enunciado dice lo siguiente:


dr3dd is n00b in crypto stuff, but he tried to encrypt some data using AES-CBC mode can you change encrypted data and get his private message..!!

nc hack.bckdr.in 10006

Y como pista se da la siguiente (Hint): CBC Bit-Flipping Attack.

Solución: ya he escrito en este blog algunos post sobre el 'bit-flipping attack', por lo que resolver este reto no tiene que ser difícil y, en consecuencia, rebajo su nivel de dificultad a bajo.

Me conecto:
En el enunciado se dice que el método de cifrado utilizado es AES en modo de operación CBC, y aquí veo el mensaje de autenticación cifrado (en hexadecimal) y que el texto en claro correspondiente al mismo es "admin=0".

Pues bien, entiendo que lo único que hay que hacer es cambiar "admin=0" por "admin=1" mediante la modificación del Byte séptimo del vector de inicialización (IV) para que se produzca la modificación deseada en el Byte séptimo del primer bloque de texto plano (pase de 0 a 1).

Es decir, la modificación que tengo que realizar es la siguiente:

C'0[7] = C0[7] XOR P1[7] XOR P'1[7] = C0[7] XOR 0 XOR 1 = C0[7] XOR 1

Donde: C'0[7] = Valor al que hay que modificar el Byte 7 de C0 (IV); 
C0[7] = Byte 7 del bloque 0 del criptograma original (Byte 7 del IV original);
 P1[7] = Byte 7 del bloque 1 del texto plano original;
 P'1[7] = Valor deseado para el Byte 7 del bloque 1 del texto plano.

Por consiguiente, basta con modificar el Byte 7 del vector de inicialización
 (resaltado en color rojo a continuación) con el resultado de la operación XOR de ese mismo Byte con 1.

C0 (IV original) = 0cc1484ddd73a77fd14dc38062560cf0
C'0[7] = C0[7] XOR 1 = a7 XOR 1 = a6
C'0 (IV modificado) = 0cc1484ddd73a67fd14dc38062560cf0

Por lo que, si no estoy equivocado, cuando nos piden 'Give me Encrypted msg in hex' basta con incluir:

0cc1484ddd73a67fd14dc38062560cf034b8bae89f1b9fb5ef1ee676572899dd

para que se nos muestre la flag:
No hay que olvidar que en esta plataforma para superar el reto hay que enviar el hash sha256 de la flag:
Por lo que el valor a enviar es:

dcde1eaf7b732a6b014d47e2cc6eb31946efd1da78494eae4c9e20d52cc2efbe

viernes, 23 de agosto de 2019

Criptografía (CLXVI): Solución Reto id0-rsa "Easy Passwords"

En este post la solución de otro de los retos de la plataforma id0-rsa, dedicada exclusivamente a desafíos de criptografía, y que figura en ella bajo el 'Tag' 'Hashing'.

En este caso lo voy a resolver sólo mediante una herramienta.

El reto en cuestión tiene por título "Easy Passwords" y, en mi opinión, presenta un nivel de dificultad medio (☆☆).

Su enunciado dice lo siguiente: 'Warm up with some easy password cracking', y se proporciona lo siguiente:

$1$abadsalt$0abdVS0D4YnJJ4b7l0RRr1
$1$abadsalt$p394aiqZnKUyrO5Rg9Tf01
$1$abadsalt$cJYsdaTkB9F9L9yH2Qjtd.
$1$abadsalt$lFZDGpRdmOwRbu6HWuqjv0
$1$abadsalt$1AI/LbmumKa5e6dOxiVe11
$1$abadsalt$e2hAp/NXE.Uezx3ZOwA5L0
$1$abadsalt$Cua6x6Rgd8UUHn7Mnzibj.
$1$abadsalt$7XBxlsUB3yXcL62wQpgjK/
$1$abadsalt$DnSSAXOSmaoAAhN4WKaU90
$1$abadsalt$Cua6x6Rgd8UUHn7Mnzibj.
$1$abadsalt$7wLTt8frOzyxahbB9Lzdi.

Solución:

JohnTheRipper:

Lo que se proporciona en este reto son valores de hash generados utilizando el algoritmo crypt(3)-MD5, y para intentar "revertirlos" utilizo 'John the Ripper'el popular software de 'crackeo' de contraseñas, 'Rockyou' como diccionario para implementar un ataque de fuerza bruta.

Creo un fichero de texto (Easy_Passwords.txt) con los valores de hash proporcionados, ejecuto el siguiente comando: john --wordlist=rockyou.txt Easy_Passwords.txt, y el resultado es:
Es decir, veo que se han conseguido 'crackear' algunos de los valores de hash contenidos en el archivo Easy_Passwords.txt.

Ejecuto el siguiente comando: john --show Easy_Passwords.txt, y obtengo lo siguiente:
Es decir, en concreto ya tengo 10 de las cadenas correspondientes a los valores hash y me falta 1

Abro el archivo (john.pot) que se ha generado tras el primer paso realizado, y veo lo siguiente:

$1$abadsalt$cJYsdaTkB9F9L9yH2Qjtd.:letter
$1$abadsalt$p394aiqZnKUyrO5Rg9Tf01:second
$1$abadsalt$e2hAp/NXE.Uezx3ZOwA5L0:word
$1$abadsalt$0abdVS0D4YnJJ4b7l0RRr1:the
$1$abadsalt$7XBxlsUB3yXcL62wQpgjK/:this
$1$abadsalt$7wLTt8frOzyxahbB9Lzdi.:order
$1$abadsalt$1AI/LbmumKa5e6dOxiVe11:each
$1$abadsalt$DnSSAXOSmaoAAhN4WKaU90:list
$1$abadsalt$Cua6x6Rgd8UUHn7Mnzibj.:in

Comparando lo valores de hash proporcionados en el reto e incluidos en el archivo de texto que he creado (Easy_Passwords.txt) con el contenido del fichero anterior, veo que hay dos valores de hash repetidos (los resaltados a continuación en color azul), que se corresponden con 'in', y que el valor de hash que falta es el resaltado a continuación en color rojo.

$1$abadsalt$0abdVS0D4YnJJ4b7l0RRr1
$1$abadsalt$p394aiqZnKUyrO5Rg9Tf01
$1$abadsalt$cJYsdaTkB9F9L9yH2Qjtd.
$1$abadsalt$lFZDGpRdmOwRbu6HWuqjv0
$1$abadsalt$1AI/LbmumKa5e6dOxiVe11
$1$abadsalt$e2hAp/NXE.Uezx3ZOwA5L0
$1$abadsalt$Cua6x6Rgd8UUHn7Mnzibj.
$1$abadsalt$7XBxlsUB3yXcL62wQpgjK/
$1$abadsalt$DnSSAXOSmaoAAhN4WKaU90
$1$abadsalt$Cua6x6Rgd8UUHn7Mnzibj.
$1$abadsalt$7wLTt8frOzyxahbB9Lzdi.

Para intentar 'crackear' el valor de hash que falta, a la vista de que todos los demás se corresponden con palabras comunes en inglés, vuelvo a repetir los 2 pasos anteriores, pero esta vez utilizo un diccionario de dicho idioma (john --wordlist=english.txt Easy_Passwords.txt):
Y veo que la palabra que faltaba era 'of'.

Ejecuto: john --show Easy_Passwords.txt, y obtengo lo siguiente:
Por tanto, la solución a este reto es: "heefaonhinr".

Criptografía (CLXV): Solución Reto id0-rsa "Fast Hashing Passwords"

En este post la solución de otro de los retos de la plataforma id0-rsa, dedicada exclusivamente a desafíos de criptografía, y que figura en ella bajo el 'Tag' 'Hashing'.

En este caso lo voy a resolver sólo mediante un script de python.

El reto en cuestión tiene por título "Fast Hashing Passwords" y, en mi opinión, presenta un nivel de dificultad bajo (☆☆☆).

Su enunciado dice lo siguiente: 'Cryptographic hash functions shouldn't be used to hash passwords directly. It's important to hash passwords before storing them, but using a cryptographic hash function directly isn't sufficient even if salt is included. Salt is intended to make it so that an attacker can't use a table of precomputed hashes of common passwords, but if your hash scheme itself is very fast to compute (as raw cryptographic hash functions are), an attacker won't need a precomputed table, as doing the computation live will be reasonable', se pide lo siguiente'To demonstrate how fast cryptographic hash functions are on passwords, hash every password in the rockyou list of common passwords (14,344,391 passwords total), with sha256. Submit the password with the lowest hash value concatenated to the end of the password with the highest hash value'.

Solución:

Script de python:

from hashlib import sha256
from tqdm import tqdm

f = open('rockyou.txt', 'rb')

rockyou = f.read().split(b"\n")

sha256_menor = ('',115792089237316195423570985008687907853269984665640564039457584007913129639935,'')
sha256_mayor = ('',0,'')

for password in tqdm(rockyou):
    sha256_password = int(sha256(password).hexdigest(), 16)
    if sha256_password < sha256_menor[1]:
        sha256_menor = (sha256(password).hexdigest(),sha256_password,password)
    if sha256_password > sha256_mayor[1]:
        sha256_mayor = (sha256(password).hexdigest(),sha256_password,password)

print'[+] Hash sha256 menor ...',sha256_menor
print'[+] Hash sha256 mayor ...',sha256_mayor
solution = sha256_mayor[2] + sha256_menor[2]
print'[+] Solution ............',solution

f.close()

Ejecuto este script:
Por tanto, la solución a este reto es: bert7quinn,3yame1bore.

Criptografía (CLXIV): Solución Reto id0-rsa "Intro to Hashing"

Empiezo con éste una serie de posts en los que pondré las soluciones de algunos de los retos de la plataforma id0-rsa, dedicada exclusivamente a desafíos de criptografía, y que figuran en ella bajo el 'Tag' 'Hashing'.

Estos retos los resolveré mediante scripts de python y/o la utilización de alguna herramienta.

El primero de estos retos tiene por título "Intro to Hashing" y, en mi opinión, presenta un nivel de dificultad muy bajo (☆☆☆☆).

Su enunciado dice lo siguiente: 'Hashing is a vital concept in cryptography', tras lo cual se incluye un pequeño tutorial sobre los 'Hashes' y se pide lo siguiente: 'To prove you understood this tutorial, show that you can use these hash functions. Hash the string id0-rsa.pub with sha256, then hash the hex string output with md5, and submit the lowercase hex result'.

Solución:

a) Script de python:

import hashlib

sha256 = hashlib.sha256('id0-rsa.pub').hexdigest()
md5 = hashlib.md5(sha256).hexdigest()

print'[+] Solution ...', md5

Ejecuto este script:
Por tanto, la solución al reto es: b25d449d86aa07981d358d3b71b891de.

a) Herramienta:

En este caso utilizo un software de escritorio.

Como primer paso calculo el hash sha256 de "id0-rsa.pub":
Y como segundo paso calculo el hash md5 de la cadena obtenida en el paso anterior:
Con lo que la solución la reto es: b25d449d86aa07981d358d3b71b891de.

jueves, 22 de agosto de 2019

Criptografía (CLXIII): Solución Reto id0-rsa "Vigenère + Rail Fence"

Solución de otro de los retos de la plataforma id0-rsa, la cual está dedicada exclusivamente a desafíos de criptografía.

Se trata de otro de los retos de criptografía clásica que en ella aparecen y, en este caso y como en alguno anterior, sólo lo voy a resolver utilizando herramientas, ya que se combinan dos métodos de cifrado diferentes, Vigenère y Rail Fence, y ésto unido al gran tamaño del criptograma hace que su resolución de forma manual ("lápiz y papel") sea muy laboriosa.

El reto en cuestión lleva por título "Vigenère + Rail Fence" y, en mi opinión, presenta un nivel de dificultad bajo (☆☆☆).

Su enunciado dice lo siguiente: 'Good luck', y como pista se indica: 'Hint: encrypted with Vigenère then Rail Fence. First word of the plaintext is THIS'.

El criptograma a descifrar es el siguiente (lo primero que hago es quitarle los espacios para que las herramientas a utilizar no entiendan que éstos forman parte del criptograma):
Solución:

Entiendo que para resolver este reto, como primer paso, hay que utilizar la fuerza bruta para el cifrado Rail Fence y, posteriormente, probar el descifrado de cada una de las posibles soluciones obtenidas (resultado para cada número de raíles) mediante el método de Vigenère para ver si se obtiene un texto inteligible.

Una vez aplicada la fuerza bruta en el cifrado Rail Fence utilizo una de las muchas herramientas 'online' existentes sobre el cifrado de Vigenère, y con 21 raíles obtengo:
Por lo que ya tengo el texto en claro:
Con lo que la solución a este reto es: "TENTACLE".

martes, 20 de agosto de 2019

Criptografía (CLXII): Solución Reto id0-rsa "Affine Cipher"

Solución de otro de los retos de la plataforma id0-rsa, la cual está dedicada exclusivamente a desafíos de criptografía.

Se trata de otro de los retos de criptografía clásica que en ella aparecen y, como en posts anteriores, lo voy a resolver tanto de forma manual ("lápiz y papel") como de forma automatizada mediante la utilización de una herramienta.

El reto en cuestión lleva por título "Affine Cipher" y, en mi opinión, presenta un nivel de dificultad bajo (☆☆☆).

Su enunciado dice lo siguiente: 'Can you brute force this classical cipher?'.

El criptograma a descifrar es el siguiente:
Solución:

a) De forma manual:

Parece que el enunciado nos sugiere utilizar la fuerza bruta para resolver este reto y efectivamente es posible solucionarlo utilizando ese método, pero yo lo voy a hacer de otra manera. No hay que olvidar que el cifrado afín es un cifrado simple por sustitución monoalfabética y, como tal, vulnerable a un ataque mediante el análisis de frecuencias, pero ni siquiera necesito realizar un análisis completo de este tipo, sino que me basta con conocer la correspondencia de dos caracteres del criptograma con sus respectivos caracteres del texto en claro, cosa que es muy fácil de conseguir.

Si hago un análisis de frecuencias de un criptograma correspondiente a un texto escrito en inglés será muy fácil identificar los caracteres del criptograma que se corresponden en el texto en claro con las dos letras más frecuentes en dicho idioma, ya que las frecuencias de aparición de los 2 caracteres del criptograma que se correspondan con la 'E' y la 'T', respectivamente, serán significativamente superiores a las del resto. Así, en el criptograma del reto obtengo lo siguiente (hay que considerar que en él también figuran espacios, además de la ',' y el  '.', por lo que el carácter que aparece con más frecuencia en el criptograma se corresponderá muy probablemente con el espacio, siendo los dos siguientes caracteres más frecuentes los que probablemente se correspondan con la 'E' y 'T', respectivamente):
Así que establezco como hipótesis inicial que el carácter  'I' en el criptograma se corresponde con la letra 'E' en el texto en claro y que el carácter 'R' en el criptograma se corresponde con la letra 'T' en el texto en claro. Pruebo a descifrar el criptograma con esta hipótesis de partida y si no obtengo un texto inteligible probaré con otra hipótesis.

El alfabeto empleado en el reto tiene 29 caracteres (letras mayúsculas A-Z, más el espacio, la coma y el punto), así que asocio a cada uno de ellos un número de orden:

'A' = 0; 'B' = 1; 'C'= 2; ...; '.' = 28

Por tanto, la función de cifrado (E) es la siguiente:

E(mi) = ci = (a x mi + b) mod 29

Donde:
a: constante de multiplicación o constante de decimación.
b: constante de adición o constante de desplazamiento.

la función de descifrado (D) es la siguiente:

D(ci) = mi = ((ci - b) x a-1) mod 29

Donde:
a: constante de multiplicación o constante de decimación.
a-1: inverso multiplicativo modular de a.
b: constante de adición o constante de desplazamiento.

Entonces, conforme a la hipótesis inicial que he establecido: 'I' (8) se corresponde con E (4) y 'R' (17) con 'T' (19), tengo que:

(a x 4 + b) mod 29 = 8
(a x 19 + b) mod 29 = 17

Por tanto:

a = (27 x (8 - 17)) mod 29 = -243 mod 29 = 18
b = (27 x ((4 x 17) - (19 x 8))) mod 29 = -2.268 mod 29 = 23

Y procedo al descifrado del criptograma con a = 18, a-1 = 21 y b =23:

- Primer carácter del criptograma ('B'):

m1 = ((c1 - b) x a-1) mod 29 = ((1 - 23) * 21) mod 29 = -462 mod 29 = 2 = ‘C’

- Segundo carácter del criptograma ('O'):

m2 = ((c2 - b) x a-1) mod 29 = ((14 - 23) * 21) mod 29 = -189 mod 29 = 14 = ‘O’

- Tercer carácter del criptograma ('H'):

m3 = ((c3 - b) x a-1) mod 29 = ((7 - 23) * 21) mod 29 = -336 mod 29 = 12 = ‘M’

- Cuarto carácter del criptograma ('H'), igual que el anterior:

m4 = ((c4 - b) x a-1) mod 29 = ((7 - 23) * 21) mod 29 = -336 mod 29 = 12 = ‘M’

- Quinto carácter del criptograma ('I'):

m5 = ((c5 - b) x a-1) mod 29 = ((8 - 23) * 21) mod 29 = -315 mod 29 = 4 = ‘E’

- Sexto carácter del criptograma ('K'):

m6 = ((c6 - b) x a-1) mod 29 = ((10 - 23) * 21) mod 29 = -273 mod 29 = 17 = ‘R’

- Séptimo carácter del criptograma ('B'), igual que el primer carácter:

m7 = ((c7 - b) x a-1) mod 29 = ((1 - 23) * 21) mod 29 = -462 mod 29 = 2 = ‘C’

- Octavo carácter del criptograma ('I'), igual que el quinto carácter:

m8 = ((c8 - b) x a-1) mod 29 = ((8 - 23) * 21) mod 29 = -315 mod 29 = 4 = ‘E’

...

Por lo que parece que voy bien, ya que se puede leer la palabra 'COMMERCE', y sigo hasta obtener el texto en claro:
Ya tengo el texto en claro, pero piden introducir como solución el 'hash' md5 de éste, por lo que utilizo un software para el cálculo de 'hashes':
Con lo que la solución a este resto es: 880cabd53df2f03050a7214d3ae30a07.

b) De forma automatizada:

Utilizo una de las muchas herramientas 'online' existentes sobre el cifrado simple por sustitución monoalfabética, no olvidar lo que he dicho anteriormente sobre que el cifrado afín no deja de ser un cifrado de ese tipo:
Como se ve en la figura anterior la herramienta sólo ha considerado los caracteres alfabéticos, dejando como están en el criptograma los espacios, las comas y los puntos, pero es muy fácil darse cuenta de que la coma se corresponde con el espacio en el texto en claro, el punto con la letra 'S' y el espacio con la 'F'.

Y obtengo el mismo texto en claro que en el descifrado manual.