Comment réussir un cyber-test à Checkpoint

Bonjour à tous, je suis Nikita Kurtin , conservatrice de l’école supérieure israélienne d’informatique et de sécurité HackerU

Checkpoint , la principale société israélienne de sécurité de l'information, a publié une série de cyber-tests cet été.

Les tâches étaient divisées en six catégories:

• Logique
• Web
• Programmation
• Réseautage
• Inverser
• Surprise

Deux tâches pour chaque direction. Dans cet article, je vais vous dire comment j'ai passé seulement quatre tests, dans les trois autres suivants:

Checkpoint avait déjà réussi à gagner le respect et l'intérêt de ma part, j'ai donc décidé d'accepter ces défis. Cependant, en raison de mon emploi, je n'ai pu me permettre que 8 des 12 tâches (de quatre catégories différentes). Et j'ai réussi à en résoudre 7.

Le défi a officiellement pris fin fin septembre 2018.

image

Alors maintenant, avec une conscience claire, je peux vous expliquer étape par étape comment j'ai réussi à résoudre les problèmes suivants:

• Défi logique "PNG ++"
• Défi Web «Les robots sont de retour»
• Défi Web "Galerie Diego"
• Tâche de programmation «étapes prudentes»
• La tâche de programmation "Puzzle"
• Défi de réseautage «Ping Pong»
• «Protocole» du défi de réseautage

Défi: PNG ++

Description:

Cette image (lien vers un fichier PNG chiffré) a été encodée à l'aide d'un chiffrement personnalisé.

Nous avons réussi à lire la plupart de ce code ici (lien vers le code python).
Malheureusement, quelqu'un a renversé du café lentement sur tout le fichier key_transformator.py.
Pourriez-vous nous aider à décrypter cette image?

Code Python:

image

La logique de chiffrement est la suivante:

1. Définissez la longueur de la clé (taille de la clé) sur 4 octets

2. Lisez les octets du fichier "flag.png" dans la variable "img"

3. Ajoutez un remplissage au fichier, au premier multiple de quatre le plus proche. Le remplissage est égal au nombre d'octets manquants. Par exemple, si la longueur du fichier est de 29 octets (3 manquants), ajoutez trois octets avec la valeur décimale 3 (ASCII 0x03). Ou, en d'autres termes, les octets de remplissage ne peuvent pas être vides (ASCII 0x00), car sa valeur décimale est zéro, ce qui n'implique pas.

4. Définissez la clé de départ avec quatre lettres majuscules aléatoires ([AZ]).

5. Faites de même avec tous les octets du fichier, en chiffrant des chaînes de quatre octets à la fois.

a. Chaque octet du fichier est disputé par octet de la clé
b. La clé est constamment convertie en une autre clé, key_transformator.transform (key) en est responsable
c. Des octets chiffrés sont ajoutés à enc_data

6. Entrez enc_data (octets chiffrés) dans encrypted.png

Pour commencer, j'ai vérifié l'en-tête du format PNG et constaté que les huit premiers octets sont les suivants:

[137, 80, 78, 71, 13, 10, 26, 10]

J'ai pris les huit premiers octets du fichier crypté et les ai tordus avec ces huit octets:

image

La clé du premier bloc s'est avérée comme ceci:
[85, 80, 82, 81]

Et le deuxième bloc - comme ceci:
[86, 81, 83, 82]

Étant donné que chaque clé suivante est générée dynamiquement à l'aide de la clé précédente (key = key_transformator.transform (key), j'ai compris l'algorithme: ajoutez un à chaque octet dans la clé précédente:
85 -> 86
80 -> 81
82 -> 83
81 -> 82

Et puis j'ai réalisé que le nom du défi cachait un soupçon maladif.

J'ai écrit deux «fonctions d'aide»:

• «nextKey», qui restaure la clé suivante en fonction du dernier
• "nextChar", qui restaure la lettre suivante, et dans la plupart des cas, augmente simplement d'une unité si elle tombe dans les limites d'octets (255)

image

J'ai converti les 4 octets d'origine [85, 80 82, 81] en lettres: «UPRQ» et j'ai exécuté l'algorithme

image

L'indicateur a été spécifié dans le fichier déchiffré:

image

Défi: le retour des robots


Description:

Les robots sont cool, mais croyez-moi: leur accès devrait être limité! Découvrez-le (lien)

Après avoir suivi le lien, vous voyez une certaine page consacrée aux robots. Fondamentalement, tout suggère de vérifier la présence du fichier "robots.txt".

image

En ajoutant ./robots.txt Ă  l'url, nous obtenons ce qui suit:

image

J'ai vérifié ./secret_login.html et suis tombé sur une page d'enregistrement

image

Ensuite, j'ai vérifié le code source du formulaire pour trouver la confirmation du mot de passe et j'ai vu ce Javascript:

image

