Analyse des tâches CTF

Début décembre, nous avons organisé un concours par équipe en sécurité de l'information. Outre OTUS , les organisateurs de l'événement pour les «hackers blancs» étaient Volga CTF et CTF.Moscow . Le moment est peut-être venu de résumer et de parler en détail des tâches.

Tout d'abord, l'événement a réussi:

  • 9 tâches ont été préparées dans trois domaines: Pentest, Reverse Engineering, Linux Security and Secure Development;
  • 217 équipes y ont participé;
  • Plus de 800 tentatives de franchissement de drapeaux ont été enregistrées;
  • plus de 300 drapeaux passés ont été enregistrés.



Deuxièmement , les tâches étaient de complexité différente, donc tout le monde ne pouvait pas résoudre le problème:



Troisièmement , immédiatement après la fin du marathon en ligne, nous avons organisé trois webinaires où nous avons parlé des gagnants, donné les bonnes réponses et annoncé les résultats finaux:

- Résultats CTF: «Linux Security and Secure Development»;


- Résultats CTF: Pentest;


- les résultats du CTF: "reverse engineering".


Quatrièmement , nous vous proposons les conditions des tâches et des descriptions textuelles de leurs solutions . Veuillez noter que certaines tâches incluaient des fichiers.

Direction 1: Pentest


Tâche 1 - Bases de données

100

Le site utilise activement des bases de données. Essayez de faire des injections SQL.
Lien vers le site: http://193.41.142.9:8001/shop/login

Solution:

Nous allons dans la section principale du magasin / boutique / produits /, après avoir collé dans le champ de recherche, nous trouvons injection sql.

Entrez 1 "OU" 1 "=" 1 "-, faites défiler vers le bas et voyez un produit qui manquait auparavant, le drapeau est dans sa description.

Indicateur: indicateur {5ql_1nject10n_15_t00_51mpl3_f0r_y0u}

Tâche 2 - Cookies

150

Mon ami a développé une plateforme de boutique en ligne. Il a demandé un test de boîte noire. Vérifiez la sécurité des cookies, vous pourrez peut-être obtenir des droits d'administrateur.

Lien vers le site: http://193.41.142.9:8001/shop/login

Solution:

Connectez-vous, regardez les cookies et voyez les cookies secrets:

«MTExMTAxMSAxMDAwMTAgMTExMDEwMSAxMTEwMDExIDExMDAxMDEgMTExMDAxMCAxMTAxMTEwIDExMDAwMDEgMTEwMTEwMSAxMTAwMTAxIDEwMDAxMCAxMTEwMTAgMTAwMDEwIDExMTAxMDEgMTExMDAxMSAxMTAwMTAxIDExMTAwMTAgMTAwMDEwIDEwMTEwMCAxMDAwMDAgMTAwMDEwIDExMDEwMDEgMTExMDAxMSAxMDExMTExIDExMDAwMDEgMTEwMDEwMCAxMTAxMTAxIDExMDEwMDEgMTEwMTExMCAxMDAwMTAgMTExMDEwIDEwMDAxMCAxMDAwMTEwIDExMDAwMDEgMTEwMTEwMCAxMTEwMDExIDExMDAxMDEgMTAwMDEwIDExMTExMDE =»

base64 Decode, nous obtenons les données binaires: 100010 1110101 1110011 1111011 1100101 1110010 1101110 1100001 1101101 1100101 100010 111010 100010 1110101 1110011 1100101 1110010 100010 101100 100000 100010 1101001 1110011 1011111 1100001 1100100 1101101 1101001 1101110 100010 111010 100010 1000110 1100001 1101100 1110011 1100101 100010 1111101

Nous traduisons en texte et obtenons: {"username":"user", "is_admin":"False"} , changez False en True et décodez-le à nouveau:

