Crypt, XOR, pirateando ZIP y PRSP sin cifrar. Resolución de problemas con r0ot-mi Crypto. Parte 2

imagen

En este artículo, aprendemos sobre la función de la cripta, aprendemos cómo seleccionar contraseñas para un archivo ZIP con nombres de archivos sin cifrar, familiarizarnos con la utilidad xortool y también tratar con un generador de números pseudoaleatorio. Artículos anteriores sobre este tema:

Parte 1 - Codificaciones, cifrado de turno, hashes brutas y creación de imágenes usando PIL python.

Información organizacional
Especialmente para aquellos que desean aprender algo nuevo y desarrollarse en cualquiera de las áreas de información y seguridad informática, escribiré y hablaré sobre las siguientes categorías:

  • PWN;
  • criptografía (criptografía);
  • tecnologías de red (Red);
  • inversa (ingeniería inversa);
  • esteganografía (Stegano);
  • búsqueda y explotación de vulnerabilidades WEB.

Además de esto, compartiré mi experiencia en informática forense, análisis de malware y firmware, ataques a redes inalámbricas y redes de área local, realización de pentests y escritura de exploits.

Para que pueda conocer nuevos artículos, software y otra información, creé un canal en Telegram y un grupo para discutir cualquier problema en el campo de ICD. Además, consideraré personalmente sus solicitudes personales, preguntas, sugerencias y recomendaciones personalmente y responderé a todos .

Toda la información se proporciona solo con fines educativos. El autor de este documento no tiene ninguna responsabilidad por los daños causados ​​a alguien como resultado del uso del conocimiento y los métodos obtenidos como resultado de estudiar este documento.


ELF64 - Cifrado PID


imagen

Nos fijamos en el código fuente. El programa toma una cadena como argumento y la compara con lo que la función cryrt devuelve del PID del programa y la cadena "$ 1 $ awesome".

La función cryt es una función de biblioteca que se utiliza para calcular el hash de contraseña. La salida de la función no es solo un hash, sino una línea de texto que también contiene sal, el algoritmo de hash utilizado y los parámetros con los que se recibió el hash, como el número de rondas y otras opciones.

imagen

Esta característica está incluida en los lenguajes de programación Perl, PHP, Pike, Python y Ruby. Por lo tanto, debe adivinar el PID con el que se iniciará el programa. Después de conectarse a través de SSH, vemos que nos dan un programa, su fuente y un archivo con una contraseña.

imagen

En Linux, cada nueva aplicación en ejecución recibirá el valor PID libre incremental más aproximado. Por ejemplo, ejecute ps varias veces seguidas. PID se incrementa cada vez.

imagen

Para que pueda calcular el hash desde cualquier PID libre, y con este valor como argumento, ejecute el programa sin cesar. Tomemos el PID, por ejemplo 30000, y ejecutemos la función de cripta. Lo haré en python.

imagen

Ahora ejecute un bucle sin fin de ejecución del programa.

imagen

Y un minuto después, obtenemos un shell desde donde leemos la contraseña.

imagen

Archivo - PKZIP


imagen

Descarga el archivo que nos dan. Este es un archivo ZIP protegido por contraseña. Veamos la contraseña. Como los nombres de los archivos no están encriptados, lo convertimos en la utilidad fcrackzip y tomamos rockyou.txt como diccionario.

imagen

Después de descomprimir, obtenemos un archivo de texto donde dice que la respuesta es la contraseña del archivo.

imagen

Texto sin formato conocido - XOR


imagen

Nos dan una imagen encriptada usando XOR BMP. Como usamos XOR (supongo que con una tecla corta) y tenemos un texto cifrado grande, puede usar xortool.

imagen

Por lo tanto, xortool cree que la longitud de clave más probable es 6. Pidámosle que determine la clave.

imagen

Genial La clave está definida, pero xortool ha descifrado el archivo y lo ha guardado en el directorio xortool_out.

imagen

Código - Generador de números pseudoaleatorios


imagen

Se nos proporciona un programa con el que se cifra el archivo, así como el archivo en sí. Además, dicen que el cifrado ocurrió en diciembre de 2012. Limpiemos el código.

Al comienzo del programa, se memoriza la hora actual (más precisamente, el tiempo transcurrido desde el 1 de enero de 1970). A continuación, se verifica la presencia del parámetro del programa: la ruta al archivo.

imagen

imagen

Luego, este archivo se abre para leer y se crea un nuevo archivo para escribir. Los descriptores de ambos archivos se pasan a la función crypt_file.

imagen

En crypt_file, la función genere_key () invierte la clave de 32 bytes, que se utiliza para cifrar XOR el archivo. El resultado del cifrado se escribe en el archivo recién creado.

imagen

La clave se compila de forma pseudoaleatoria. Del alfabeto presentado en cada paso, se selecciona un valor dependiendo del valor de retención y valor, que también cambia en cada paso, y al principio es igual al tiempo actual.

imagen

Por lo tanto, necesitamos generar posibles claves. El código fuente de Python se ve así.
keys = [] charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789" l = len(charset) holdrand = None def Rand(): global holdrand holdrand = holdrand * 214013 + 2531011 return ((holdrand >> 16) & 0x7fff) def genere_key(): key = "".join( [ charset[Rand()%l] for _ in range(32) ] ) keys.append(key) start = ? fin = ? for ts in range(start, fin): holdrand = ts genere_key() 


Ahora tratemos con los límites del tiempo. Dado que el cifrado se realizó en diciembre de 2012, debemos clasificar todos los valores posibles desde el 1 de diciembre hasta el 31 de diciembre.

imagen

 start = 1354320000 fin = 1356998400 


Hemos decidido sobre las fronteras, pero aún habrá muchas llaves. Afortunadamente, el archivo tiene su extensión, esto es bz2.

imagen

Es decir, los primeros tres bytes del archivo deben ser "BZh", el cuarto debe ser uno de los caracteres del "1" al "9" y los siguientes seis bytes deben ser 0x314159265359. Agreguemos un filtro para las claves. Para hacer esto, necesitamos los primeros bytes del texto cifrado.

imagen

 def key_filter(key): ctext = "\x23\x17\x5d\x70\x5a\x11\x6d\x67\x37\x08" BZh = "BZh" sign = "".join( [ chr(ord(ctext[i])^ord(BZh[i])) for i in range(3) ] ) byte4 = "".join( [ chr(ord(ctext[3])^ord(i)) for i in "123456789" ] ) bytePI = chr(ord(ctext[4])^0x31) if sign in key[:3] and key[3] in byte4 and key[4] in bytePI: print(key) 


Y solo tenemos una clave.

imagen

Y utilizando el mismo xortool, puede proxy el archivo con la clave.

imagen

Por lo tanto, descifró el archivo.

Puedes unirte a nosotros en Telegram . Formemos una comunidad en la que haya personas con conocimientos en muchas áreas de TI, para que siempre podamos ayudarnos mutuamente en cualquier problema de seguridad de la información y TI.

Source: https://habr.com/ru/post/482680/


All Articles