Il semble que lorsque la valeur est confirmée, elle est envoyée à la fonction d'autorisation, qui décode la valeur transmise à l'aide de la fonction btoa (fonction de décodage base64 en Javascript), puis la compare avec la chaîne: «SzMzcFQjM1IwYjB0JDB1dA ==».

J'ai décodé cette ligne

image

J'ai inséré la valeur résultante dans la chaîne de mot de passe. Bingo!

image


Défi: Diego Gallery

Description:

J'ai récemment commencé à développer une plateforme pour gérer les photos de mon chat et sécuriser mon flag.txt. Veuillez vérifier mon système (lien vers le formulaire d'inscription).

Afin d'éviter les bourrages dans le système de sécurité, tels que la possibilité d'incorporer du code SQL, j'ai créé mon propre schéma.

Sa brève description est disponible ici (lien vers le schéma)

Formulaire d'inscription:

image

Circuit préréglé:

image

Après avoir défini le nom d'utilisateur et le mot de passe de test, j'ai eu accès à la galerie publique du chat "Diego".

Depuis que je me suis enregistré en tant qu'utilisateur régulier, je me suis dit que je devrais peut-être trouver un moyen d'escalader les privilèges PE (Privilege Escalation). En parcourant le schéma pour les utilisateurs enregistrés, j'ai vu que la différence entre l'utilisateur régulier et l'administrateur se trouve dans la troisième section du schéma, séparée par trois tirets.

Après avoir estimé que si la première valeur (nom d'utilisateur) se réfère à la première section et la seconde (mot de passe) se réfère à la seconde, le rôle est attribué par le système immédiatement après l'entrée de l'utilisateur avec les droits actuels.

Par exemple:

START ||| Première valeur ||| Deuxième valeur ||| utilisateur (ajouté par le service Web) ||| END

Ma charge utile était la suivante:

• Première valeur: "niki ||| niki ||| admin ||| END \ nSTART ||| autre"
• Deuxième valeur: «autre»

Cela a probablement généré les lignes de journal suivantes:

START ||| niki ||| niki ||| admin ||| END
START ||| autre ||| autre ||| utilisateur ||| FIN

Après cela, j'ai pu me connecter en tant qu'administrateur et obtenir tous les droits:

image

Appuyer sur les boutons active uniquement un avertissement indiquant que le drapeau est sûr.
Cependant, à l'intérieur de l'URL, vous pouvez lire:

35.194.63.219/csa_2018/diegos_gallery/_nwryqcttstvs/admin-panel/index.php ? view = log.txt

Qui fait très explicitement référence à LFI (Local File Inclusion) via URL

J'ai essayé:

35.194.63.219/csa_2018/diegos_gallery/_nwryqcttstvs/admin-panel/index.php?view=flag.txt

Et le drapeau était à moi.

image

Défi: étapes prudentes

Description:

Ce (lien de fichier) est un tas d'archives que nous avons trouvées. Nous sommes sûrs que le drapeau secret est caché quelque part en eux.
Nous sommes absolument sûrs que les données que nous recherchons sont cachées dans la section commentaires de chaque fichier.
Pourriez-vous parcourir soigneusement les fichiers et trouver le drapeau?
Bonne chance

Après avoir extrait le fichier, vous obtenez un répertoire appelé "archives" avec deux mille fichiers à l'intérieur, intitulé "unzipme. [Number]".

image

J'ai utilisé le programme binwalk pour vérifier le premier fichier. Et voici ce que le programme m'a donné:

image

Oui, donc dans la section des commentaires, nous avons Ă  la fois des lettres et des chiffres. Encore des indices?

Au début, je me suis demandé si je devais connecter les lettres avec les index donnés de ce fichier zip et vérifier le fichier suivant déjà avec l'index 245.

Mais voici une surprise: le deuxième fichier n'était pas au format zip, mais au format rar.

image

Par conséquent, j'ai dû «l'anrarn» pour arriver aux commentaires:

image

Ma logique était d'exécuter le fichier via binwalk, et si je tombais sur un RAR, décompressez-le pour accéder aux commentaires. Sinon, consultez directement la section des commentaires pour comprendre d'autres actions.

Ma première supposition: le numéro est l'index du fichier (chacun a été numéroté de 0 à 1999). Cependant, j'ai trouvé que certains chiffres sont négatifs, ce qui signifie qu'ils ne peuvent pas être un indice.

Deuxième hypothèse: le nombre est un saut, qui pourrait bien être négatif. Pour chaque numéro, j'avais besoin d'un saut au fichier suivant. Je savais que si mon code saute constamment au fichier calculé suivant, cela peut créer un petit piège sous la forme d'un cycle et mon code restera coincé dans une boucle sans fin. J'ai donc écrit un code python avec une limite de compte. Et après plusieurs tests, j'ai découvert que le nombre 120 serait bien suffisant:

image

Et le drapeau était à moi:

image

Les trois autres que j'ai décrits dans le prochain post, lisez, essayez, je serai heureux de vos commentaires

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


All Articles