01111011 00100010 01110101 01110011 01100101 01110010 01101110 01100001 01101101 01100101 00100010 00111010 00100010 01110101 01110011 01100101 01110010 00100010 00101100 00100000 00100010 01101001 01110011 01011111 01100001 01100100 01101101 01101001 01101110 00100010 00111010 00100010 01010100 01110010 01110101 01100101 00100010 01111101

«MDExMTEwMTEgMDAxMDAwMTAgMDExMTAxMDEgMDExMTAwMTEgMDExMDAxMDEgMDExMTAwMTAgMDExMDExMTAgMDExMDAwMDEgMDExMDExMDEgMDExMDAxMDEgMDAxMDAwMTAgMDAxMTEwMTAgMDAxMDAwMTAgMDExMTAxMDEgMDExMTAwMTEgMDExMDAxMDEgMDExMTAwMTAgMDAxMDAwMTAgMDAxMDExMDAgMDAxMDAwMDAgMDAxMDAwMTAgMDExMDEwMDEgMDExMTAwMTEgMDEwMTExMTEgMDExMDAwMDEgMDExMDAxMDAgMDExMDExMDEgMDExMDEwMDEgMDExMDExMTAgMDAxMDAwMTAgMDAxMTEwMTAgMDAxMDAwMTAgMDEwMTAxMDAgMDExMTAwMTAgMDExMTAxMDEgMDExMDAxMDEgMDAxMDAwMTAgMDExMTExMDE =»

Remplacez la valeur des cookies par une nouvelle et accédez au profil utilisateur.
Drapeau: flag {d0_y0u_l1k3_c00k13s}

Tâche 3 - Lecture de fichiers

200

Nous rencontrons souvent des sources qui fuient et une étrange logique de travail. Les vecteurs d'attaque possibles sont généralement trouvés par fuzzing. Je vous suggère de faire ça.

Lien vers le site: http://193.41.142.9:8001/shop/login

Solution:

On démarre dirb (common.txt habituel suffit), on trouve les pages /shop/_source/ et /shop/files/ .

Ayant familiarisé avec la source _source nous comprenons que nous avons la vulnérabilité Path Traversal + quelques filtres simples.

Pour obtenir l'indicateur, vous devez faire une demande POST à /shop/files/ avec le paramètre "file", dont la valeur doit être %2E%2E/%2E%2E/flag .

En réponse à la demande, il y aura un drapeau.

Drapeau: flag {y0u_g0t_0ur_s3cr3t}

Direction 2: «Linux Security and Secure Development»


Tâche 1 - VCS

50

Mais le client nous a-t-il donné quelque chose de superflu?
L'archive contient le code source d'une partie du site.
Lien vers le site: http://193.41.142.9:8002/
Pièce jointe: task.7z

Solution:

Nous avons accès au code source. Il s'est avéré que les développeurs ont également mis un référentiel git. Nous regardons git log, nous voyons commit avec des correctifs. Nous utilisons git show <hash commit>, nous voyons les fichiers modifiés et leur contenu, un drapeau est stocké dans l'une des lignes.

drapeau {22717297f6a3603608d260c9e5f69e0a}

Tâche 2 - Algo

50

Nous avons un nouveau défi. Effectuez une vérification de développement en toute sécurité. Le client a fourni une archive avec la partie ouverte du site en cours de développement. Pour tester son algorithme de hachage, il a fourni un hachage: 666c61677b32646733326473323334327d. Vérifiez l'algorithme pour la possibilité de transformation inverse.

L'archive contient le code source d'une partie du site.
Lien vers le site: http://193.41.142.9:8002/
Pièce jointe: task.7z

Solution:

Le code source a un algorithme de hachage de mot de passe. En fait, ce n'est pas un algorithme de hachage, mais simplement la conversion de données d'un format de chaîne en hexadécimal.

Nous utilisons Python:

 import binascii binascii.unhexlify("666c61677b32646733326473323334327d") 

Nous obtenons le drapeau: flag {2dg32ds2342}

Tâche 3 - Fichiers fichiers fichiers

150

