Crypter, XOR, piratage ZIP et PRSP non cryptés. Résolution de problèmes avec r0ot-mi Crypto. 2e partie

image

Dans cet article, nous en apprenons davantage sur la fonction de cryptage, apprendre à sélectionner les mots de passe pour une archive ZIP avec des noms de fichiers non cryptés, se familiariser avec l'utilitaire xortool et également traiter avec un générateur de nombres pseudo-aléatoires. Articles précédents sur ce sujet:

Partie 1 - Encodages, chiffrement par décalage, hachages bruts et création d'images à l'aide de Python PIL.

Information organisationnelle
Surtout pour ceux qui veulent apprendre quelque chose de nouveau et se développer dans l'un des domaines de l'information et de la sécurité informatique, j'écrirai et parlerai des catégories suivantes:

  • PWN;
  • cryptographie (Crypto);
  • technologies de réseau (réseau);
  • reverse (Reverse Engineering);
  • stéganographie (Stegano);
  • recherche et exploitation des vulnérabilités WEB.

En plus de cela, je partagerai mon expérience en criminalistique informatique, analyse de logiciels malveillants et micrologiciels, attaques sur les réseaux sans fil et les réseaux locaux, réalisation de pentests et écriture d'exploits.

Afin que vous puissiez vous renseigner sur les nouveaux articles, logiciels et autres informations, j'ai créé une chaîne dans Telegram et un groupe pour discuter de tout problème dans le domaine de l'ICD. Aussi, je considérerai personnellement vos demandes, questions, suggestions et recommandations personnelles et répondrai à tout le monde .

Toutes les informations sont fournies à des fins éducatives uniquement. L'auteur de ce document n'assume aucune responsabilité pour tout dommage causé à quelqu'un du fait de l'utilisation des connaissances et des méthodes obtenues à la suite de l'étude de ce document.


ELF64 - Cryptage PID


image

Nous regardons le code source. Le programme prend une chaîne en argument et la compare avec ce que la fonction cryt renvoie du PID du programme et la chaîne "$ 1 $ awesome".

La fonction cryt est une fonction de bibliothèque utilisée pour calculer le hachage de mot de passe. La sortie de la fonction n'est pas seulement un hachage, mais une ligne de texte qui contient également du sel, l'algorithme de hachage utilisé et les paramètres avec lesquels le hachage a été reçu, tels que le nombre de tours et d'autres options.

image

Cette fonctionnalité est incluse dans les langages de programmation Perl, PHP, Pike, Python et Ruby. Ainsi, vous devez deviner le PID avec lequel le programme sera lancé. Une fois connectés via SSH, nous voyons qu'ils nous donnent un programme, sa source et un fichier avec un mot de passe.

image

Sous Linux, chaque nouvelle application en cours d'exécution recevra la valeur PID libre incrémentielle la plus approximative. Par exemple, exécutez ps plusieurs fois de suite. Le PID est incrémenté à chaque fois.

image

Vous pouvez donc calculer le hachage à partir de n'importe quel PID libre, et avec cette valeur comme argument, exécutez le programme sans fin. Prenons le PID, par exemple 30000, et exécutons la fonction crypt. Je vais le faire en python.

image

Exécutez maintenant une boucle sans fin d'exécution de programme.

image

Et une minute plus tard, nous obtenons un shell d'où nous lisons le mot de passe.

image

Fichier - PKZIP


image

Téléchargez le fichier qu'ils nous donnent. Il s'agit d'une archive ZIP protégée par mot de passe. Passons par le mot de passe. Comme les noms de fichiers ne sont pas cryptés, nous en faisons l'utilitaire fcrackzip et prenons rockyou.txt comme dictionnaire.

image

Après décompression, nous obtenons un fichier texte où il est dit que la réponse est le mot de passe de l'archive.

image

Texte en clair connu - XOR


image

On nous donne une image chiffrée en utilisant XOR BMP. Puisque nous avons utilisé XOR (je suppose avec une touche courte) et que nous avons un grand texte chiffré, vous pouvez utiliser xortool.

image

Ainsi, xortool estime que la longueur de clé la plus probable est 6. Demandons-lui de déterminer la clé.

image

Super. La clé est définie, mais xortool lui-même a déchiffré le fichier et l'a enregistré dans le répertoire xortool_out.

image

Code - Générateur de nombres pseudo aléatoires


image

On nous donne un programme avec lequel le fichier est crypté, ainsi que le fichier lui-même. De plus, ils disent que le cryptage a eu lieu en décembre 2012. Nettoyons le code.

Au tout début du programme, l'heure actuelle est mémorisée (plus précisément l'heure écoulée depuis le 1er janvier 1970). Ensuite, la présence du paramètre du programme est vérifiée - le chemin d'accès au fichier.

image

image

Ensuite, ce fichier est ouvert pour la lecture et un nouveau fichier est créé pour l'écriture. Les descripteurs des deux fichiers sont transmis à la fonction crypt_file.

image

Dans crypt_file, la fonction genere_key () inverse la clé de 32 octets, qui est utilisée pour chiffrer XOR le fichier. Le résultat du chiffrement est écrit dans le fichier nouvellement créé.

image

La clé est compilée de manière pseudo-aléatoire. Dans l'alphabet présenté à chaque étape, une valeur est sélectionnée en fonction de la valeur de la marque, qui change également à chaque étape, et au tout début, elle est égale à l'heure actuelle.

image

Ainsi, nous devons générer des clés possibles. Le code source de python ressemble à ceci.
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() 


Voyons maintenant les limites du temps. Étant donné que le chiffrement a été effectué en décembre 2012, nous devons trier toutes les valeurs possibles du 1er décembre au 31 décembre.

image

 start = 1354320000 fin = 1356998400 


Nous avons décidé des frontières, mais il y aura encore beaucoup de clés. Heureusement, le fichier a son extension - c'est bz2.

image

Autrement dit, les trois premiers octets du fichier doivent être «BZh», le quatrième doit être l'un des caractères de «1» à «9» et les six octets suivants doivent être 0x314159265359. Ajoutons un filtre pour les clés. Pour ce faire, nous avons besoin des premiers octets du texte chiffré.

image

 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) 


Et nous n'obtenons qu'une seule clé.

image

Et en utilisant le même xortool, vous pouvez proxyer le fichier avec la clé.

image

Ainsi, vous avez décrypté l'archive.

Vous pouvez nous rejoindre sur Telegram . Créons une communauté dans laquelle il y aura des gens qui connaissent bien de nombreux domaines de l'informatique, puis nous pouvons toujours nous entraider pour tout problème informatique et de sécurité de l'information.

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


All Articles