Terminons l'audit. Voyez-vous également cette vulnérabilité? Super. Ainsi, obtenir un fichier secret est facile pour vous.
L'archive contient le code source d'une partie du site.
Lien vers le site: http://193.41.142.9:8002/
Pièce jointe: task.7z

Solution:

Dans le code source du module principal du programme, vous pouvez remarquer le lecteur de fichiers (c'est l'application principale de ce service). La fonction de vérification de l'existence d'un fichier ne vérifie en aucun cas les caractères spéciaux et concatène simplement deux lignes => vulnérabilité de chemin d'accès.

Toujours dans Dockerfile, docker-compose.yml, vous pouvez voir les mappages de fichiers et la structure de chargement dans le conteneur. En utilisant ces connaissances, nous générons une charge utile:

 http://193.41.142.9:8002/files?password=qgzc6!78zxcbkj123fdgd234&filename=../../../../../../src/secret_files/flag.txt 

drapeau {a0a7c3fff21f2aea3cfa1d0316dd816c}

Direction 3: "reverse engineering"


Tâche 1 - Serpent
100

Notre entreprise essaie toujours de contourner toute protection logicielle. Aidez-nous cette fois à gérer Python.
Fichier attaché: task.pyc

Solution:

Nous utilisons le bytecode Python décompilé par le module uncompyle6:
uncompyle6 task.pyc.
On décompile, on obtient un drapeau:

indicateur {w3l1_pyth0n}

Tâche 2 - Robot
150

Cette fois, nous sommes tombés sur une application étrange, aidez-moi à trouver le mot de passe à saisir.
Pièce jointe: app.apk

Solution:

L'application est sur Android, il suffit donc de la charger dans un analyseur statique tel que BytecodeViewer et de voir le code source restauré du programme. Notez qu'il s'agit de Kotiln, et il utilise souvent une programmation fonctionnelle, comme dans ce cas. Dans l'une des fonctions anonymes décompilées, nous trouvons la vérification du drapeau, la vérification elle-même:

 (String)paramFunction1.invoke(Boolean.valueOf(Arrays.equals(paramString, h)));  invoke: ((StringBuilder)localObject).append("flag{"); ((StringBuilder)localObject).append(this.$m); ((StringBuilder)localObject).append('}'); 

variable h: {102, 97, 50, 98, 102, 54, 52, 54, 101, 52, 57, 97, 98, 53, 101, 53, 54, 102, 50, 98, 55, 52, 52, 56, 48, 98, 97, 54, 49, 48, 49, 55};

On voit qu'il ressemble à des caractères imprimés codés. Nous utilisons Python:

'' .join (chr (x) pour x in [102, 97, 50, 98, 102, 54, 52, 54, 101, 52, 57, 97, 98, 53, 101, 53, 54, 102, 50 , 98, 55, 52, 52, 56, 48, 98, 97, 54, 49, 48, 49, 55])

Nous obtenons le drapeau:

drapeau {fa2bf646e49ab5e56f2b74480ba61017}

Quête 3 - Bin

200

Cette fois, nous sommes tombés sur un fichier binaire. La tâche est la même, obtenez le mot de passe secret.
Pièce jointe: tâche

Solution:
Un fichier binaire est donné. Nous chargeons dans le désassembleur et voyons six fonctions de validation écrites en C ++.

Ils sont exécutés de manière identique et sont appelés les uns dans les autres, vérifiant le drapeau en morceaux de 5 éléments.

Nous le restaurons par étapes en utilisant les informations du démonteur. Nous obtenons le drapeau en plusieurs parties:

0) vérification de la longueur
1) drapeau {
2) feefa
3) _172a
4) k14sc
5) _eee}

Combinez et obtenez le drapeau:

drapeau {feefa_172ak14sc_eee}

C'est tout, chers collègues! Merci à tous pour votre participation, prenez soin de vous, de vos proches et de vos données! Bonne année!

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


All Articles